import type { JSX } from "@solidjs/web"; import { type Accessor } from "solid-js"; import { type MaybeAccessor } from "../internals/maybe-accessor.js"; import { type ItemsInput } from "./utils/resolve-value-label.js"; export type SelectChangeReason = "item-press" | "escape-key" | "outside-press" | "imperative"; import type { SelectValue } from "./select-root-context.js"; export type { SelectValue }; export interface CreateSelectOptions { /** * Current selected value. Consumer-owned signal. Writes happen via * `onValueChange` — the primitive does NOT keep an internal copy. * Pass an array when `multiple: true`. */ value: MaybeAccessor | null | undefined>; onValueChange?: (value: SelectValueType | null, reason: SelectChangeReason) => void; /** Open state. Consumer-owned signal. */ open: MaybeAccessor; onOpenChange?: (open: boolean, reason: SelectChangeReason) => void; /** Whether multiple items may be selected. */ multiple?: Multiple; disabled?: MaybeAccessor; readOnly?: MaybeAccessor; required?: MaybeAccessor; /** Items registry — drives trigger label resolution for object values. */ items?: MaybeAccessor | undefined>; /** Formatter for object values (trigger display). */ itemToStringLabel?: MaybeAccessor<((value: Value) => string) | undefined>; /** Formatter for object values (form submission). */ itemToStringValue?: MaybeAccessor<((value: Value) => string) | undefined>; /** Custom equality comparer. Defaults to `Object.is`. */ isItemEqualToValue?: MaybeAccessor<((itemValue: Value, value: Value) => boolean) | undefined>; } type SelectValueType = Multiple extends true ? Value[] : Value; export interface SelectApi { /** Reactive accessor for the current selected value. */ value: Accessor | null>; /** Reactive accessor for the open state. */ open: Accessor; multiple: boolean; disabled: Accessor; readOnly: Accessor; required: Accessor; /** Items registry (for label resolution / group support). */ items: Accessor | undefined>; /** Whether the items list is grouped. */ isGrouped: Accessor; /** Check whether a given item value is currently selected. */ isItemSelected: (item: Value) => boolean; /** Display label for the current value. Empty string when nothing is selected. */ valueLabel: Accessor; /** Pure event-emitter — fire `onValueChange`. Consumer owns the signal write. */ setValue: (next: SelectValueType | null, reason?: SelectChangeReason) => void; /** Pure event-emitter — fire `onOpenChange`. */ setOpen: (next: boolean, reason?: SelectChangeReason) => void; /** * Context provider. Wrap a subtree to make the api discoverable via * `useSelect()` without prop-drilling. */ Provider: (props: { children: JSX.Element; }) => JSX.Element; } export declare function useSelect(): SelectApi; /** * Solid 2-native headless primitive for the select selection logic. Owns: * value / open state, isItemSelected derivation, and valueLabel. No filter * input (Select has no text input). DOM concerns (floating-ui positioning, * keyboard nav, portal, hidden form input) live in the structural * `` wrapper that composes this primitive. */ export declare function createSelect(options: CreateSelectOptions): SelectApi; //# sourceMappingURL=create-select.d.ts.map