Chat Source

Примитивы отображения источников — favicon, стек favicon с +N, сводка по доменам и сгруппированные результаты.

Установка

Использование

Семейство — четыре независимых примитива поверх плоского API (данные внутрь, колбэки наружу). Без зависимостей от типов приложения. <img> нативный (фреймворк-агностично), loading="lazy".

Состояния

ChatSourceFavicon

  • loadedsrc или резолв по domain отдаёт картинку.
  • favicon-fallbackonError или отсутствие srcGlobeIcon.
  • no-favicon-src — пустой domain (резолвер вернул null) → сразу GlobeIcon.
  • размеры: size<=16 запрашивает sz=32, size>16sz=64. Дефолт 16. URL-провайдер переопределяется через faviconSrc.

ChatSourceFaviconStack

  • empty — нет валидных источников → рендерит null.
  • single — одна favicon, без нахлёста.
  • multiple — нахлёст -ml-1.5, каждая в ring-2 ring-background.
  • overflow — источники сверх max сворачиваются в чип +N.

ChatSourceDomains

  • loading — нет строк + loading → 3 skeleton-бара.
  • loaded — топ-N доменов: favicon + имя + count + пропорциональный бар (count/maxCount, анимация ширины).
  • has-more — есть источники сверх топ-N (remaining = total − сумма топа > 0) → строка «N more sources». Учитывает total, поэтому строка появляется и когда передан только топ доменов вместе с бо́льшим total.
  • trailing countingloading при наличии строк → ещё один skeleton-бар.
  • static / clickable — без onSelect это div; с onSelectbutton на всю ширину с hover:border-foreground/25 и кольцом focus-visible:ring-ring для клавиатуры.
  • empty — нет доменов и loading выключен → ничего не рендерит.

ChatSourceGroups

  • empty — нет групп → emptyLabel («No sources.»).
  • collapsed — группа закрыта: результаты скрыты, шеврон повёрнут.
  • expanded — открытая группа с count>0 → список ссылок (favicon + title + domain).
  • count + chevron — счётчик результатов, шеврон поворачивается на 180° при открытии.
  • focus-visible — триггер группы и ссылки результатов получают кольцо ring-ring при навигации с клавиатуры (паттерн disclosure из APG: aria-expanded + aria-controls связывает триггер с раскрываемым списком).

API

faviconSrc?(domain, size) по умолчанию использует Google s2; верни null чтобы форсировать фоллбэк-глобус. defaultFaviconSrc экспортируется отдельно.

Oracul DS

Built for the future of AI-driven interfaces.