import React from "react"; import type { SelectOption } from "@krosoft/core/types"; export interface MultiSelectOption extends SelectOption { /** Option visible mais non basculable : grisée, ignorée par le clic, la navigation clavier et les actions globales. */ disabled?: boolean; /** Vignette affichée avant le libellé dans la liste. Définie (URL) → image ; définie à `null`/`""` → placeholder gris ; absente → pas de vignette. */ imageUrl?: string | null; } /** * Les props non reconnues (et la `ref`) sont relayées au bouton du trigger : c'est ce qui permet à un * `` (Slot) d'y poser `id`, `aria-describedby` et `aria-invalid`, et donc de raccrocher le * champ à son libellé et à son message d'erreur. Sous React 19 `ref` est une prop ordinaire, elle voyage * donc dans le spread : pas de `forwardRef`, qui effacerait en plus le générique `T` (voir aussi `SingleSelect`). */ interface MultiSelectProps extends Omit, "children" | "disabled" | "onChange" | "onToggle" | "value"> { options: MultiSelectOption[]; selected: T[]; onToggle: (val: T) => void; onClear?: () => void; onSelectAll?: (values: T[]) => void; /** * `"input"` : contrôle de formulaire pleine largeur (libellés sélectionnés + compteur `+N`). * `"filter"` : le même contrôle, mais dimensionné pour une barre de filtres * (`controlFilterWidthClass`) plutôt que pour la largeur d'un champ de formulaire. * `"pill"` : pastille de filtre compacte (libellé i18n fixe + badge du nombre de sélections). */ variant?: "input" | "filter" | "pill"; placeholder?: string; /** Libellé i18n fixe de la pastille (variant `"pill"`). */ labelKey?: string; searchable?: boolean; searchPlaceholder?: string; disabled?: boolean; /** * Panneau rendu en modal (défaut, comme le `Select`). À laisser tel quel dans une boîte de * dialogue : sans ça, le `Dialog` neutralise les clics et le scroll sur le panneau porté dans le portail. */ modal?: boolean; /** Affiche les options sélectionnées en pastilles retirables sous le contrôle (`variant="input"`). */ chips?: boolean; /** Nombre de libellés affichés dans le trigger (variant `"input"`), le reste est résumé par un compteur `+N`. */ maxCount?: number; className?: string; } export declare const MultiSelect: ({ options, selected, onToggle, onClear, onSelectAll, variant, placeholder, labelKey, searchable, searchPlaceholder, disabled, modal, chips, maxCount, className, ...triggerProps }: MultiSelectProps) => React.ReactElement; export {}; //# sourceMappingURL=MultiSelect.d.ts.map