@flanksource/clicky-ui 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat.cjs +16 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +17 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +34 -11
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +8 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +34 -11
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/DateTimePicker.cjs +3 -0
- package/dist/components/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker.d.ts +6 -2
- package/dist/components/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker.js +3 -0
- package/dist/components/DateTimePicker.js.map +1 -1
- package/dist/components/Field.cjs +33 -0
- package/dist/components/Field.cjs.map +1 -0
- package/dist/components/Field.d.ts +27 -0
- package/dist/components/Field.d.ts.map +1 -0
- package/dist/components/Field.js +33 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/FilterBar.cjs +81 -20
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +30 -0
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +83 -22
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +26 -3
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +26 -3
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +2 -1
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts +5 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +2 -1
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +15 -8
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +15 -8
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +4 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +2 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +4 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +1 -1
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +2 -2
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +4 -2
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +13 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +2 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +13 -0
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/loading.cjs +21 -8
- package/dist/components/loading.cjs.map +1 -1
- package/dist/components/loading.d.ts +6 -4
- package/dist/components/loading.d.ts.map +1 -1
- package/dist/components/loading.js +21 -8
- package/dist/components/loading.js.map +1 -1
- package/dist/components/use-form.cjs +27 -0
- package/dist/components/use-form.cjs.map +1 -0
- package/dist/components/use-form.d.ts +30 -0
- package/dist/components/use-form.d.ts.map +1 -0
- package/dist/components/use-form.js +27 -0
- package/dist/components/use-form.js.map +1 -0
- package/dist/components.cjs +7 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +4 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +8 -1
- package/dist/components.js.map +1 -1
- package/dist/data/Markdown.cjs +14 -40
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +3 -0
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +14 -40
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/TaskProgress.cjs +22 -0
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.js +22 -0
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +5 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/Tree.cjs +32 -1
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +9 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +32 -1
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/chat/Attachment.cjs +79 -0
- package/dist/data/chat/Attachment.cjs.map +1 -0
- package/dist/data/chat/Attachment.d.ts +18 -0
- package/dist/data/chat/Attachment.d.ts.map +1 -0
- package/dist/data/chat/Attachment.js +79 -0
- package/dist/data/chat/Attachment.js.map +1 -0
- package/dist/data/chat/Chat.cjs +71 -14
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +30 -12
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts +9 -0
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +73 -16
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +32 -14
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +5 -3
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +34 -16
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/Message.cjs +73 -14
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +11 -4
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +75 -16
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/MessageActions.cjs +54 -0
- package/dist/data/chat/MessageActions.cjs.map +1 -0
- package/dist/data/chat/MessageActions.d.ts +11 -0
- package/dist/data/chat/MessageActions.d.ts.map +1 -0
- package/dist/data/chat/MessageActions.js +54 -0
- package/dist/data/chat/MessageActions.js.map +1 -0
- package/dist/data/chat/ModelSelector.cjs +43 -0
- package/dist/data/chat/ModelSelector.cjs.map +1 -0
- package/dist/data/chat/ModelSelector.d.ts +22 -0
- package/dist/data/chat/ModelSelector.d.ts.map +1 -0
- package/dist/data/chat/ModelSelector.js +43 -0
- package/dist/data/chat/ModelSelector.js.map +1 -0
- package/dist/data/chat/PromptInput.cjs +28 -15
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +14 -8
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +28 -15
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/chat/Reasoning.cjs +37 -0
- package/dist/data/chat/Reasoning.cjs.map +1 -0
- package/dist/data/chat/Reasoning.d.ts +11 -0
- package/dist/data/chat/Reasoning.d.ts.map +1 -0
- package/dist/data/chat/Reasoning.js +37 -0
- package/dist/data/chat/Reasoning.js.map +1 -0
- package/dist/data/chat/Suggestion.cjs +20 -0
- package/dist/data/chat/Suggestion.cjs.map +1 -0
- package/dist/data/chat/Suggestion.d.ts +10 -0
- package/dist/data/chat/Suggestion.d.ts.map +1 -0
- package/dist/data/chat/Suggestion.js +20 -0
- package/dist/data/chat/Suggestion.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +26 -3
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +5 -1
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +26 -3
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/index.d.ts +7 -2
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/types.cjs +16 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +29 -2
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js +16 -0
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/hooks/use-task-run.cjs +33 -20
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +33 -20
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/index.cjs +7 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/overlay/Modal.cjs +27 -23
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +7 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +27 -23
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +4 -4
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.js +4 -4
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +17 -21
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -3
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +18 -22
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +5 -3
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +5 -3
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBar.cjs","sources":["../../src/components/FilterBar.tsx"],"sourcesContent":["import {\n useCallback,\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { FilterPill, type FilterMode } from \"../data/FilterPill\";\nimport { clearFilterBarFilter, isFilterBarFilterActive } from \"./filter-bar-utils\";\nimport { Icon, LabelIcon, type LabelIconSpec } from \"../data/Icon\";\nimport { formatDateTimeRelative } from \"../data/cells/timestamp-format\";\nimport { UiChevronDown, UiChevronRight, UiChevronUp, UiClose, UiFilter, UiSearch } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Combobox, type ComboboxOption } from \"./Combobox\";\nimport { DateTimePicker } from \"./DateTimePicker\";\nimport { MultiSelect, type MultiSelectOption } from \"./MultiSelect\";\nimport { RangeSlider } from \"./RangeSlider\";\nimport { TimeRange, type TimeRangePresetGroup } from \"./TimeRange\";\n\nconst FILTER_INPUT_DEBOUNCE_MS = 500;\nconst FILTER_BAR_GAP_PX = 8;\nconst FILTER_BAR_OVERFLOW_TRIGGER_ESTIMATE_PX = 44;\n\n// When `autoSubmit` is false, debounced fields forward their draft value\n// immediately (no timer) so the consumer can accumulate state locally and\n// fire one request when Apply is clicked. When true (default) fields debounce\n// upstream, matching the live-filter behaviour used in trace/log UIs.\nconst FilterBarContext = createContext<{ autoSubmit: boolean }>({\n autoSubmit: true,\n});\n\nexport type FilterBarSearchProps = {\n /** Controlled search text. */\n value: string;\n /** Called with the next search text. Debounced when `autoSubmit` is true. */\n onChange: (value: string) => void;\n /** Placeholder shown in the search input. */\n placeholder?: string;\n /** Accessible label for the search input. */\n ariaLabel?: string;\n /** Classes applied to the search input. */\n className?: string;\n};\n\nexport type FilterBarTextFilter = {\n /** Stable filter key used for rendering and overflow measurement. */\n key: string;\n /** Renders a free-text input. */\n kind: \"text\";\n /** Filter label shown on the control. */\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n /** Optional helper text shown in filter popovers. */\n description?: string;\n /** Controlled input value. */\n value: string;\n /** Called with the next input value. */\n onChange: (value: string) => void;\n /** Placeholder shown in the input. */\n placeholder?: string;\n /** Disables this filter. */\n disabled?: boolean;\n /** Classes applied to this filter control. */\n className?: string;\n};\n\nexport type FilterBarLookupOption = {\n /** Option value written to filter state. */\n value: string;\n /** Optional display label; falls back to `value`. */\n label?: string;\n /** Prevents choosing the option. */\n disabled?: boolean;\n /** Optional browser tooltip. */\n title?: string;\n};\n\nexport type FilterBarLookupInputType = \"text\" | \"number\" | \"date\";\n\nexport type FilterBarLookupFilter = {\n key: string;\n /** Renders an input backed by a datalist-style option set. */\n kind: \"lookup\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled selected or typed value. */\n value: string;\n /** Suggestions for the lookup input. */\n options: FilterBarLookupOption[];\n onChange: (value: string) => void;\n placeholder?: string;\n /** Native input type for the lookup field. */\n inputType?: FilterBarLookupInputType;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarLookupMultiFilter = {\n key: string;\n /** Renders a multi-value lookup filter. */\n kind: \"lookup-multi\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled selected values. */\n value: string[];\n /** Suggestions for the lookup input. */\n options: FilterBarLookupOption[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n /**\n * Optional async search invoked (debounced) as the user types; the consumer\n * fetches matching options and feeds them back via `options`. When set, the\n * typeahead is server-driven (results replace the list); when absent it\n * filters the static `options` client-side.\n */\n onSearch?: (query: string) => void;\n /** Shows a loading indicator while a search is in flight. */\n loading?: boolean;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarMultiFilterMode = Extract<FilterMode, \"include\" | \"exclude\">;\n\nexport type FilterBarMultiFilter = {\n key: string;\n /** Renders include/exclude chips for each option. */\n kind: \"multi\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Map of option value to include/exclude state. */\n value: Record<string, FilterBarMultiFilterMode>;\n /** Available chip options. When `truncated`, this is only the head set. */\n options: MultiSelectOption[];\n onChange: (value: Record<string, FilterBarMultiFilterMode>) => void;\n /**\n * True when more options exist than are in `options` (the option set was\n * capped server-side). Renders an \"… and N more\" hint and, with `onSearch`,\n * lets the user search the full set.\n */\n truncated?: boolean;\n /** True distinct count behind a truncated option set; drives the \"N more\" label. */\n total?: number;\n /**\n * Optional async fetch invoked (debounced) as the user types in the option\n * search box. Returns the options matching the query, which are merged into\n * the displayed list so values beyond the head become selectable. When\n * absent, the search box filters the static `options` client-side only.\n */\n onSearch?: (query: string) => Promise<MultiSelectOption[]> | void;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarNestedMultiGroup = {\n /** Stable group id. */\n groupKey: string;\n /** Optional visible group label. */\n label?: string;\n /** Options in this group. */\n options: MultiSelectOption[];\n};\n\nexport type FilterBarNestedMultiFilter = {\n key: string;\n /** Renders grouped include/exclude chips. */\n kind: \"nested-multi\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n // Same wire shape as FilterBarMultiFilter so consumers can swap kinds\n // without changing their state slot.\n value: Record<string, FilterBarMultiFilterMode>;\n groups: FilterBarNestedMultiGroup[];\n onChange: (value: Record<string, FilterBarMultiFilterMode>) => void;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarSelectMultiFilter = {\n key: string;\n /** Renders a compact multi-select dropdown. */\n kind: \"select-multi\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled selected values. */\n value: string[];\n /** Available dropdown options. */\n options: MultiSelectOption[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarNumberValue = {\n /** Minimum bound as a string so callers can preserve draft input. */\n min?: string;\n /** Maximum bound as a string so callers can preserve draft input. */\n max?: string;\n};\n\nexport type FilterBarNumberFilter = {\n key: string;\n /** Renders paired min/max numeric controls. */\n kind: \"number\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled min/max value. */\n value: FilterBarNumberValue;\n onChange: (value: FilterBarNumberValue) => void;\n /** Lower bound used by the optional range slider. */\n domainMin?: number;\n /** Upper bound used by the optional range slider. */\n domainMax?: number;\n /** Step size for number inputs and slider movement. */\n step?: number;\n /** Formatter used for slider labels. */\n formatValue?: (value: number) => string;\n minPlaceholder?: string;\n maxPlaceholder?: string;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarEnumFilter = {\n key: string;\n /** Renders a single-select dropdown. */\n kind: \"enum\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled selected value. */\n value: string;\n /** Available enum options. */\n options: Array<{ value: string; label?: string }>;\n onChange: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarBooleanFilter = {\n key: string;\n /** Renders a boolean toggle. */\n kind: \"boolean\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled checked state. */\n value: boolean;\n onChange: (value: boolean) => void;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarFilter =\n | FilterBarTextFilter\n | FilterBarLookupFilter\n | FilterBarLookupMultiFilter\n | FilterBarMultiFilter\n | FilterBarNestedMultiFilter\n | FilterBarSelectMultiFilter\n | FilterBarNumberFilter\n | FilterBarEnumFilter\n | FilterBarBooleanFilter;\n\nexport type FilterBarRangePreset = {\n /** Visible preset label. */\n label: string;\n /** Start value applied by the preset. */\n from: string;\n /** End value applied by the preset. */\n to: string;\n};\n\nexport type FilterBarRangeProps = {\n /** Current start value. */\n from?: string;\n /** Current end value. */\n to?: string;\n /** Called when the user applies the range. */\n onApply: (from: string, to: string) => void;\n /** Presets or preset groups shown in the range popup. */\n presets?: Array<FilterBarRangePreset | TimeRangePresetGroup>;\n /** Enables time inputs when using date-time values. */\n timeEnabled?: boolean;\n /** Selected timezone. */\n timeZone?: string;\n /** Available timezone options. */\n timeZones?: string[];\n fromPlaceholder?: string;\n toPlaceholder?: string;\n emptyLabel?: string;\n className?: string;\n};\n\nexport type FilterBarProps = {\n /** Optional global search control shown first. */\n search?: FilterBarSearchProps;\n /** Structured filters rendered after search. */\n filters?: FilterBarFilter[];\n /** Date-time range control. */\n timeRange?: FilterBarRangeProps;\n /** Date-only range control. */\n dateRange?: FilterBarRangeProps;\n /** Additional content rendered in the filter row. */\n children?: ReactNode;\n /** Content rendered before search and filters. */\n leading?: ReactNode;\n /** Content rendered at the end of the bar. */\n trailing?: ReactNode;\n /** Classes applied to the root bar. */\n className?: string;\n /**\n * When false, debounced fields forward edits immediately and an Apply button\n * is rendered in the trailing slot. Defaults to true.\n */\n autoSubmit?: boolean;\n /** Called by the Apply button when `autoSubmit` is false. */\n onApply?: () => void;\n /** Label for the Apply button. */\n applyLabel?: string;\n /** Shows a pending state on the Apply button. */\n isPending?: boolean;\n /** `responsive` moves hidden filters into an overflow popover; `wrap` lets them wrap. */\n overflowMode?: \"responsive\" | \"wrap\";\n};\n\nexport function FilterBar({\n search,\n filters,\n timeRange,\n dateRange,\n children,\n leading,\n trailing,\n className,\n autoSubmit = true,\n onApply,\n applyLabel = \"Apply\",\n isPending = false,\n overflowMode = \"responsive\",\n}: FilterBarProps) {\n const hasRangeControls = Boolean(timeRange || dateRange);\n const showApply = !autoSubmit && !!onApply;\n const contextValue = useMemo(() => ({ autoSubmit }), [autoSubmit]);\n const allFilters = filters ?? [];\n const responsiveOverflow = overflowMode === \"responsive\" && allFilters.length > 0;\n const filterListRef = useRef<HTMLDivElement>(null);\n const overflowTriggerRef = useRef<HTMLButtonElement>(null);\n const filterNodeRefs = useRef(new Map<string, HTMLDivElement>());\n const filterWidthCache = useRef(new Map<string, number>());\n const filterKeys = useMemo(\n () => allFilters.map((filter) => filter.key).join(\"\\u0000\"),\n [allFilters],\n );\n const [visibleFilterCount, setVisibleFilterCount] = useState(allFilters.length);\n\n // Latest-value refs so measureOverflow can be a stable useCallback. Reading\n // the current values through refs sidesteps the closure-staleness problem\n // without putting array references in the dep list — which is what caused\n // the \"Maximum update depth exceeded\" cascade (allFilters in the deps made\n // measureOverflow change on every render → ResizeObserver effect re-ran →\n // setVisibleFilterCount fired → repeat).\n const allFiltersRef = useRef(allFilters);\n const responsiveOverflowRef = useRef(responsiveOverflow);\n allFiltersRef.current = allFilters;\n responsiveOverflowRef.current = responsiveOverflow;\n\n useLayoutEffect(() => {\n setVisibleFilterCount(allFiltersRef.current.length);\n }, [filterKeys]);\n\n const measureOverflow = useCallback(() => {\n const current = allFiltersRef.current;\n if (!responsiveOverflowRef.current) {\n setVisibleFilterCount(current.length);\n return;\n }\n\n const filterList = filterListRef.current;\n if (!filterList) return;\n\n const availableWidth = Math.floor(filterList.getBoundingClientRect().width);\n if (availableWidth <= 0) return;\n\n const widths = current.map((filter) => {\n const node = filterNodeRefs.current.get(filter.key);\n const measured = node?.getBoundingClientRect().width ?? 0;\n if (measured > 0) {\n const width = Math.ceil(measured);\n filterWidthCache.current.set(filter.key, width);\n return width;\n }\n return filterWidthCache.current.get(filter.key) ?? estimateFilterWidth(filter);\n });\n\n const triggerWidth = Math.ceil(\n overflowTriggerRef.current?.getBoundingClientRect().width ??\n FILTER_BAR_OVERFLOW_TRIGGER_ESTIMATE_PX,\n );\n const triggerGap = triggerWidth > 0 ? FILTER_BAR_GAP_PX : 0;\n const allFiltersWidth = sumFilterWidths(widths);\n const nextVisible =\n allFiltersWidth <= availableWidth\n ? current.length\n : calculateVisibleFilterCount(\n widths,\n Math.max(0, availableWidth - triggerWidth - triggerGap),\n );\n setVisibleFilterCount((prev) => (prev === nextVisible ? prev : nextVisible));\n }, []);\n\n useLayoutEffect(() => {\n measureOverflow();\n }, [measureOverflow]);\n\n useEffect(() => {\n if (!responsiveOverflow) return;\n\n const filterList = filterListRef.current;\n const trigger = overflowTriggerRef.current;\n const ResizeObserverCtor = typeof ResizeObserver === \"undefined\" ? null : ResizeObserver;\n\n if (!ResizeObserverCtor) {\n window.addEventListener(\"resize\", measureOverflow);\n measureOverflow();\n return () => window.removeEventListener(\"resize\", measureOverflow);\n }\n\n const observer = new ResizeObserverCtor(() => measureOverflow());\n if (filterList) observer.observe(filterList);\n if (trigger) observer.observe(trigger);\n window.addEventListener(\"resize\", measureOverflow);\n measureOverflow();\n\n return () => {\n observer.disconnect();\n window.removeEventListener(\"resize\", measureOverflow);\n };\n }, [measureOverflow, responsiveOverflow]);\n\n const inlineFilters = responsiveOverflow\n ? allFilters.slice(0, Math.min(visibleFilterCount, allFilters.length))\n : allFilters;\n const overflowFilters = responsiveOverflow\n ? allFilters.slice(Math.min(visibleFilterCount, allFilters.length))\n : [];\n const activeOverflowCount = overflowFilters.filter(isFilterBarFilterActive).length;\n\n const setFilterNode = useCallback((key: string, node: HTMLDivElement | null) => {\n if (!node) {\n filterNodeRefs.current.delete(key);\n return;\n }\n filterNodeRefs.current.set(key, node);\n }, []);\n\n return (\n <FilterBarContext.Provider value={contextValue}>\n <div\n className={cn(\n \"flex flex-nowrap items-center gap-2 overflow-visible rounded-lg border border-input bg-background px-2 py-1.5 shadow-sm\",\n overflowMode === \"wrap\" && \"flex-wrap\",\n className,\n )}\n >\n {leading && <div className=\"flex shrink-0 items-center gap-2\">{leading}</div>}\n\n {search && <SearchField search={search} />}\n\n {children}\n\n {allFilters.length > 0 && (\n <div\n ref={filterListRef}\n data-filter-bar-list\n className={cn(\n \"flex min-w-0 items-center gap-2\",\n overflowMode === \"wrap\" ? \"flex-wrap\" : \"flex-1\",\n )}\n >\n {inlineFilters.map((filter, index) => (\n <div\n key={filter.key}\n ref={(node) => setFilterNode(filter.key, node)}\n data-filter-bar-item={filter.key}\n className=\"min-w-0 shrink-0\"\n >\n {renderFilterField(filter, !search && index === 0)}\n </div>\n ))}\n </div>\n )}\n\n {responsiveOverflow && overflowFilters.length > 0 && (\n <OverflowFiltersMenu\n triggerRef={overflowTriggerRef}\n filters={overflowFilters}\n activeHidden={activeOverflowCount}\n {...(onApply ? { onApply } : {})}\n />\n )}\n\n {(hasRangeControls || trailing || showApply) && (\n <div className=\"ml-auto flex shrink-0 flex-nowrap items-center gap-2\">\n {dateRange && <RangeControlButton kind=\"date\" label=\"Date range\" {...dateRange} />}\n {timeRange && <RangeControlButton kind=\"time\" label=\"Time range\" {...timeRange} />}\n {trailing}\n {showApply && (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isPending}\n onClick={onApply}\n >\n {isPending ? \"Loading…\" : applyLabel}\n </Button>\n )}\n </div>\n )}\n </div>\n </FilterBarContext.Provider>\n );\n}\n\ntype FilterBarFilterPanelChrome = \"full\" | \"embedded\";\n\nexport function FilterBarFilterPanel({\n filter,\n chrome = \"full\",\n autoSubmit = true,\n}: {\n filter: FilterBarFilter;\n chrome?: FilterBarFilterPanelChrome;\n autoSubmit?: boolean;\n}) {\n const contextValue = useMemo(() => ({ autoSubmit }), [autoSubmit]);\n\n return (\n <FilterBarContext.Provider value={contextValue}>\n <FilterBarFilterPanelContent filter={filter} chrome={chrome} />\n </FilterBarContext.Provider>\n );\n}\n\nfunction FilterBarFilterPanelContent({\n filter,\n chrome = \"full\",\n}: {\n filter: FilterBarFilter;\n chrome?: FilterBarFilterPanelChrome;\n}) {\n return (\n <>\n {filter.kind === \"lookup\" && <LookupFilterField filter={filter} grow />}\n {filter.kind === \"lookup-multi\" && <LookupMultiFilterField filter={filter} grow />}\n {filter.kind === \"multi\" && <MultiFilterPanel filter={filter} chrome={chrome} />}\n {filter.kind === \"nested-multi\" && <NestedMultiFilterPanel filter={filter} chrome={chrome} />}\n {filter.kind === \"select-multi\" && <SelectMultiFilterField filter={filter} grow />}\n {filter.kind === \"number\" && <NumberFilterPanel filter={filter} chrome={chrome} />}\n {filter.kind === \"enum\" && <EnumFilterField filter={filter} grow />}\n {filter.kind === \"boolean\" && <BooleanFilterField filter={filter} />}\n {filter.kind === \"text\" && <TextFilterField filter={filter} grow />}\n </>\n );\n}\n\nfunction renderFilterField(filter: FilterBarFilter, grow: boolean) {\n if (filter.kind === \"lookup\") {\n return <LookupFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"lookup-multi\") {\n return <LookupMultiFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"multi\") {\n return <MultiFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"nested-multi\") {\n return <NestedMultiFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"select-multi\") {\n return <SelectMultiFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"number\") {\n return <NumberFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"enum\") {\n return <EnumFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"boolean\") {\n return <BooleanFilterField filter={filter} />;\n }\n\n return <TextFilterField filter={filter} grow={grow} />;\n}\n\nfunction OverflowFiltersMenu({\n triggerRef,\n filters,\n activeHidden,\n onApply,\n}: {\n triggerRef: RefObject<HTMLButtonElement>;\n filters: FilterBarFilter[];\n activeHidden: number;\n onApply?: () => void;\n}) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [stagedValues, setStagedValues] = useState<Record<string, FilterBarValue>>({});\n const hasHidden = filters.length > 0;\n const hiddenFilterKeys = useMemo(\n () => filters.map((filter) => filter.key).join(\"\\u0000\"),\n [filters],\n );\n const openOverflowMenu = useCallback(() => {\n setStagedValues(createFilterValueMap(filters));\n setOpen(true);\n }, [filters]);\n const closeOverflowMenu = useCallback(() => {\n setStagedValues(createFilterValueMap(filters));\n setOpen(false);\n }, [filters]);\n\n useDismissablePopup(open, rootRef, triggerRef, closeOverflowMenu);\n\n useEffect(() => {\n if (!hasHidden) closeOverflowMenu();\n }, [closeOverflowMenu, hasHidden]);\n\n useEffect(() => {\n if (!open) return;\n setStagedValues(createFilterValueMap(filters));\n }, [hiddenFilterKeys, open]);\n\n const stagedFilters = filters.map((filter) =>\n filterWithStagedValue(\n filter,\n stagedValues[filter.key] ?? filterBarFilterValue(filter),\n (next) =>\n setStagedValues((current) => ({\n ...current,\n [filter.key]: next,\n })),\n ),\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\"relative shrink-0\", !hasHidden && \"invisible pointer-events-none\")}\n aria-hidden={!hasHidden || undefined}\n >\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"More filters\"\n aria-haspopup=\"dialog\"\n aria-expanded={hasHidden ? open : false}\n tabIndex={hasHidden ? 0 : -1}\n title={hasHidden ? \"More filters\" : undefined}\n onClick={() => {\n if (!hasHidden) return;\n if (open) {\n closeOverflowMenu();\n } else {\n openOverflowMenu();\n }\n }}\n className={cn(\n \"h-8 min-w-0 gap-1.5 px-2 text-xs font-normal\",\n activeHidden > 0 && \"border-primary/40 text-primary\",\n )}\n >\n <Icon icon={UiFilter} className=\"text-[14px]\" />\n {activeHidden > 0 && (\n <span className=\"rounded-full bg-muted px-1.5 text-[10px] font-medium text-muted-foreground\">\n {activeHidden}\n </span>\n )}\n </Button>\n\n {hasHidden && open && (\n <div\n role=\"dialog\"\n aria-label=\"Overflow filters\"\n className=\"absolute right-0 top-[calc(100%+0.375rem)] z-50 w-[min(34rem,calc(100vw-2rem))] overflow-visible rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\"\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"mb-2 flex items-center justify-between gap-2 px-1\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Filters\n </div>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n className=\"rounded px-1.5 py-0.5 text-xs text-primary transition-colors hover:bg-accent focus:bg-accent focus:outline-none disabled:text-muted-foreground\"\n onClick={() => stagedFilters.forEach(clearFilterBarFilter)}\n disabled={stagedFilters.every((filter) => !isFilterBarFilterActive(filter))}\n >\n Clear all\n </button>\n <button\n type=\"button\"\n aria-label=\"Close overflow filters\"\n title=\"Close\"\n className=\"inline-flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\"\n onClick={closeOverflowMenu}\n >\n <Icon icon={UiClose} className=\"text-sm\" />\n </button>\n </div>\n </div>\n <div className=\"divide-y divide-border/70 rounded-md border border-border/70\">\n {stagedFilters.map((filter) => {\n const active = isFilterBarFilterActive(filter);\n return (\n <div\n key={filter.key}\n data-overflow-filter-row={filter.key}\n className=\"grid h-12 grid-cols-[minmax(7rem,10rem)_auto_minmax(0,1fr)_auto] items-center gap-2 overflow-visible p-2\"\n >\n <label\n htmlFor={filterInputId(filter)}\n className=\"flex min-w-0 items-center gap-1 truncate text-[10px] font-medium uppercase tracking-wide text-muted-foreground\"\n title={filter.description ?? filter.label}\n >\n <LabelIcon icon={filter.icon} className=\"text-[12px] normal-case\" />\n <span className=\"truncate\">{filter.label}</span>\n </label>\n <span className=\"text-sm text-muted-foreground\">=</span>\n <div className=\"min-w-0 overflow-visible\">\n <FilterBarContext.Provider value={{ autoSubmit: false }}>\n <FilterBarKeyValueControl filter={filter} />\n </FilterBarContext.Provider>\n </div>\n <button\n type=\"button\"\n aria-label={`Clear ${filter.label}`}\n title={`Clear ${filter.label}`}\n className=\"inline-flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none disabled:text-muted-foreground/40\"\n onClick={() => clearFilterBarFilter(filter)}\n disabled={!active}\n >\n <Icon icon={UiClose} className=\"text-sm\" />\n </button>\n </div>\n );\n })}\n </div>\n <div className=\"mt-3 flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-3 text-xs\"\n onClick={closeOverflowMenu}\n >\n Close\n </Button>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n className=\"h-8 px-3 text-xs\"\n onClick={() => {\n applyStagedFilterValues(filters, stagedValues);\n onApply?.();\n setOpen(false);\n }}\n >\n Apply\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction FilterBarKeyValueControl({ filter }: { filter: FilterBarFilter }) {\n if (filter.kind === \"text\") {\n return <TextFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"lookup\") {\n return <LookupFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"lookup-multi\") {\n return <LookupMultiFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"enum\") {\n return <EnumFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"boolean\") {\n return <BooleanFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"select-multi\") {\n return <SelectMultiFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"multi\") {\n return <MultiFilterField filter={filter} grow />;\n }\n if (filter.kind === \"nested-multi\") {\n return <NestedMultiFilterField filter={filter} grow />;\n }\n return <NumberFilterField filter={filter} grow />;\n}\n\nfunction filterInputId(filter: FilterBarFilter) {\n return `filterbar-overflow-${filter.key}`;\n}\n\nfunction lookupOptionsToCombobox(options: FilterBarLookupOption[]): ComboboxOption[] {\n return options.map((option) => ({\n value: option.value,\n label: option.label ?? option.value,\n ...(option.disabled !== undefined ? { disabled: option.disabled } : {}),\n }));\n}\n\nfunction valueInputClassName(disabled?: boolean) {\n return cn(\n \"h-8 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring\",\n disabled && \"cursor-not-allowed opacity-60\",\n );\n}\n\nfunction TextFilterValueControl({ filter }: { filter: FilterBarTextFilter }) {\n const [draft, setDraft] = useDebouncedTextDraft(filter.value, filter.onChange);\n\n return (\n <input\n id={filterInputId(filter)}\n type=\"text\"\n aria-label={filter.label}\n className={valueInputClassName(filter.disabled)}\n placeholder={filter.placeholder ?? \"Filter...\"}\n value={draft}\n disabled={filter.disabled}\n onChange={(event) => setDraft(event.target.value)}\n />\n );\n}\n\nfunction LookupFilterValueControl({ filter }: { filter: FilterBarLookupFilter }) {\n const [draft, setDraft] = useDebouncedTextDraft(filter.value, filter.onChange);\n\n if (filter.inputType === \"date\") {\n return (\n <DateTimePicker\n id={filterInputId(filter)}\n aria-label={filter.label}\n className=\"w-full\"\n inputClassName={valueInputClassName(filter.disabled)}\n buttonClassName=\"right-1\"\n placeholder={filter.placeholder}\n value={draft}\n disabled={filter.disabled}\n onChange={setDraft}\n />\n );\n }\n\n if (filter.inputType === \"number\") {\n return (\n <input\n id={filterInputId(filter)}\n type=\"number\"\n aria-label={filter.label}\n className={valueInputClassName(filter.disabled)}\n placeholder={filter.placeholder}\n value={draft}\n disabled={filter.disabled}\n onChange={(event) => setDraft(event.target.value)}\n />\n );\n }\n\n // The overflow panel renders the filter label as a separate row header, so\n // the Combobox here omits its own inline label to avoid duplication.\n return (\n <Combobox\n id={filterInputId(filter)}\n options={lookupOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n className=\"w-full\"\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction LookupMultiFilterValueControl({ filter }: { filter: FilterBarLookupMultiFilter }) {\n return (\n <Combobox\n multiple\n id={filterInputId(filter)}\n options={lookupOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n className=\"w-full\"\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction enumOptionsToCombobox(\n options: FilterBarEnumFilter[\"options\"],\n): ComboboxOption[] {\n return options.map((option) => ({\n value: option.value,\n label: option.label ?? option.value,\n }));\n}\n\nfunction EnumFilterValueControl({ filter }: { filter: FilterBarEnumFilter }) {\n return (\n <Combobox\n id={filterInputId(filter)}\n options={enumOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n placeholder={filter.placeholder ?? `Any ${filter.label.toLowerCase()}`}\n className=\"w-full\"\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction BooleanFilterValueControl({ filter }: { filter: FilterBarBooleanFilter }) {\n return (\n <div className=\"flex h-8 items-center\">\n <input\n id={filterInputId(filter)}\n type=\"checkbox\"\n aria-label={filter.label}\n className=\"h-4 w-4 accent-primary\"\n checked={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.checked)}\n />\n </div>\n );\n}\n\nfunction SelectMultiFilterValueControl({ filter }: { filter: FilterBarSelectMultiFilter }) {\n return (\n <MultiSelect\n options={filter.options}\n value={filter.value}\n onChange={filter.onChange}\n placeholder={filter.placeholder ?? `Any ${filter.label.toLowerCase()}`}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n triggerClassName=\"h-8 w-full rounded-md border border-input bg-background px-2 text-sm shadow-none\"\n menuClassName=\"left-auto right-0\"\n />\n );\n}\n\nexport function FilterBarRangePanel({\n kind,\n label,\n from = \"\",\n to = \"\",\n onApply,\n presets,\n timeEnabled,\n timeZone,\n timeZones,\n fromPlaceholder,\n toPlaceholder,\n emptyLabel,\n}: FilterBarRangeProps & { kind: \"date\" | \"time\"; label: string }) {\n return (\n <div className=\"w-72 p-3 text-popover-foreground\">\n <TimeRange\n kind={kind}\n label={label}\n align=\"left\"\n from={from}\n to={to}\n onApply={onApply}\n {...(presets ? { presets } : {})}\n {...(timeEnabled !== undefined ? { timeEnabled } : {})}\n {...(timeZone ? { timeZone } : {})}\n {...(timeZones ? { timeZones } : {})}\n {...(fromPlaceholder ? { fromPlaceholder } : {})}\n {...(toPlaceholder ? { toPlaceholder } : {})}\n {...(emptyLabel ? { emptyLabel } : {})}\n panelClassName=\"left-0 right-auto\"\n />\n </div>\n );\n}\n\nfunction EnumFilterField({ filter, grow }: { filter: FilterBarEnumFilter; grow: boolean }) {\n return (\n <Combobox\n label={filter.label}\n options={enumOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n placeholder={filter.placeholder ?? `Any ${filter.label.toLowerCase()}`}\n className={cn(lookupFieldWidthClass(grow), filter.className)}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction BooleanFilterField({ filter }: { filter: FilterBarBooleanFilter }) {\n return (\n <label\n title={filter.description}\n className={cn(\n \"flex h-8 shrink-0 items-center gap-2 rounded-md border border-input bg-muted/30 px-2 text-xs\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <input\n type=\"checkbox\"\n aria-label={filter.label}\n className=\"h-3.5 w-3.5 accent-primary\"\n checked={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.checked)}\n />\n <FilterFieldLabel icon={filter.icon} label={filter.label} />\n </label>\n );\n}\n\nfunction SearchField({ search }: { search: FilterBarSearchProps }) {\n const [draft, setDraft] = useDebouncedTextDraft(search.value, search.onChange);\n\n return (\n <div className=\"flex min-w-[14rem] max-w-[24rem] flex-1 items-center gap-2\">\n <label\n className={cn(\n \"flex h-8 min-w-0 flex-1 items-center rounded-md border border-input bg-background px-3 text-sm\",\n search.className,\n )}\n >\n {draft.trim() ? (\n <span className=\"mr-2 whitespace-nowrap text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {search.ariaLabel ?? \"Search\"}\n </span>\n ) : (\n <Icon icon={UiSearch} className=\"mr-2 shrink-0 text-muted-foreground\" />\n )}\n <input\n type=\"search\"\n aria-label={search.ariaLabel ?? search.placeholder ?? \"Search\"}\n className=\"w-full bg-transparent outline-none placeholder:text-muted-foreground\"\n placeholder={search.placeholder ?? \"Search…\"}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n />\n </label>\n </div>\n );\n}\n\nfunction TextFilterField({ filter, grow }: { filter: FilterBarTextFilter; grow: boolean }) {\n const [draft, setDraft] = useDebouncedTextDraft(filter.value, filter.onChange);\n\n return (\n <label\n title={filter.description}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-input bg-muted/30 pl-2 pr-2 text-xs\",\n grow ? \"min-w-[12rem] max-w-[18rem] flex-1\" : \"min-w-[11rem] max-w-[15rem] shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <FilterFieldLabel icon={filter.icon} label={filter.label} />\n <input\n type=\"text\"\n aria-label={filter.label}\n className=\"w-full min-w-0 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n placeholder={filter.placeholder ?? \"Filter…\"}\n value={draft}\n disabled={filter.disabled}\n onChange={(event) => setDraft(event.target.value)}\n />\n </label>\n );\n}\n\n// FilterFieldLabel is the uppercase label shown inside inline filter shells,\n// with an optional leading glyph from the filter's `icon`.\nfunction FilterFieldLabel({ icon, label }: { icon?: LabelIconSpec; label: string }) {\n return (\n <span className=\"flex items-center gap-1 whitespace-nowrap font-medium uppercase tracking-wide text-muted-foreground\">\n <LabelIcon icon={icon} className=\"text-[13px] normal-case\" />\n {label}\n </span>\n );\n}\n\nfunction lookupFieldWidthClass(grow: boolean) {\n return grow ? \"min-w-[12rem] max-w-[18rem] flex-1\" : \"min-w-[11rem] max-w-[15rem] shrink-0\";\n}\n\nfunction LookupFilterField({ filter, grow }: { filter: FilterBarLookupFilter; grow: boolean }) {\n const [draft, setDraft] = useDebouncedTextDraft(filter.value, filter.onChange);\n\n // Date and number lookups keep their specialized inputs in the label shell;\n // text lookups use the Combobox with its own inline label.\n if (filter.inputType === \"date\" || filter.inputType === \"number\") {\n // For a date lookup with a value, surface the human-readable absolute +\n // relative form (e.g. \"Apr 15, 2026, 12:00 PM (2h ago)\") as the hover title.\n const dateTitle =\n filter.inputType === \"date\" && draft ? formatDateTimeRelative(draft) : undefined;\n return (\n <label\n title={dateTitle ?? filter.description}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-input bg-muted/30 pl-2 pr-2 text-xs\",\n lookupFieldWidthClass(grow),\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <FilterFieldLabel icon={filter.icon} label={filter.label} />\n {filter.inputType === \"date\" ? (\n <DateTimePicker\n aria-label={filter.label}\n className=\"w-full\"\n inputClassName=\"w-full min-w-0 border-0 bg-transparent px-0 pr-6 text-sm text-foreground shadow-none focus-visible:ring-0\"\n buttonClassName=\"right-0\"\n placeholder={filter.placeholder}\n value={draft}\n disabled={filter.disabled}\n onChange={setDraft}\n />\n ) : (\n <input\n type=\"number\"\n aria-label={filter.label}\n className=\"w-full min-w-0 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n placeholder={filter.placeholder}\n value={draft}\n disabled={filter.disabled}\n onChange={(event) => setDraft(event.target.value)}\n />\n )}\n </label>\n );\n }\n\n return (\n <Combobox\n label={filter.label}\n options={lookupOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n className={cn(lookupFieldWidthClass(grow), filter.className)}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction LookupMultiFilterField({\n filter,\n grow,\n}: {\n filter: FilterBarLookupMultiFilter;\n grow: boolean;\n}) {\n return (\n <Combobox\n multiple\n label={filter.label}\n options={lookupOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n className={cn(lookupFieldWidthClass(grow), filter.className)}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.onSearch !== undefined ? { onSearch: filter.onSearch } : {})}\n {...(filter.loading !== undefined ? { loading: filter.loading } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction NumberFilterField({ filter, grow }: { filter: FilterBarNumberFilter; grow: boolean }) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n\n useDismissablePopup(open, rootRef, triggerRef, () => setOpen(false));\n\n const bounds = resolveNumberFilterBounds(filter);\n const [draft, setDraft] = useDebouncedNumberDraft(filter.value, filter.onChange);\n const sliderMin = clampNumber(parseFilterNumber(draft.min) ?? bounds.min, bounds.min, bounds.max);\n const sliderMax = clampNumber(parseFilterNumber(draft.max) ?? bounds.max, bounds.min, bounds.max);\n const activeMin = Math.min(sliderMin, sliderMax);\n const activeMax = Math.max(sliderMin, sliderMax);\n const summary = summarizeNumberFilter(filter, bounds, draft);\n\n return (\n <div\n ref={rootRef}\n title={filter.description}\n className={cn(\n \"relative min-w-0\",\n grow ? \"min-w-[8rem] max-w-[12rem] flex-1\" : \"shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${filter.label} filter`}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={filter.disabled}\n onClick={() => setOpen((current) => !current)}\n className={cn(\n \"min-w-0 gap-2 font-normal\",\n grow ? \"w-full max-w-[12rem] justify-between\" : \"w-auto max-w-[9.5rem] px-2.5\",\n summary === filter.label && \"text-muted-foreground\",\n )}\n >\n <LabelIcon icon={filter.icon} className=\"text-[14px] text-muted-foreground\" />\n <span className=\"truncate\">{summary}</span>\n <Icon icon={open ? UiChevronUp : UiChevronDown} className=\"text-muted-foreground\" />\n </Button>\n\n {open && (\n <div className=\"absolute left-0 top-[calc(100%+0.375rem)] z-50 min-w-[18rem] max-w-[22rem] rounded-md border border-border bg-popover p-3 text-popover-foreground shadow-lg shadow-black/5\">\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => {\n setDraft({});\n filter.onChange({});\n }}\n disabled={!String(draft.min ?? \"\").trim() && !String(draft.max ?? \"\").trim()}\n >\n Clear all\n </button>\n </div>\n\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\n <span>{formatNumberValue(bounds.min, filter)}</span>\n <span>{formatNumberValue(bounds.max, filter)}</span>\n </div>\n <div className=\"relative h-6\">\n <RangeSlider\n min={bounds.min}\n max={bounds.max}\n step={bounds.step}\n value={[activeMin, activeMax]}\n ariaLabelMin={`${filter.label} minimum slider`}\n ariaLabelMax={`${filter.label} maximum slider`}\n onChange={([nextMin, nextMax]) =>\n setDraft(numberFilterValueFromSlider([nextMin, nextMax], bounds))\n }\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-1\">\n <label className=\"text-[10px] text-muted-foreground\">Min</label>\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={bounds.step}\n aria-label={`${filter.label} minimum`}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={filter.minPlaceholder ?? formatNumberValue(bounds.min, filter)}\n value={draft.min ?? \"\"}\n onChange={(event) =>\n setDraft(\n normalizeNumberFilterValue(\n { min: event.target.value, max: draft.max ?? \"\" },\n \"min-input\",\n ),\n )\n }\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-[10px] text-muted-foreground\">Max</label>\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={bounds.step}\n aria-label={`${filter.label} maximum`}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={filter.maxPlaceholder ?? formatNumberValue(bounds.max, filter)}\n value={draft.max ?? \"\"}\n onChange={(event) =>\n setDraft(\n normalizeNumberFilterValue(\n { min: draft.min ?? \"\", max: event.target.value },\n \"max-input\",\n ),\n )\n }\n />\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction NumberFilterPanel({\n filter,\n chrome = \"full\",\n}: {\n filter: FilterBarNumberFilter;\n chrome?: FilterBarFilterPanelChrome;\n}) {\n const bounds = resolveNumberFilterBounds(filter);\n const [draft, setDraft] = useDebouncedNumberDraft(filter.value, filter.onChange);\n const sliderMin = clampNumber(parseFilterNumber(draft.min) ?? bounds.min, bounds.min, bounds.max);\n const sliderMax = clampNumber(parseFilterNumber(draft.max) ?? bounds.max, bounds.min, bounds.max);\n const activeMin = Math.min(sliderMin, sliderMax);\n const activeMax = Math.max(sliderMin, sliderMax);\n const embedded = chrome === \"embedded\";\n\n return (\n <div\n data-filter-panel-chrome={chrome}\n className={cn(\n \"min-w-[18rem] max-w-[22rem] text-popover-foreground\",\n embedded\n ? \"p-0\"\n : \"rounded-md border border-border bg-popover p-3 shadow-sm shadow-black/5\",\n )}\n >\n {!embedded && (\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => {\n setDraft({});\n filter.onChange({});\n }}\n disabled={!String(draft.min ?? \"\").trim() && !String(draft.max ?? \"\").trim()}\n >\n Clear all\n </button>\n </div>\n )}\n\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\n <span>{formatNumberValue(bounds.min, filter)}</span>\n <span>{formatNumberValue(bounds.max, filter)}</span>\n </div>\n <div className=\"relative h-6\">\n <RangeSlider\n min={bounds.min}\n max={bounds.max}\n step={bounds.step}\n value={[activeMin, activeMax]}\n ariaLabelMin={`${filter.label} minimum slider`}\n ariaLabelMax={`${filter.label} maximum slider`}\n onChange={([nextMin, nextMax]) =>\n setDraft(numberFilterValueFromSlider([nextMin, nextMax], bounds))\n }\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-1\">\n <label className=\"text-[10px] text-muted-foreground\">Min</label>\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={bounds.step}\n aria-label={`${filter.label} minimum`}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={filter.minPlaceholder ?? formatNumberValue(bounds.min, filter)}\n value={draft.min ?? \"\"}\n onChange={(event) =>\n setDraft(\n normalizeNumberFilterValue(\n { min: event.target.value, max: draft.max ?? \"\" },\n \"min-input\",\n ),\n )\n }\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-[10px] text-muted-foreground\">Max</label>\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={bounds.step}\n aria-label={`${filter.label} maximum`}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n placeholder={filter.maxPlaceholder ?? formatNumberValue(bounds.max, filter)}\n value={draft.max ?? \"\"}\n onChange={(event) =>\n setDraft(\n normalizeNumberFilterValue(\n { min: draft.min ?? \"\", max: event.target.value },\n \"max-input\",\n ),\n )\n }\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction MultiFilterField({ filter, grow }: { filter: FilterBarMultiFilter; grow: boolean }) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const [optionQuery, setOptionQuery] = useState(\"\");\n // Options fetched via onSearch for the current query. While a query is active\n // these replace the head (plus already-toggled head items); empty otherwise.\n const [searchOptions, setSearchOptions] = useState<MultiSelectOption[]>([]);\n const [draft, setDraft] = useDebouncedMultiDraft(filter.value, filter.onChange);\n\n useDismissablePopup(open, rootRef, triggerRef, () => setOpen(false));\n\n // Debounced server-side search. Runs only when onSearch is provided; clears\n // results for an empty query so the view reverts to the head set.\n const onSearch = filter.onSearch;\n useEffect(() => {\n if (!onSearch) return;\n const query = optionQuery.trim();\n if (!query) {\n setSearchOptions([]);\n return;\n }\n let cancelled = false;\n const handle = setTimeout(() => {\n Promise.resolve(onSearch(query))\n .then((opts) => {\n if (!cancelled && Array.isArray(opts)) setSearchOptions(opts);\n })\n .catch(() => {\n if (!cancelled) setSearchOptions([]);\n });\n }, 250);\n return () => {\n cancelled = true;\n clearTimeout(handle);\n };\n }, [onSearch, optionQuery]);\n\n const summary = summarizeMultiFilter(filter.label, draft);\n // Truncated or async-searchable filters always expose the search box; small\n // static lists only get it past a threshold (matching the original behaviour).\n const showOptionFilter = filter.truncated || Boolean(onSearch) || filter.options.length > 7;\n const visibleOptions = useMemo(() => {\n const query = optionQuery.trim();\n // No query → the head set, as supplied.\n if (!query) return filter.options;\n // Server search active → the matches REPLACE the head, but any head option\n // the user has already toggled (include/exclude) stays pinned so their\n // selection remains visible and changeable. Selected first, then matches.\n if (onSearch) {\n const selectedHead = filter.options.filter((o) => draft[o.value] !== undefined);\n return mergeMultiSelectOptions(selectedHead, searchOptions);\n }\n // No server search (static/AsCode list) → client-side substring filter.\n const lowered = query.toLowerCase();\n return filter.options.filter((option) =>\n multiSelectOptionText(option).toLowerCase().includes(lowered),\n );\n }, [filter.options, searchOptions, optionQuery, onSearch, draft]);\n const moreCount =\n filter.truncated && filter.total ? Math.max(filter.total - filter.options.length, 0) : 0;\n\n return (\n <div\n ref={rootRef}\n title={filter.description}\n className={cn(\n \"relative min-w-0\",\n grow ? \"min-w-[8rem] max-w-[12rem] flex-1\" : \"shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${filter.label} filter`}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={filter.disabled}\n onClick={() => setOpen((current) => !current)}\n className={cn(\n \"min-w-0 gap-2 font-normal\",\n grow ? \"w-full max-w-[12rem] justify-between\" : \"w-auto max-w-[8.5rem] px-2.5\",\n summary === filter.label && \"text-muted-foreground\",\n )}\n >\n <LabelIcon icon={filter.icon} className=\"text-[14px] text-muted-foreground\" />\n <span className=\"truncate\">{summary}</span>\n <Icon icon={open ? UiChevronUp : UiChevronDown} className=\"text-muted-foreground\" />\n </Button>\n\n {open && (\n <div className=\"absolute left-0 top-[calc(100%+0.375rem)] z-50 min-w-[18rem] max-w-[22rem] rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => setDraft({})}\n disabled={Object.keys(draft).length === 0}\n >\n Clear all\n </button>\n </div>\n\n {showOptionFilter && (\n <div className=\"mb-2 flex items-center gap-2 rounded-md border border-input bg-background px-2\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label={`Filter ${filter.label} options`}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder={`Filter ${filter.label.toLowerCase()}`}\n value={optionQuery}\n onChange={(event) => setOptionQuery(event.target.value)}\n />\n </div>\n )}\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {visibleOptions.map((option) => {\n const mode = draft[option.value] ?? \"neutral\";\n const title = option.title ?? multiSelectOptionText(option);\n\n return (\n <div\n key={option.value}\n role=\"button\"\n tabIndex={0}\n data-filter-option={option.value}\n className=\"rounded-md px-1.5 py-0.5 hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={() =>\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)))\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)));\n }\n }}\n >\n <FilterPill\n className=\"w-full justify-between\"\n label={option.label}\n mode={mode}\n title={title}\n togglePosition=\"right\"\n onModeChange={(next) =>\n setDraft(updateMultiFilterValue(draft, option.value, next))\n }\n />\n </div>\n );\n })}\n {visibleOptions.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No options found</div>\n )}\n </div>\n\n {moreCount > 0 && !optionQuery.trim() && (\n <div className=\"mt-2 px-1.5 text-[11px] text-muted-foreground\">\n … and {moreCount.toLocaleString()} more\n {onSearch ? \" — type to search all\" : \"\"}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// mergeMultiSelectOptions concatenates two option lists, deduping by value with\n// the first list (the head) taking precedence on ordering and label.\nfunction mergeMultiSelectOptions(\n head: MultiSelectOption[],\n extra: MultiSelectOption[],\n): MultiSelectOption[] {\n if (extra.length === 0) return head;\n const seen = new Set(head.map((o) => o.value));\n const merged = [...head];\n for (const option of extra) {\n if (!seen.has(option.value)) {\n seen.add(option.value);\n merged.push(option);\n }\n }\n return merged;\n}\n\nfunction MultiFilterPanel({\n filter,\n chrome = \"full\",\n}: {\n filter: FilterBarMultiFilter;\n chrome?: FilterBarFilterPanelChrome;\n}) {\n const [optionQuery, setOptionQuery] = useState(\"\");\n const [draft, setDraft] = useDebouncedMultiDraft(filter.value, filter.onChange);\n const showOptionFilter = filter.options.length > 7;\n const embedded = chrome === \"embedded\";\n const visibleOptions = useMemo(() => {\n const query = optionQuery.trim().toLowerCase();\n if (!query) return filter.options;\n return filter.options.filter((option) =>\n multiSelectOptionText(option).toLowerCase().includes(query),\n );\n }, [filter.options, optionQuery]);\n\n return (\n <div\n data-filter-panel-chrome={chrome}\n className={cn(\n \"min-w-[18rem] max-w-[22rem] text-popover-foreground\",\n embedded\n ? \"p-0\"\n : \"rounded-md border border-border bg-popover p-2 shadow-sm shadow-black/5\",\n )}\n >\n {!embedded && (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => setDraft({})}\n disabled={Object.keys(draft).length === 0}\n >\n Clear all\n </button>\n </div>\n )}\n\n {showOptionFilter && (\n <div className=\"mb-2 flex items-center gap-2 rounded-md border border-input bg-background px-2\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label={`Filter ${filter.label} options`}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder={`Filter ${filter.label.toLowerCase()}`}\n value={optionQuery}\n onChange={(event) => setOptionQuery(event.target.value)}\n />\n </div>\n )}\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {visibleOptions.map((option) => {\n const mode = draft[option.value] ?? \"neutral\";\n const title = option.title ?? multiSelectOptionText(option);\n\n return (\n <div\n key={option.value}\n role=\"button\"\n tabIndex={0}\n data-filter-option={option.value}\n className=\"rounded-md px-1.5 py-0.5 hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={() =>\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)))\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)));\n }\n }}\n >\n <FilterPill\n className=\"w-full justify-between\"\n label={option.label}\n mode={mode}\n title={title}\n togglePosition=\"right\"\n onModeChange={(next) => setDraft(updateMultiFilterValue(draft, option.value, next))}\n />\n </div>\n );\n })}\n {visibleOptions.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No options found</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction NestedMultiFilterPanel({\n filter,\n chrome = \"full\",\n}: {\n filter: FilterBarNestedMultiFilter;\n chrome?: FilterBarFilterPanelChrome;\n}) {\n const [activeGroup, setActiveGroup] = useState<string | null>(filter.groups[0]?.groupKey ?? null);\n const [draft, setDraft] = useDebouncedMultiDraft(filter.value, filter.onChange);\n const groups = filter.groups;\n const embedded = chrome === \"embedded\";\n const activeGroupData = useMemo(\n () => groups.find((group) => group.groupKey === activeGroup) ?? groups[0] ?? null,\n [groups, activeGroup],\n );\n\n const selectedByGroup = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const group of groups) {\n let n = 0;\n for (const option of group.options) {\n if (draft[option.value]) n += 1;\n }\n counts[group.groupKey] = n;\n }\n return counts;\n }, [groups, draft]);\n\n const sortedGroups = useMemo(() => {\n const selected: typeof groups = [];\n const rest: typeof groups = [];\n for (const group of groups) {\n if ((selectedByGroup[group.groupKey] ?? 0) > 0) selected.push(group);\n else rest.push(group);\n }\n return [...selected, ...rest];\n }, [groups, selectedByGroup]);\n\n const clearGroup = (groupKey: string) => {\n const group = groups.find((g) => g.groupKey === groupKey);\n if (!group) return;\n const next = { ...draft };\n for (const option of group.options) {\n delete next[option.value];\n }\n setDraft(next);\n };\n\n return (\n <div role=\"dialog\" className=\"flex\">\n <div\n data-filter-panel-chrome={chrome}\n className={cn(\n \"min-w-[14rem] max-w-[16rem] text-popover-foreground\",\n embedded\n ? \"p-0\"\n : \"rounded-md border border-border bg-popover p-2 shadow-sm shadow-black/5\",\n )}\n >\n {!embedded && (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => setDraft({})}\n disabled={Object.keys(draft).length === 0}\n >\n Clear all\n </button>\n </div>\n )}\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {sortedGroups.map((group) => {\n const selected = selectedByGroup[group.groupKey] ?? 0;\n const isActive = group.groupKey === activeGroup;\n return (\n <div\n key={group.groupKey}\n role=\"button\"\n tabIndex={0}\n onMouseEnter={() => setActiveGroup(group.groupKey)}\n onFocus={() => setActiveGroup(group.groupKey)}\n onClick={() => setActiveGroup(group.groupKey)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"ArrowRight\") {\n event.preventDefault();\n setActiveGroup(group.groupKey);\n }\n }}\n className={cn(\n \"flex cursor-pointer items-center justify-between gap-2 rounded-md px-1.5 py-0.5 text-sm\",\n \"hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\",\n isActive && \"bg-accent/60\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{group.label ?? group.groupKey}</span>\n {selected > 0 && (\n <span className=\"rounded-full bg-primary/15 px-1.5 text-[10px] font-medium text-primary\">\n {selected}/{group.options.length}\n </span>\n )}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-muted-foreground\" />\n </div>\n );\n })}\n {groups.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No groups</div>\n )}\n </div>\n </div>\n\n {activeGroupData && (\n <div\n onMouseEnter={() => setActiveGroup(activeGroupData.groupKey)}\n className=\"ml-1.5 min-w-[16rem] max-w-[20rem] rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-sm shadow-black/5\"\n >\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {activeGroupData.label ?? activeGroupData.groupKey}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => clearGroup(activeGroupData.groupKey)}\n disabled={(selectedByGroup[activeGroupData.groupKey] ?? 0) === 0}\n >\n Clear\n </button>\n </div>\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {activeGroupData.options.map((option) => {\n const mode = draft[option.value] ?? \"neutral\";\n const title = option.title ?? multiSelectOptionText(option);\n return (\n <div\n key={option.value}\n role=\"button\"\n tabIndex={0}\n data-filter-option={option.value}\n className=\"rounded-md px-1.5 py-0.5 hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={() =>\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)))\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)));\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n setActiveGroup(null);\n }\n }}\n >\n <FilterPill\n className=\"w-full justify-between\"\n label={renderNestedOptionLabel(option, activeGroupData.groupKey)}\n mode={mode}\n title={title}\n togglePosition=\"right\"\n onModeChange={(next) =>\n setDraft(updateMultiFilterValue(draft, option.value, next))\n }\n />\n </div>\n );\n })}\n {activeGroupData.options.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No values</div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction multiSelectOptionText(option: MultiSelectOption) {\n const label = typeof option.label === \"string\" ? option.label : \"\";\n return [option.value, label, option.title ?? \"\"].filter(Boolean).join(\" \");\n}\n\nfunction NestedMultiFilterField({\n filter,\n grow,\n}: {\n filter: FilterBarNestedMultiFilter;\n grow: boolean;\n}) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const [activeGroup, setActiveGroup] = useState<string | null>(null);\n const [draft, setDraft] = useDebouncedMultiDraft(filter.value, filter.onChange);\n\n useDismissablePopup(open, rootRef, triggerRef, () => {\n setOpen(false);\n setActiveGroup(null);\n });\n\n const summary = summarizeMultiFilter(filter.label, draft);\n const groups = filter.groups;\n const activeGroupData = useMemo(\n () => groups.find((group) => group.groupKey === activeGroup) ?? null,\n [groups, activeGroup],\n );\n\n // Selected count per group, used in the outer list.\n const selectedByGroup = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const group of groups) {\n let n = 0;\n for (const option of group.options) {\n if (draft[option.value]) n += 1;\n }\n counts[group.groupKey] = n;\n }\n return counts;\n }, [groups, draft]);\n\n // Groups with active selections sort to the top so the user always sees\n // what's filtered without scrolling. Within each partition, the original\n // order from the consumer is preserved.\n const sortedGroups = useMemo(() => {\n const selected: typeof groups = [];\n const rest: typeof groups = [];\n for (const group of groups) {\n if ((selectedByGroup[group.groupKey] ?? 0) > 0) selected.push(group);\n else rest.push(group);\n }\n return [...selected, ...rest];\n }, [groups, selectedByGroup]);\n\n const clearGroup = (groupKey: string) => {\n const group = groups.find((g) => g.groupKey === groupKey);\n if (!group) return;\n const next = { ...draft };\n for (const option of group.options) {\n delete next[option.value];\n }\n setDraft(next);\n };\n\n return (\n <div\n ref={rootRef}\n title={filter.description}\n className={cn(\n \"relative min-w-0\",\n grow ? \"min-w-[8rem] max-w-[12rem] flex-1\" : \"shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${filter.label} filter`}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={filter.disabled}\n onClick={() => {\n setOpen((current) => !current);\n if (open) setActiveGroup(null);\n }}\n className={cn(\n \"min-w-0 gap-2 font-normal\",\n grow ? \"w-full max-w-[12rem] justify-between\" : \"w-auto max-w-[8.5rem] px-2.5\",\n summary === filter.label && \"text-muted-foreground\",\n )}\n >\n <span className=\"truncate\">{summary}</span>\n <Icon icon={open ? UiChevronUp : UiChevronDown} className=\"text-muted-foreground\" />\n </Button>\n\n {open && (\n <div\n role=\"dialog\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false);\n setActiveGroup(null);\n }\n }}\n className=\"absolute left-0 top-[calc(100%+0.375rem)] z-50 flex\"\n >\n <div className=\"min-w-[14rem] max-w-[16rem] rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => setDraft({})}\n disabled={Object.keys(draft).length === 0}\n >\n Clear all\n </button>\n </div>\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {sortedGroups.map((group) => {\n const selected = selectedByGroup[group.groupKey] ?? 0;\n const isActive = group.groupKey === activeGroup;\n return (\n <div\n key={group.groupKey}\n role=\"button\"\n tabIndex={0}\n onMouseEnter={() => setActiveGroup(group.groupKey)}\n onFocus={() => setActiveGroup(group.groupKey)}\n onClick={() => setActiveGroup(group.groupKey)}\n onKeyDown={(event) => {\n if (\n event.key === \"Enter\" ||\n event.key === \" \" ||\n event.key === \"ArrowRight\"\n ) {\n event.preventDefault();\n setActiveGroup(group.groupKey);\n }\n }}\n className={cn(\n \"flex cursor-pointer items-center justify-between gap-2 rounded-md px-1.5 py-0.5 text-sm\",\n \"hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\",\n isActive && \"bg-accent/60\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{group.label ?? group.groupKey}</span>\n {selected > 0 && (\n <span className=\"rounded-full bg-primary/15 px-1.5 text-[10px] font-medium text-primary\">\n {selected}/{group.options.length}\n </span>\n )}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-muted-foreground\" />\n </div>\n );\n })}\n {groups.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No groups</div>\n )}\n </div>\n </div>\n\n {activeGroupData && (\n <div\n onMouseEnter={() => setActiveGroup(activeGroupData.groupKey)}\n className=\"ml-1.5 min-w-[16rem] max-w-[20rem] rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\"\n >\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {activeGroupData.label ?? activeGroupData.groupKey}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => clearGroup(activeGroupData.groupKey)}\n disabled={(selectedByGroup[activeGroupData.groupKey] ?? 0) === 0}\n >\n Clear\n </button>\n </div>\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {activeGroupData.options.map((option) => {\n const mode = draft[option.value] ?? \"neutral\";\n const title = option.title ?? multiSelectOptionText(option);\n return (\n <div\n key={option.value}\n role=\"button\"\n tabIndex={0}\n data-filter-option={option.value}\n className=\"rounded-md px-1.5 py-0.5 hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={() =>\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)))\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setDraft(\n updateMultiFilterValue(draft, option.value, nextFilterMode(mode)),\n );\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n setActiveGroup(null);\n }\n }}\n >\n <FilterPill\n className=\"w-full justify-between\"\n // Show only the value side here — the key is already\n // implied by the parent group panel.\n label={renderNestedOptionLabel(option, activeGroupData.groupKey)}\n mode={mode}\n title={title}\n togglePosition=\"right\"\n onModeChange={(next) =>\n setDraft(updateMultiFilterValue(draft, option.value, next))\n }\n />\n </div>\n );\n })}\n {activeGroupData.options.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No values</div>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction renderNestedOptionLabel(option: MultiSelectOption, groupKey: string): ReactNode {\n // If the option label already strips the key prefix, use it. Otherwise\n // strip it here so the inner panel doesn't repeat the key on every row.\n if (typeof option.label === \"string\") {\n const prefix = `${groupKey}=`;\n if (option.label.startsWith(prefix)) return option.label.slice(prefix.length);\n return option.label;\n }\n return option.label ?? option.value;\n}\n\nfunction SelectMultiFilterField({\n filter,\n grow,\n}: {\n filter: FilterBarSelectMultiFilter;\n grow: boolean;\n}) {\n return (\n <label\n title={filter.description}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-input bg-muted/30 pl-2 pr-1 text-xs\",\n grow ? \"min-w-[12rem] max-w-[18rem] flex-1\" : \"min-w-[11rem] max-w-[15rem] shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <span className=\"whitespace-nowrap font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </span>\n <MultiSelect\n options={filter.options}\n value={filter.value}\n onChange={filter.onChange}\n placeholder={filter.placeholder ?? `Any ${filter.label.toLowerCase()}`}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n triggerClassName=\"h-6 min-w-0 border-0 bg-transparent px-1 text-xs shadow-none focus-visible:ring-0\"\n menuClassName=\"left-auto right-0\"\n />\n </label>\n );\n}\n\nfunction RangeControlButton({\n kind,\n label,\n from = \"\",\n to = \"\",\n onApply,\n presets,\n timeEnabled,\n timeZone,\n timeZones,\n fromPlaceholder,\n toPlaceholder,\n emptyLabel,\n className,\n}: FilterBarRangeProps & { kind: \"date\" | \"time\"; label: string }) {\n return (\n <TimeRange\n kind={kind}\n label={label}\n from={from}\n to={to}\n onApply={onApply}\n {...(presets ? { presets } : {})}\n {...(timeEnabled !== undefined ? { timeEnabled } : {})}\n {...(timeZone ? { timeZone } : {})}\n {...(timeZones ? { timeZones } : {})}\n {...(fromPlaceholder ? { fromPlaceholder } : {})}\n {...(toPlaceholder ? { toPlaceholder } : {})}\n {...(emptyLabel ? { emptyLabel } : {})}\n {...(className ? { className } : {})}\n />\n );\n}\n\nfunction useDismissablePopup(\n open: boolean,\n rootRef: RefObject<HTMLElement | null>,\n triggerRef: RefObject<HTMLElement | null>,\n onClose: () => void,\n) {\n useEffect(() => {\n if (!open) return;\n\n const onPointerDown = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n onClose();\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener(\"mousedown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [onClose, open, rootRef, triggerRef]);\n}\n\nfunction summarizeMultiFilter(\n label: string,\n value: Record<string, FilterBarMultiFilterMode>,\n): string {\n const includeCount = Object.values(value).filter((mode) => mode === \"include\").length;\n const excludeCount = Object.values(value).filter((mode) => mode === \"exclude\").length;\n\n if (includeCount === 0 && excludeCount === 0) {\n return label;\n }\n\n const counts = [\n includeCount > 0 ? `+${includeCount}` : null,\n excludeCount > 0 ? `-${excludeCount}` : null,\n ].filter(Boolean);\n\n return `${label} ${counts.join(\" \")}`;\n}\n\nfunction useDebouncedMultiDraft(\n value: Record<string, FilterBarMultiFilterMode>,\n onChange: (value: Record<string, FilterBarMultiFilterMode>) => void,\n) {\n const { autoSubmit } = useContext(FilterBarContext);\n const [draft, setDraft] = useState(value);\n const latestOnChange = useRef(onChange);\n\n useEffect(() => {\n latestOnChange.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n useEffect(() => {\n if (sameMultiFilterValue(draft, value)) return;\n\n if (!autoSubmit) {\n latestOnChange.current(draft);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n latestOnChange.current(draft);\n }, FILTER_INPUT_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timeoutId);\n }, [autoSubmit, draft, value]);\n\n return [draft, setDraft] as const;\n}\n\nfunction sameMultiFilterValue(\n a: Record<string, FilterBarMultiFilterMode>,\n b: Record<string, FilterBarMultiFilterMode>,\n) {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n for (const key of aKeys) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n}\n\nfunction useDebouncedTextDraft(value: string, onChange: (value: string) => void) {\n const { autoSubmit } = useContext(FilterBarContext);\n const [draft, setDraft] = useState(value);\n const latestOnChange = useRef(onChange);\n\n useEffect(() => {\n latestOnChange.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n useEffect(() => {\n if (draft === value) return;\n\n if (!autoSubmit) {\n latestOnChange.current(draft);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n latestOnChange.current(draft);\n }, FILTER_INPUT_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timeoutId);\n }, [autoSubmit, draft, value]);\n\n return [draft, setDraft] as const;\n}\n\nfunction useDebouncedNumberDraft(\n value: FilterBarNumberValue,\n onChange: (value: FilterBarNumberValue) => void,\n) {\n const { autoSubmit } = useContext(FilterBarContext);\n const [draft, setDraft] = useState(value);\n const latestOnChange = useRef(onChange);\n\n useEffect(() => {\n latestOnChange.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n setDraft(value);\n }, [value.max, value.min]);\n\n useEffect(() => {\n if (sameNumberFilterValue(draft, value)) return;\n\n if (!autoSubmit) {\n latestOnChange.current(draft);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n latestOnChange.current(draft);\n }, FILTER_INPUT_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timeoutId);\n }, [autoSubmit, draft, value]);\n\n return [draft, setDraft] as const;\n}\n\nfunction sameNumberFilterValue(left: FilterBarNumberValue, right: FilterBarNumberValue) {\n return (left.min ?? \"\") === (right.min ?? \"\") && (left.max ?? \"\") === (right.max ?? \"\");\n}\n\ntype NumberFilterBounds = {\n min: number;\n max: number;\n step: number;\n};\n\ntype NumberFilterSource = \"min-input\" | \"max-input\";\n\nfunction resolveNumberFilterBounds(filter: FilterBarNumberFilter): NumberFilterBounds {\n const parsedMin = parseFilterNumber(filter.value.min);\n const parsedMax = parseFilterNumber(filter.value.max);\n const fallbackMin = parsedMin ?? 0;\n const fallbackMax = parsedMax ?? Math.max(fallbackMin + 100, 100);\n const min = filter.domainMin ?? Math.min(fallbackMin, fallbackMax);\n const max = filter.domainMax ?? Math.max(fallbackMax, min + 100);\n const step = filter.step && filter.step > 0 ? filter.step : 1;\n\n return {\n min,\n max: max <= min ? min + step : max,\n step,\n };\n}\n\nfunction summarizeNumberFilter(\n filter: FilterBarNumberFilter,\n bounds: NumberFilterBounds,\n value: FilterBarNumberValue,\n) {\n const parsedMin = parseFilterNumber(value.min);\n const parsedMax = parseFilterNumber(value.max);\n const hasMin = String(value.min ?? \"\").trim() !== \"\";\n const hasMax = String(value.max ?? \"\").trim() !== \"\";\n\n if (!hasMin && !hasMax) {\n return filter.label;\n }\n\n const minLabel =\n parsedMin == null\n ? formatNumberValue(bounds.min, filter)\n : formatNumberValue(parsedMin, filter);\n const maxLabel =\n parsedMax == null\n ? formatNumberValue(bounds.max, filter)\n : formatNumberValue(parsedMax, filter);\n\n if (hasMin && hasMax) {\n if (minLabel === maxLabel) {\n return `${filter.label} ${minLabel}`;\n }\n return `${filter.label} ${minLabel}-${maxLabel}`;\n }\n\n if (hasMin) {\n return `${filter.label} >=${minLabel}`;\n }\n\n return `${filter.label} <=${maxLabel}`;\n}\n\nfunction normalizeNumberFilterValue(\n nextValue: FilterBarNumberValue,\n source: NumberFilterSource,\n): FilterBarNumberValue {\n let min = nextValue.min ?? \"\";\n let max = nextValue.max ?? \"\";\n\n const parsedMin = parseFilterNumber(min);\n const parsedMax = parseFilterNumber(max);\n\n if (parsedMin != null && parsedMax != null && parsedMin > parsedMax) {\n if (source.startsWith(\"min\")) {\n max = min;\n } else {\n min = max;\n }\n }\n\n return { min, max };\n}\n\nfunction numberFilterValueFromSlider(\n value: [number, number],\n bounds: NumberFilterBounds,\n): FilterBarNumberValue {\n const [min, max] = value;\n return {\n min: min <= bounds.min ? \"\" : formatRawNumber(clampNumber(min, bounds.min, bounds.max)),\n max: max >= bounds.max ? \"\" : formatRawNumber(clampNumber(max, bounds.min, bounds.max)),\n };\n}\n\nfunction parseFilterNumber(value: string | undefined) {\n if (!value?.trim()) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction clampNumber(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction formatNumberValue(value: number, filter: FilterBarNumberFilter) {\n if (filter.formatValue) {\n return filter.formatValue(value);\n }\n\n return formatRawNumber(value);\n}\n\nfunction formatRawNumber(value: number) {\n return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(6)));\n}\n\nfunction updateMultiFilterValue(\n current: Record<string, FilterBarMultiFilterMode>,\n optionValue: string,\n nextMode: FilterMode,\n): Record<string, FilterBarMultiFilterMode> {\n const next = { ...current };\n\n if (nextMode === \"neutral\") {\n delete next[optionValue];\n return next;\n }\n\n if (nextMode === \"include\" || nextMode === \"exclude\") {\n next[optionValue] = nextMode;\n }\n\n return next;\n}\n\nfunction nextFilterMode(mode: FilterMode): FilterMode {\n if (mode === \"include\") return \"exclude\";\n if (mode === \"exclude\") return \"neutral\";\n return \"include\";\n}\n\ntype FilterBarValue =\n | string\n | string[]\n | boolean\n | FilterBarNumberValue\n | Record<string, FilterBarMultiFilterMode>;\n\nfunction createFilterValueMap(filters: FilterBarFilter[]) {\n return Object.fromEntries(filters.map((filter) => [filter.key, filterBarFilterValue(filter)]));\n}\n\nfunction filterBarFilterValue(filter: FilterBarFilter): FilterBarValue {\n return filter.value;\n}\n\nfunction filterWithStagedValue(\n filter: FilterBarFilter,\n value: FilterBarValue,\n onChange: (value: FilterBarValue) => void,\n): FilterBarFilter {\n if (filter.kind === \"text\") {\n return {\n ...filter,\n value: String(value ?? \"\"),\n onChange: (next: string) => onChange(next),\n };\n }\n if (filter.kind === \"lookup\") {\n return {\n ...filter,\n value: String(value ?? \"\"),\n onChange: (next: string) => onChange(next),\n };\n }\n if (filter.kind === \"lookup-multi\") {\n return {\n ...filter,\n value: Array.isArray(value) ? value.map(String) : [],\n onChange: (next: string[]) => onChange(next),\n };\n }\n if (filter.kind === \"multi\") {\n return {\n ...filter,\n value: isMultiFilterValue(value) ? value : {},\n onChange: (next: Record<string, FilterBarMultiFilterMode>) => onChange(next),\n };\n }\n if (filter.kind === \"nested-multi\") {\n return {\n ...filter,\n value: isMultiFilterValue(value) ? value : {},\n onChange: (next: Record<string, FilterBarMultiFilterMode>) => onChange(next),\n };\n }\n if (filter.kind === \"select-multi\") {\n return {\n ...filter,\n value: Array.isArray(value) ? value.map(String) : [],\n onChange: (next: string[]) => onChange(next),\n };\n }\n if (filter.kind === \"number\") {\n return {\n ...filter,\n value: isNumberFilterValue(value) ? value : {},\n onChange: (next: FilterBarNumberValue) => onChange(next),\n };\n }\n if (filter.kind === \"enum\") {\n return {\n ...filter,\n value: String(value ?? \"\"),\n onChange: (next: string) => onChange(next),\n };\n }\n return {\n ...filter,\n value: Boolean(value),\n onChange: (next: boolean) => onChange(next),\n };\n}\n\nfunction applyStagedFilterValues(\n filters: FilterBarFilter[],\n stagedValues: Record<string, FilterBarValue>,\n) {\n for (const filter of filters) {\n const next = stagedValues[filter.key] ?? filterBarFilterValue(filter);\n if (sameFilterBarValue(filterBarFilterValue(filter), next)) continue;\n applyFilterBarValue(filter, next);\n }\n}\n\nfunction applyFilterBarValue(filter: FilterBarFilter, value: FilterBarValue) {\n if (filter.kind === \"text\" || filter.kind === \"lookup\" || filter.kind === \"enum\") {\n filter.onChange(String(value ?? \"\"));\n return;\n }\n if (filter.kind === \"lookup-multi\" || filter.kind === \"select-multi\") {\n filter.onChange(Array.isArray(value) ? value.map(String) : []);\n return;\n }\n if (filter.kind === \"number\") {\n filter.onChange(isNumberFilterValue(value) ? value : {});\n return;\n }\n if (filter.kind === \"boolean\") {\n filter.onChange(Boolean(value));\n return;\n }\n filter.onChange(isMultiFilterValue(value) ? value : {});\n}\n\nfunction sameFilterBarValue(left: FilterBarValue, right: FilterBarValue) {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction isNumberFilterValue(value: FilterBarValue): value is FilterBarNumberValue {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isMultiFilterValue(\n value: FilterBarValue,\n): value is Record<string, FilterBarMultiFilterMode> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction calculateVisibleFilterCount(widths: number[], availableWidth: number) {\n if (widths.length === 0) return 0;\n\n let used = 0;\n let count = 0;\n for (const width of widths) {\n const nextUsed = used + (count > 0 ? FILTER_BAR_GAP_PX : 0) + width;\n if (nextUsed > availableWidth) break;\n used = nextUsed;\n count += 1;\n }\n return count;\n}\n\nfunction sumFilterWidths(widths: number[]) {\n if (widths.length === 0) return 0;\n return (\n widths.reduce((total, width) => total + width, 0) + (widths.length - 1) * FILTER_BAR_GAP_PX\n );\n}\n\nfunction estimateFilterWidth(filter: FilterBarFilter) {\n if (filter.kind === \"boolean\") return Math.max(88, filter.label.length * 8 + 40);\n if (filter.kind === \"multi\" || filter.kind === \"nested-multi\") return 136;\n if (filter.kind === \"number\") return 152;\n return Math.max(144, filter.label.length * 8 + 96);\n}\n"],"names":["createContext","useMemo","useRef","useState","useLayoutEffect","useCallback","useEffect","isFilterBarFilterActive","jsx","jsxs","cn","Button","Fragment","Icon","UiFilter","clearFilterBarFilter","UiClose","LabelIcon","DateTimePicker","Combobox","MultiSelect","TimeRange","UiSearch","formatDateTimeRelative","UiChevronUp","UiChevronDown","RangeSlider","FilterPill","UiChevronRight","useContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterBar.cjs","sources":["../../src/components/FilterBar.tsx"],"sourcesContent":["import {\n cloneElement,\n isValidElement,\n useCallback,\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { FilterPill, type FilterMode } from \"../data/FilterPill\";\nimport { clearFilterBarFilter, isFilterBarFilterActive } from \"./filter-bar-utils\";\nimport { Icon, LabelIcon, type LabelIconSpec } from \"../data/Icon\";\nimport { formatDateTimeRelative } from \"../data/cells/timestamp-format\";\nimport { UiChevronDown, UiChevronRight, UiChevronUp, UiClose, UiFilter, UiSearch } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Combobox, type ComboboxOption } from \"./Combobox\";\nimport { DateTimePicker } from \"./DateTimePicker\";\nimport { MultiSelect, type MultiSelectOption } from \"./MultiSelect\";\nimport { RangeSlider } from \"./RangeSlider\";\nimport { TimeRange, type TimeRangePresetGroup } from \"./TimeRange\";\n\nconst FILTER_INPUT_DEBOUNCE_MS = 500;\nconst FILTER_BAR_GAP_PX = 8;\nconst FILTER_BAR_OVERFLOW_TRIGGER_ESTIMATE_PX = 44;\n\n// When `autoSubmit` is false, debounced fields forward their draft value\n// immediately (no timer) so the consumer can accumulate state locally and\n// fire one request when Apply is clicked. When true (default) fields debounce\n// upstream, matching the live-filter behaviour used in trace/log UIs.\nconst FilterBarContext = createContext<{ autoSubmit: boolean }>({\n autoSubmit: true,\n});\n\nexport type FilterBarSearchProps = {\n /** Controlled search text. */\n value: string;\n /** Called with the next search text. Debounced when `autoSubmit` is true. */\n onChange: (value: string) => void;\n /** Placeholder shown in the search input. */\n placeholder?: string;\n /** Accessible label for the search input. */\n ariaLabel?: string;\n /** Classes applied to the search input. */\n className?: string;\n};\n\nexport type FilterBarTextFilter = {\n /** Stable filter key used for rendering and overflow measurement. */\n key: string;\n /** Renders a free-text input. */\n kind: \"text\";\n /** Filter label shown on the control. */\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n /** Optional helper text shown in filter popovers. */\n description?: string;\n /** Controlled input value. */\n value: string;\n /** Called with the next input value. */\n onChange: (value: string) => void;\n /** Placeholder shown in the input. */\n placeholder?: string;\n /** Disables this filter. */\n disabled?: boolean;\n /** Classes applied to this filter control. */\n className?: string;\n};\n\nexport type FilterBarLookupOption = {\n /** Option value written to filter state. */\n value: string;\n /** Optional display label; falls back to `value`. */\n label?: string;\n /** Prevents choosing the option. */\n disabled?: boolean;\n /** Optional browser tooltip. */\n title?: string;\n};\n\nexport type FilterBarLookupInputType = \"text\" | \"number\" | \"date\";\n\nexport type FilterBarLookupFilter = {\n key: string;\n /** Renders an input backed by a datalist-style option set. */\n kind: \"lookup\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled selected or typed value. */\n value: string;\n /** Suggestions for the lookup input. */\n options: FilterBarLookupOption[];\n onChange: (value: string) => void;\n placeholder?: string;\n /** Native input type for the lookup field. */\n inputType?: FilterBarLookupInputType;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarLookupMultiFilter = {\n key: string;\n /** Renders a multi-value lookup filter. */\n kind: \"lookup-multi\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled selected values. */\n value: string[];\n /** Suggestions for the lookup input. */\n options: FilterBarLookupOption[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n /**\n * Optional async search invoked (debounced) as the user types; the consumer\n * fetches matching options and feeds them back via `options`. When set, the\n * typeahead is server-driven (results replace the list); when absent it\n * filters the static `options` client-side.\n */\n onSearch?: (query: string) => void;\n /** Shows a loading indicator while a search is in flight. */\n loading?: boolean;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarMultiFilterMode = Extract<FilterMode, \"include\" | \"exclude\">;\n\nexport type FilterBarMultiFilter = {\n key: string;\n /** Renders include/exclude chips for each option. */\n kind: \"multi\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Map of option value to include/exclude state. */\n value: Record<string, FilterBarMultiFilterMode>;\n /** Available chip options. When `truncated`, this is only the head set. */\n options: MultiSelectOption[];\n onChange: (value: Record<string, FilterBarMultiFilterMode>) => void;\n /**\n * True when more options exist than are in `options` (the option set was\n * capped server-side). Renders an \"… and N more\" hint and, with `onSearch`,\n * lets the user search the full set.\n */\n truncated?: boolean;\n /** True distinct count behind a truncated option set; drives the \"N more\" label. */\n total?: number;\n /**\n * Optional async fetch invoked (debounced) as the user types in the option\n * search box. Returns the options matching the query, which are merged into\n * the displayed list so values beyond the head become selectable. When\n * absent, the search box filters the static `options` client-side only.\n */\n onSearch?: (query: string) => Promise<MultiSelectOption[]> | void;\n /**\n * Lets the user commit a value absent from `options` (a free-typed name or a\n * `*` wildcard). The option search box stays visible and an \"Add\" row appears\n * when the query matches no listed option; committed customs pin to the top so\n * they stay toggleable. Use for MatchItem-style filters (table/login patterns).\n */\n allowCustomValue?: boolean;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarNestedMultiGroup = {\n /** Stable group id. */\n groupKey: string;\n /** Optional visible group label. */\n label?: string;\n /** Options in this group. */\n options: MultiSelectOption[];\n};\n\nexport type FilterBarNestedMultiFilter = {\n key: string;\n /** Renders grouped include/exclude chips. */\n kind: \"nested-multi\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n // Same wire shape as FilterBarMultiFilter so consumers can swap kinds\n // without changing their state slot.\n value: Record<string, FilterBarMultiFilterMode>;\n groups: FilterBarNestedMultiGroup[];\n onChange: (value: Record<string, FilterBarMultiFilterMode>) => void;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarSelectMultiFilter = {\n key: string;\n /** Renders a compact multi-select dropdown. */\n kind: \"select-multi\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled selected values. */\n value: string[];\n /** Available dropdown options. */\n options: MultiSelectOption[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarNumberValue = {\n /** Minimum bound as a string so callers can preserve draft input. */\n min?: string;\n /** Maximum bound as a string so callers can preserve draft input. */\n max?: string;\n};\n\nexport type FilterBarNumberFilter = {\n key: string;\n /** Renders paired min/max numeric controls. */\n kind: \"number\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled min/max value. */\n value: FilterBarNumberValue;\n onChange: (value: FilterBarNumberValue) => void;\n /** Lower bound used by the optional range slider. */\n domainMin?: number;\n /** Upper bound used by the optional range slider. */\n domainMax?: number;\n /** Step size for number inputs and slider movement. */\n step?: number;\n /** Formatter used for slider labels. */\n formatValue?: (value: number) => string;\n minPlaceholder?: string;\n maxPlaceholder?: string;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarEnumFilter = {\n key: string;\n /** Renders a single-select dropdown. */\n kind: \"enum\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled selected value. */\n value: string;\n /** Available enum options. */\n options: Array<{ value: string; label?: string }>;\n onChange: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarBooleanFilter = {\n key: string;\n /** Renders a boolean toggle. */\n kind: \"boolean\";\n label: string;\n /** Leading glyph shown before the label: a runtime icon name or a node. */\n icon?: LabelIconSpec;\n description?: string;\n /** Controlled checked state. */\n value: boolean;\n onChange: (value: boolean) => void;\n disabled?: boolean;\n className?: string;\n};\n\nexport type FilterBarFilter =\n | FilterBarTextFilter\n | FilterBarLookupFilter\n | FilterBarLookupMultiFilter\n | FilterBarMultiFilter\n | FilterBarNestedMultiFilter\n | FilterBarSelectMultiFilter\n | FilterBarNumberFilter\n | FilterBarEnumFilter\n | FilterBarBooleanFilter;\n\n// FilterExtension decorates a resolved filter before it renders — the FilterBar\n// analogue of JsonSchemaForm's PreExtension. Consumers compose these in array\n// order (each sees the prior's output) to stamp domain-specific touches such as\n// an entity `icon` keyed on the filter's name, keeping FilterBar domain-agnostic.\nexport type FilterExtension = (filter: FilterBarFilter) => FilterBarFilter;\n\n// applyFilterExtensions runs a filter through the composed extension stack.\nexport function applyFilterExtensions(\n filter: FilterBarFilter,\n extensions: FilterExtension[] | undefined,\n): FilterBarFilter {\n if (!extensions || extensions.length === 0) return filter;\n return extensions.reduce((current, ext) => ext(current), filter);\n}\n\nexport type FilterBarRangePreset = {\n /** Visible preset label. */\n label: string;\n /** Start value applied by the preset. */\n from: string;\n /** End value applied by the preset. */\n to: string;\n};\n\nexport type FilterBarRangeProps = {\n /** Current start value. */\n from?: string;\n /** Current end value. */\n to?: string;\n /** Called when the user applies the range. */\n onApply: (from: string, to: string) => void;\n /** Presets or preset groups shown in the range popup. */\n presets?: Array<FilterBarRangePreset | TimeRangePresetGroup>;\n /** Enables time inputs when using date-time values. */\n timeEnabled?: boolean;\n /** Selected timezone. */\n timeZone?: string;\n /** Available timezone options. */\n timeZones?: string[];\n fromPlaceholder?: string;\n toPlaceholder?: string;\n emptyLabel?: string;\n className?: string;\n};\n\nexport type FilterBarProps = {\n /** Optional global search control shown first. */\n search?: FilterBarSearchProps;\n /** Structured filters rendered after search. */\n filters?: FilterBarFilter[];\n /** Date-time range control. */\n timeRange?: FilterBarRangeProps;\n /** Date-only range control. */\n dateRange?: FilterBarRangeProps;\n /** Additional content rendered in the filter row. */\n children?: ReactNode;\n /** Content rendered before search and filters. */\n leading?: ReactNode;\n /** Content rendered at the end of the bar. */\n trailing?: ReactNode;\n /** Classes applied to the root bar. */\n className?: string;\n /**\n * When false, debounced fields forward edits immediately and an Apply button\n * is rendered in the trailing slot. Defaults to true.\n */\n autoSubmit?: boolean;\n /** Called by the Apply button when `autoSubmit` is false. */\n onApply?: () => void;\n /** Label for the Apply button. */\n applyLabel?: string;\n /** Shows a pending state on the Apply button. */\n isPending?: boolean;\n /** `responsive` moves hidden filters into an overflow popover; `wrap` lets them wrap. */\n overflowMode?: \"responsive\" | \"wrap\";\n};\n\nexport function FilterBar({\n search,\n filters,\n timeRange,\n dateRange,\n children,\n leading,\n trailing,\n className,\n autoSubmit = true,\n onApply,\n applyLabel = \"Apply\",\n isPending = false,\n overflowMode = \"responsive\",\n}: FilterBarProps) {\n const hasRangeControls = Boolean(timeRange || dateRange);\n const showApply = !autoSubmit && !!onApply;\n const contextValue = useMemo(() => ({ autoSubmit }), [autoSubmit]);\n const allFilters = filters ?? [];\n const responsiveOverflow = overflowMode === \"responsive\" && allFilters.length > 0;\n const filterListRef = useRef<HTMLDivElement>(null);\n const overflowTriggerRef = useRef<HTMLButtonElement>(null);\n const filterNodeRefs = useRef(new Map<string, HTMLDivElement>());\n const filterWidthCache = useRef(new Map<string, number>());\n const filterKeys = useMemo(\n () => allFilters.map((filter) => filter.key).join(\"\\u0000\"),\n [allFilters],\n );\n const [visibleFilterCount, setVisibleFilterCount] = useState(allFilters.length);\n\n // Latest-value refs so measureOverflow can be a stable useCallback. Reading\n // the current values through refs sidesteps the closure-staleness problem\n // without putting array references in the dep list — which is what caused\n // the \"Maximum update depth exceeded\" cascade (allFilters in the deps made\n // measureOverflow change on every render → ResizeObserver effect re-ran →\n // setVisibleFilterCount fired → repeat).\n const allFiltersRef = useRef(allFilters);\n const responsiveOverflowRef = useRef(responsiveOverflow);\n allFiltersRef.current = allFilters;\n responsiveOverflowRef.current = responsiveOverflow;\n\n useLayoutEffect(() => {\n setVisibleFilterCount(allFiltersRef.current.length);\n }, [filterKeys]);\n\n const measureOverflow = useCallback(() => {\n const current = allFiltersRef.current;\n if (!responsiveOverflowRef.current) {\n setVisibleFilterCount(current.length);\n return;\n }\n\n const filterList = filterListRef.current;\n if (!filterList) return;\n\n const availableWidth = Math.floor(filterList.getBoundingClientRect().width);\n if (availableWidth <= 0) return;\n\n const widths = current.map((filter) => {\n const node = filterNodeRefs.current.get(filter.key);\n const measured = node?.getBoundingClientRect().width ?? 0;\n if (measured > 0) {\n const width = Math.ceil(measured);\n filterWidthCache.current.set(filter.key, width);\n return width;\n }\n return filterWidthCache.current.get(filter.key) ?? estimateFilterWidth(filter);\n });\n\n const triggerWidth = Math.ceil(\n overflowTriggerRef.current?.getBoundingClientRect().width ??\n FILTER_BAR_OVERFLOW_TRIGGER_ESTIMATE_PX,\n );\n const triggerGap = triggerWidth > 0 ? FILTER_BAR_GAP_PX : 0;\n const allFiltersWidth = sumFilterWidths(widths);\n const nextVisible =\n allFiltersWidth <= availableWidth\n ? current.length\n : calculateVisibleFilterCount(\n widths,\n Math.max(0, availableWidth - triggerWidth - triggerGap),\n );\n setVisibleFilterCount((prev) => (prev === nextVisible ? prev : nextVisible));\n }, []);\n\n useLayoutEffect(() => {\n measureOverflow();\n }, [measureOverflow]);\n\n useEffect(() => {\n if (!responsiveOverflow) return;\n\n const filterList = filterListRef.current;\n const trigger = overflowTriggerRef.current;\n const ResizeObserverCtor = typeof ResizeObserver === \"undefined\" ? null : ResizeObserver;\n\n if (!ResizeObserverCtor) {\n window.addEventListener(\"resize\", measureOverflow);\n measureOverflow();\n return () => window.removeEventListener(\"resize\", measureOverflow);\n }\n\n const observer = new ResizeObserverCtor(() => measureOverflow());\n if (filterList) observer.observe(filterList);\n if (trigger) observer.observe(trigger);\n window.addEventListener(\"resize\", measureOverflow);\n measureOverflow();\n\n return () => {\n observer.disconnect();\n window.removeEventListener(\"resize\", measureOverflow);\n };\n }, [measureOverflow, responsiveOverflow]);\n\n const inlineFilters = responsiveOverflow\n ? allFilters.slice(0, Math.min(visibleFilterCount, allFilters.length))\n : allFilters;\n const overflowFilters = responsiveOverflow\n ? allFilters.slice(Math.min(visibleFilterCount, allFilters.length))\n : [];\n const activeOverflowCount = overflowFilters.filter(isFilterBarFilterActive).length;\n\n const setFilterNode = useCallback((key: string, node: HTMLDivElement | null) => {\n if (!node) {\n filterNodeRefs.current.delete(key);\n return;\n }\n filterNodeRefs.current.set(key, node);\n }, []);\n\n return (\n <FilterBarContext.Provider value={contextValue}>\n <div\n className={cn(\n \"flex flex-nowrap items-center gap-2 overflow-visible rounded-lg border border-input bg-background px-2 py-1.5 shadow-sm\",\n overflowMode === \"wrap\" && \"flex-wrap\",\n className,\n )}\n >\n {leading && <div className=\"flex shrink-0 items-center gap-2\">{leading}</div>}\n\n {search && <SearchField search={search} />}\n\n {children}\n\n {allFilters.length > 0 && (\n <div\n ref={filterListRef}\n data-filter-bar-list\n className={cn(\n \"flex min-w-0 items-center gap-2\",\n overflowMode === \"wrap\" ? \"flex-wrap\" : \"flex-1\",\n )}\n >\n {inlineFilters.map((filter, index) => (\n <div\n key={filter.key}\n ref={(node) => setFilterNode(filter.key, node)}\n data-filter-bar-item={filter.key}\n className=\"min-w-0 shrink-0\"\n >\n {renderFilterField(filter, !search && index === 0)}\n </div>\n ))}\n </div>\n )}\n\n {responsiveOverflow && overflowFilters.length > 0 && (\n <OverflowFiltersMenu\n triggerRef={overflowTriggerRef}\n filters={overflowFilters}\n activeHidden={activeOverflowCount}\n {...(onApply ? { onApply } : {})}\n />\n )}\n\n {(hasRangeControls || trailing || showApply) && (\n <div className=\"ml-auto flex shrink-0 flex-nowrap items-center gap-2\">\n {dateRange && <RangeControlButton kind=\"date\" label=\"Date range\" {...dateRange} />}\n {timeRange && <RangeControlButton kind=\"time\" label=\"Time range\" {...timeRange} />}\n {trailing}\n {showApply && (\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isPending}\n onClick={onApply}\n >\n {isPending ? \"Loading…\" : applyLabel}\n </Button>\n )}\n </div>\n )}\n </div>\n </FilterBarContext.Provider>\n );\n}\n\ntype FilterBarFilterPanelChrome = \"full\" | \"embedded\";\n\nexport function FilterBarFilterPanel({\n filter,\n chrome = \"full\",\n autoSubmit = true,\n}: {\n filter: FilterBarFilter;\n chrome?: FilterBarFilterPanelChrome;\n autoSubmit?: boolean;\n}) {\n const contextValue = useMemo(() => ({ autoSubmit }), [autoSubmit]);\n\n return (\n <FilterBarContext.Provider value={contextValue}>\n <FilterBarFilterPanelContent filter={filter} chrome={chrome} />\n </FilterBarContext.Provider>\n );\n}\n\nfunction FilterBarFilterPanelContent({\n filter,\n chrome = \"full\",\n}: {\n filter: FilterBarFilter;\n chrome?: FilterBarFilterPanelChrome;\n}) {\n return (\n <>\n {filter.kind === \"lookup\" && <LookupFilterField filter={filter} grow />}\n {filter.kind === \"lookup-multi\" && <LookupMultiFilterField filter={filter} grow />}\n {filter.kind === \"multi\" && <MultiFilterPanel filter={filter} chrome={chrome} />}\n {filter.kind === \"nested-multi\" && <NestedMultiFilterPanel filter={filter} chrome={chrome} />}\n {filter.kind === \"select-multi\" && <SelectMultiFilterField filter={filter} grow />}\n {filter.kind === \"number\" && <NumberFilterPanel filter={filter} chrome={chrome} />}\n {filter.kind === \"enum\" && <EnumFilterField filter={filter} grow />}\n {filter.kind === \"boolean\" && <BooleanFilterField filter={filter} />}\n {filter.kind === \"text\" && <TextFilterField filter={filter} grow />}\n </>\n );\n}\n\nfunction renderFilterField(filter: FilterBarFilter, grow: boolean) {\n if (filter.kind === \"lookup\") {\n return <LookupFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"lookup-multi\") {\n return <LookupMultiFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"multi\") {\n return <MultiFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"nested-multi\") {\n return <NestedMultiFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"select-multi\") {\n return <SelectMultiFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"number\") {\n return <NumberFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"enum\") {\n return <EnumFilterField filter={filter} grow={grow} />;\n }\n\n if (filter.kind === \"boolean\") {\n return <BooleanFilterField filter={filter} />;\n }\n\n return <TextFilterField filter={filter} grow={grow} />;\n}\n\nfunction OverflowFiltersMenu({\n triggerRef,\n filters,\n activeHidden,\n onApply,\n}: {\n triggerRef: RefObject<HTMLButtonElement>;\n filters: FilterBarFilter[];\n activeHidden: number;\n onApply?: () => void;\n}) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [stagedValues, setStagedValues] = useState<Record<string, FilterBarValue>>({});\n const hasHidden = filters.length > 0;\n const hiddenFilterKeys = useMemo(\n () => filters.map((filter) => filter.key).join(\"\\u0000\"),\n [filters],\n );\n const openOverflowMenu = useCallback(() => {\n setStagedValues(createFilterValueMap(filters));\n setOpen(true);\n }, [filters]);\n const closeOverflowMenu = useCallback(() => {\n setStagedValues(createFilterValueMap(filters));\n setOpen(false);\n }, [filters]);\n\n useDismissablePopup(open, rootRef, triggerRef, closeOverflowMenu);\n\n useEffect(() => {\n if (!hasHidden) closeOverflowMenu();\n }, [closeOverflowMenu, hasHidden]);\n\n useEffect(() => {\n if (!open) return;\n setStagedValues(createFilterValueMap(filters));\n }, [hiddenFilterKeys, open]);\n\n const stagedFilters = filters.map((filter) =>\n filterWithStagedValue(\n filter,\n stagedValues[filter.key] ?? filterBarFilterValue(filter),\n (next) =>\n setStagedValues((current) => ({\n ...current,\n [filter.key]: next,\n })),\n ),\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\"relative shrink-0\", !hasHidden && \"invisible pointer-events-none\")}\n aria-hidden={!hasHidden || undefined}\n >\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"More filters\"\n aria-haspopup=\"dialog\"\n aria-expanded={hasHidden ? open : false}\n tabIndex={hasHidden ? 0 : -1}\n title={hasHidden ? \"More filters\" : undefined}\n onClick={() => {\n if (!hasHidden) return;\n if (open) {\n closeOverflowMenu();\n } else {\n openOverflowMenu();\n }\n }}\n className={cn(\n \"h-8 min-w-0 gap-1.5 px-2 text-xs font-normal\",\n activeHidden > 0 && \"border-primary/40 text-primary\",\n )}\n >\n <Icon icon={UiFilter} className=\"text-[14px]\" />\n {activeHidden > 0 && (\n <span className=\"rounded-full bg-muted px-1.5 text-[10px] font-medium text-muted-foreground\">\n {activeHidden}\n </span>\n )}\n </Button>\n\n {hasHidden && open && (\n <div\n role=\"dialog\"\n aria-label=\"Overflow filters\"\n className=\"absolute right-0 top-[calc(100%+0.375rem)] z-50 w-[min(34rem,calc(100vw-2rem))] overflow-visible rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\"\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"mb-2 flex items-center justify-between gap-2 px-1\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Filters\n </div>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n className=\"rounded px-1.5 py-0.5 text-xs text-primary transition-colors hover:bg-accent focus:bg-accent focus:outline-none disabled:text-muted-foreground\"\n onClick={() => stagedFilters.forEach(clearFilterBarFilter)}\n disabled={stagedFilters.every((filter) => !isFilterBarFilterActive(filter))}\n >\n Clear all\n </button>\n <button\n type=\"button\"\n aria-label=\"Close overflow filters\"\n title=\"Close\"\n className=\"inline-flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\"\n onClick={closeOverflowMenu}\n >\n <Icon icon={UiClose} className=\"text-sm\" />\n </button>\n </div>\n </div>\n <div className=\"divide-y divide-border/70 rounded-md border border-border/70\">\n {stagedFilters.map((filter) => {\n const active = isFilterBarFilterActive(filter);\n return (\n <div\n key={filter.key}\n data-overflow-filter-row={filter.key}\n className=\"grid h-12 grid-cols-[minmax(7rem,10rem)_auto_minmax(0,1fr)_auto] items-center gap-2 overflow-visible p-2\"\n >\n <label\n htmlFor={filterInputId(filter)}\n className=\"flex min-w-0 items-center gap-1 truncate text-[10px] font-medium uppercase tracking-wide text-muted-foreground\"\n title={filter.description ?? filter.label}\n >\n <LabelIcon\n icon={sizedIcon(filter.icon, 12)}\n className=\"text-[12px] normal-case\"\n />\n <span className=\"truncate\">{filter.label}</span>\n </label>\n <span className=\"text-sm text-muted-foreground\">=</span>\n <div className=\"min-w-0 overflow-visible\">\n <FilterBarContext.Provider value={{ autoSubmit: false }}>\n <FilterBarKeyValueControl filter={filter} />\n </FilterBarContext.Provider>\n </div>\n <button\n type=\"button\"\n aria-label={`Clear ${filter.label}`}\n title={`Clear ${filter.label}`}\n className=\"inline-flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none disabled:text-muted-foreground/40\"\n onClick={() => clearFilterBarFilter(filter)}\n disabled={!active}\n >\n <Icon icon={UiClose} className=\"text-sm\" />\n </button>\n </div>\n );\n })}\n </div>\n <div className=\"mt-3 flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-3 text-xs\"\n onClick={closeOverflowMenu}\n >\n Close\n </Button>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n className=\"h-8 px-3 text-xs\"\n onClick={() => {\n applyStagedFilterValues(filters, stagedValues);\n onApply?.();\n setOpen(false);\n }}\n >\n Apply\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction FilterBarKeyValueControl({ filter }: { filter: FilterBarFilter }) {\n if (filter.kind === \"text\") {\n return <TextFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"lookup\") {\n return <LookupFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"lookup-multi\") {\n return <LookupMultiFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"enum\") {\n return <EnumFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"boolean\") {\n return <BooleanFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"select-multi\") {\n return <SelectMultiFilterValueControl filter={filter} />;\n }\n if (filter.kind === \"multi\") {\n return <MultiFilterField filter={filter} grow />;\n }\n if (filter.kind === \"nested-multi\") {\n return <NestedMultiFilterField filter={filter} grow />;\n }\n return <NumberFilterField filter={filter} grow />;\n}\n\nfunction filterInputId(filter: FilterBarFilter) {\n return `filterbar-overflow-${filter.key}`;\n}\n\nfunction lookupOptionsToCombobox(options: FilterBarLookupOption[]): ComboboxOption[] {\n return options.map((option) => ({\n value: option.value,\n label: option.label ?? option.value,\n ...(option.disabled !== undefined ? { disabled: option.disabled } : {}),\n }));\n}\n\nfunction valueInputClassName(disabled?: boolean) {\n return cn(\n \"h-8 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring\",\n disabled && \"cursor-not-allowed opacity-60\",\n );\n}\n\nfunction TextFilterValueControl({ filter }: { filter: FilterBarTextFilter }) {\n const [draft, setDraft] = useDebouncedTextDraft(filter.value, filter.onChange);\n\n return (\n <input\n id={filterInputId(filter)}\n type=\"text\"\n aria-label={filter.label}\n className={valueInputClassName(filter.disabled)}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n value={draft}\n disabled={filter.disabled}\n onChange={(event) => setDraft(event.target.value)}\n />\n );\n}\n\nfunction LookupFilterValueControl({ filter }: { filter: FilterBarLookupFilter }) {\n const [draft, setDraft] = useDebouncedTextDraft(filter.value, filter.onChange);\n\n if (filter.inputType === \"date\") {\n return (\n <DateTimePicker\n id={filterInputId(filter)}\n aria-label={filter.label}\n className=\"w-full\"\n inputClassName={valueInputClassName(filter.disabled)}\n buttonClassName=\"right-1\"\n placeholder={filter.placeholder}\n value={draft}\n disabled={filter.disabled}\n onChange={setDraft}\n />\n );\n }\n\n if (filter.inputType === \"number\") {\n return (\n <input\n id={filterInputId(filter)}\n type=\"number\"\n aria-label={filter.label}\n className={valueInputClassName(filter.disabled)}\n placeholder={filter.placeholder}\n value={draft}\n disabled={filter.disabled}\n onChange={(event) => setDraft(event.target.value)}\n />\n );\n }\n\n // The overflow panel renders the filter label as a separate row header, so\n // the Combobox here omits its own inline label to avoid duplication.\n return (\n <Combobox\n id={filterInputId(filter)}\n options={lookupOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n className=\"w-full\"\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction LookupMultiFilterValueControl({ filter }: { filter: FilterBarLookupMultiFilter }) {\n return (\n <Combobox\n multiple\n id={filterInputId(filter)}\n options={lookupOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n className=\"w-full\"\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction enumOptionsToCombobox(\n options: FilterBarEnumFilter[\"options\"],\n): ComboboxOption[] {\n return options.map((option) => ({\n value: option.value,\n label: option.label ?? option.value,\n }));\n}\n\nfunction EnumFilterValueControl({ filter }: { filter: FilterBarEnumFilter }) {\n return (\n <Combobox\n id={filterInputId(filter)}\n options={enumOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n className=\"w-full\"\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction BooleanFilterValueControl({ filter }: { filter: FilterBarBooleanFilter }) {\n return (\n <div className=\"flex h-8 items-center\">\n <input\n id={filterInputId(filter)}\n type=\"checkbox\"\n aria-label={filter.label}\n className=\"h-4 w-4 accent-primary\"\n checked={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.checked)}\n />\n </div>\n );\n}\n\nfunction SelectMultiFilterValueControl({ filter }: { filter: FilterBarSelectMultiFilter }) {\n return (\n <MultiSelect\n options={filter.options}\n value={filter.value}\n onChange={filter.onChange}\n ariaLabel={`${filter.label} filter`}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n triggerClassName=\"h-8 w-full rounded-md border border-input bg-background px-2 text-sm shadow-none\"\n menuClassName=\"left-auto right-0\"\n />\n );\n}\n\nexport function FilterBarRangePanel({\n kind,\n label,\n from = \"\",\n to = \"\",\n onApply,\n presets,\n timeEnabled,\n timeZone,\n timeZones,\n fromPlaceholder,\n toPlaceholder,\n emptyLabel,\n}: FilterBarRangeProps & { kind: \"date\" | \"time\"; label: string }) {\n return (\n <div className=\"w-72 p-3 text-popover-foreground\">\n <TimeRange\n kind={kind}\n label={label}\n align=\"left\"\n from={from}\n to={to}\n onApply={onApply}\n {...(presets ? { presets } : {})}\n {...(timeEnabled !== undefined ? { timeEnabled } : {})}\n {...(timeZone ? { timeZone } : {})}\n {...(timeZones ? { timeZones } : {})}\n {...(fromPlaceholder ? { fromPlaceholder } : {})}\n {...(toPlaceholder ? { toPlaceholder } : {})}\n {...(emptyLabel ? { emptyLabel } : {})}\n panelClassName=\"left-0 right-auto\"\n />\n </div>\n );\n}\n\nfunction EnumFilterField({ filter, grow }: { filter: FilterBarEnumFilter; grow: boolean }) {\n return (\n <Combobox\n {...comboboxLabelProps(filter)}\n options={enumOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n className={cn(lookupFieldWidthClass(grow), filter.className)}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction BooleanFilterField({ filter }: { filter: FilterBarBooleanFilter }) {\n return (\n <label\n title={filter.description}\n className={cn(\n \"flex h-8 shrink-0 items-center gap-2 rounded-md border border-input bg-muted/30 px-2 text-xs\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <input\n type=\"checkbox\"\n aria-label={filter.label}\n className=\"h-3.5 w-3.5 accent-primary\"\n checked={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.checked)}\n />\n <FilterFieldLabel icon={filter.icon} label={filter.label} />\n </label>\n );\n}\n\nfunction SearchField({ search }: { search: FilterBarSearchProps }) {\n const [draft, setDraft] = useDebouncedTextDraft(search.value, search.onChange);\n\n return (\n <div className=\"flex min-w-[14rem] max-w-[24rem] flex-1 items-center gap-2\">\n <label\n className={cn(\n \"flex h-8 min-w-0 flex-1 items-center rounded-md border border-input bg-background px-3 text-sm\",\n search.className,\n )}\n >\n {draft.trim() ? (\n <span className=\"mr-2 whitespace-nowrap text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {search.ariaLabel ?? \"Search\"}\n </span>\n ) : (\n <Icon icon={UiSearch} className=\"mr-2 shrink-0 text-muted-foreground\" />\n )}\n <input\n type=\"search\"\n aria-label={search.ariaLabel ?? search.placeholder ?? \"Search\"}\n className=\"w-full bg-transparent outline-none placeholder:text-muted-foreground\"\n placeholder={search.placeholder ?? \"Search…\"}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n />\n </label>\n </div>\n );\n}\n\nfunction TextFilterField({ filter, grow }: { filter: FilterBarTextFilter; grow: boolean }) {\n const [draft, setDraft] = useDebouncedTextDraft(filter.value, filter.onChange);\n\n return (\n <label\n title={filter.description}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-input bg-muted/30 pl-2 pr-2 text-xs\",\n grow ? \"min-w-[12rem] max-w-[18rem] flex-1\" : \"min-w-[11rem] max-w-[15rem] shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <FilterFieldLabel icon={filter.icon} label={filter.label} />\n <input\n type=\"text\"\n aria-label={filter.label}\n className=\"w-full min-w-0 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n value={draft}\n disabled={filter.disabled}\n onChange={(event) => setDraft(event.target.value)}\n />\n </label>\n );\n}\n\n// FilterFieldLabel is the uppercase label shown inside inline filter shells,\n// with an optional leading glyph from the filter's `icon`.\nfunction FilterFieldLabel({ icon, label }: { icon?: LabelIconSpec; label: string }) {\n return (\n <span className=\"flex items-center gap-1 whitespace-nowrap font-medium uppercase tracking-wide text-muted-foreground\">\n <LabelIcon icon={icon} className=\"text-[13px] normal-case\" />\n {label}\n </span>\n );\n}\n\n// sizedIcon constrains a filter icon to `px`. A node icon (e.g. a lucide\n// component, which otherwise renders at its own default 24px) is cloned with an\n// explicit inline width/height — done in clicky-ui via a real style so it never\n// depends on a Tailwind arbitrary class being generated in the consumer's build.\n// A string (runtime/iconify) icon is returned as-is and sized by the wrapper's\n// font-size. An existing inline size on the node wins (consumer override).\nfunction sizedIcon(icon: LabelIconSpec | undefined, px: number): LabelIconSpec | undefined {\n if (!isValidElement(icon)) return icon;\n const el = icon as ReactElement<{ style?: CSSProperties }>;\n return cloneElement(el, {\n style: { width: `${px}px`, height: `${px}px`, ...(el.props.style ?? {}) },\n });\n}\n\n// comboboxLabelProps maps a filter to the Combobox `label`/`ariaLabel`: when the\n// filter carries an `icon`, the icon replaces the inline text label (with the\n// field name kept as tooltip + accessible name); otherwise the text label shows.\n// clicky-ui owns the size (10px default) — the consumer supplies only the icon\n// and its colour.\nfunction comboboxLabelProps(filter: { icon?: LabelIconSpec; label: string }): {\n label: ReactNode;\n ariaLabel?: string;\n} {\n if (filter.icon == null) return { label: filter.label };\n return {\n label: (\n <span title={filter.label} className=\"inline-flex items-center text-[10px]\">\n <LabelIcon icon={sizedIcon(filter.icon, 10)} className=\"normal-case\" />\n </span>\n ),\n ariaLabel: filter.label,\n };\n}\n\nfunction lookupFieldWidthClass(grow: boolean) {\n return grow ? \"min-w-[12rem] max-w-[18rem] flex-1\" : \"min-w-[11rem] max-w-[15rem] shrink-0\";\n}\n\nfunction LookupFilterField({ filter, grow }: { filter: FilterBarLookupFilter; grow: boolean }) {\n const [draft, setDraft] = useDebouncedTextDraft(filter.value, filter.onChange);\n\n // Date and number lookups keep their specialized inputs in the label shell;\n // text lookups use the Combobox with its own inline label.\n if (filter.inputType === \"date\" || filter.inputType === \"number\") {\n // For a date lookup with a value, surface the human-readable absolute +\n // relative form (e.g. \"Apr 15, 2026, 12:00 PM (2h ago)\") as the hover title.\n const dateTitle =\n filter.inputType === \"date\" && draft ? formatDateTimeRelative(draft) : undefined;\n return (\n <label\n title={dateTitle ?? filter.description}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-input bg-muted/30 pl-2 pr-2 text-xs\",\n lookupFieldWidthClass(grow),\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <FilterFieldLabel icon={filter.icon} label={filter.label} />\n {filter.inputType === \"date\" ? (\n <DateTimePicker\n aria-label={filter.label}\n className=\"w-full\"\n inputClassName=\"w-full min-w-0 border-0 bg-transparent px-0 pr-6 text-sm text-foreground shadow-none focus-visible:ring-0\"\n buttonClassName=\"right-0\"\n placeholder={filter.placeholder}\n value={draft}\n disabled={filter.disabled}\n onChange={setDraft}\n />\n ) : (\n <input\n type=\"number\"\n aria-label={filter.label}\n className=\"w-full min-w-0 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n placeholder={filter.placeholder}\n value={draft}\n disabled={filter.disabled}\n onChange={(event) => setDraft(event.target.value)}\n />\n )}\n </label>\n );\n }\n\n return (\n <Combobox\n {...comboboxLabelProps(filter)}\n options={lookupOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n className={cn(lookupFieldWidthClass(grow), filter.className)}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction LookupMultiFilterField({\n filter,\n grow,\n}: {\n filter: FilterBarLookupMultiFilter;\n grow: boolean;\n}) {\n return (\n <Combobox\n multiple\n {...comboboxLabelProps(filter)}\n options={lookupOptionsToCombobox(filter.options)}\n value={filter.value}\n onChange={filter.onChange}\n allowCustomValue={false}\n className={cn(lookupFieldWidthClass(grow), filter.className)}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.onSearch !== undefined ? { onSearch: filter.onSearch } : {})}\n {...(filter.loading !== undefined ? { loading: filter.loading } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n />\n );\n}\n\nfunction NumberFilterField({ filter, grow }: { filter: FilterBarNumberFilter; grow: boolean }) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n\n useDismissablePopup(open, rootRef, triggerRef, () => setOpen(false));\n\n const bounds = resolveNumberFilterBounds(filter);\n const [draft, setDraft] = useDebouncedNumberDraft(filter.value, filter.onChange);\n const sliderMin = clampNumber(parseFilterNumber(draft.min) ?? bounds.min, bounds.min, bounds.max);\n const sliderMax = clampNumber(parseFilterNumber(draft.max) ?? bounds.max, bounds.min, bounds.max);\n const activeMin = Math.min(sliderMin, sliderMax);\n const activeMax = Math.max(sliderMin, sliderMax);\n const summary = summarizeNumberFilter(filter, bounds, draft);\n\n return (\n <div\n ref={rootRef}\n title={filter.description}\n className={cn(\n \"relative min-w-0\",\n grow ? \"min-w-[8rem] max-w-[12rem] flex-1\" : \"shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${filter.label} filter`}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={filter.disabled}\n onClick={() => setOpen((current) => !current)}\n className={cn(\n \"min-w-0 gap-2 font-normal\",\n grow ? \"w-full max-w-[12rem] justify-between\" : \"w-auto max-w-[9.5rem] px-2.5\",\n summary === filter.label && \"text-muted-foreground\",\n )}\n >\n <LabelIcon icon={filter.icon} className=\"text-[14px] text-muted-foreground\" />\n <span className=\"truncate\">{summary}</span>\n <Icon icon={open ? UiChevronUp : UiChevronDown} className=\"text-muted-foreground\" />\n </Button>\n\n {open && (\n <div className=\"absolute left-0 top-[calc(100%+0.375rem)] z-50 min-w-[18rem] max-w-[22rem] rounded-md border border-border bg-popover p-3 text-popover-foreground shadow-lg shadow-black/5\">\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => {\n setDraft({});\n filter.onChange({});\n }}\n disabled={!String(draft.min ?? \"\").trim() && !String(draft.max ?? \"\").trim()}\n >\n Clear all\n </button>\n </div>\n\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\n <span>{formatNumberValue(bounds.min, filter)}</span>\n <span>{formatNumberValue(bounds.max, filter)}</span>\n </div>\n <div className=\"relative h-6\">\n <RangeSlider\n min={bounds.min}\n max={bounds.max}\n step={bounds.step}\n value={[activeMin, activeMax]}\n ariaLabelMin={`${filter.label} minimum slider`}\n ariaLabelMax={`${filter.label} maximum slider`}\n onChange={([nextMin, nextMax]) =>\n setDraft(numberFilterValueFromSlider([nextMin, nextMax], bounds))\n }\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-1\">\n <label className=\"text-[10px] text-muted-foreground\">Min</label>\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={bounds.step}\n aria-label={`${filter.label} minimum`}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n {...(filter.minPlaceholder !== undefined ? { placeholder: filter.minPlaceholder } : {})}\n value={draft.min ?? \"\"}\n onChange={(event) =>\n setDraft(\n normalizeNumberFilterValue(\n { min: event.target.value, max: draft.max ?? \"\" },\n \"min-input\",\n ),\n )\n }\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-[10px] text-muted-foreground\">Max</label>\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={bounds.step}\n aria-label={`${filter.label} maximum`}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n {...(filter.maxPlaceholder !== undefined ? { placeholder: filter.maxPlaceholder } : {})}\n value={draft.max ?? \"\"}\n onChange={(event) =>\n setDraft(\n normalizeNumberFilterValue(\n { min: draft.min ?? \"\", max: event.target.value },\n \"max-input\",\n ),\n )\n }\n />\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction NumberFilterPanel({\n filter,\n chrome = \"full\",\n}: {\n filter: FilterBarNumberFilter;\n chrome?: FilterBarFilterPanelChrome;\n}) {\n const bounds = resolveNumberFilterBounds(filter);\n const [draft, setDraft] = useDebouncedNumberDraft(filter.value, filter.onChange);\n const sliderMin = clampNumber(parseFilterNumber(draft.min) ?? bounds.min, bounds.min, bounds.max);\n const sliderMax = clampNumber(parseFilterNumber(draft.max) ?? bounds.max, bounds.min, bounds.max);\n const activeMin = Math.min(sliderMin, sliderMax);\n const activeMax = Math.max(sliderMin, sliderMax);\n const embedded = chrome === \"embedded\";\n\n return (\n <div\n data-filter-panel-chrome={chrome}\n className={cn(\n \"min-w-[18rem] max-w-[22rem] text-popover-foreground\",\n embedded\n ? \"p-0\"\n : \"rounded-md border border-border bg-popover p-3 shadow-sm shadow-black/5\",\n )}\n >\n {!embedded && (\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => {\n setDraft({});\n filter.onChange({});\n }}\n disabled={!String(draft.min ?? \"\").trim() && !String(draft.max ?? \"\").trim()}\n >\n Clear all\n </button>\n </div>\n )}\n\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\n <span>{formatNumberValue(bounds.min, filter)}</span>\n <span>{formatNumberValue(bounds.max, filter)}</span>\n </div>\n <div className=\"relative h-6\">\n <RangeSlider\n min={bounds.min}\n max={bounds.max}\n step={bounds.step}\n value={[activeMin, activeMax]}\n ariaLabelMin={`${filter.label} minimum slider`}\n ariaLabelMax={`${filter.label} maximum slider`}\n onChange={([nextMin, nextMax]) =>\n setDraft(numberFilterValueFromSlider([nextMin, nextMax], bounds))\n }\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-1\">\n <label className=\"text-[10px] text-muted-foreground\">Min</label>\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={bounds.step}\n aria-label={`${filter.label} minimum`}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n {...(filter.minPlaceholder !== undefined ? { placeholder: filter.minPlaceholder } : {})}\n value={draft.min ?? \"\"}\n onChange={(event) =>\n setDraft(\n normalizeNumberFilterValue(\n { min: event.target.value, max: draft.max ?? \"\" },\n \"min-input\",\n ),\n )\n }\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-[10px] text-muted-foreground\">Max</label>\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={bounds.step}\n aria-label={`${filter.label} maximum`}\n className=\"h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n {...(filter.maxPlaceholder !== undefined ? { placeholder: filter.maxPlaceholder } : {})}\n value={draft.max ?? \"\"}\n onChange={(event) =>\n setDraft(\n normalizeNumberFilterValue(\n { min: draft.min ?? \"\", max: event.target.value },\n \"max-input\",\n ),\n )\n }\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction MultiFilterField({ filter, grow }: { filter: FilterBarMultiFilter; grow: boolean }) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const [optionQuery, setOptionQuery] = useState(\"\");\n // Options fetched via onSearch for the current query. While a query is active\n // these replace the head (plus already-toggled head items); empty otherwise.\n const [searchOptions, setSearchOptions] = useState<MultiSelectOption[]>([]);\n const [draft, setDraft] = useDebouncedMultiDraft(filter.value, filter.onChange);\n\n useDismissablePopup(open, rootRef, triggerRef, () => setOpen(false));\n\n // Debounced server-side search. Runs only when onSearch is provided; clears\n // results for an empty query so the view reverts to the head set.\n const onSearch = filter.onSearch;\n useEffect(() => {\n if (!onSearch) return;\n const query = optionQuery.trim();\n if (!query) {\n setSearchOptions([]);\n return;\n }\n let cancelled = false;\n const handle = setTimeout(() => {\n Promise.resolve(onSearch(query))\n .then((opts) => {\n if (!cancelled && Array.isArray(opts)) setSearchOptions(opts);\n })\n .catch(() => {\n if (!cancelled) setSearchOptions([]);\n });\n }, 250);\n return () => {\n cancelled = true;\n clearTimeout(handle);\n };\n }, [onSearch, optionQuery]);\n\n const summary = summarizeMultiFilter(filter.label, draft);\n // allowCustomValue: any toggled value absent from `options` (a free-typed name\n // or a `*` wildcard) is synthesised as a pinned option so it renders and stays\n // toggleable across reopens.\n const allowCustomValue = Boolean(filter.allowCustomValue);\n const baseOptions = useMemo(() => {\n if (!allowCustomValue) return filter.options;\n const known = new Set(filter.options.map((o) => o.value));\n const pinned = Object.keys(draft)\n .filter((v) => !known.has(v))\n .map((v) => ({ value: v, label: v }));\n return mergeMultiSelectOptions(pinned, filter.options);\n }, [allowCustomValue, filter.options, draft]);\n // Truncated, async-searchable, or custom-value filters always expose the search\n // box; small static lists only get it past a threshold (original behaviour).\n const showOptionFilter =\n filter.truncated || Boolean(onSearch) || allowCustomValue || filter.options.length > 7;\n const visibleOptions = useMemo(() => {\n const query = optionQuery.trim();\n // No query → the base set (options + pinned customs), as supplied.\n if (!query) return baseOptions;\n // Server search active → the matches REPLACE the head, but any head option\n // the user has already toggled (include/exclude) stays pinned so their\n // selection remains visible and changeable. Selected first, then matches.\n if (onSearch) {\n const selectedHead = baseOptions.filter((o) => draft[o.value] !== undefined);\n return mergeMultiSelectOptions(selectedHead, searchOptions);\n }\n // No server search (static/AsCode list) → client-side substring filter.\n const lowered = query.toLowerCase();\n return baseOptions.filter((option) =>\n multiSelectOptionText(option).toLowerCase().includes(lowered),\n );\n }, [baseOptions, searchOptions, optionQuery, onSearch, draft]);\n // canAddCustom: offer an \"Add\" row when the typed query names no listed option.\n const trimmedQuery = optionQuery.trim();\n const canAddCustom =\n allowCustomValue &&\n trimmedQuery !== \"\" &&\n !visibleOptions.some((o) => o.value === trimmedQuery);\n const addCustom = () => {\n setDraft(updateMultiFilterValue(draft, trimmedQuery, \"include\"));\n setOptionQuery(\"\");\n };\n const moreCount =\n filter.truncated && filter.total ? Math.max(filter.total - filter.options.length, 0) : 0;\n\n return (\n <div\n ref={rootRef}\n title={filter.description}\n className={cn(\n \"relative min-w-0\",\n grow ? \"min-w-[8rem] max-w-[12rem] flex-1\" : \"shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${filter.label} filter`}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={filter.disabled}\n onClick={() => setOpen((current) => !current)}\n className={cn(\n \"min-w-0 gap-2 font-normal\",\n grow ? \"w-full max-w-[12rem] justify-between\" : \"w-auto max-w-[8.5rem] px-2.5\",\n summary === filter.label && \"text-muted-foreground\",\n )}\n >\n <LabelIcon icon={filter.icon} className=\"text-[14px] text-muted-foreground\" />\n <span className=\"truncate\">{summary}</span>\n <Icon icon={open ? UiChevronUp : UiChevronDown} className=\"text-muted-foreground\" />\n </Button>\n\n {open && (\n <div className=\"absolute left-0 top-[calc(100%+0.375rem)] z-50 min-w-[18rem] max-w-[22rem] rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => setDraft({})}\n disabled={Object.keys(draft).length === 0}\n >\n Clear all\n </button>\n </div>\n\n {showOptionFilter && (\n <div className=\"mb-2 flex items-center gap-2 rounded-md border border-input bg-background px-2\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label={`Filter ${filter.label} options`}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder={`Filter ${filter.label.toLowerCase()}`}\n value={optionQuery}\n onChange={(event) => setOptionQuery(event.target.value)}\n />\n </div>\n )}\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {visibleOptions.map((option) => {\n const mode = draft[option.value] ?? \"neutral\";\n const title = option.title ?? multiSelectOptionText(option);\n\n return (\n <div\n key={option.value}\n role=\"button\"\n tabIndex={0}\n data-filter-option={option.value}\n className=\"rounded-md px-1.5 py-0.5 hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={() =>\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)))\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)));\n }\n }}\n >\n <FilterPill\n className=\"w-full justify-between\"\n label={option.label}\n mode={mode}\n title={title}\n togglePosition=\"right\"\n onModeChange={(next) =>\n setDraft(updateMultiFilterValue(draft, option.value, next))\n }\n />\n </div>\n );\n })}\n {canAddCustom && (\n <div\n role=\"button\"\n tabIndex={0}\n data-filter-add-custom={trimmedQuery}\n className=\"rounded-md px-2 py-1 text-sm text-primary hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={addCustom}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n addCustom();\n }\n }}\n >\n Add “{trimmedQuery}”\n </div>\n )}\n {visibleOptions.length === 0 && !canAddCustom && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No options found</div>\n )}\n </div>\n\n {moreCount > 0 && !optionQuery.trim() && (\n <div className=\"mt-2 px-1.5 text-[11px] text-muted-foreground\">\n … and {moreCount.toLocaleString()} more\n {onSearch ? \" — type to search all\" : \"\"}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport type TriStateMultiSelectProps = {\n /** Trigger label and popover heading. */\n label: string;\n /** Map of option value → include/exclude. Neutral options are absent. */\n value: Record<string, FilterBarMultiFilterMode>;\n onChange: (value: Record<string, FilterBarMultiFilterMode>) => void;\n /** Chip options. When `truncated`, this is only the head set. */\n options: MultiSelectOption[];\n icon?: LabelIconSpec;\n description?: string;\n truncated?: boolean;\n total?: number;\n onSearch?: (query: string) => Promise<MultiSelectOption[]> | void;\n /** Allow committing free-typed / `*`-wildcard values absent from `options`. */\n allowCustomValue?: boolean;\n disabled?: boolean;\n className?: string;\n /** Fill the available width (form field) vs. shrink to content. Default true. */\n grow?: boolean;\n};\n\n// TriStateMultiSelect is the standalone include/exclude/neutral multi-select used\n// by FilterBar's \"multi\" kind, exposed for hand-written forms. It renders a\n// popover of FilterPill chips that cycle neutral → include → exclude. It commits\n// changes immediately (autoSubmit:false) since a controlled form owns the value.\nexport function TriStateMultiSelect({ grow = true, ...rest }: TriStateMultiSelectProps) {\n const filter: FilterBarMultiFilter = { key: rest.label, kind: \"multi\", ...rest };\n return (\n <FilterBarContext.Provider value={{ autoSubmit: false }}>\n <MultiFilterField filter={filter} grow={grow} />\n </FilterBarContext.Provider>\n );\n}\n\n// mergeMultiSelectOptions concatenates two option lists, deduping by value with\n// the first list (the head) taking precedence on ordering and label.\nfunction mergeMultiSelectOptions(\n head: MultiSelectOption[],\n extra: MultiSelectOption[],\n): MultiSelectOption[] {\n if (extra.length === 0) return head;\n const seen = new Set(head.map((o) => o.value));\n const merged = [...head];\n for (const option of extra) {\n if (!seen.has(option.value)) {\n seen.add(option.value);\n merged.push(option);\n }\n }\n return merged;\n}\n\nfunction MultiFilterPanel({\n filter,\n chrome = \"full\",\n}: {\n filter: FilterBarMultiFilter;\n chrome?: FilterBarFilterPanelChrome;\n}) {\n const [optionQuery, setOptionQuery] = useState(\"\");\n const [draft, setDraft] = useDebouncedMultiDraft(filter.value, filter.onChange);\n const showOptionFilter = filter.options.length > 7;\n const embedded = chrome === \"embedded\";\n const visibleOptions = useMemo(() => {\n const query = optionQuery.trim().toLowerCase();\n if (!query) return filter.options;\n return filter.options.filter((option) =>\n multiSelectOptionText(option).toLowerCase().includes(query),\n );\n }, [filter.options, optionQuery]);\n\n return (\n <div\n data-filter-panel-chrome={chrome}\n className={cn(\n \"min-w-[18rem] max-w-[22rem] text-popover-foreground\",\n embedded\n ? \"p-0\"\n : \"rounded-md border border-border bg-popover p-2 shadow-sm shadow-black/5\",\n )}\n >\n {!embedded && (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => setDraft({})}\n disabled={Object.keys(draft).length === 0}\n >\n Clear all\n </button>\n </div>\n )}\n\n {showOptionFilter && (\n <div className=\"mb-2 flex items-center gap-2 rounded-md border border-input bg-background px-2\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label={`Filter ${filter.label} options`}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder={`Filter ${filter.label.toLowerCase()}`}\n value={optionQuery}\n onChange={(event) => setOptionQuery(event.target.value)}\n />\n </div>\n )}\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {visibleOptions.map((option) => {\n const mode = draft[option.value] ?? \"neutral\";\n const title = option.title ?? multiSelectOptionText(option);\n\n return (\n <div\n key={option.value}\n role=\"button\"\n tabIndex={0}\n data-filter-option={option.value}\n className=\"rounded-md px-1.5 py-0.5 hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={() =>\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)))\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)));\n }\n }}\n >\n <FilterPill\n className=\"w-full justify-between\"\n label={option.label}\n mode={mode}\n title={title}\n togglePosition=\"right\"\n onModeChange={(next) => setDraft(updateMultiFilterValue(draft, option.value, next))}\n />\n </div>\n );\n })}\n {visibleOptions.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No options found</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction NestedMultiFilterPanel({\n filter,\n chrome = \"full\",\n}: {\n filter: FilterBarNestedMultiFilter;\n chrome?: FilterBarFilterPanelChrome;\n}) {\n const [activeGroup, setActiveGroup] = useState<string | null>(filter.groups[0]?.groupKey ?? null);\n const [draft, setDraft] = useDebouncedMultiDraft(filter.value, filter.onChange);\n const groups = filter.groups;\n const embedded = chrome === \"embedded\";\n const activeGroupData = useMemo(\n () => groups.find((group) => group.groupKey === activeGroup) ?? groups[0] ?? null,\n [groups, activeGroup],\n );\n\n const selectedByGroup = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const group of groups) {\n let n = 0;\n for (const option of group.options) {\n if (draft[option.value]) n += 1;\n }\n counts[group.groupKey] = n;\n }\n return counts;\n }, [groups, draft]);\n\n const sortedGroups = useMemo(() => {\n const selected: typeof groups = [];\n const rest: typeof groups = [];\n for (const group of groups) {\n if ((selectedByGroup[group.groupKey] ?? 0) > 0) selected.push(group);\n else rest.push(group);\n }\n return [...selected, ...rest];\n }, [groups, selectedByGroup]);\n\n const clearGroup = (groupKey: string) => {\n const group = groups.find((g) => g.groupKey === groupKey);\n if (!group) return;\n const next = { ...draft };\n for (const option of group.options) {\n delete next[option.value];\n }\n setDraft(next);\n };\n\n return (\n <div role=\"dialog\" className=\"flex\">\n <div\n data-filter-panel-chrome={chrome}\n className={cn(\n \"min-w-[14rem] max-w-[16rem] text-popover-foreground\",\n embedded\n ? \"p-0\"\n : \"rounded-md border border-border bg-popover p-2 shadow-sm shadow-black/5\",\n )}\n >\n {!embedded && (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => setDraft({})}\n disabled={Object.keys(draft).length === 0}\n >\n Clear all\n </button>\n </div>\n )}\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {sortedGroups.map((group) => {\n const selected = selectedByGroup[group.groupKey] ?? 0;\n const isActive = group.groupKey === activeGroup;\n return (\n <div\n key={group.groupKey}\n role=\"button\"\n tabIndex={0}\n onMouseEnter={() => setActiveGroup(group.groupKey)}\n onFocus={() => setActiveGroup(group.groupKey)}\n onClick={() => setActiveGroup(group.groupKey)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"ArrowRight\") {\n event.preventDefault();\n setActiveGroup(group.groupKey);\n }\n }}\n className={cn(\n \"flex cursor-pointer items-center justify-between gap-2 rounded-md px-1.5 py-0.5 text-sm\",\n \"hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\",\n isActive && \"bg-accent/60\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{group.label ?? group.groupKey}</span>\n {selected > 0 && (\n <span className=\"rounded-full bg-primary/15 px-1.5 text-[10px] font-medium text-primary\">\n {selected}/{group.options.length}\n </span>\n )}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-muted-foreground\" />\n </div>\n );\n })}\n {groups.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No groups</div>\n )}\n </div>\n </div>\n\n {activeGroupData && (\n <div\n onMouseEnter={() => setActiveGroup(activeGroupData.groupKey)}\n className=\"ml-1.5 min-w-[16rem] max-w-[20rem] rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-sm shadow-black/5\"\n >\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {activeGroupData.label ?? activeGroupData.groupKey}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => clearGroup(activeGroupData.groupKey)}\n disabled={(selectedByGroup[activeGroupData.groupKey] ?? 0) === 0}\n >\n Clear\n </button>\n </div>\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {activeGroupData.options.map((option) => {\n const mode = draft[option.value] ?? \"neutral\";\n const title = option.title ?? multiSelectOptionText(option);\n return (\n <div\n key={option.value}\n role=\"button\"\n tabIndex={0}\n data-filter-option={option.value}\n className=\"rounded-md px-1.5 py-0.5 hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={() =>\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)))\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)));\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n setActiveGroup(null);\n }\n }}\n >\n <FilterPill\n className=\"w-full justify-between\"\n label={renderNestedOptionLabel(option, activeGroupData.groupKey)}\n mode={mode}\n title={title}\n togglePosition=\"right\"\n onModeChange={(next) =>\n setDraft(updateMultiFilterValue(draft, option.value, next))\n }\n />\n </div>\n );\n })}\n {activeGroupData.options.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No values</div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction multiSelectOptionText(option: MultiSelectOption) {\n const label = typeof option.label === \"string\" ? option.label : \"\";\n return [option.value, label, option.title ?? \"\"].filter(Boolean).join(\" \");\n}\n\nfunction NestedMultiFilterField({\n filter,\n grow,\n}: {\n filter: FilterBarNestedMultiFilter;\n grow: boolean;\n}) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const [activeGroup, setActiveGroup] = useState<string | null>(null);\n const [draft, setDraft] = useDebouncedMultiDraft(filter.value, filter.onChange);\n\n useDismissablePopup(open, rootRef, triggerRef, () => {\n setOpen(false);\n setActiveGroup(null);\n });\n\n const summary = summarizeMultiFilter(filter.label, draft);\n const groups = filter.groups;\n const activeGroupData = useMemo(\n () => groups.find((group) => group.groupKey === activeGroup) ?? null,\n [groups, activeGroup],\n );\n\n // Selected count per group, used in the outer list.\n const selectedByGroup = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const group of groups) {\n let n = 0;\n for (const option of group.options) {\n if (draft[option.value]) n += 1;\n }\n counts[group.groupKey] = n;\n }\n return counts;\n }, [groups, draft]);\n\n // Groups with active selections sort to the top so the user always sees\n // what's filtered without scrolling. Within each partition, the original\n // order from the consumer is preserved.\n const sortedGroups = useMemo(() => {\n const selected: typeof groups = [];\n const rest: typeof groups = [];\n for (const group of groups) {\n if ((selectedByGroup[group.groupKey] ?? 0) > 0) selected.push(group);\n else rest.push(group);\n }\n return [...selected, ...rest];\n }, [groups, selectedByGroup]);\n\n const clearGroup = (groupKey: string) => {\n const group = groups.find((g) => g.groupKey === groupKey);\n if (!group) return;\n const next = { ...draft };\n for (const option of group.options) {\n delete next[option.value];\n }\n setDraft(next);\n };\n\n return (\n <div\n ref={rootRef}\n title={filter.description}\n className={cn(\n \"relative min-w-0\",\n grow ? \"min-w-[8rem] max-w-[12rem] flex-1\" : \"shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`${filter.label} filter`}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={filter.disabled}\n onClick={() => {\n setOpen((current) => !current);\n if (open) setActiveGroup(null);\n }}\n className={cn(\n \"min-w-0 gap-2 font-normal\",\n grow ? \"w-full max-w-[12rem] justify-between\" : \"w-auto max-w-[8.5rem] px-2.5\",\n summary === filter.label && \"text-muted-foreground\",\n )}\n >\n <span className=\"truncate\">{summary}</span>\n <Icon icon={open ? UiChevronUp : UiChevronDown} className=\"text-muted-foreground\" />\n </Button>\n\n {open && (\n <div\n role=\"dialog\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false);\n setActiveGroup(null);\n }\n }}\n className=\"absolute left-0 top-[calc(100%+0.375rem)] z-50 flex\"\n >\n <div className=\"min-w-[14rem] max-w-[16rem] rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => setDraft({})}\n disabled={Object.keys(draft).length === 0}\n >\n Clear all\n </button>\n </div>\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {sortedGroups.map((group) => {\n const selected = selectedByGroup[group.groupKey] ?? 0;\n const isActive = group.groupKey === activeGroup;\n return (\n <div\n key={group.groupKey}\n role=\"button\"\n tabIndex={0}\n onMouseEnter={() => setActiveGroup(group.groupKey)}\n onFocus={() => setActiveGroup(group.groupKey)}\n onClick={() => setActiveGroup(group.groupKey)}\n onKeyDown={(event) => {\n if (\n event.key === \"Enter\" ||\n event.key === \" \" ||\n event.key === \"ArrowRight\"\n ) {\n event.preventDefault();\n setActiveGroup(group.groupKey);\n }\n }}\n className={cn(\n \"flex cursor-pointer items-center justify-between gap-2 rounded-md px-1.5 py-0.5 text-sm\",\n \"hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\",\n isActive && \"bg-accent/60\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{group.label ?? group.groupKey}</span>\n {selected > 0 && (\n <span className=\"rounded-full bg-primary/15 px-1.5 text-[10px] font-medium text-primary\">\n {selected}/{group.options.length}\n </span>\n )}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-muted-foreground\" />\n </div>\n );\n })}\n {groups.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No groups</div>\n )}\n </div>\n </div>\n\n {activeGroupData && (\n <div\n onMouseEnter={() => setActiveGroup(activeGroupData.groupKey)}\n className=\"ml-1.5 min-w-[16rem] max-w-[20rem] rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\"\n >\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {activeGroupData.label ?? activeGroupData.groupKey}\n </div>\n <button\n type=\"button\"\n className=\"text-[10px] text-primary disabled:text-muted-foreground\"\n onClick={() => clearGroup(activeGroupData.groupKey)}\n disabled={(selectedByGroup[activeGroupData.groupKey] ?? 0) === 0}\n >\n Clear\n </button>\n </div>\n\n <div className=\"max-h-72 space-y-0.5 overflow-auto\">\n {activeGroupData.options.map((option) => {\n const mode = draft[option.value] ?? \"neutral\";\n const title = option.title ?? multiSelectOptionText(option);\n return (\n <div\n key={option.value}\n role=\"button\"\n tabIndex={0}\n data-filter-option={option.value}\n className=\"rounded-md px-1.5 py-0.5 hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none\"\n onClick={() =>\n setDraft(updateMultiFilterValue(draft, option.value, nextFilterMode(mode)))\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setDraft(\n updateMultiFilterValue(draft, option.value, nextFilterMode(mode)),\n );\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n setActiveGroup(null);\n }\n }}\n >\n <FilterPill\n className=\"w-full justify-between\"\n // Show only the value side here — the key is already\n // implied by the parent group panel.\n label={renderNestedOptionLabel(option, activeGroupData.groupKey)}\n mode={mode}\n title={title}\n togglePosition=\"right\"\n onModeChange={(next) =>\n setDraft(updateMultiFilterValue(draft, option.value, next))\n }\n />\n </div>\n );\n })}\n {activeGroupData.options.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No values</div>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction renderNestedOptionLabel(option: MultiSelectOption, groupKey: string): ReactNode {\n // If the option label already strips the key prefix, use it. Otherwise\n // strip it here so the inner panel doesn't repeat the key on every row.\n if (typeof option.label === \"string\") {\n const prefix = `${groupKey}=`;\n if (option.label.startsWith(prefix)) return option.label.slice(prefix.length);\n return option.label;\n }\n return option.label ?? option.value;\n}\n\nfunction SelectMultiFilterField({\n filter,\n grow,\n}: {\n filter: FilterBarSelectMultiFilter;\n grow: boolean;\n}) {\n return (\n <label\n title={filter.description}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-input bg-muted/30 pl-2 pr-1 text-xs\",\n grow ? \"min-w-[12rem] max-w-[18rem] flex-1\" : \"min-w-[11rem] max-w-[15rem] shrink-0\",\n filter.disabled && \"opacity-60\",\n filter.className,\n )}\n >\n <span className=\"whitespace-nowrap font-medium uppercase tracking-wide text-muted-foreground\">\n {filter.label}\n </span>\n <MultiSelect\n options={filter.options}\n value={filter.value}\n onChange={filter.onChange}\n ariaLabel={`${filter.label} filter`}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n {...(filter.disabled !== undefined ? { disabled: filter.disabled } : {})}\n triggerClassName=\"h-6 min-w-0 border-0 bg-transparent px-1 text-xs shadow-none focus-visible:ring-0\"\n menuClassName=\"left-auto right-0\"\n />\n </label>\n );\n}\n\nfunction RangeControlButton({\n kind,\n label,\n from = \"\",\n to = \"\",\n onApply,\n presets,\n timeEnabled,\n timeZone,\n timeZones,\n fromPlaceholder,\n toPlaceholder,\n emptyLabel,\n className,\n}: FilterBarRangeProps & { kind: \"date\" | \"time\"; label: string }) {\n return (\n <TimeRange\n kind={kind}\n label={label}\n from={from}\n to={to}\n onApply={onApply}\n {...(presets ? { presets } : {})}\n {...(timeEnabled !== undefined ? { timeEnabled } : {})}\n {...(timeZone ? { timeZone } : {})}\n {...(timeZones ? { timeZones } : {})}\n {...(fromPlaceholder ? { fromPlaceholder } : {})}\n {...(toPlaceholder ? { toPlaceholder } : {})}\n {...(emptyLabel ? { emptyLabel } : {})}\n {...(className ? { className } : {})}\n />\n );\n}\n\nfunction useDismissablePopup(\n open: boolean,\n rootRef: RefObject<HTMLElement | null>,\n triggerRef: RefObject<HTMLElement | null>,\n onClose: () => void,\n) {\n useEffect(() => {\n if (!open) return;\n\n const onPointerDown = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n onClose();\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener(\"mousedown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [onClose, open, rootRef, triggerRef]);\n}\n\nfunction summarizeMultiFilter(\n label: string,\n value: Record<string, FilterBarMultiFilterMode>,\n): string {\n const includeCount = Object.values(value).filter((mode) => mode === \"include\").length;\n const excludeCount = Object.values(value).filter((mode) => mode === \"exclude\").length;\n\n if (includeCount === 0 && excludeCount === 0) {\n return label;\n }\n\n const counts = [\n includeCount > 0 ? `+${includeCount}` : null,\n excludeCount > 0 ? `-${excludeCount}` : null,\n ].filter(Boolean);\n\n return `${label} ${counts.join(\" \")}`;\n}\n\nfunction useDebouncedMultiDraft(\n value: Record<string, FilterBarMultiFilterMode>,\n onChange: (value: Record<string, FilterBarMultiFilterMode>) => void,\n) {\n const { autoSubmit } = useContext(FilterBarContext);\n const [draft, setDraft] = useState(value);\n const latestOnChange = useRef(onChange);\n\n useEffect(() => {\n latestOnChange.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n useEffect(() => {\n if (sameMultiFilterValue(draft, value)) return;\n\n if (!autoSubmit) {\n latestOnChange.current(draft);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n latestOnChange.current(draft);\n }, FILTER_INPUT_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timeoutId);\n }, [autoSubmit, draft, value]);\n\n return [draft, setDraft] as const;\n}\n\nfunction sameMultiFilterValue(\n a: Record<string, FilterBarMultiFilterMode>,\n b: Record<string, FilterBarMultiFilterMode>,\n) {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n for (const key of aKeys) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n}\n\nfunction useDebouncedTextDraft(value: string, onChange: (value: string) => void) {\n const { autoSubmit } = useContext(FilterBarContext);\n const [draft, setDraft] = useState(value);\n const latestOnChange = useRef(onChange);\n\n useEffect(() => {\n latestOnChange.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n useEffect(() => {\n if (draft === value) return;\n\n if (!autoSubmit) {\n latestOnChange.current(draft);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n latestOnChange.current(draft);\n }, FILTER_INPUT_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timeoutId);\n }, [autoSubmit, draft, value]);\n\n return [draft, setDraft] as const;\n}\n\nfunction useDebouncedNumberDraft(\n value: FilterBarNumberValue,\n onChange: (value: FilterBarNumberValue) => void,\n) {\n const { autoSubmit } = useContext(FilterBarContext);\n const [draft, setDraft] = useState(value);\n const latestOnChange = useRef(onChange);\n\n useEffect(() => {\n latestOnChange.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n setDraft(value);\n }, [value.max, value.min]);\n\n useEffect(() => {\n if (sameNumberFilterValue(draft, value)) return;\n\n if (!autoSubmit) {\n latestOnChange.current(draft);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n latestOnChange.current(draft);\n }, FILTER_INPUT_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timeoutId);\n }, [autoSubmit, draft, value]);\n\n return [draft, setDraft] as const;\n}\n\nfunction sameNumberFilterValue(left: FilterBarNumberValue, right: FilterBarNumberValue) {\n return (left.min ?? \"\") === (right.min ?? \"\") && (left.max ?? \"\") === (right.max ?? \"\");\n}\n\ntype NumberFilterBounds = {\n min: number;\n max: number;\n step: number;\n};\n\ntype NumberFilterSource = \"min-input\" | \"max-input\";\n\nfunction resolveNumberFilterBounds(filter: FilterBarNumberFilter): NumberFilterBounds {\n const parsedMin = parseFilterNumber(filter.value.min);\n const parsedMax = parseFilterNumber(filter.value.max);\n const fallbackMin = parsedMin ?? 0;\n const fallbackMax = parsedMax ?? Math.max(fallbackMin + 100, 100);\n const min = filter.domainMin ?? Math.min(fallbackMin, fallbackMax);\n const max = filter.domainMax ?? Math.max(fallbackMax, min + 100);\n const step = filter.step && filter.step > 0 ? filter.step : 1;\n\n return {\n min,\n max: max <= min ? min + step : max,\n step,\n };\n}\n\nfunction summarizeNumberFilter(\n filter: FilterBarNumberFilter,\n bounds: NumberFilterBounds,\n value: FilterBarNumberValue,\n) {\n const parsedMin = parseFilterNumber(value.min);\n const parsedMax = parseFilterNumber(value.max);\n const hasMin = String(value.min ?? \"\").trim() !== \"\";\n const hasMax = String(value.max ?? \"\").trim() !== \"\";\n\n if (!hasMin && !hasMax) {\n return filter.label;\n }\n\n const minLabel =\n parsedMin == null\n ? formatNumberValue(bounds.min, filter)\n : formatNumberValue(parsedMin, filter);\n const maxLabel =\n parsedMax == null\n ? formatNumberValue(bounds.max, filter)\n : formatNumberValue(parsedMax, filter);\n\n if (hasMin && hasMax) {\n if (minLabel === maxLabel) {\n return `${filter.label} ${minLabel}`;\n }\n return `${filter.label} ${minLabel}-${maxLabel}`;\n }\n\n if (hasMin) {\n return `${filter.label} >=${minLabel}`;\n }\n\n return `${filter.label} <=${maxLabel}`;\n}\n\nfunction normalizeNumberFilterValue(\n nextValue: FilterBarNumberValue,\n source: NumberFilterSource,\n): FilterBarNumberValue {\n let min = nextValue.min ?? \"\";\n let max = nextValue.max ?? \"\";\n\n const parsedMin = parseFilterNumber(min);\n const parsedMax = parseFilterNumber(max);\n\n if (parsedMin != null && parsedMax != null && parsedMin > parsedMax) {\n if (source.startsWith(\"min\")) {\n max = min;\n } else {\n min = max;\n }\n }\n\n return { min, max };\n}\n\nfunction numberFilterValueFromSlider(\n value: [number, number],\n bounds: NumberFilterBounds,\n): FilterBarNumberValue {\n const [min, max] = value;\n return {\n min: min <= bounds.min ? \"\" : formatRawNumber(clampNumber(min, bounds.min, bounds.max)),\n max: max >= bounds.max ? \"\" : formatRawNumber(clampNumber(max, bounds.min, bounds.max)),\n };\n}\n\nfunction parseFilterNumber(value: string | undefined) {\n if (!value?.trim()) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction clampNumber(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction formatNumberValue(value: number, filter: FilterBarNumberFilter) {\n if (filter.formatValue) {\n return filter.formatValue(value);\n }\n\n return formatRawNumber(value);\n}\n\nfunction formatRawNumber(value: number) {\n return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(6)));\n}\n\nfunction updateMultiFilterValue(\n current: Record<string, FilterBarMultiFilterMode>,\n optionValue: string,\n nextMode: FilterMode,\n): Record<string, FilterBarMultiFilterMode> {\n const next = { ...current };\n\n if (nextMode === \"neutral\") {\n delete next[optionValue];\n return next;\n }\n\n if (nextMode === \"include\" || nextMode === \"exclude\") {\n next[optionValue] = nextMode;\n }\n\n return next;\n}\n\nfunction nextFilterMode(mode: FilterMode): FilterMode {\n if (mode === \"include\") return \"exclude\";\n if (mode === \"exclude\") return \"neutral\";\n return \"include\";\n}\n\ntype FilterBarValue =\n | string\n | string[]\n | boolean\n | FilterBarNumberValue\n | Record<string, FilterBarMultiFilterMode>;\n\nfunction createFilterValueMap(filters: FilterBarFilter[]) {\n return Object.fromEntries(filters.map((filter) => [filter.key, filterBarFilterValue(filter)]));\n}\n\nfunction filterBarFilterValue(filter: FilterBarFilter): FilterBarValue {\n return filter.value;\n}\n\nfunction filterWithStagedValue(\n filter: FilterBarFilter,\n value: FilterBarValue,\n onChange: (value: FilterBarValue) => void,\n): FilterBarFilter {\n if (filter.kind === \"text\") {\n return {\n ...filter,\n value: String(value ?? \"\"),\n onChange: (next: string) => onChange(next),\n };\n }\n if (filter.kind === \"lookup\") {\n return {\n ...filter,\n value: String(value ?? \"\"),\n onChange: (next: string) => onChange(next),\n };\n }\n if (filter.kind === \"lookup-multi\") {\n return {\n ...filter,\n value: Array.isArray(value) ? value.map(String) : [],\n onChange: (next: string[]) => onChange(next),\n };\n }\n if (filter.kind === \"multi\") {\n return {\n ...filter,\n value: isMultiFilterValue(value) ? value : {},\n onChange: (next: Record<string, FilterBarMultiFilterMode>) => onChange(next),\n };\n }\n if (filter.kind === \"nested-multi\") {\n return {\n ...filter,\n value: isMultiFilterValue(value) ? value : {},\n onChange: (next: Record<string, FilterBarMultiFilterMode>) => onChange(next),\n };\n }\n if (filter.kind === \"select-multi\") {\n return {\n ...filter,\n value: Array.isArray(value) ? value.map(String) : [],\n onChange: (next: string[]) => onChange(next),\n };\n }\n if (filter.kind === \"number\") {\n return {\n ...filter,\n value: isNumberFilterValue(value) ? value : {},\n onChange: (next: FilterBarNumberValue) => onChange(next),\n };\n }\n if (filter.kind === \"enum\") {\n return {\n ...filter,\n value: String(value ?? \"\"),\n onChange: (next: string) => onChange(next),\n };\n }\n return {\n ...filter,\n value: Boolean(value),\n onChange: (next: boolean) => onChange(next),\n };\n}\n\nfunction applyStagedFilterValues(\n filters: FilterBarFilter[],\n stagedValues: Record<string, FilterBarValue>,\n) {\n for (const filter of filters) {\n const next = stagedValues[filter.key] ?? filterBarFilterValue(filter);\n if (sameFilterBarValue(filterBarFilterValue(filter), next)) continue;\n applyFilterBarValue(filter, next);\n }\n}\n\nfunction applyFilterBarValue(filter: FilterBarFilter, value: FilterBarValue) {\n if (filter.kind === \"text\" || filter.kind === \"lookup\" || filter.kind === \"enum\") {\n filter.onChange(String(value ?? \"\"));\n return;\n }\n if (filter.kind === \"lookup-multi\" || filter.kind === \"select-multi\") {\n filter.onChange(Array.isArray(value) ? value.map(String) : []);\n return;\n }\n if (filter.kind === \"number\") {\n filter.onChange(isNumberFilterValue(value) ? value : {});\n return;\n }\n if (filter.kind === \"boolean\") {\n filter.onChange(Boolean(value));\n return;\n }\n filter.onChange(isMultiFilterValue(value) ? value : {});\n}\n\nfunction sameFilterBarValue(left: FilterBarValue, right: FilterBarValue) {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction isNumberFilterValue(value: FilterBarValue): value is FilterBarNumberValue {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isMultiFilterValue(\n value: FilterBarValue,\n): value is Record<string, FilterBarMultiFilterMode> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction calculateVisibleFilterCount(widths: number[], availableWidth: number) {\n if (widths.length === 0) return 0;\n\n let used = 0;\n let count = 0;\n for (const width of widths) {\n const nextUsed = used + (count > 0 ? FILTER_BAR_GAP_PX : 0) + width;\n if (nextUsed > availableWidth) break;\n used = nextUsed;\n count += 1;\n }\n return count;\n}\n\nfunction sumFilterWidths(widths: number[]) {\n if (widths.length === 0) return 0;\n return (\n widths.reduce((total, width) => total + width, 0) + (widths.length - 1) * FILTER_BAR_GAP_PX\n );\n}\n\nfunction estimateFilterWidth(filter: FilterBarFilter) {\n if (filter.kind === \"boolean\") return Math.max(88, filter.label.length * 8 + 40);\n if (filter.kind === \"multi\" || filter.kind === \"nested-multi\") return 136;\n if (filter.kind === \"number\") return 152;\n return Math.max(144, filter.label.length * 8 + 96);\n}\n"],"names":["createContext","useMemo","useRef","useState","useLayoutEffect","useCallback","useEffect","isFilterBarFilterActive","jsx","jsxs","cn","Button","Fragment","Icon","UiFilter","clearFilterBarFilter","UiClose","LabelIcon","DateTimePicker","Combobox","MultiSelect","TimeRange","UiSearch","isValidElement","cloneElement","formatDateTimeRelative","UiChevronUp","UiChevronDown","RangeSlider","FilterPill","UiChevronRight","useContext"],"mappings":"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"}
|