Combobox
Автодополнение (поиск по списку) на композиции Popover + Command + Button: триггер-кнопка
показывает label текущего значения и открывает выпадающий список опций с полем поиска. Отдельного
shadcn-примитива нет — это рецепт из готовых компонентов. Контракт value-based (value: string | null,
onChange(string | null)), поэтому в форме Combobox кладётся в component как есть.
Тяжёлый компонент: импортируется из подпути @reformer/ui-kit/combobox (вне главного barrel).
Когда выбор иерархичен, плоского options не хватает — тогда берут варианты ComboboxTree
(значение string | null) и ComboboxTreeMulti (значение string[] | null, пустой выбор
эмитится как null, никогда как [] — обязательность выражается required(), а не
minLength(1)). Оба принимают nodes вместо options; значением поля становится id узла
(для файла — его полный путь), а loadChildren позволяет читать уровни лениво. По умолчанию
selectable="leaf": щелчок по каталогу раскрывает его, а не выбирает.
Список в поповере у этих вариантов — Tree кита, и cmdk там намеренно
отсутствует, в отличие от Combobox / ComboboxMulti: фильтр cmdk при поиске размонтирует
несовпавшие строки вместе с их детьми, переставляет узлы мимо React и не видит виртуализированных
строк — иерархия этого не переживает. Поэтому поиск свой: он фильтрует само дерево, достраивая
путь до совпадения.
Variants — готовые конфигурации компонента: один и тот же компонент с разными преднастроенными пропсами. Витрина состояний (напр. обычный Select и Select с расширенной информацией — два варианта).
Examples — приёмы в коде: как решить задачу. Напр. как разные Data Provider’ы работают с компонентом (рецепты использования).