/** Navigation component prop types — @see docs/COMPONENTS.md#navigation */ import type * as React from "react"; import type { ReactNode } from "react"; import type { AffixProp } from "./layout.prop.js"; import type { ActionsProp, ChildrenProp, ClassNameProp, DisabledProp, ErrorProp, HasActiveFiltersProp, IdProp, LabelProp, OnClearFiltersProp, PendingProp, PlaceholderProp, StickyProp, TextAlignProp } from "../vocabulary/index.js"; import type { SearchSelectOptionProp } from "./data-entry.prop.js"; /** * `wrap` (default) stacks on narrow viewports then wraps onto extra rows; `scroll` keeps ONE * bounded row that scrolls inline, so a wide filter set never pushes the list below the fold. */ export type FilterBarOverflowProp = "wrap" | "scroll"; /** * Renders the canonical SearchInput as the FIRST control of the strip, with a token-owned * consistent width (`--filter-bar-search-width`, full-width below 640px). Controlled by consumer * data via the `value`/`defaultValue`/ `onValueChange` triad; `onSearch` mirrors SearchInput's * debounced-term callback. */ export type FilterBarSearchProp = { value?: string; defaultValue?: string; /** Fires on EVERY keystroke — required to keep a controlled `value` responsive. */ onValueChange?: (query: string) => void; /** Fires with the DEBOUNCED term. Omit it when filtering is driven off `onValueChange`. */ onSearch?: (query: string) => void; placeholder?: string; /** Visible label above the search field. Omit for the placeholder-only compact form. */ label?: React.ReactNode; /** Accessible name when no visible `label` is given (defaults to the localized "Search"). */ ariaLabel?: string; id?: IdProp; disabled?: DisabledProp; }; /** * `value` is the filter's stable identity (never shown); the visible `label` is rendered as the * control's real `