@dxos/react-ui-searchlist 0.8.4-main.8342792842 → 0.8.4-main.8360d9e660

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/README.md CHANGED
@@ -1,3 +1,3 @@
1
1
  # @dxos/react-ui-searchlist
2
2
 
3
- A themed ⌘K-style searchable list. When used with the included trigger and variant is set to `'listbox'`, this conforms to one definition of ARIA’s `combobox`.
3
+ A themed ⌘K-style searchable list. When used with the included trigger and variant is set to `'listbox'`, this conforms to one definition of ARIA’s `combobox`.
@@ -4,13 +4,13 @@ import { useControllableState as useControllableState2 } from "@radix-ui/react-u
4
4
  import React3, { forwardRef as forwardRef2, useCallback as useCallback3 } from "react";
5
5
  import { Button, Icon as Icon2, Popover } from "@dxos/react-ui";
6
6
  import { useId } from "@dxos/react-ui";
7
- import { mx as mx2, staticPlaceholderText } from "@dxos/ui-theme";
7
+ import { mx as mx2 } from "@dxos/ui-theme";
8
8
 
9
9
  // src/components/SearchList/SearchList.tsx
10
10
  import { useControllableState } from "@radix-ui/react-use-controllable-state";
11
11
  import React, { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
12
- import { Icon, useDensityContext, useElevationContext, useThemeContext, useTranslation } from "@dxos/react-ui";
13
- import { descriptionText, mx } from "@dxos/ui-theme";
12
+ import { Icon, ScrollArea, useDensityContext, useElevationContext, useThemeContext, useTranslation } from "@dxos/react-ui";
13
+ import { mx } from "@dxos/ui-theme";
14
14
 
15
15
  // src/translations.ts
16
16
  var translationKey = "@dxos/react-ui-searchlist";
@@ -155,23 +155,15 @@ var SearchListRoot = ({ children, value: valueProp, defaultValue = "", debounceM
155
155
  }, children));
156
156
  };
157
157
  SearchListRoot.displayName = "SearchList.Root";
158
- var SearchListContent = /* @__PURE__ */ forwardRef(({ classNames, children }, forwardedRef) => {
158
+ var SearchListContent = /* @__PURE__ */ forwardRef(({ classNames, children, ...props }, forwardedRef) => {
159
159
  return /* @__PURE__ */ React.createElement("div", {
160
160
  role: "none",
161
- // TODO(burdon): Remove p-1 hack.
162
- className: mx("flex flex-col gap-2 bs-full is-full min-bs-0 overflow-hidden p-1", classNames),
161
+ ...props,
162
+ className: mx("dx-container flex flex-col gap-3", classNames),
163
163
  ref: forwardedRef
164
164
  }, children);
165
165
  });
166
166
  SearchListContent.displayName = "SearchList.Content";
167
- var SearchListViewport = /* @__PURE__ */ forwardRef(({ classNames, children }, forwardedRef) => {
168
- return /* @__PURE__ */ React.createElement("div", {
169
- role: "listbox",
170
- className: mx("bs-full is-full min-bs-0 overflow-y-auto", classNames),
171
- ref: forwardedRef
172
- }, children);
173
- });
174
- SearchListViewport.displayName = "SearchList.Viewport";
175
167
  var SearchListInput = /* @__PURE__ */ forwardRef(({ classNames, density: propsDensity, elevation: propsElevation, variant, placeholder, onChange, ...props }, forwardedRef) => {
176
168
  const { query, onQueryChange, selectedValue, onSelectedValueChange, getItemValues, triggerSelect } = useSearchListInputContext("SearchList.Input");
177
169
  const { t } = useTranslation(translationKey);
@@ -261,7 +253,7 @@ var SearchListInput = /* @__PURE__ */ forwardRef(({ classNames, density: propsDe
261
253
  },
262
254
  type: "text",
263
255
  placeholder: placeholder ?? defaultPlaceholder,
264
- className: tx("input.input", "input", {
256
+ className: tx("input.input", {
265
257
  variant,
266
258
  disabled: props.disabled,
267
259
  density,
@@ -274,7 +266,16 @@ var SearchListInput = /* @__PURE__ */ forwardRef(({ classNames, density: propsDe
274
266
  });
275
267
  });
276
268
  SearchListInput.displayName = "SearchList.Input";
277
- var SearchListItem = /* @__PURE__ */ forwardRef(({ classNames, value, label, icon, checked, suffix, onSelect, disabled }, forwardedRef) => {
269
+ var SearchListViewport = /* @__PURE__ */ forwardRef(({ classNames, children }, forwardedRef) => {
270
+ return /* @__PURE__ */ React.createElement(ScrollArea.Root, {
271
+ role: "listbox",
272
+ classNames: mx(classNames),
273
+ ref: forwardedRef,
274
+ thin: true
275
+ }, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, null, children));
276
+ });
277
+ SearchListViewport.displayName = "SearchList.Viewport";
278
+ var SearchListItem = /* @__PURE__ */ forwardRef(({ classNames, value, label, icon, iconClassNames, checked, suffix, onSelect, disabled }, forwardedRef) => {
278
279
  const { selectedValue, registerItem, unregisterItem } = useSearchListItemContext("SearchList.Item");
279
280
  const internalRef = useRef(null);
280
281
  const isSelected = selectedValue === value && !disabled;
@@ -325,15 +326,16 @@ var SearchListItem = /* @__PURE__ */ forwardRef(({ classNames, value, label, ico
325
326
  "data-disabled": disabled,
326
327
  "data-value": value,
327
328
  tabIndex: -1,
328
- className: mx("flex gap-2 items-center", "plb-1 pli-2 rounded-sm select-none cursor-pointer data-[selected=true]:bg-hoverOverlay hover:bg-hoverOverlay", disabled && "opacity-50 cursor-not-allowed hover:bg-transparent data-[selected=true]:bg-transparent", classNames),
329
+ className: mx("flex gap-2 items-center", "py-1 px-2 rounded-xs select-none cursor-pointer data-[selected=true]:bg-hover-overlay hover:bg-hover-overlay", disabled && "opacity-50 cursor-not-allowed hover:bg-transparent data-[selected=true]:bg-transparent", classNames),
329
330
  onClick: handleClick
330
331
  }, icon && /* @__PURE__ */ React.createElement(Icon, {
331
332
  icon,
332
- size: 5
333
+ size: 5,
334
+ classNames: iconClassNames
333
335
  }), /* @__PURE__ */ React.createElement("span", {
334
- className: "is-0 grow truncate"
336
+ className: "w-0 grow truncate"
335
337
  }, label), suffix && /* @__PURE__ */ React.createElement("span", {
336
- className: mx("shrink-0", descriptionText)
338
+ className: "shrink-0 text-description"
337
339
  }, suffix), checked && /* @__PURE__ */ React.createElement(Icon, {
338
340
  icon: "ph--check--regular",
339
341
  size: 5
@@ -343,7 +345,7 @@ SearchListItem.displayName = "SearchList.Item";
343
345
  var SearchListEmpty = ({ classNames, children }) => {
344
346
  return /* @__PURE__ */ React.createElement("div", {
345
347
  role: "status",
346
- className: mx("flex flex-col is-full pli-2 plb-1", classNames)
348
+ className: mx("flex flex-col w-full px-2 py-1", classNames)
347
349
  }, children);
348
350
  };
349
351
  SearchListEmpty.displayName = "SearchList.Empty";
@@ -354,7 +356,7 @@ var SearchListGroup = /* @__PURE__ */ forwardRef(({ classNames, heading, childre
354
356
  className: mx("flex flex-col", classNames)
355
357
  }, heading && /* @__PURE__ */ React.createElement("div", {
356
358
  role: "presentation",
357
- className: "pli-2 plb-1 text-xs font-medium text-description"
359
+ className: "px-2 py-1 text-xs font-medium text-description"
358
360
  }, heading), children);
359
361
  });
360
362
  SearchListGroup.displayName = "SearchList.Group";
@@ -534,7 +536,7 @@ var ComboboxContent = /* @__PURE__ */ forwardRef2(({ side = "bottom", collisionP
534
536
  onInteractOutside,
535
537
  forceMount,
536
538
  classNames: [
537
- "is-[--radix-popover-trigger-width] max-bs-[--radix-popover-content-available-height] grid grid-rows-[min-content_1fr]",
539
+ "w-(--radix-popover-trigger-width) max-h-(--radix-popover-content-available-height) grid grid-rows-[min-content_1fr]",
538
540
  classNames
539
541
  ],
540
542
  id: modalId,
@@ -567,7 +569,7 @@ var ComboboxTrigger = /* @__PURE__ */ forwardRef2(({ children, onClick, ...props
567
569
  onClick: handleClick,
568
570
  ref: forwardedRef
569
571
  }, children ?? /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement("span", {
570
- className: mx2("font-normal text-start flex-1 min-is-0 truncate mie-2", !value && staticPlaceholderText)
572
+ className: mx2("font-normal text-start flex-1 min-w-0 truncate me-2", !value && "text-subdued")
571
573
  }, value || placeholder), /* @__PURE__ */ React3.createElement(Icon2, {
572
574
  icon: "ph--caret-down--bold",
573
575
  size: 3
@@ -579,7 +581,7 @@ var ComboboxInput = /* @__PURE__ */ forwardRef2(({ classNames, ...props }, forwa
579
581
  return /* @__PURE__ */ React3.createElement(SearchList.Input, {
580
582
  ...props,
581
583
  classNames: [
582
- "mli-cardSpacingChrome mbs-cardSpacingChrome mbe-0 is-[calc(100%-2*var(--dx-cardSpacingChrome))]",
584
+ "m-form-chrome mb-0 w-[calc(100%-2*var(--spacing-form-chrome))]",
583
585
  classNames
584
586
  ],
585
587
  ref: forwardedRef
@@ -589,7 +591,7 @@ var ComboboxList = /* @__PURE__ */ forwardRef2(({ classNames, ...props }, forwar
589
591
  return /* @__PURE__ */ React3.createElement(SearchList.Viewport, {
590
592
  ...props,
591
593
  classNames: [
592
- "plb-cardSpacingChrome",
594
+ "py-form-chrome",
593
595
  classNames
594
596
  ],
595
597
  ref: forwardedRef
@@ -616,7 +618,7 @@ var ComboboxItem = /* @__PURE__ */ forwardRef2(({ classNames, onSelect, value, c
616
618
  ...props,
617
619
  value,
618
620
  classNames: [
619
- "mli-cardSpacingChrome pli-cardSpacingChrome",
621
+ "mx-form-chrome px-form-chrome",
620
622
  classNames
621
623
  ],
622
624
  onSelect: handleSelect,
@@ -686,7 +688,7 @@ var ListboxRoot = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
686
688
  }, /* @__PURE__ */ React4.createElement("ul", {
687
689
  role: "listbox",
688
690
  ...rootProps,
689
- className: mx3("is-full p-cardSpacingChrome", classNames),
691
+ className: mx3("w-full p-form-chrome", classNames),
690
692
  ref: rootRef,
691
693
  ...arrowGroup
692
694
  }, children));
@@ -711,7 +713,7 @@ var ListboxOption = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
711
713
  ...rootProps,
712
714
  "aria-selected": isSelected,
713
715
  tabIndex: 0,
714
- className: mx3("dx-focus-ring", "plb-1 pli-2 rounded-sm select-none cursor-pointer data-[selected=true]:bg-hoverOverlay hover:bg-hoverOverlay", commandItem, classNames),
716
+ className: mx3("dx-focus-ring", "py-1 px-2 rounded-xs select-none cursor-pointer data-[selected=true]:bg-hover-overlay hover:bg-hover-overlay", commandItem, classNames),
715
717
  onClick: handleSelect,
716
718
  onKeyDown: ({ key }) => {
717
719
  if ([
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/Combobox/Combobox.tsx", "../../../src/components/SearchList/SearchList.tsx", "../../../src/translations.ts", "../../../src/components/SearchList/context.ts", "../../../src/components/SearchList/hooks/useGlobalFilter.tsx", "../../../src/components/SearchList/hooks/useSearchListInput.ts", "../../../src/components/SearchList/hooks/useSearchListItem.ts", "../../../src/components/SearchList/hooks/useSearchListResults.ts", "../../../src/components/Listbox/Listbox.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type PropsWithChildren, forwardRef, useCallback } from 'react';\n\nimport {\n Button,\n type ButtonProps,\n Icon,\n Popover,\n type PopoverArrowProps,\n type PopoverContentProps,\n type PopoverVirtualTriggerProps,\n} from '@dxos/react-ui';\nimport { useId } from '@dxos/react-ui';\nimport { mx, staticPlaceholderText } from '@dxos/ui-theme';\n\nimport {\n SearchList,\n type SearchListEmptyProps,\n type SearchListInputProps,\n type SearchListItemProps,\n type SearchListRootProps,\n type SearchListViewportProps,\n} from '../SearchList';\n\nconst COMBOBOX_NAME = 'Combobox';\nconst COMBOBOX_CONTENT_NAME = 'ComboboxContent';\nconst COMBOBOX_ITEM_NAME = 'ComboboxItem';\nconst COMBOBOX_TRIGGER_NAME = 'ComboboxTrigger';\n\n//\n// Context\n//\n\ntype ComboboxContextValue = {\n modalId: string;\n isCombobox: true;\n placeholder?: string;\n open: boolean;\n onOpenChange: (nextOpen: boolean) => void;\n value: string;\n onValueChange: (nextValue: string) => void;\n};\n\nconst [ComboboxProvider, useComboboxContext] = createContext<Partial<ComboboxContextValue>>(COMBOBOX_NAME, {});\n\n//\n// Root\n//\n\ntype ComboboxRootProps = PropsWithChildren<\n Partial<ComboboxContextValue & { modal: boolean; defaultOpen: boolean; defaultValue: string; placeholder: string }>\n>;\n\nconst ComboboxRoot = ({\n modal,\n modalId: propsModalId,\n open: propsOpen,\n defaultOpen,\n onOpenChange: propsOnOpenChange,\n value: propsValue,\n defaultValue,\n onValueChange: propsOnValueChange,\n placeholder,\n children,\n}: ComboboxRootProps) => {\n const modalId = useId(COMBOBOX_NAME, propsModalId);\n const [open = false, onOpenChange] = useControllableState({\n prop: propsOpen,\n onChange: propsOnOpenChange,\n defaultProp: defaultOpen,\n });\n const [value = '', onValueChange] = useControllableState({\n prop: propsValue,\n onChange: propsOnValueChange,\n defaultProp: defaultValue,\n });\n\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange} modal={modal}>\n <ComboboxProvider\n isCombobox\n modalId={modalId}\n placeholder={placeholder}\n open={open}\n onOpenChange={onOpenChange}\n value={value}\n onValueChange={onValueChange}\n >\n {children}\n </ComboboxProvider>\n </Popover.Root>\n );\n};\n\n//\n// ContentProps\n//\n\ntype ComboboxContentProps = SearchListRootProps & PopoverContentProps & { label?: string };\n\nconst ComboboxContent = forwardRef<HTMLDivElement, ComboboxContentProps>(\n (\n {\n side = 'bottom',\n collisionPadding = 48,\n sideOffset,\n align,\n alignOffset,\n avoidCollisions,\n collisionBoundary,\n arrowPadding,\n sticky,\n hideWhenDetached,\n onOpenAutoFocus,\n onCloseAutoFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n forceMount,\n children,\n classNames,\n onSearch,\n value,\n defaultValue,\n debounceMs,\n label,\n },\n forwardedRef,\n ) => {\n const { modalId } = useComboboxContext(COMBOBOX_CONTENT_NAME);\n\n return (\n <Popover.Content\n {...{\n side,\n sideOffset,\n align,\n alignOffset,\n avoidCollisions,\n collisionBoundary,\n collisionPadding,\n arrowPadding,\n sticky,\n hideWhenDetached,\n onOpenAutoFocus,\n onCloseAutoFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n forceMount,\n }}\n classNames={[\n 'is-[--radix-popover-trigger-width] max-bs-[--radix-popover-content-available-height] grid grid-rows-[min-content_1fr]',\n classNames,\n ]}\n id={modalId}\n ref={forwardedRef}\n >\n <SearchList.Root onSearch={onSearch} value={value} defaultValue={defaultValue} debounceMs={debounceMs}>\n <SearchList.Content>{children}</SearchList.Content>\n </SearchList.Root>\n </Popover.Content>\n );\n },\n);\n\nComboboxContent.displayName = COMBOBOX_CONTENT_NAME;\n\n//\n// Trigger\n//\n\ntype ComboboxTriggerProps = ButtonProps;\n\nconst ComboboxTrigger = forwardRef<HTMLButtonElement, ComboboxTriggerProps>(\n ({ children, onClick, ...props }, forwardedRef) => {\n const { modalId, open, onOpenChange, placeholder, value } = useComboboxContext(COMBOBOX_TRIGGER_NAME);\n const handleClick = useCallback(\n (event: Parameters<Exclude<ButtonProps['onClick'], undefined>>[0]) => {\n onClick?.(event);\n onOpenChange?.(true);\n },\n [onClick, onOpenChange],\n );\n\n return (\n <Popover.Trigger asChild>\n <Button\n {...props}\n role='combobox'\n aria-expanded={open}\n aria-controls={modalId}\n aria-haspopup='dialog'\n onClick={handleClick}\n ref={forwardedRef}\n >\n {children ?? (\n <>\n <span\n className={mx('font-normal text-start flex-1 min-is-0 truncate mie-2', !value && staticPlaceholderText)}\n >\n {value || placeholder}\n </span>\n <Icon icon='ph--caret-down--bold' size={3} />\n </>\n )}\n </Button>\n </Popover.Trigger>\n );\n },\n);\n\nComboboxTrigger.displayName = COMBOBOX_TRIGGER_NAME;\n\n//\n// VirtualTrigger\n//\n\ntype ComboboxVirtualTriggerProps = PopoverVirtualTriggerProps;\n\nconst ComboboxVirtualTrigger = Popover.VirtualTrigger;\n\n//\n// Input\n//\n\ntype ComboboxInputProps = SearchListInputProps;\n\nconst ComboboxInput = forwardRef<HTMLInputElement, ComboboxInputProps>(({ classNames, ...props }, forwardedRef) => {\n return (\n <SearchList.Input\n {...props}\n classNames={[\n 'mli-cardSpacingChrome mbs-cardSpacingChrome mbe-0 is-[calc(100%-2*var(--dx-cardSpacingChrome))]',\n classNames,\n ]}\n ref={forwardedRef}\n />\n );\n});\n\n//\n// List\n//\n\ntype ComboboxListProps = SearchListViewportProps;\n\nconst ComboboxList = forwardRef<HTMLDivElement, ComboboxListProps>(({ classNames, ...props }, forwardedRef) => {\n return <SearchList.Viewport {...props} classNames={['plb-cardSpacingChrome', classNames]} ref={forwardedRef} />;\n});\n\n//\n// Item\n//\n\ntype ComboboxItemProps = SearchListItemProps & {\n /** Whether to close the popover when this item is selected. Defaults to true. */\n closeOnSelect?: boolean;\n};\n\nconst ComboboxItem = forwardRef<HTMLDivElement, ComboboxItemProps>(\n ({ classNames, onSelect, value, closeOnSelect = true, ...props }, forwardedRef) => {\n const { onValueChange, onOpenChange } = useComboboxContext(COMBOBOX_ITEM_NAME);\n const handleSelect = useCallback<NonNullable<SearchListItemProps['onSelect']>>(() => {\n onSelect?.();\n if (value !== undefined) {\n onValueChange?.(value);\n }\n if (closeOnSelect) {\n onOpenChange?.(false);\n }\n }, [onSelect, onValueChange, onOpenChange, value, closeOnSelect]);\n\n return (\n <SearchList.Item\n {...props}\n value={value}\n classNames={['mli-cardSpacingChrome pli-cardSpacingChrome', classNames]}\n onSelect={handleSelect}\n ref={forwardedRef}\n />\n );\n },\n);\n\nComboboxItem.displayName = COMBOBOX_ITEM_NAME;\n\n//\n// Arrow\n//\n\ntype ComboboxArrowProps = PopoverArrowProps;\n\nconst ComboboxArrow = Popover.Arrow;\n\n//\n// Empty\n//\n\ntype ComboboxEmptyProps = SearchListEmptyProps;\n\nconst ComboboxEmpty = SearchList.Empty;\n\n//\n// Combobox\n// https://www.w3.org/WAI/ARIA/apg/patterns/combobox\n//\n\n//\n// Portal\n//\n\ntype ComboboxPortalProps = React.ComponentPropsWithoutRef<typeof Popover.Portal>;\n\nconst ComboboxPortal = Popover.Portal;\n\nexport const Combobox = {\n Root: ComboboxRoot,\n Portal: ComboboxPortal,\n Content: ComboboxContent,\n Trigger: ComboboxTrigger,\n VirtualTrigger: ComboboxVirtualTrigger,\n Input: ComboboxInput,\n List: ComboboxList,\n Item: ComboboxItem,\n Arrow: ComboboxArrow,\n Empty: ComboboxEmpty,\n};\n\nexport type {\n ComboboxRootProps,\n ComboboxPortalProps,\n ComboboxContentProps,\n ComboboxTriggerProps,\n ComboboxVirtualTriggerProps,\n ComboboxInputProps,\n ComboboxListProps,\n ComboboxItemProps,\n ComboboxArrowProps,\n ComboboxEmptyProps,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, {\n type ChangeEvent,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type PropsWithChildren,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {\n type Density,\n type Elevation,\n Icon,\n type ThemedClassName,\n useDensityContext,\n useElevationContext,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { descriptionText, mx } from '@dxos/ui-theme';\n\nimport { translationKey } from '../../translations';\n\nimport {\n SearchListInputContextProvider,\n SearchListItemContextProvider,\n useSearchListInputContext,\n useSearchListItemContext,\n} from './context';\n\n//\n// Internal types\n//\n\ntype ItemData = {\n element: HTMLElement;\n disabled?: boolean;\n onSelect?: () => void;\n};\n\n//\n// Root\n//\n\ntype SearchListRootProps = PropsWithChildren<{\n /** Controlled query value. */\n value?: string;\n\n /** Default query value for uncontrolled mode. */\n defaultValue?: string;\n\n /** Debounce delay in milliseconds. */\n debounceMs?: number;\n\n /** Callback when search query changes (debounced). */\n onSearch?: (query: string) => void;\n}>;\n\nconst SearchListRoot = ({\n children,\n value: valueProp,\n defaultValue = '',\n debounceMs = 200,\n onSearch,\n}: SearchListRootProps) => {\n const [query = '', setQuery] = useControllableState({\n prop: valueProp,\n defaultProp: defaultValue,\n onChange: undefined,\n });\n\n const [selectedValue, setSelectedValue] = useState<string | undefined>(undefined);\n\n // Track registered items: value -> { element, onSelect, disabled }.\n const itemsRef = useRef<Map<string, ItemData>>(new Map());\n\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleQueryChange = useCallback(\n (newQuery: string) => {\n setQuery(newQuery);\n // Don't update selectedValue here - let the effect handle it when items actually change.\n // This prevents unnecessary re-renders of items when query changes.\n\n // Debounce onSearch callback.\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n debounceRef.current = setTimeout(() => {\n onSearch?.(newQuery);\n }, debounceMs);\n },\n [setQuery, onSearch, debounceMs],\n );\n\n // Track when items change to trigger first-item selection.\n const [itemVersion, setItemVersion] = useState(0);\n\n // Cleanup debounce on unmount.\n useEffect(() => {\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, []);\n\n // Auto-select first non-disabled item when items change and no valid selection exists.\n useEffect(() => {\n // Check if current selection is still valid (exists and not disabled).\n const currentItem = selectedValue !== undefined ? itemsRef.current.get(selectedValue) : undefined;\n const isSelectionValid = currentItem !== undefined && !currentItem.disabled;\n if (!isSelectionValid && itemsRef.current.size > 0) {\n // Get first non-disabled item in DOM order.\n const entries = Array.from(itemsRef.current.entries()).filter(([, data]) => !data.disabled);\n if (entries.length > 0) {\n entries.sort(([, a], [, b]) => {\n const position = a.element.compareDocumentPosition(b.element);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n const firstValue = entries[0]?.[0];\n if (firstValue !== undefined && firstValue !== selectedValue) {\n setSelectedValue(firstValue);\n }\n } else if (selectedValue !== undefined) {\n // No valid items available, clear selection\n setSelectedValue(undefined);\n }\n }\n }, [itemVersion, selectedValue]);\n\n const registerItem = useCallback(\n (value: string, element: HTMLElement | null, onSelect: (() => void) | undefined, disabled?: boolean) => {\n if (element) {\n itemsRef.current.set(value, { element, onSelect, disabled });\n setItemVersion((v) => v + 1);\n }\n },\n [],\n );\n\n const unregisterItem = useCallback((value: string) => {\n itemsRef.current.delete(value);\n setItemVersion((v) => v + 1);\n }, []);\n\n // Get item values in DOM order by sorting registered elements (excludes disabled items).\n const getItemValues = useCallback(() => {\n return Array.from(itemsRef.current.entries())\n .filter(([, data]) => !data.disabled)\n .sort(([, a], [, b]) => {\n // Sort by DOM position using compareDocumentPosition.\n const position = a.element.compareDocumentPosition(b.element);\n return position & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : position & Node.DOCUMENT_POSITION_PRECEDING ? 1 : 0;\n })\n .map(([value]) => value);\n }, []);\n\n const triggerSelect = useCallback(() => {\n if (selectedValue !== undefined) {\n const item = itemsRef.current.get(selectedValue);\n item?.onSelect?.();\n }\n }, [selectedValue]);\n\n // Item context; stable, doesn't change when query changes.\n const itemContextValue = useMemo(\n () => ({\n selectedValue,\n onSelectedValueChange: setSelectedValue,\n registerItem,\n unregisterItem,\n }),\n [selectedValue, registerItem, unregisterItem],\n );\n\n const inputContextValue = useMemo(\n () => ({\n query,\n onQueryChange: handleQueryChange,\n selectedValue,\n onSelectedValueChange: setSelectedValue,\n getItemValues,\n triggerSelect,\n }),\n [query, handleQueryChange, selectedValue, getItemValues, triggerSelect],\n );\n\n // NOTE: Separate contexts for items and input to avoid unnecessary re-renders of items when query changes.\n return (\n <SearchListInputContextProvider\n query={inputContextValue.query}\n onQueryChange={inputContextValue.onQueryChange}\n selectedValue={inputContextValue.selectedValue}\n onSelectedValueChange={inputContextValue.onSelectedValueChange}\n getItemValues={inputContextValue.getItemValues}\n triggerSelect={inputContextValue.triggerSelect}\n >\n <SearchListItemContextProvider\n selectedValue={itemContextValue.selectedValue}\n onSelectedValueChange={itemContextValue.onSelectedValueChange}\n registerItem={itemContextValue.registerItem}\n unregisterItem={itemContextValue.unregisterItem}\n >\n {children}\n </SearchListItemContextProvider>\n </SearchListInputContextProvider>\n );\n};\n\nSearchListRoot.displayName = 'SearchList.Root';\n\n//\n// Content\n//\n\ntype SearchListContentProps = ThemedClassName<PropsWithChildren<{}>>;\n\nconst SearchListContent = forwardRef<HTMLDivElement, SearchListContentProps>(\n ({ classNames, children }, forwardedRef) => {\n return (\n <div\n role='none'\n // TODO(burdon): Remove p-1 hack.\n className={mx('flex flex-col gap-2 bs-full is-full min-bs-0 overflow-hidden p-1', classNames)}\n ref={forwardedRef}\n >\n {children}\n </div>\n );\n },\n);\n\nSearchListContent.displayName = 'SearchList.Content';\n\n//\n// Viewport\n//\n\ntype SearchListViewportProps = ThemedClassName<PropsWithChildren>;\n\n/**\n * Scrollable viewport wrapper for Content.\n * Only Content wrapped in Viewport will be scrollable.\n */\n// TODO(burdon): Reconcile with Mosaic.Viewport (factor out common core?).\nconst SearchListViewport = forwardRef<HTMLDivElement, SearchListViewportProps>(\n ({ classNames, children }, forwardedRef) => {\n return (\n <div role='listbox' className={mx('bs-full is-full min-bs-0 overflow-y-auto', classNames)} ref={forwardedRef}>\n {children}\n </div>\n );\n },\n);\n\nSearchListViewport.displayName = 'SearchList.Viewport';\n\n//\n// Input\n//\n\ntype InputVariant = 'default' | 'subdued';\n\ntype SearchListInputProps = ThemedClassName<\n Omit<ComponentPropsWithRef<'input'>, 'value'> & {\n density?: Density;\n elevation?: Elevation;\n variant?: InputVariant;\n }\n>;\n\nconst SearchListInput = forwardRef<HTMLInputElement, SearchListInputProps>(\n (\n { classNames, density: propsDensity, elevation: propsElevation, variant, placeholder, onChange, ...props },\n forwardedRef,\n ) => {\n const { query, onQueryChange, selectedValue, onSelectedValueChange, getItemValues, triggerSelect } =\n useSearchListInputContext('SearchList.Input');\n const { t } = useTranslation(translationKey);\n const { hasIosKeyboard, tx } = useThemeContext();\n const density = useDensityContext(propsDensity);\n const elevation = useElevationContext(propsElevation);\n const defaultPlaceholder = t('search.placeholder');\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n onQueryChange(event.target.value);\n onChange?.(event);\n },\n [onQueryChange, onChange],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n const values = getItemValues();\n if (values.length === 0) {\n if (event.key === 'Escape') {\n onQueryChange('');\n }\n return;\n }\n\n const currentIndex = selectedValue !== undefined ? values.indexOf(selectedValue) : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const nextIndex = currentIndex === -1 ? 0 : Math.min(currentIndex + 1, values.length - 1);\n const nextValue = values[nextIndex];\n if (nextValue !== undefined) {\n onSelectedValueChange(nextValue);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prevIndex = currentIndex === -1 ? values.length - 1 : Math.max(currentIndex - 1, 0);\n const prevValue = values[prevIndex];\n if (prevValue !== undefined) {\n onSelectedValueChange(prevValue);\n }\n break;\n }\n case 'Enter': {\n if (selectedValue !== undefined) {\n event.preventDefault();\n triggerSelect();\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n const firstValue = values[0];\n if (firstValue !== undefined) {\n onSelectedValueChange(firstValue);\n }\n break;\n }\n case 'End': {\n event.preventDefault();\n const lastValue = values[values.length - 1];\n if (lastValue !== undefined) {\n onSelectedValueChange(lastValue);\n }\n break;\n }\n case 'Escape': {\n event.preventDefault();\n if (selectedValue !== undefined) {\n onSelectedValueChange(undefined);\n } else {\n onQueryChange('');\n }\n break;\n }\n }\n },\n [selectedValue, onSelectedValueChange, getItemValues, triggerSelect, onQueryChange],\n );\n\n return (\n <input\n {...props}\n {...(props.autoFocus && !hasIosKeyboard && { autoFocus: true })}\n type='text'\n placeholder={placeholder ?? defaultPlaceholder}\n className={tx(\n 'input.input',\n 'input',\n {\n variant,\n disabled: props.disabled,\n density,\n elevation,\n },\n classNames,\n )}\n value={query}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n ref={forwardedRef}\n />\n );\n },\n);\n\nSearchListInput.displayName = 'SearchList.Input';\n\n//\n// Item\n//\n\ntype SearchListItemProps = ThemedClassName<{\n /** Unique identifier for the item. */\n value: string;\n /** Display label for the item. */\n label: string;\n /** Icon to display (string identifier for Icon component). */\n icon?: string;\n /** Whether to show a check icon. */\n checked?: boolean;\n /** Suffix text to display after the label. */\n suffix?: string;\n /** Callback when item is selected. */\n onSelect?: () => void;\n /** Whether the item is disabled. */\n disabled?: boolean;\n}>;\n\nconst SearchListItem = forwardRef<HTMLDivElement, SearchListItemProps>(\n ({ classNames, value, label, icon, checked, suffix, onSelect, disabled }, forwardedRef) => {\n const { selectedValue, registerItem, unregisterItem } = useSearchListItemContext('SearchList.Item');\n const internalRef = useRef<HTMLDivElement>(null);\n\n const isSelected = selectedValue === value && !disabled;\n\n // Register this item.\n useEffect(() => {\n const element = internalRef.current;\n if (element) {\n registerItem(value, element, onSelect, disabled);\n }\n return () => unregisterItem(value);\n }, [value, onSelect, disabled, registerItem, unregisterItem]);\n\n // Scroll into view when selected.\n useEffect(() => {\n if (isSelected && internalRef.current) {\n internalRef.current.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, [isSelected]);\n\n const handleClick = useCallback(() => {\n if (!disabled) {\n onSelect?.();\n }\n }, [onSelect, disabled]);\n\n return (\n <div\n ref={(node) => {\n internalRef.current = node;\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n }}\n role='option'\n aria-selected={isSelected}\n aria-disabled={disabled}\n data-selected={isSelected}\n data-disabled={disabled}\n data-value={value}\n tabIndex={-1}\n className={mx(\n 'flex gap-2 items-center',\n 'plb-1 pli-2 rounded-sm select-none cursor-pointer data-[selected=true]:bg-hoverOverlay hover:bg-hoverOverlay',\n disabled && 'opacity-50 cursor-not-allowed hover:bg-transparent data-[selected=true]:bg-transparent',\n classNames,\n )}\n onClick={handleClick}\n >\n {icon && <Icon icon={icon} size={5} />}\n <span className='is-0 grow truncate'>{label}</span>\n {suffix && <span className={mx('shrink-0', descriptionText)}>{suffix}</span>}\n {checked && <Icon icon='ph--check--regular' size={5} />}\n </div>\n );\n },\n);\n\nSearchListItem.displayName = 'SearchList.Item';\n\n//\n// Empty\n//\n\ntype SearchListEmptyProps = ThemedClassName<PropsWithChildren<{}>>;\n\nconst SearchListEmpty = ({ classNames, children }: SearchListEmptyProps) => {\n return (\n <div role='status' className={mx('flex flex-col is-full pli-2 plb-1', classNames)}>\n {children}\n </div>\n );\n};\n\nSearchListEmpty.displayName = 'SearchList.Empty';\n\n//\n// Group\n//\n\ntype SearchListGroupProps = ThemedClassName<\n PropsWithChildren<{\n /** Heading for the group. */\n heading?: ReactNode;\n }>\n>;\n\n/**\n * Groups related search items with an optional heading.\n */\nconst SearchListGroup = forwardRef<HTMLDivElement, SearchListGroupProps>(\n ({ classNames, heading, children }, forwardedRef) => {\n return (\n <div ref={forwardedRef} role='group' className={mx('flex flex-col', classNames)}>\n {heading && (\n <div role='presentation' className='pli-2 plb-1 text-xs font-medium text-description'>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n },\n);\n\nSearchListGroup.displayName = 'SearchList.Group';\n\n//\n// SearchList\n//\n\nexport const SearchList = {\n Root: SearchListRoot,\n Content: SearchListContent,\n Viewport: SearchListViewport,\n Input: SearchListInput,\n Item: SearchListItem,\n Empty: SearchListEmpty,\n Group: SearchListGroup,\n};\n\nexport type {\n SearchListRootProps,\n SearchListContentProps,\n SearchListViewportProps,\n SearchListInputProps,\n SearchListItemProps,\n SearchListEmptyProps,\n SearchListGroupProps,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = '@dxos/react-ui-searchlist';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'search.placeholder': 'Search...',\n },\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\n\n/** Context for items - stable, doesn't change when query changes */\nexport type SearchListItemContextValue = {\n /** Currently selected item value for keyboard navigation. */\n selectedValue: string | undefined;\n /** Update the selected value. */\n onSelectedValueChange: (value: string | undefined) => void;\n /** Register an item for keyboard navigation. */\n registerItem: (\n value: string,\n element: HTMLElement | null,\n onSelect: (() => void) | undefined,\n disabled?: boolean,\n ) => void;\n /** Unregister an item. */\n unregisterItem: (value: string) => void;\n};\n\n/** Context for input - can change frequently with query */\nexport type SearchListInputContextValue = {\n /** Current search query. */\n query: string;\n /** Update the query value. */\n onQueryChange: (query: string) => void;\n /** Currently selected item value for keyboard navigation. */\n selectedValue: string | undefined;\n /** Update the selected value. */\n onSelectedValueChange: (value: string | undefined) => void;\n /** Get ordered list of registered item values (excludes disabled items). */\n getItemValues: () => string[];\n /** Trigger selection of the currently highlighted item. */\n triggerSelect: () => void;\n};\n\nexport const [SearchListItemContextProvider, useSearchListItemContext] =\n createContext<SearchListItemContextValue>('SearchListItem');\nexport const [SearchListInputContextProvider, useSearchListInputContext] =\n createContext<SearchListInputContextValue>('SearchListInput');\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext, useContext, useMemo } from 'react';\n\n/**\n * Type for a filter function that filters an array of objects.\n */\nexport type FilterFunction<T = any> = (objects: T[]) => T[];\n\ntype GlobalFilterContextType = {\n /** The current filter function. */\n filter?: FilterFunction;\n};\n\nconst GlobalFilterContext = createContext<GlobalFilterContextType>({});\n\nexport type GlobalFilterProviderProps = PropsWithChildren<{\n /** The filter function to apply globally. */\n filter?: FilterFunction;\n}>;\n\n/**\n * Provider that makes a filter function available globally.\n * Used by plugin-search to provide its regex-based filtering.\n */\nexport const GlobalFilterProvider = ({ children, filter }: GlobalFilterProviderProps) => {\n const value = useMemo(() => ({ filter }), [filter]);\n return <GlobalFilterContext.Provider value={value}>{children}</GlobalFilterContext.Provider>;\n};\n\n/**\n * Hook to access the global filter context.\n * Returns the filter function if one is provided.\n */\nexport const useGlobalFilter = () => {\n return useContext(GlobalFilterContext);\n};\n\n/**\n * Hook that applies the global filter to an array of objects.\n * If no filter is set, returns the original objects unchanged.\n *\n * @example\n * const objects = useQuery(db, Filter.everything());\n * const filteredObjects = useGlobalFilteredObjects(objects);\n */\nexport const useGlobalFilteredObjects = <T extends Record<string, any>>(objects?: T[]): T[] => {\n const { filter } = useGlobalFilter();\n\n return useMemo(() => {\n if (!objects) {\n return [];\n }\n if (!filter) {\n return objects;\n }\n return filter(objects);\n }, [objects, filter]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useSearchListInputContext } from '../context';\n\n/**\n * Hook to access the search context for custom input implementations.\n */\nexport const useSearchListInput = () => {\n const { query, onQueryChange, selectedValue, onSelectedValueChange, getItemValues, triggerSelect } =\n useSearchListInputContext('useSearchListInput');\n return { query, onQueryChange, selectedValue, onSelectedValueChange, getItemValues, triggerSelect };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useSearchListItemContext } from '../context';\n\n/**\n * Hook to access selection state for custom item renderers.\n * Returns the current selected value and registration functions.\n */\nexport const useSearchListItem = () => {\n const { selectedValue, registerItem, unregisterItem } = useSearchListItemContext('useSearchListItem');\n return { selectedValue, registerItem, unregisterItem };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport commandScore from 'command-score';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nexport type UseSearchListResultsOptions<T> = {\n /** Items to filter. */\n items: T[];\n /** Custom filter function. Defaults to filtering by extracted string. */\n filter?: (item: T, query: string) => boolean;\n /** Enable fuzzy filtering using command-score algorithm. Defaults to true. */\n fuzzy?: boolean;\n /** Custom function to extract the searchable string from an item. Defaults to accessing 'label' property if it exists. */\n extract?: (item: T) => string;\n /** Minimum score threshold for fuzzy matches (0-1). Defaults to 0. */\n minScore?: number;\n};\n\n/**\n * Hook to manage search results with fuzzy filtering (enabled by default).\n * Returns filtered results and a handleSearch function to pass to SearchList.Root.\n *\n * @example\n * // Default fuzzy filtering using command-score (tries to extract from 'label' property)\n * const { results, handleSearch } = useSearchListResults({ items });\n *\n * @example\n * // Disable fuzzy for basic case-insensitive substring match\n * const { results, handleSearch } = useSearchListResults({ items, fuzzy: false });\n *\n * @example\n * // Custom extraction for fuzzy filtering\n * const { results, handleSearch } = useSearchListResults({\n * items,\n * extract: (item) => `${item.name} ${item.description}`,\n * });\n */\nexport const useSearchListResults = <T = unknown>({\n items,\n filter,\n fuzzy = true,\n extract,\n minScore = 0,\n}: UseSearchListResultsOptions<T>) => {\n const [query, setQuery] = useState<string>('');\n const queryRef = useRef<string>('');\n\n // Update results when items change.\n useEffect(() => {\n queryRef.current = '';\n setQuery('');\n }, [items]);\n\n const defaultExtract = useCallback((item: T) => {\n // If item is a string, return it directly\n if (typeof item === 'string') {\n return item;\n }\n // Otherwise, try to access 'label' property\n return (item as any)?.label ?? '';\n }, []);\n const extractFn = extract ?? defaultExtract;\n\n const defaultFilter = useCallback(\n (item: T, query: string) => {\n const searchable = extractFn(item);\n return searchable.toLowerCase().includes(query.toLowerCase());\n },\n [extractFn],\n );\n\n const filterFn = filter ?? defaultFilter;\n\n const handleSearch = useCallback((searchQuery: string) => {\n queryRef.current = searchQuery;\n setQuery(searchQuery);\n }, []);\n\n const results = useMemo(() => {\n const currentQuery = queryRef.current;\n if (!currentQuery) {\n return items;\n }\n\n if (fuzzy) {\n // Score and filter items using command-score.\n const scored = items\n .map((item) => ({\n item,\n score: commandScore(extractFn(item), currentQuery) as number,\n }))\n .filter(({ score }) => score > minScore)\n .sort((a, b) => b.score - a.score);\n\n return scored.map(({ item }) => item);\n } else {\n return items.filter((item) => filterFn(item, currentQuery));\n }\n }, [items, query, filterFn, fuzzy, extractFn, minScore]);\n\n return { results, handleSearch };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { type Scope, createContextScope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type ComponentPropsWithRef, forwardRef, useCallback, useEffect, useRef } from 'react';\n\nimport { Icon, type IconProps, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nconst commandItem = 'flex items-center overflow-hidden';\n\nconst LISTBOX_NAME = 'Listbox';\nconst LISTBOX_OPTION_NAME = 'ListboxOption';\nconst LISTBOX_OPTION_LABEL_NAME = 'ListboxOptionLabel';\nconst LISTBOX_OPTION_INDICATOR_NAME = 'ListboxOptionIndicator';\n\n//\n// Context\n//\n\ntype ListboxScopedProps<P> = P & { __listboxScope?: Scope };\ntype ListboxOptionScopedProps<P> = P & { __listboxOptionScope?: Scope };\n\ntype ListboxOptionProps = ThemedClassName<ComponentPropsWithRef<'li'>> & {\n value: string;\n};\n\nconst [createListboxContext, createListboxScope] = createContextScope(LISTBOX_NAME, []);\nconst [createListboxOptionContext, createListboxOptionScope] = createContextScope(LISTBOX_OPTION_NAME, [\n createListboxScope,\n]);\n\ntype ListboxContextValue = {\n selectedValue: string | undefined;\n onValueChange: (value: string) => void;\n};\n\ntype ListboxOptionContextValue = {\n value: string;\n isSelected: boolean;\n};\n\nconst [ListboxProvider, useListboxContext] = createListboxContext<ListboxContextValue>(LISTBOX_NAME);\nconst [ListboxOptionProvider, useListboxOptionContext] =\n createListboxOptionContext<ListboxOptionContextValue>(LISTBOX_OPTION_NAME);\n\n//\n// Root\n//\n\ntype ListboxRootProps = ThemedClassName<ComponentPropsWithRef<'ul'>> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n autoFocus?: boolean;\n};\n\n// TODO(thure): Note that this overlaps significantly with the the `SelectableListbox` story of `List.tsx` in `react-ui`,\n// making this an exemplar of `List` specifying standard `role=\"listbox\"` interactivity, though it is here because it\n// coheres with SearchList’s styles and norms. This can be promoted to `react-ui`, but doing so should involve clearing\n// the technical- and design-debt in its `List` component.\nconst ListboxRoot = forwardRef<HTMLUListElement, ListboxRootProps>(\n (props: ListboxScopedProps<ListboxRootProps>, forwardedRef) => {\n const {\n __listboxScope,\n children,\n classNames,\n value: propsValue,\n defaultValue,\n onValueChange,\n autoFocus,\n ...rootProps\n } = props;\n\n const arrowGroup = useArrowNavigationGroup({ axis: 'vertical' });\n const ref = useRef<HTMLUListElement | null>(null);\n const rootRef = useComposedRefs<HTMLUListElement>(ref, forwardedRef);\n\n const [selectedValue, setSelectedValue] = useControllableState({\n prop: propsValue,\n defaultProp: defaultValue,\n onChange: onValueChange,\n });\n\n const handleValueChange = (value: string) => {\n setSelectedValue(value);\n };\n\n useEffect(() => {\n // Autofocus the selected option on mount using querySelector\n (ref.current?.querySelector('[aria-selected=\"true\"]') as HTMLLIElement)?.focus();\n }, [autoFocus]);\n\n return (\n <ListboxProvider scope={__listboxScope} selectedValue={selectedValue} onValueChange={handleValueChange}>\n <ul\n role='listbox'\n {...rootProps}\n className={mx('is-full p-cardSpacingChrome', classNames)}\n ref={rootRef}\n {...arrowGroup}\n >\n {children}\n </ul>\n </ListboxProvider>\n );\n },\n);\n\nListboxRoot.displayName = LISTBOX_NAME;\n\n//\n// Option\n//\n\nconst ListboxOption = forwardRef<HTMLLIElement, ListboxOptionProps>(\n (props: ListboxScopedProps<ListboxOptionProps>, forwardedRef) => {\n const { __listboxScope, children, classNames, value, ...rootProps } = props;\n const { selectedValue, onValueChange } = useListboxContext(LISTBOX_OPTION_NAME, __listboxScope);\n\n const isSelected = selectedValue === value;\n\n const handleSelect = useCallback(() => {\n onValueChange(value);\n }, [value, onValueChange]);\n\n return (\n <ListboxOptionProvider scope={__listboxScope} value={value} isSelected={isSelected}>\n <li\n role='option'\n {...rootProps}\n aria-selected={isSelected}\n tabIndex={0}\n className={mx(\n 'dx-focus-ring',\n 'plb-1 pli-2 rounded-sm select-none cursor-pointer data-[selected=true]:bg-hoverOverlay hover:bg-hoverOverlay',\n commandItem,\n classNames,\n )}\n onClick={handleSelect}\n onKeyDown={({ key }) => {\n if (['Enter', ' '].includes(key)) {\n handleSelect();\n }\n }}\n ref={forwardedRef}\n >\n {children}\n </li>\n </ListboxOptionProvider>\n );\n },\n);\n\nListboxOption.displayName = LISTBOX_OPTION_NAME;\n\n//\n// OptionLabel\n//\n\nconst ListboxOptionLabel = forwardRef<HTMLDivElement, ThemedClassName<ComponentPropsWithRef<'div'>>>(\n ({ children, classNames, ...rootProps }, forwardedRef) => {\n return (\n <span {...rootProps} className={mx('grow truncate', classNames)} ref={forwardedRef}>\n {children}\n </span>\n );\n },\n);\n\nListboxOptionLabel.displayName = LISTBOX_OPTION_LABEL_NAME;\n\ntype ListboxOptionIndicatorProps = Omit<IconProps, 'icon'> & Partial<Pick<IconProps, 'icon'>>;\n\n//\n// OptionIndicator\n//\n\nconst ListboxOptionIndicator = forwardRef<SVGSVGElement, ListboxOptionIndicatorProps>(\n (props: ListboxOptionScopedProps<ListboxOptionIndicatorProps>, forwardedRef) => {\n const { __listboxOptionScope, classNames, ...rootProps } = props;\n const { isSelected } = useListboxOptionContext(LISTBOX_OPTION_INDICATOR_NAME, __listboxOptionScope);\n\n return (\n <Icon\n icon='ph--check--regular'\n {...rootProps}\n classNames={mx(!isSelected && 'invisible', classNames)}\n ref={forwardedRef}\n />\n );\n },\n);\n\nListboxOptionIndicator.displayName = LISTBOX_OPTION_INDICATOR_NAME;\n\n//\n// Listbox\n//\n\nexport const Listbox = {\n Root: ListboxRoot,\n Option: ListboxOption,\n OptionLabel: ListboxOptionLabel,\n OptionIndicator: ListboxOptionIndicator,\n};\n\nexport { createListboxScope, useListboxContext };\n\nexport type { ListboxRootProps, ListboxOptionProps, ListboxScopedProps };\n"],
5
- "mappings": ";AAIA,SAASA,iBAAAA,sBAAqB;AAC9B,SAASC,wBAAAA,6BAA4B;AACrC,OAAOC,UAAiCC,cAAAA,aAAYC,eAAAA,oBAAmB;AAEvE,SACEC,QAEAC,QAAAA,OACAC,eAIK;AACP,SAASC,aAAa;AACtB,SAASC,MAAAA,KAAIC,6BAA6B;;;ACd1C,SAASC,4BAA4B;AACrC,OAAOC,SAMLC,YACAC,aACAC,WACAC,SACAC,QACAC,gBACK;AAEP,SAGEC,MAEAC,mBACAC,qBACAC,iBACAC,sBACK;AACP,SAASC,iBAAiBC,UAAU;;;ACvB7B,IAAMC,iBAAiB;AAEvB,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACD,cAAAA,GAAiB;QAChB,sBAAsB;MACxB;IACF;EACF;;;;ACXF,SAASE,qBAAqB;AAmCvB,IAAM,CAACC,+BAA+BC,wBAAAA,IAC3CC,cAA0C,gBAAA;AACrC,IAAM,CAACC,gCAAgCC,yBAAAA,IAC5CF,cAA2C,iBAAA;;;AF0B7C,IAAMG,iBAAiB,CAAC,EACtBC,UACAC,OAAOC,WACPC,eAAe,IACfC,aAAa,KACbC,SAAQ,MACY;AACpB,QAAM,CAACC,QAAQ,IAAIC,QAAAA,IAAYC,qBAAqB;IAClDC,MAAMP;IACNQ,aAAaP;IACbQ,UAAUC;EACZ,CAAA;AAEA,QAAM,CAACC,eAAeC,gBAAAA,IAAoBC,SAA6BH,MAAAA;AAGvE,QAAMI,WAAWC,OAA8B,oBAAIC,IAAAA,CAAAA;AAEnD,QAAMC,cAAcF,OAA6C,IAAA;AAEjE,QAAMG,oBAAoBC,YACxB,CAACC,aAAAA;AACCf,aAASe,QAAAA;AAKT,QAAIH,YAAYI,SAAS;AACvBC,mBAAaL,YAAYI,OAAO;IAClC;AACAJ,gBAAYI,UAAUE,WAAW,MAAA;AAC/BpB,iBAAWiB,QAAAA;IACb,GAAGlB,UAAAA;EACL,GACA;IAACG;IAAUF;IAAUD;GAAW;AAIlC,QAAM,CAACsB,aAAaC,cAAAA,IAAkBZ,SAAS,CAAA;AAG/Ca,YAAU,MAAA;AACR,WAAO,MAAA;AACL,UAAIT,YAAYI,SAAS;AACvBC,qBAAaL,YAAYI,OAAO;MAClC;IACF;EACF,GAAG,CAAA,CAAE;AAGLK,YAAU,MAAA;AAER,UAAMC,cAAchB,kBAAkBD,SAAYI,SAASO,QAAQO,IAAIjB,aAAAA,IAAiBD;AACxF,UAAMmB,mBAAmBF,gBAAgBjB,UAAa,CAACiB,YAAYG;AACnE,QAAI,CAACD,oBAAoBf,SAASO,QAAQU,OAAO,GAAG;AAElD,YAAMC,UAAUC,MAAMC,KAAKpB,SAASO,QAAQW,QAAO,CAAA,EAAIG,OAAO,CAAC,CAAA,EAAGC,IAAAA,MAAU,CAACA,KAAKN,QAAQ;AAC1F,UAAIE,QAAQK,SAAS,GAAG;AACtBL,gBAAQM,KAAK,CAAC,CAAA,EAAGC,CAAAA,GAAI,CAAA,EAAGC,CAAAA,MAAE;AACxB,gBAAMC,WAAWF,EAAEG,QAAQC,wBAAwBH,EAAEE,OAAO;AAC5D,cAAID,WAAWG,KAAKC,6BAA6B;AAC/C,mBAAO;UACT;AACA,cAAIJ,WAAWG,KAAKE,6BAA6B;AAC/C,mBAAO;UACT;AACA,iBAAO;QACT,CAAA;AACA,cAAMC,aAAaf,QAAQ,CAAA,IAAK,CAAA;AAChC,YAAIe,eAAerC,UAAaqC,eAAepC,eAAe;AAC5DC,2BAAiBmC,UAAAA;QACnB;MACF,WAAWpC,kBAAkBD,QAAW;AAEtCE,yBAAiBF,MAAAA;MACnB;IACF;EACF,GAAG;IAACc;IAAab;GAAc;AAE/B,QAAMqC,eAAe7B,YACnB,CAACpB,OAAe2C,SAA6BO,UAAoCnB,aAAAA;AAC/E,QAAIY,SAAS;AACX5B,eAASO,QAAQ6B,IAAInD,OAAO;QAAE2C;QAASO;QAAUnB;MAAS,CAAA;AAC1DL,qBAAe,CAAC0B,MAAMA,IAAI,CAAA;IAC5B;EACF,GACA,CAAA,CAAE;AAGJ,QAAMC,iBAAiBjC,YAAY,CAACpB,UAAAA;AAClCe,aAASO,QAAQgC,OAAOtD,KAAAA;AACxB0B,mBAAe,CAAC0B,MAAMA,IAAI,CAAA;EAC5B,GAAG,CAAA,CAAE;AAGL,QAAMG,gBAAgBnC,YAAY,MAAA;AAChC,WAAOc,MAAMC,KAAKpB,SAASO,QAAQW,QAAO,CAAA,EACvCG,OAAO,CAAC,CAAA,EAAGC,IAAAA,MAAU,CAACA,KAAKN,QAAQ,EACnCQ,KAAK,CAAC,CAAA,EAAGC,CAAAA,GAAI,CAAA,EAAGC,CAAAA,MAAE;AAEjB,YAAMC,WAAWF,EAAEG,QAAQC,wBAAwBH,EAAEE,OAAO;AAC5D,aAAOD,WAAWG,KAAKC,8BAA8B,KAAKJ,WAAWG,KAAKE,8BAA8B,IAAI;IAC9G,CAAA,EACCS,IAAI,CAAC,CAACxD,KAAAA,MAAWA,KAAAA;EACtB,GAAG,CAAA,CAAE;AAEL,QAAMyD,gBAAgBrC,YAAY,MAAA;AAChC,QAAIR,kBAAkBD,QAAW;AAC/B,YAAM+C,OAAO3C,SAASO,QAAQO,IAAIjB,aAAAA;AAClC8C,YAAMR,WAAAA;IACR;EACF,GAAG;IAACtC;GAAc;AAGlB,QAAM+C,mBAAmBC,QACvB,OAAO;IACLhD;IACAiD,uBAAuBhD;IACvBoC;IACAI;EACF,IACA;IAACzC;IAAeqC;IAAcI;GAAe;AAG/C,QAAMS,oBAAoBF,QACxB,OAAO;IACLvD;IACA0D,eAAe5C;IACfP;IACAiD,uBAAuBhD;IACvB0C;IACAE;EACF,IACA;IAACpD;IAAOc;IAAmBP;IAAe2C;IAAeE;GAAc;AAIzE,SACE,sBAAA,cAACO,gCAAAA;IACC3D,OAAOyD,kBAAkBzD;IACzB0D,eAAeD,kBAAkBC;IACjCnD,eAAekD,kBAAkBlD;IACjCiD,uBAAuBC,kBAAkBD;IACzCN,eAAeO,kBAAkBP;IACjCE,eAAeK,kBAAkBL;KAEjC,sBAAA,cAACQ,+BAAAA;IACCrD,eAAe+C,iBAAiB/C;IAChCiD,uBAAuBF,iBAAiBE;IACxCZ,cAAcU,iBAAiBV;IAC/BI,gBAAgBM,iBAAiBN;KAEhCtD,QAAAA,CAAAA;AAIT;AAEAD,eAAeoE,cAAc;AAQ7B,IAAMC,oBAAoBC,2BACxB,CAAC,EAAEC,YAAYtE,SAAQ,GAAIuE,iBAAAA;AACzB,SACE,sBAAA,cAACC,OAAAA;IACCC,MAAK;;IAELC,WAAWC,GAAG,oEAAoEL,UAAAA;IAClFM,KAAKL;KAEJvE,QAAAA;AAGP,CAAA;AAGFoE,kBAAkBD,cAAc;AAahC,IAAMU,qBAAqBR,2BACzB,CAAC,EAAEC,YAAYtE,SAAQ,GAAIuE,iBAAAA;AACzB,SACE,sBAAA,cAACC,OAAAA;IAAIC,MAAK;IAAUC,WAAWC,GAAG,4CAA4CL,UAAAA;IAAaM,KAAKL;KAC7FvE,QAAAA;AAGP,CAAA;AAGF6E,mBAAmBV,cAAc;AAgBjC,IAAMW,kBAAkBT,2BACtB,CACE,EAAEC,YAAYS,SAASC,cAAcC,WAAWC,gBAAgBC,SAASC,aAAazE,UAAU,GAAG0E,MAAAA,GACnGd,iBAAAA;AAEA,QAAM,EAAEjE,OAAO0D,eAAenD,eAAeiD,uBAAuBN,eAAeE,cAAa,IAC9F4B,0BAA0B,kBAAA;AAC5B,QAAM,EAAEC,EAAC,IAAKC,eAAeC,cAAAA;AAC7B,QAAM,EAAEC,gBAAgBC,GAAE,IAAKC,gBAAAA;AAC/B,QAAMb,UAAUc,kBAAkBb,YAAAA;AAClC,QAAMC,YAAYa,oBAAoBZ,cAAAA;AACtC,QAAMa,qBAAqBR,EAAE,oBAAA;AAE7B,QAAMS,eAAe3E,YACnB,CAAC4E,UAAAA;AACCjC,kBAAciC,MAAMC,OAAOjG,KAAK;AAChCU,eAAWsF,KAAAA;EACb,GACA;IAACjC;IAAerD;GAAS;AAG3B,QAAMwF,gBAAgB9E,YACpB,CAAC4E,UAAAA;AACC,UAAMG,SAAS5C,cAAAA;AACf,QAAI4C,OAAO7D,WAAW,GAAG;AACvB,UAAI0D,MAAMI,QAAQ,UAAU;AAC1BrC,sBAAc,EAAA;MAChB;AACA;IACF;AAEA,UAAMsC,eAAezF,kBAAkBD,SAAYwF,OAAOG,QAAQ1F,aAAAA,IAAiB;AAEnF,YAAQoF,MAAMI,KAAG;MACf,KAAK,aAAa;AAChBJ,cAAMO,eAAc;AACpB,cAAMC,YAAYH,iBAAiB,KAAK,IAAII,KAAKC,IAAIL,eAAe,GAAGF,OAAO7D,SAAS,CAAA;AACvF,cAAMqE,YAAYR,OAAOK,SAAAA;AACzB,YAAIG,cAAchG,QAAW;AAC3BkD,gCAAsB8C,SAAAA;QACxB;AACA;MACF;MACA,KAAK,WAAW;AACdX,cAAMO,eAAc;AACpB,cAAMK,YAAYP,iBAAiB,KAAKF,OAAO7D,SAAS,IAAImE,KAAKI,IAAIR,eAAe,GAAG,CAAA;AACvF,cAAMS,YAAYX,OAAOS,SAAAA;AACzB,YAAIE,cAAcnG,QAAW;AAC3BkD,gCAAsBiD,SAAAA;QACxB;AACA;MACF;MACA,KAAK,SAAS;AACZ,YAAIlG,kBAAkBD,QAAW;AAC/BqF,gBAAMO,eAAc;AACpB9C,wBAAAA;QACF;AACA;MACF;MACA,KAAK,QAAQ;AACXuC,cAAMO,eAAc;AACpB,cAAMvD,aAAamD,OAAO,CAAA;AAC1B,YAAInD,eAAerC,QAAW;AAC5BkD,gCAAsBb,UAAAA;QACxB;AACA;MACF;MACA,KAAK,OAAO;AACVgD,cAAMO,eAAc;AACpB,cAAMQ,YAAYZ,OAAOA,OAAO7D,SAAS,CAAA;AACzC,YAAIyE,cAAcpG,QAAW;AAC3BkD,gCAAsBkD,SAAAA;QACxB;AACA;MACF;MACA,KAAK,UAAU;AACbf,cAAMO,eAAc;AACpB,YAAI3F,kBAAkBD,QAAW;AAC/BkD,gCAAsBlD,MAAAA;QACxB,OAAO;AACLoD,wBAAc,EAAA;QAChB;AACA;MACF;IACF;EACF,GACA;IAACnD;IAAeiD;IAAuBN;IAAeE;IAAeM;GAAc;AAGrF,SACE,sBAAA,cAACiD,SAAAA;IACE,GAAG5B;IACH,GAAIA,MAAM6B,aAAa,CAACxB,kBAAkB;MAAEwB,WAAW;IAAK;IAC7DC,MAAK;IACL/B,aAAaA,eAAeW;IAC5BrB,WAAWiB,GACT,eACA,SACA;MACER;MACAnD,UAAUqD,MAAMrD;MAChB+C;MACAE;IACF,GACAX,UAAAA;IAEFrE,OAAOK;IACPK,UAAUqF;IACVoB,WAAWjB;IACXvB,KAAKL;;AAGX,CAAA;AAGFO,gBAAgBX,cAAc;AAuB9B,IAAMkD,iBAAiBhD,2BACrB,CAAC,EAAEC,YAAYrE,OAAOqH,OAAOC,MAAMC,SAASC,QAAQtE,UAAUnB,SAAQ,GAAIuC,iBAAAA;AACxE,QAAM,EAAE1D,eAAeqC,cAAcI,eAAc,IAAKoE,yBAAyB,iBAAA;AACjF,QAAMC,cAAc1G,OAAuB,IAAA;AAE3C,QAAM2G,aAAa/G,kBAAkBZ,SAAS,CAAC+B;AAG/CJ,YAAU,MAAA;AACR,UAAMgB,UAAU+E,YAAYpG;AAC5B,QAAIqB,SAAS;AACXM,mBAAajD,OAAO2C,SAASO,UAAUnB,QAAAA;IACzC;AACA,WAAO,MAAMsB,eAAerD,KAAAA;EAC9B,GAAG;IAACA;IAAOkD;IAAUnB;IAAUkB;IAAcI;GAAe;AAG5D1B,YAAU,MAAA;AACR,QAAIgG,cAAcD,YAAYpG,SAAS;AACrCoG,kBAAYpG,QAAQsG,eAAe;QAAEC,OAAO;QAAWC,UAAU;MAAS,CAAA;IAC5E;EACF,GAAG;IAACH;GAAW;AAEf,QAAMI,cAAc3G,YAAY,MAAA;AAC9B,QAAI,CAACW,UAAU;AACbmB,iBAAAA;IACF;EACF,GAAG;IAACA;IAAUnB;GAAS;AAEvB,SACE,sBAAA,cAACwC,OAAAA;IACCI,KAAK,CAACqD,SAAAA;AACJN,kBAAYpG,UAAU0G;AACtB,UAAI,OAAO1D,iBAAiB,YAAY;AACtCA,qBAAa0D,IAAAA;MACf,WAAW1D,cAAc;AACvBA,qBAAahD,UAAU0G;MACzB;IACF;IACAxD,MAAK;IACLyD,iBAAeN;IACfO,iBAAenG;IACfoG,iBAAeR;IACfS,iBAAerG;IACfsG,cAAYrI;IACZsI,UAAU;IACV7D,WAAWC,GACT,2BACA,gHACA3C,YAAY,0FACZsC,UAAAA;IAEFkE,SAASR;KAERT,QAAQ,sBAAA,cAACkB,MAAAA;IAAKlB;IAAYtF,MAAM;MACjC,sBAAA,cAACyG,QAAAA;IAAKhE,WAAU;KAAsB4C,KAAAA,GACrCG,UAAU,sBAAA,cAACiB,QAAAA;IAAKhE,WAAWC,GAAG,YAAYgE,eAAAA;KAAmBlB,MAAAA,GAC7DD,WAAW,sBAAA,cAACiB,MAAAA;IAAKlB,MAAK;IAAqBtF,MAAM;;AAGxD,CAAA;AAGFoF,eAAelD,cAAc;AAQ7B,IAAMyE,kBAAkB,CAAC,EAAEtE,YAAYtE,SAAQ,MAAwB;AACrE,SACE,sBAAA,cAACwE,OAAAA;IAAIC,MAAK;IAASC,WAAWC,GAAG,qCAAqCL,UAAAA;KACnEtE,QAAAA;AAGP;AAEA4I,gBAAgBzE,cAAc;AAgB9B,IAAM0E,kBAAkBxE,2BACtB,CAAC,EAAEC,YAAYwE,SAAS9I,SAAQ,GAAIuE,iBAAAA;AAClC,SACE,sBAAA,cAACC,OAAAA;IAAII,KAAKL;IAAcE,MAAK;IAAQC,WAAWC,GAAG,iBAAiBL,UAAAA;KACjEwE,WACC,sBAAA,cAACtE,OAAAA;IAAIC,MAAK;IAAeC,WAAU;KAChCoE,OAAAA,GAGJ9I,QAAAA;AAGP,CAAA;AAGF6I,gBAAgB1E,cAAc;AAMvB,IAAM4E,aAAa;EACxBC,MAAMjJ;EACNkJ,SAAS7E;EACT8E,UAAUrE;EACVsE,OAAOrE;EACPsE,MAAM/B;EACNgC,OAAOT;EACPU,OAAOT;AACT;;;AGliBA,OAAOU,UAAiCC,iBAAAA,gBAAeC,YAAYC,WAAAA,gBAAe;AAYlF,IAAMC,sBAAsBC,gBAAAA,eAAuC,CAAC,CAAA;AAW7D,IAAMC,uBAAuB,CAAC,EAAEC,UAAUC,OAAM,MAA6B;AAClF,QAAMC,QAAQC,SAAQ,OAAO;IAAEF;EAAO,IAAI;IAACA;GAAO;AAClD,SAAO,gBAAAG,OAAA,cAACP,oBAAoBQ,UAAQ;IAACH;KAAeF,QAAAA;AACtD;AAMO,IAAMM,kBAAkB,MAAA;AAC7B,SAAOC,WAAWV,mBAAAA;AACpB;AAUO,IAAMW,2BAA2B,CAAgCC,YAAAA;AACtE,QAAM,EAAER,OAAM,IAAKK,gBAAAA;AAEnB,SAAOH,SAAQ,MAAA;AACb,QAAI,CAACM,SAAS;AACZ,aAAO,CAAA;IACT;AACA,QAAI,CAACR,QAAQ;AACX,aAAOQ;IACT;AACA,WAAOR,OAAOQ,OAAAA;EAChB,GAAG;IAACA;IAASR;GAAO;AACtB;;;ACnDO,IAAMS,qBAAqB,MAAA;AAChC,QAAM,EAAEC,OAAOC,eAAeC,eAAeC,uBAAuBC,eAAeC,cAAa,IAC9FC,0BAA0B,oBAAA;AAC5B,SAAO;IAAEN;IAAOC;IAAeC;IAAeC;IAAuBC;IAAeC;EAAc;AACpG;;;ACHO,IAAME,oBAAoB,MAAA;AAC/B,QAAM,EAAEC,eAAeC,cAAcC,eAAc,IAAKC,yBAAyB,mBAAA;AACjF,SAAO;IAAEH;IAAeC;IAAcC;EAAe;AACvD;;;ACTA,OAAOE,kBAAkB;AACzB,SAASC,eAAAA,cAAaC,aAAAA,YAAWC,WAAAA,UAASC,UAAAA,SAAQC,YAAAA,iBAAgB;AAkC3D,IAAMC,uBAAuB,CAAc,EAChDC,OACAC,QACAC,QAAQ,MACRC,SACAC,WAAW,EAAC,MACmB;AAC/B,QAAM,CAACC,OAAOC,QAAAA,IAAYC,UAAiB,EAAA;AAC3C,QAAMC,WAAWC,QAAe,EAAA;AAGhCC,EAAAA,WAAU,MAAA;AACRF,aAASG,UAAU;AACnBL,aAAS,EAAA;EACX,GAAG;IAACN;GAAM;AAEV,QAAMY,iBAAiBC,aAAY,CAACC,SAAAA;AAElC,QAAI,OAAOA,SAAS,UAAU;AAC5B,aAAOA;IACT;AAEA,WAAQA,MAAcC,SAAS;EACjC,GAAG,CAAA,CAAE;AACL,QAAMC,YAAYb,WAAWS;AAE7B,QAAMK,gBAAgBJ,aACpB,CAACC,MAAST,WAAAA;AACR,UAAMa,aAAaF,UAAUF,IAAAA;AAC7B,WAAOI,WAAWC,YAAW,EAAGC,SAASf,OAAMc,YAAW,CAAA;EAC5D,GACA;IAACH;GAAU;AAGb,QAAMK,WAAWpB,UAAUgB;AAE3B,QAAMK,eAAeT,aAAY,CAACU,gBAAAA;AAChCf,aAASG,UAAUY;AACnBjB,aAASiB,WAAAA;EACX,GAAG,CAAA,CAAE;AAEL,QAAMC,UAAUC,SAAQ,MAAA;AACtB,UAAMC,eAAelB,SAASG;AAC9B,QAAI,CAACe,cAAc;AACjB,aAAO1B;IACT;AAEA,QAAIE,OAAO;AAET,YAAMyB,SAAS3B,MACZ4B,IAAI,CAACd,UAAU;QACdA;QACAe,OAAOC,aAAad,UAAUF,IAAAA,GAAOY,YAAAA;MACvC,EAAA,EACCzB,OAAO,CAAC,EAAE4B,MAAK,MAAOA,QAAQzB,QAAAA,EAC9B2B,KAAK,CAACC,GAAGC,MAAMA,EAAEJ,QAAQG,EAAEH,KAAK;AAEnC,aAAOF,OAAOC,IAAI,CAAC,EAAEd,KAAI,MAAOA,IAAAA;IAClC,OAAO;AACL,aAAOd,MAAMC,OAAO,CAACa,SAASO,SAASP,MAAMY,YAAAA,CAAAA;IAC/C;EACF,GAAG;IAAC1B;IAAOK;IAAOgB;IAAUnB;IAAOc;IAAWZ;GAAS;AAEvD,SAAO;IAAEoB;IAASF;EAAa;AACjC;;;AP1EA,IAAMY,gBAAgB;AACtB,IAAMC,wBAAwB;AAC9B,IAAMC,qBAAqB;AAC3B,IAAMC,wBAAwB;AAgB9B,IAAM,CAACC,kBAAkBC,kBAAAA,IAAsBC,eAA6CN,eAAe,CAAC,CAAA;AAU5G,IAAMO,eAAe,CAAC,EACpBC,OACAC,SAASC,cACTC,MAAMC,WACNC,aACAC,cAAcC,mBACdC,OAAOC,YACPC,cACAC,eAAeC,oBACfC,aACAC,SAAQ,MACU;AAClB,QAAMb,UAAUc,MAAMvB,eAAeU,YAAAA;AACrC,QAAM,CAACC,OAAO,OAAOG,YAAAA,IAAgBU,sBAAqB;IACxDC,MAAMb;IACNc,UAAUX;IACVY,aAAad;EACf,CAAA;AACA,QAAM,CAACG,QAAQ,IAAIG,aAAAA,IAAiBK,sBAAqB;IACvDC,MAAMR;IACNS,UAAUN;IACVO,aAAaT;EACf,CAAA;AAEA,SACE,gBAAAU,OAAA,cAACC,QAAQC,MAAI;IAACnB;IAAYG;IAA4BN;KACpD,gBAAAoB,OAAA,cAACxB,kBAAAA;IACC2B,YAAAA;IACAtB;IACAY;IACAV;IACAG;IACAE;IACAG;KAECG,QAAAA,CAAAA;AAIT;AAQA,IAAMU,kBAAkBC,gBAAAA,YACtB,CACE,EACEC,OAAO,UACPC,mBAAmB,IACnBC,YACAC,OACAC,aACAC,iBACAC,mBACAC,cACAC,QACAC,kBACAC,iBACAC,kBACAC,iBACAC,sBACAC,gBACAC,mBACAC,YACA5B,UACA6B,YACAC,UACApC,OACAE,cACAmC,YACAC,MAAK,GAEPC,iBAAAA;AAEA,QAAM,EAAE9C,QAAO,IAAKJ,mBAAmBJ,qBAAAA;AAEvC,SACE,gBAAA2B,OAAA,cAACC,QAAQ2B,SAAO;IAEZtB;IACAE;IACAC;IACAC;IACAC;IACAC;IACAL;IACAM;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IAEFC,YAAY;MACV;MACAA;;IAEFM,IAAIhD;IACJiD,KAAKH;KAEL,gBAAA3B,OAAA,cAAC+B,WAAW7B,MAAI;IAACsB;IAAoBpC;IAAcE;IAA4BmC;KAC7E,gBAAAzB,OAAA,cAAC+B,WAAWH,SAAO,MAAElC,QAAAA,CAAAA,CAAAA;AAI7B,CAAA;AAGFU,gBAAgB4B,cAAc3D;AAQ9B,IAAM4D,kBAAkB5B,gBAAAA,YACtB,CAAC,EAAEX,UAAUwC,SAAS,GAAGC,MAAAA,GAASR,iBAAAA;AAChC,QAAM,EAAE9C,SAASE,MAAMG,cAAcO,aAAaL,MAAK,IAAKX,mBAAmBF,qBAAAA;AAC/E,QAAM6D,cAAcC,aAClB,CAACC,UAAAA;AACCJ,cAAUI,KAAAA;AACVpD,mBAAe,IAAA;EACjB,GACA;IAACgD;IAAShD;GAAa;AAGzB,SACE,gBAAAc,OAAA,cAACC,QAAQsC,SAAO;IAACC,SAAAA;KACf,gBAAAxC,OAAA,cAACyC,QAAAA;IACE,GAAGN;IACJO,MAAK;IACLC,iBAAe5D;IACf6D,iBAAe/D;IACfgE,iBAAc;IACdX,SAASE;IACTN,KAAKH;KAEJjC,YACC,gBAAAM,OAAA,cAAAA,OAAA,UAAA,MACE,gBAAAA,OAAA,cAAC8C,QAAAA;IACCC,WAAWC,IAAG,yDAAyD,CAAC5D,SAAS6D,qBAAAA;KAEhF7D,SAASK,WAAAA,GAEZ,gBAAAO,OAAA,cAACkD,OAAAA;IAAKC,MAAK;IAAuBC,MAAM;;AAMpD,CAAA;AAGFnB,gBAAgBD,cAAczD;AAQ9B,IAAM8E,yBAAyBpD,QAAQqD;AAQvC,IAAMC,gBAAgBlD,gBAAAA,YAAiD,CAAC,EAAEkB,YAAY,GAAGY,MAAAA,GAASR,iBAAAA;AAChG,SACE,gBAAA3B,OAAA,cAAC+B,WAAWyB,OAAK;IACd,GAAGrB;IACJZ,YAAY;MACV;MACAA;;IAEFO,KAAKH;;AAGX,CAAA;AAQA,IAAM8B,eAAepD,gBAAAA,YAA8C,CAAC,EAAEkB,YAAY,GAAGY,MAAAA,GAASR,iBAAAA;AAC5F,SAAO,gBAAA3B,OAAA,cAAC+B,WAAW2B,UAAQ;IAAE,GAAGvB;IAAOZ,YAAY;MAAC;MAAyBA;;IAAaO,KAAKH;;AACjG,CAAA;AAWA,IAAMgC,eAAetD,gBAAAA,YACnB,CAAC,EAAEkB,YAAYqC,UAAUxE,OAAOyE,gBAAgB,MAAM,GAAG1B,MAAAA,GAASR,iBAAAA;AAChE,QAAM,EAAEpC,eAAeL,aAAY,IAAKT,mBAAmBH,kBAAAA;AAC3D,QAAMwF,eAAezB,aAA0D,MAAA;AAC7EuB,eAAAA;AACA,QAAIxE,UAAU2E,QAAW;AACvBxE,sBAAgBH,KAAAA;IAClB;AACA,QAAIyE,eAAe;AACjB3E,qBAAe,KAAA;IACjB;EACF,GAAG;IAAC0E;IAAUrE;IAAeL;IAAcE;IAAOyE;GAAc;AAEhE,SACE,gBAAA7D,OAAA,cAAC+B,WAAWiC,MAAI;IACb,GAAG7B;IACJ/C;IACAmC,YAAY;MAAC;MAA+CA;;IAC5DqC,UAAUE;IACVhC,KAAKH;;AAGX,CAAA;AAGFgC,aAAa3B,cAAc1D;AAQ3B,IAAM2F,gBAAgBhE,QAAQiE;AAQ9B,IAAMC,gBAAgBpC,WAAWqC;AAajC,IAAMC,iBAAiBpE,QAAQqE;AAExB,IAAMC,WAAW;EACtBrE,MAAMvB;EACN2F,QAAQD;EACRzC,SAASxB;EACTmC,SAASN;EACTqB,gBAAgBD;EAChBG,OAAOD;EACPiB,MAAMf;EACNO,MAAML;EACNO,OAAOD;EACPG,OAAOD;AACT;;;AQ1UA,SAASM,+BAA+B;AACxC,SAASC,uBAAuB;AAChC,SAAqBC,0BAA0B;AAC/C,SAASC,wBAAAA,6BAA4B;AACrC,OAAOC,UAAqCC,cAAAA,aAAYC,eAAAA,cAAaC,aAAAA,YAAWC,UAAAA,eAAc;AAE9F,SAASC,QAAAA,aAAkD;AAC3D,SAASC,MAAAA,WAAU;AAEnB,IAAMC,cAAc;AAEpB,IAAMC,eAAe;AACrB,IAAMC,sBAAsB;AAC5B,IAAMC,4BAA4B;AAClC,IAAMC,gCAAgC;AAatC,IAAM,CAACC,sBAAsBC,kBAAAA,IAAsBC,mBAAmBN,cAAc,CAAA,CAAE;AACtF,IAAM,CAACO,4BAA4BC,wBAAAA,IAA4BF,mBAAmBL,qBAAqB;EACrGI;CACD;AAYD,IAAM,CAACI,iBAAiBC,iBAAAA,IAAqBN,qBAA0CJ,YAAAA;AACvF,IAAM,CAACW,uBAAuBC,uBAAAA,IAC5BL,2BAAsDN,mBAAAA;AAiBxD,IAAMY,cAAcC,gBAAAA,YAClB,CAACC,OAA6CC,iBAAAA;AAC5C,QAAM,EACJC,gBACAC,UACAC,YACAC,OAAOC,YACPC,cACAC,eACAC,WACA,GAAGC,UAAAA,IACDV;AAEJ,QAAMW,aAAaC,wBAAwB;IAAEC,MAAM;EAAW,CAAA;AAC9D,QAAMC,MAAMC,QAAgC,IAAA;AAC5C,QAAMC,UAAUC,gBAAkCH,KAAKb,YAAAA;AAEvD,QAAM,CAACiB,eAAeC,gBAAAA,IAAoBC,sBAAqB;IAC7DC,MAAMf;IACNgB,aAAaf;IACbgB,UAAUf;EACZ,CAAA;AAEA,QAAMgB,oBAAoB,CAACnB,UAAAA;AACzBc,qBAAiBd,KAAAA;EACnB;AAEAoB,EAAAA,WAAU,MAAA;AAEPX,QAAIY,SAASC,cAAc,wBAAA,GAA6CC,MAAAA;EAC3E,GAAG;IAACnB;GAAU;AAEd,SACE,gBAAAoB,OAAA,cAACnC,iBAAAA;IAAgBoC,OAAO5B;IAAgBgB;IAA8BV,eAAegB;KACnF,gBAAAK,OAAA,cAACE,MAAAA;IACCC,MAAK;IACJ,GAAGtB;IACJuB,WAAWC,IAAG,+BAA+B9B,UAAAA;IAC7CU,KAAKE;IACJ,GAAGL;KAEHR,QAAAA,CAAAA;AAIT,CAAA;AAGFL,YAAYqC,cAAclD;AAM1B,IAAMmD,gBAAgBrC,gBAAAA,YACpB,CAACC,OAA+CC,iBAAAA;AAC9C,QAAM,EAAEC,gBAAgBC,UAAUC,YAAYC,OAAO,GAAGK,UAAAA,IAAcV;AACtE,QAAM,EAAEkB,eAAeV,cAAa,IAAKb,kBAAkBT,qBAAqBgB,cAAAA;AAEhF,QAAMmC,aAAanB,kBAAkBb;AAErC,QAAMiC,eAAeC,aAAY,MAAA;AAC/B/B,kBAAcH,KAAAA;EAChB,GAAG;IAACA;IAAOG;GAAc;AAEzB,SACE,gBAAAqB,OAAA,cAACjC,uBAAAA;IAAsBkC,OAAO5B;IAAgBG;IAAcgC;KAC1D,gBAAAR,OAAA,cAACW,MAAAA;IACCR,MAAK;IACJ,GAAGtB;IACJ+B,iBAAeJ;IACfK,UAAU;IACVT,WAAWC,IACT,iBACA,gHACAlD,aACAoB,UAAAA;IAEFuC,SAASL;IACTM,WAAW,CAAC,EAAEC,IAAG,MAAE;AACjB,UAAI;QAAC;QAAS;QAAKC,SAASD,GAAAA,GAAM;AAChCP,qBAAAA;MACF;IACF;IACAxB,KAAKb;KAEJE,QAAAA,CAAAA;AAIT,CAAA;AAGFiC,cAAcD,cAAcjD;AAM5B,IAAM6D,qBAAqBhD,gBAAAA,YACzB,CAAC,EAAEI,UAAUC,YAAY,GAAGM,UAAAA,GAAaT,iBAAAA;AACvC,SACE,gBAAA4B,OAAA,cAACmB,QAAAA;IAAM,GAAGtC;IAAWuB,WAAWC,IAAG,iBAAiB9B,UAAAA;IAAaU,KAAKb;KACnEE,QAAAA;AAGP,CAAA;AAGF4C,mBAAmBZ,cAAchD;AAQjC,IAAM8D,yBAAyBlD,gBAAAA,YAC7B,CAACC,OAA8DC,iBAAAA;AAC7D,QAAM,EAAEiD,sBAAsB9C,YAAY,GAAGM,UAAAA,IAAcV;AAC3D,QAAM,EAAEqC,WAAU,IAAKxC,wBAAwBT,+BAA+B8D,oBAAAA;AAE9E,SACE,gBAAArB,OAAA,cAACsB,OAAAA;IACCC,MAAK;IACJ,GAAG1C;IACJN,YAAY8B,IAAG,CAACG,cAAc,aAAajC,UAAAA;IAC3CU,KAAKb;;AAGX,CAAA;AAGFgD,uBAAuBd,cAAc/C;AAM9B,IAAMiE,UAAU;EACrBC,MAAMxD;EACNyD,QAAQnB;EACRoB,aAAaT;EACbU,iBAAiBR;AACnB;",
6
- "names": ["createContext", "useControllableState", "React", "forwardRef", "useCallback", "Button", "Icon", "Popover", "useId", "mx", "staticPlaceholderText", "useControllableState", "React", "forwardRef", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Icon", "useDensityContext", "useElevationContext", "useThemeContext", "useTranslation", "descriptionText", "mx", "translationKey", "translations", "createContext", "SearchListItemContextProvider", "useSearchListItemContext", "createContext", "SearchListInputContextProvider", "useSearchListInputContext", "SearchListRoot", "children", "value", "valueProp", "defaultValue", "debounceMs", "onSearch", "query", "setQuery", "useControllableState", "prop", "defaultProp", "onChange", "undefined", "selectedValue", "setSelectedValue", "useState", "itemsRef", "useRef", "Map", "debounceRef", "handleQueryChange", "useCallback", "newQuery", "current", "clearTimeout", "setTimeout", "itemVersion", "setItemVersion", "useEffect", "currentItem", "get", "isSelectionValid", "disabled", "size", "entries", "Array", "from", "filter", "data", "length", "sort", "a", "b", "position", "element", "compareDocumentPosition", "Node", "DOCUMENT_POSITION_FOLLOWING", "DOCUMENT_POSITION_PRECEDING", "firstValue", "registerItem", "onSelect", "set", "v", "unregisterItem", "delete", "getItemValues", "map", "triggerSelect", "item", "itemContextValue", "useMemo", "onSelectedValueChange", "inputContextValue", "onQueryChange", "SearchListInputContextProvider", "SearchListItemContextProvider", "displayName", "SearchListContent", "forwardRef", "classNames", "forwardedRef", "div", "role", "className", "mx", "ref", "SearchListViewport", "SearchListInput", "density", "propsDensity", "elevation", "propsElevation", "variant", "placeholder", "props", "useSearchListInputContext", "t", "useTranslation", "translationKey", "hasIosKeyboard", "tx", "useThemeContext", "useDensityContext", "useElevationContext", "defaultPlaceholder", "handleChange", "event", "target", "handleKeyDown", "values", "key", "currentIndex", "indexOf", "preventDefault", "nextIndex", "Math", "min", "nextValue", "prevIndex", "max", "prevValue", "lastValue", "input", "autoFocus", "type", "onKeyDown", "SearchListItem", "label", "icon", "checked", "suffix", "useSearchListItemContext", "internalRef", "isSelected", "scrollIntoView", "block", "behavior", "handleClick", "node", "aria-selected", "aria-disabled", "data-selected", "data-disabled", "data-value", "tabIndex", "onClick", "Icon", "span", "descriptionText", "SearchListEmpty", "SearchListGroup", "heading", "SearchList", "Root", "Content", "Viewport", "Input", "Item", "Empty", "Group", "React", "createContext", "useContext", "useMemo", "GlobalFilterContext", "createContext", "GlobalFilterProvider", "children", "filter", "value", "useMemo", "React", "Provider", "useGlobalFilter", "useContext", "useGlobalFilteredObjects", "objects", "useSearchListInput", "query", "onQueryChange", "selectedValue", "onSelectedValueChange", "getItemValues", "triggerSelect", "useSearchListInputContext", "useSearchListItem", "selectedValue", "registerItem", "unregisterItem", "useSearchListItemContext", "commandScore", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useSearchListResults", "items", "filter", "fuzzy", "extract", "minScore", "query", "setQuery", "useState", "queryRef", "useRef", "useEffect", "current", "defaultExtract", "useCallback", "item", "label", "extractFn", "defaultFilter", "searchable", "toLowerCase", "includes", "filterFn", "handleSearch", "searchQuery", "results", "useMemo", "currentQuery", "scored", "map", "score", "commandScore", "sort", "a", "b", "COMBOBOX_NAME", "COMBOBOX_CONTENT_NAME", "COMBOBOX_ITEM_NAME", "COMBOBOX_TRIGGER_NAME", "ComboboxProvider", "useComboboxContext", "createContext", "ComboboxRoot", "modal", "modalId", "propsModalId", "open", "propsOpen", "defaultOpen", "onOpenChange", "propsOnOpenChange", "value", "propsValue", "defaultValue", "onValueChange", "propsOnValueChange", "placeholder", "children", "useId", "useControllableState", "prop", "onChange", "defaultProp", "React", "Popover", "Root", "isCombobox", "ComboboxContent", "forwardRef", "side", "collisionPadding", "sideOffset", "align", "alignOffset", "avoidCollisions", "collisionBoundary", "arrowPadding", "sticky", "hideWhenDetached", "onOpenAutoFocus", "onCloseAutoFocus", "onEscapeKeyDown", "onPointerDownOutside", "onFocusOutside", "onInteractOutside", "forceMount", "classNames", "onSearch", "debounceMs", "label", "forwardedRef", "Content", "id", "ref", "SearchList", "displayName", "ComboboxTrigger", "onClick", "props", "handleClick", "useCallback", "event", "Trigger", "asChild", "Button", "role", "aria-expanded", "aria-controls", "aria-haspopup", "span", "className", "mx", "staticPlaceholderText", "Icon", "icon", "size", "ComboboxVirtualTrigger", "VirtualTrigger", "ComboboxInput", "Input", "ComboboxList", "Viewport", "ComboboxItem", "onSelect", "closeOnSelect", "handleSelect", "undefined", "Item", "ComboboxArrow", "Arrow", "ComboboxEmpty", "Empty", "ComboboxPortal", "Portal", "Combobox", "List", "useArrowNavigationGroup", "useComposedRefs", "createContextScope", "useControllableState", "React", "forwardRef", "useCallback", "useEffect", "useRef", "Icon", "mx", "commandItem", "LISTBOX_NAME", "LISTBOX_OPTION_NAME", "LISTBOX_OPTION_LABEL_NAME", "LISTBOX_OPTION_INDICATOR_NAME", "createListboxContext", "createListboxScope", "createContextScope", "createListboxOptionContext", "createListboxOptionScope", "ListboxProvider", "useListboxContext", "ListboxOptionProvider", "useListboxOptionContext", "ListboxRoot", "forwardRef", "props", "forwardedRef", "__listboxScope", "children", "classNames", "value", "propsValue", "defaultValue", "onValueChange", "autoFocus", "rootProps", "arrowGroup", "useArrowNavigationGroup", "axis", "ref", "useRef", "rootRef", "useComposedRefs", "selectedValue", "setSelectedValue", "useControllableState", "prop", "defaultProp", "onChange", "handleValueChange", "useEffect", "current", "querySelector", "focus", "React", "scope", "ul", "role", "className", "mx", "displayName", "ListboxOption", "isSelected", "handleSelect", "useCallback", "li", "aria-selected", "tabIndex", "onClick", "onKeyDown", "key", "includes", "ListboxOptionLabel", "span", "ListboxOptionIndicator", "__listboxOptionScope", "Icon", "icon", "Listbox", "Root", "Option", "OptionLabel", "OptionIndicator"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type PropsWithChildren, forwardRef, useCallback } from 'react';\n\nimport {\n Button,\n type ButtonProps,\n Icon,\n Popover,\n type PopoverArrowProps,\n type PopoverContentProps,\n type PopoverVirtualTriggerProps,\n} from '@dxos/react-ui';\nimport { useId } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport {\n SearchList,\n type SearchListEmptyProps,\n type SearchListInputProps,\n type SearchListItemProps,\n type SearchListRootProps,\n type SearchListViewportProps,\n} from '../SearchList';\n\nconst COMBOBOX_NAME = 'Combobox';\nconst COMBOBOX_CONTENT_NAME = 'ComboboxContent';\nconst COMBOBOX_ITEM_NAME = 'ComboboxItem';\nconst COMBOBOX_TRIGGER_NAME = 'ComboboxTrigger';\n\n//\n// Context\n//\n\ntype ComboboxContextValue = {\n modalId: string;\n isCombobox: true;\n placeholder?: string;\n open: boolean;\n onOpenChange: (nextOpen: boolean) => void;\n value: string;\n onValueChange: (nextValue: string) => void;\n};\n\nconst [ComboboxProvider, useComboboxContext] = createContext<Partial<ComboboxContextValue>>(COMBOBOX_NAME, {});\n\n//\n// Root\n//\n\ntype ComboboxRootProps = PropsWithChildren<\n Partial<ComboboxContextValue & { modal: boolean; defaultOpen: boolean; defaultValue: string; placeholder: string }>\n>;\n\nconst ComboboxRoot = ({\n modal,\n modalId: propsModalId,\n open: propsOpen,\n defaultOpen,\n onOpenChange: propsOnOpenChange,\n value: propsValue,\n defaultValue,\n onValueChange: propsOnValueChange,\n placeholder,\n children,\n}: ComboboxRootProps) => {\n const modalId = useId(COMBOBOX_NAME, propsModalId);\n const [open = false, onOpenChange] = useControllableState({\n prop: propsOpen,\n onChange: propsOnOpenChange,\n defaultProp: defaultOpen,\n });\n const [value = '', onValueChange] = useControllableState({\n prop: propsValue,\n onChange: propsOnValueChange,\n defaultProp: defaultValue,\n });\n\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange} modal={modal}>\n <ComboboxProvider\n isCombobox\n modalId={modalId}\n placeholder={placeholder}\n open={open}\n onOpenChange={onOpenChange}\n value={value}\n onValueChange={onValueChange}\n >\n {children}\n </ComboboxProvider>\n </Popover.Root>\n );\n};\n\n//\n// ContentProps\n//\n\ntype ComboboxContentProps = SearchListRootProps & PopoverContentProps & { label?: string };\n\nconst ComboboxContent = forwardRef<HTMLDivElement, ComboboxContentProps>(\n (\n {\n side = 'bottom',\n collisionPadding = 48,\n sideOffset,\n align,\n alignOffset,\n avoidCollisions,\n collisionBoundary,\n arrowPadding,\n sticky,\n hideWhenDetached,\n onOpenAutoFocus,\n onCloseAutoFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n forceMount,\n children,\n classNames,\n onSearch,\n value,\n defaultValue,\n debounceMs,\n label,\n },\n forwardedRef,\n ) => {\n const { modalId } = useComboboxContext(COMBOBOX_CONTENT_NAME);\n\n return (\n <Popover.Content\n {...{\n side,\n sideOffset,\n align,\n alignOffset,\n avoidCollisions,\n collisionBoundary,\n collisionPadding,\n arrowPadding,\n sticky,\n hideWhenDetached,\n onOpenAutoFocus,\n onCloseAutoFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n forceMount,\n }}\n classNames={[\n 'w-(--radix-popover-trigger-width) max-h-(--radix-popover-content-available-height) grid grid-rows-[min-content_1fr]',\n classNames,\n ]}\n id={modalId}\n ref={forwardedRef}\n >\n <SearchList.Root onSearch={onSearch} value={value} defaultValue={defaultValue} debounceMs={debounceMs}>\n <SearchList.Content>{children}</SearchList.Content>\n </SearchList.Root>\n </Popover.Content>\n );\n },\n);\n\nComboboxContent.displayName = COMBOBOX_CONTENT_NAME;\n\n//\n// Trigger\n//\n\ntype ComboboxTriggerProps = ButtonProps;\n\nconst ComboboxTrigger = forwardRef<HTMLButtonElement, ComboboxTriggerProps>(\n ({ children, onClick, ...props }, forwardedRef) => {\n const { modalId, open, onOpenChange, placeholder, value } = useComboboxContext(COMBOBOX_TRIGGER_NAME);\n const handleClick = useCallback(\n (event: Parameters<Exclude<ButtonProps['onClick'], undefined>>[0]) => {\n onClick?.(event);\n onOpenChange?.(true);\n },\n [onClick, onOpenChange],\n );\n\n return (\n <Popover.Trigger asChild>\n <Button\n {...props}\n role='combobox'\n aria-expanded={open}\n aria-controls={modalId}\n aria-haspopup='dialog'\n onClick={handleClick}\n ref={forwardedRef}\n >\n {children ?? (\n <>\n <span className={mx('font-normal text-start flex-1 min-w-0 truncate me-2', !value && 'text-subdued')}>\n {value || placeholder}\n </span>\n <Icon icon='ph--caret-down--bold' size={3} />\n </>\n )}\n </Button>\n </Popover.Trigger>\n );\n },\n);\n\nComboboxTrigger.displayName = COMBOBOX_TRIGGER_NAME;\n\n//\n// VirtualTrigger\n//\n\ntype ComboboxVirtualTriggerProps = PopoverVirtualTriggerProps;\n\nconst ComboboxVirtualTrigger = Popover.VirtualTrigger;\n\n//\n// Input\n//\n\ntype ComboboxInputProps = SearchListInputProps;\n\nconst ComboboxInput = forwardRef<HTMLInputElement, ComboboxInputProps>(({ classNames, ...props }, forwardedRef) => {\n return (\n <SearchList.Input\n {...props}\n classNames={['m-form-chrome mb-0 w-[calc(100%-2*var(--spacing-form-chrome))]', classNames]}\n ref={forwardedRef}\n />\n );\n});\n\n//\n// List\n//\n\ntype ComboboxListProps = SearchListViewportProps;\n\nconst ComboboxList = forwardRef<HTMLDivElement, ComboboxListProps>(({ classNames, ...props }, forwardedRef) => {\n return <SearchList.Viewport {...props} classNames={['py-form-chrome', classNames]} ref={forwardedRef} />;\n});\n\n//\n// Item\n//\n\ntype ComboboxItemProps = SearchListItemProps & {\n /** Whether to close the popover when this item is selected. Defaults to true. */\n closeOnSelect?: boolean;\n};\n\nconst ComboboxItem = forwardRef<HTMLDivElement, ComboboxItemProps>(\n ({ classNames, onSelect, value, closeOnSelect = true, ...props }, forwardedRef) => {\n const { onValueChange, onOpenChange } = useComboboxContext(COMBOBOX_ITEM_NAME);\n const handleSelect = useCallback<NonNullable<SearchListItemProps['onSelect']>>(() => {\n onSelect?.();\n if (value !== undefined) {\n onValueChange?.(value);\n }\n if (closeOnSelect) {\n onOpenChange?.(false);\n }\n }, [onSelect, onValueChange, onOpenChange, value, closeOnSelect]);\n\n return (\n <SearchList.Item\n {...props}\n value={value}\n classNames={['mx-form-chrome px-form-chrome', classNames]}\n onSelect={handleSelect}\n ref={forwardedRef}\n />\n );\n },\n);\n\nComboboxItem.displayName = COMBOBOX_ITEM_NAME;\n\n//\n// Arrow\n//\n\ntype ComboboxArrowProps = PopoverArrowProps;\n\nconst ComboboxArrow = Popover.Arrow;\n\n//\n// Empty\n//\n\ntype ComboboxEmptyProps = SearchListEmptyProps;\n\nconst ComboboxEmpty = SearchList.Empty;\n\n//\n// Combobox\n// https://www.w3.org/WAI/ARIA/apg/patterns/combobox\n//\n\n//\n// Portal\n//\n\ntype ComboboxPortalProps = React.ComponentPropsWithoutRef<typeof Popover.Portal>;\n\nconst ComboboxPortal = Popover.Portal;\n\nexport const Combobox = {\n Root: ComboboxRoot,\n Portal: ComboboxPortal,\n Content: ComboboxContent,\n Trigger: ComboboxTrigger,\n VirtualTrigger: ComboboxVirtualTrigger,\n Input: ComboboxInput,\n List: ComboboxList,\n Item: ComboboxItem,\n Arrow: ComboboxArrow,\n Empty: ComboboxEmpty,\n};\n\nexport type {\n ComboboxRootProps,\n ComboboxPortalProps,\n ComboboxContentProps,\n ComboboxTriggerProps,\n ComboboxVirtualTriggerProps,\n ComboboxInputProps,\n ComboboxListProps,\n ComboboxItemProps,\n ComboboxArrowProps,\n ComboboxEmptyProps,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, {\n type ChangeEvent,\n type ComponentPropsWithRef,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type PropsWithChildren,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {\n type Density,\n type Elevation,\n Icon,\n ScrollArea,\n type ThemedClassName,\n useDensityContext,\n useElevationContext,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { translationKey } from '../../translations';\n\nimport {\n SearchListInputContextProvider,\n SearchListItemContextProvider,\n useSearchListInputContext,\n useSearchListItemContext,\n} from './context';\n\n//\n// Internal types\n//\n\ntype ItemData = {\n element: HTMLElement;\n disabled?: boolean;\n onSelect?: () => void;\n};\n\n//\n// Root\n//\n\ntype SearchListRootProps = PropsWithChildren<{\n /** Controlled query value. */\n value?: string;\n\n /** Default query value for uncontrolled mode. */\n defaultValue?: string;\n\n /** Debounce delay in milliseconds. */\n debounceMs?: number;\n\n /** Callback when search query changes (debounced). */\n onSearch?: (query: string) => void;\n}>;\n\nconst SearchListRoot = ({\n children,\n value: valueProp,\n defaultValue = '',\n debounceMs = 200,\n onSearch,\n}: SearchListRootProps) => {\n const [query = '', setQuery] = useControllableState({\n prop: valueProp,\n defaultProp: defaultValue,\n onChange: undefined,\n });\n\n const [selectedValue, setSelectedValue] = useState<string | undefined>(undefined);\n\n // Track registered items: value -> { element, onSelect, disabled }.\n const itemsRef = useRef<Map<string, ItemData>>(new Map());\n\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleQueryChange = useCallback(\n (newQuery: string) => {\n setQuery(newQuery);\n // Don't update selectedValue here - let the effect handle it when items actually change.\n // This prevents unnecessary re-renders of items when query changes.\n\n // Debounce onSearch callback.\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n debounceRef.current = setTimeout(() => {\n onSearch?.(newQuery);\n }, debounceMs);\n },\n [setQuery, onSearch, debounceMs],\n );\n\n // Track when items change to trigger first-item selection.\n const [itemVersion, setItemVersion] = useState(0);\n\n // Cleanup debounce on unmount.\n useEffect(() => {\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, []);\n\n // Auto-select first non-disabled item when items change and no valid selection exists.\n useEffect(() => {\n // Check if current selection is still valid (exists and not disabled).\n const currentItem = selectedValue !== undefined ? itemsRef.current.get(selectedValue) : undefined;\n const isSelectionValid = currentItem !== undefined && !currentItem.disabled;\n if (!isSelectionValid && itemsRef.current.size > 0) {\n // Get first non-disabled item in DOM order.\n const entries = Array.from(itemsRef.current.entries()).filter(([, data]) => !data.disabled);\n if (entries.length > 0) {\n entries.sort(([, a], [, b]) => {\n const position = a.element.compareDocumentPosition(b.element);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n const firstValue = entries[0]?.[0];\n if (firstValue !== undefined && firstValue !== selectedValue) {\n setSelectedValue(firstValue);\n }\n } else if (selectedValue !== undefined) {\n // No valid items available, clear selection\n setSelectedValue(undefined);\n }\n }\n }, [itemVersion, selectedValue]);\n\n const registerItem = useCallback(\n (value: string, element: HTMLElement | null, onSelect: (() => void) | undefined, disabled?: boolean) => {\n if (element) {\n itemsRef.current.set(value, { element, onSelect, disabled });\n setItemVersion((v) => v + 1);\n }\n },\n [],\n );\n\n const unregisterItem = useCallback((value: string) => {\n itemsRef.current.delete(value);\n setItemVersion((v) => v + 1);\n }, []);\n\n // Get item values in DOM order by sorting registered elements (excludes disabled items).\n const getItemValues = useCallback(() => {\n return Array.from(itemsRef.current.entries())\n .filter(([, data]) => !data.disabled)\n .sort(([, a], [, b]) => {\n // Sort by DOM position using compareDocumentPosition.\n const position = a.element.compareDocumentPosition(b.element);\n return position & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : position & Node.DOCUMENT_POSITION_PRECEDING ? 1 : 0;\n })\n .map(([value]) => value);\n }, []);\n\n const triggerSelect = useCallback(() => {\n if (selectedValue !== undefined) {\n const item = itemsRef.current.get(selectedValue);\n item?.onSelect?.();\n }\n }, [selectedValue]);\n\n // Item context; stable, doesn't change when query changes.\n const itemContextValue = useMemo(\n () => ({\n selectedValue,\n onSelectedValueChange: setSelectedValue,\n registerItem,\n unregisterItem,\n }),\n [selectedValue, registerItem, unregisterItem],\n );\n\n const inputContextValue = useMemo(\n () => ({\n query,\n onQueryChange: handleQueryChange,\n selectedValue,\n onSelectedValueChange: setSelectedValue,\n getItemValues,\n triggerSelect,\n }),\n [query, handleQueryChange, selectedValue, getItemValues, triggerSelect],\n );\n\n // NOTE: Separate contexts for items and input to avoid unnecessary re-renders of items when query changes.\n return (\n <SearchListInputContextProvider\n query={inputContextValue.query}\n onQueryChange={inputContextValue.onQueryChange}\n selectedValue={inputContextValue.selectedValue}\n onSelectedValueChange={inputContextValue.onSelectedValueChange}\n getItemValues={inputContextValue.getItemValues}\n triggerSelect={inputContextValue.triggerSelect}\n >\n <SearchListItemContextProvider\n selectedValue={itemContextValue.selectedValue}\n onSelectedValueChange={itemContextValue.onSelectedValueChange}\n registerItem={itemContextValue.registerItem}\n unregisterItem={itemContextValue.unregisterItem}\n >\n {children}\n </SearchListItemContextProvider>\n </SearchListInputContextProvider>\n );\n};\n\nSearchListRoot.displayName = 'SearchList.Root';\n\n//\n// Content\n//\n\ntype SearchListContentProps = ThemedClassName<ComponentPropsWithoutRef<'div'>>;\n\nconst SearchListContent = forwardRef<HTMLDivElement, SearchListContentProps>(\n ({ classNames, children, ...props }, forwardedRef) => {\n return (\n <div role='none' {...props} className={mx('dx-container flex flex-col gap-3', classNames)} ref={forwardedRef}>\n {children}\n </div>\n );\n },\n);\n\nSearchListContent.displayName = 'SearchList.Content';\n\n//\n// Input\n//\n\ntype InputVariant = 'default' | 'subdued';\n\ntype SearchListInputProps = ThemedClassName<\n Omit<ComponentPropsWithRef<'input'>, 'value'> & {\n density?: Density;\n elevation?: Elevation;\n variant?: InputVariant;\n }\n>;\n\nconst SearchListInput = forwardRef<HTMLInputElement, SearchListInputProps>(\n (\n { classNames, density: propsDensity, elevation: propsElevation, variant, placeholder, onChange, ...props },\n forwardedRef,\n ) => {\n const { query, onQueryChange, selectedValue, onSelectedValueChange, getItemValues, triggerSelect } =\n useSearchListInputContext('SearchList.Input');\n const { t } = useTranslation(translationKey);\n const { hasIosKeyboard, tx } = useThemeContext();\n const density = useDensityContext(propsDensity);\n const elevation = useElevationContext(propsElevation);\n const defaultPlaceholder = t('search.placeholder');\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n onQueryChange(event.target.value);\n onChange?.(event);\n },\n [onQueryChange, onChange],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n const values = getItemValues();\n if (values.length === 0) {\n if (event.key === 'Escape') {\n onQueryChange('');\n }\n return;\n }\n\n const currentIndex = selectedValue !== undefined ? values.indexOf(selectedValue) : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const nextIndex = currentIndex === -1 ? 0 : Math.min(currentIndex + 1, values.length - 1);\n const nextValue = values[nextIndex];\n if (nextValue !== undefined) {\n onSelectedValueChange(nextValue);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prevIndex = currentIndex === -1 ? values.length - 1 : Math.max(currentIndex - 1, 0);\n const prevValue = values[prevIndex];\n if (prevValue !== undefined) {\n onSelectedValueChange(prevValue);\n }\n break;\n }\n case 'Enter': {\n if (selectedValue !== undefined) {\n event.preventDefault();\n triggerSelect();\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n const firstValue = values[0];\n if (firstValue !== undefined) {\n onSelectedValueChange(firstValue);\n }\n break;\n }\n case 'End': {\n event.preventDefault();\n const lastValue = values[values.length - 1];\n if (lastValue !== undefined) {\n onSelectedValueChange(lastValue);\n }\n break;\n }\n case 'Escape': {\n event.preventDefault();\n if (selectedValue !== undefined) {\n onSelectedValueChange(undefined);\n } else {\n onQueryChange('');\n }\n break;\n }\n }\n },\n [selectedValue, onSelectedValueChange, getItemValues, triggerSelect, onQueryChange],\n );\n\n return (\n <input\n {...props}\n {...(props.autoFocus && !hasIosKeyboard && { autoFocus: true })}\n type='text'\n placeholder={placeholder ?? defaultPlaceholder}\n className={tx(\n 'input.input',\n {\n variant,\n disabled: props.disabled,\n density,\n elevation,\n },\n classNames,\n )}\n value={query}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n ref={forwardedRef}\n />\n );\n },\n);\n\nSearchListInput.displayName = 'SearchList.Input';\n\n//\n// Viewport\n//\n\ntype SearchListViewportProps = ThemedClassName<PropsWithChildren>;\n\nconst SearchListViewport = forwardRef<HTMLDivElement, SearchListViewportProps>(\n ({ classNames, children }, forwardedRef) => {\n return (\n <ScrollArea.Root role='listbox' classNames={mx(classNames)} ref={forwardedRef} thin>\n <ScrollArea.Viewport>{children}</ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n },\n);\n\nSearchListViewport.displayName = 'SearchList.Viewport';\n\n//\n// Item\n//\n\ntype SearchListItemProps = ThemedClassName<{\n /** Unique identifier for the item. */\n value: string;\n /** Display label for the item. */\n label: string;\n /** Icon to display (string identifier for Icon component). */\n icon?: string;\n /** Additional class names for the icon element. */\n iconClassNames?: string;\n /** Whether to show a check icon. */\n checked?: boolean;\n /** Suffix text to display after the label. */\n suffix?: string;\n /** Callback when item is selected. */\n onSelect?: () => void;\n /** Whether the item is disabled. */\n disabled?: boolean;\n}>;\n\nconst SearchListItem = forwardRef<HTMLDivElement, SearchListItemProps>(\n ({ classNames, value, label, icon, iconClassNames, checked, suffix, onSelect, disabled }, forwardedRef) => {\n const { selectedValue, registerItem, unregisterItem } = useSearchListItemContext('SearchList.Item');\n const internalRef = useRef<HTMLDivElement>(null);\n\n const isSelected = selectedValue === value && !disabled;\n\n // Register this item.\n useEffect(() => {\n const element = internalRef.current;\n if (element) {\n registerItem(value, element, onSelect, disabled);\n }\n return () => unregisterItem(value);\n }, [value, onSelect, disabled, registerItem, unregisterItem]);\n\n // Scroll into view when selected.\n useEffect(() => {\n if (isSelected && internalRef.current) {\n internalRef.current.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, [isSelected]);\n\n const handleClick = useCallback(() => {\n if (!disabled) {\n onSelect?.();\n }\n }, [onSelect, disabled]);\n\n return (\n <div\n ref={(node) => {\n internalRef.current = node;\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n }}\n role='option'\n aria-selected={isSelected}\n aria-disabled={disabled}\n data-selected={isSelected}\n data-disabled={disabled}\n data-value={value}\n tabIndex={-1}\n className={mx(\n 'flex gap-2 items-center',\n 'py-1 px-2 rounded-xs select-none cursor-pointer data-[selected=true]:bg-hover-overlay hover:bg-hover-overlay',\n disabled && 'opacity-50 cursor-not-allowed hover:bg-transparent data-[selected=true]:bg-transparent',\n classNames,\n )}\n onClick={handleClick}\n >\n {icon && <Icon icon={icon} size={5} classNames={iconClassNames} />}\n <span className='w-0 grow truncate'>{label}</span>\n {suffix && <span className='shrink-0 text-description'>{suffix}</span>}\n {checked && <Icon icon='ph--check--regular' size={5} />}\n </div>\n );\n },\n);\n\nSearchListItem.displayName = 'SearchList.Item';\n\n//\n// Empty\n//\n\ntype SearchListEmptyProps = ThemedClassName<PropsWithChildren<{}>>;\n\nconst SearchListEmpty = ({ classNames, children }: SearchListEmptyProps) => {\n return (\n <div role='status' className={mx('flex flex-col w-full px-2 py-1', classNames)}>\n {children}\n </div>\n );\n};\n\nSearchListEmpty.displayName = 'SearchList.Empty';\n\n//\n// Group\n//\n\ntype SearchListGroupProps = ThemedClassName<\n PropsWithChildren<{\n /** Heading for the group. */\n heading?: ReactNode;\n }>\n>;\n\n/**\n * Groups related search items with an optional heading.\n */\nconst SearchListGroup = forwardRef<HTMLDivElement, SearchListGroupProps>(\n ({ classNames, heading, children }, forwardedRef) => {\n return (\n <div ref={forwardedRef} role='group' className={mx('flex flex-col', classNames)}>\n {heading && (\n <div role='presentation' className='px-2 py-1 text-xs font-medium text-description'>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n },\n);\n\nSearchListGroup.displayName = 'SearchList.Group';\n\n//\n// SearchList\n//\n\nexport const SearchList = {\n Root: SearchListRoot,\n Content: SearchListContent,\n Viewport: SearchListViewport,\n Input: SearchListInput,\n Item: SearchListItem,\n Empty: SearchListEmpty,\n Group: SearchListGroup,\n};\n\nexport type {\n SearchListRootProps,\n SearchListContentProps,\n SearchListViewportProps,\n SearchListInputProps,\n SearchListItemProps,\n SearchListEmptyProps,\n SearchListGroupProps,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = '@dxos/react-ui-searchlist';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'search.placeholder': 'Search...',\n },\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\n\n/** Context for items - stable, doesn't change when query changes */\nexport type SearchListItemContextValue = {\n /** Currently selected item value for keyboard navigation. */\n selectedValue: string | undefined;\n /** Update the selected value. */\n onSelectedValueChange: (value: string | undefined) => void;\n /** Register an item for keyboard navigation. */\n registerItem: (\n value: string,\n element: HTMLElement | null,\n onSelect: (() => void) | undefined,\n disabled?: boolean,\n ) => void;\n /** Unregister an item. */\n unregisterItem: (value: string) => void;\n};\n\n/** Context for input - can change frequently with query */\nexport type SearchListInputContextValue = {\n /** Current search query. */\n query: string;\n /** Update the query value. */\n onQueryChange: (query: string) => void;\n /** Currently selected item value for keyboard navigation. */\n selectedValue: string | undefined;\n /** Update the selected value. */\n onSelectedValueChange: (value: string | undefined) => void;\n /** Get ordered list of registered item values (excludes disabled items). */\n getItemValues: () => string[];\n /** Trigger selection of the currently highlighted item. */\n triggerSelect: () => void;\n};\n\nexport const [SearchListItemContextProvider, useSearchListItemContext] =\n createContext<SearchListItemContextValue>('SearchListItem');\nexport const [SearchListInputContextProvider, useSearchListInputContext] =\n createContext<SearchListInputContextValue>('SearchListInput');\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext, useContext, useMemo } from 'react';\n\n/**\n * Type for a filter function that filters an array of objects.\n */\nexport type FilterFunction<T = any> = (objects: T[]) => T[];\n\ntype GlobalFilterContextType = {\n /** The current filter function. */\n filter?: FilterFunction;\n};\n\nconst GlobalFilterContext = createContext<GlobalFilterContextType>({});\n\nexport type GlobalFilterProviderProps = PropsWithChildren<{\n /** The filter function to apply globally. */\n filter?: FilterFunction;\n}>;\n\n/**\n * Provider that makes a filter function available globally.\n * Used by plugin-search to provide its regex-based filtering.\n */\nexport const GlobalFilterProvider = ({ children, filter }: GlobalFilterProviderProps) => {\n const value = useMemo(() => ({ filter }), [filter]);\n return <GlobalFilterContext.Provider value={value}>{children}</GlobalFilterContext.Provider>;\n};\n\n/**\n * Hook to access the global filter context.\n * Returns the filter function if one is provided.\n */\nexport const useGlobalFilter = () => {\n return useContext(GlobalFilterContext);\n};\n\n/**\n * Hook that applies the global filter to an array of objects.\n * If no filter is set, returns the original objects unchanged.\n *\n * @example\n * const objects = useQuery(db, Filter.everything());\n * const filteredObjects = useGlobalFilteredObjects(objects);\n */\nexport const useGlobalFilteredObjects = <T extends Record<string, any>>(objects?: T[]): T[] => {\n const { filter } = useGlobalFilter();\n\n return useMemo(() => {\n if (!objects) {\n return [];\n }\n if (!filter) {\n return objects;\n }\n return filter(objects);\n }, [objects, filter]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useSearchListInputContext } from '../context';\n\n/**\n * Hook to access the search context for custom input implementations.\n */\nexport const useSearchListInput = () => {\n const { query, onQueryChange, selectedValue, onSelectedValueChange, getItemValues, triggerSelect } =\n useSearchListInputContext('useSearchListInput');\n return { query, onQueryChange, selectedValue, onSelectedValueChange, getItemValues, triggerSelect };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useSearchListItemContext } from '../context';\n\n/**\n * Hook to access selection state for custom item renderers.\n * Returns the current selected value and registration functions.\n */\nexport const useSearchListItem = () => {\n const { selectedValue, registerItem, unregisterItem } = useSearchListItemContext('useSearchListItem');\n return { selectedValue, registerItem, unregisterItem };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport commandScore from 'command-score';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nexport type UseSearchListResultsOptions<T> = {\n /** Items to filter. */\n items: T[];\n /** Custom filter function. Defaults to filtering by extracted string. */\n filter?: (item: T, query: string) => boolean;\n /** Enable fuzzy filtering using command-score algorithm. Defaults to true. */\n fuzzy?: boolean;\n /** Custom function to extract the searchable string from an item. Defaults to accessing 'label' property if it exists. */\n extract?: (item: T) => string;\n /** Minimum score threshold for fuzzy matches (0-1). Defaults to 0. */\n minScore?: number;\n};\n\n/**\n * Hook to manage search results with fuzzy filtering (enabled by default).\n * Returns filtered results and a handleSearch function to pass to SearchList.Root.\n *\n * @example\n * // Default fuzzy filtering using command-score (tries to extract from 'label' property)\n * const { results, handleSearch } = useSearchListResults({ items });\n *\n * @example\n * // Disable fuzzy for basic case-insensitive substring match\n * const { results, handleSearch } = useSearchListResults({ items, fuzzy: false });\n *\n * @example\n * // Custom extraction for fuzzy filtering\n * const { results, handleSearch } = useSearchListResults({\n * items,\n * extract: (item) => `${item.name} ${item.description}`,\n * });\n */\nexport const useSearchListResults = <T = unknown>({\n items,\n filter,\n fuzzy = true,\n extract,\n minScore = 0,\n}: UseSearchListResultsOptions<T>) => {\n const [query, setQuery] = useState<string>('');\n const queryRef = useRef<string>('');\n\n // Update results when items change.\n useEffect(() => {\n queryRef.current = '';\n setQuery('');\n }, [items]);\n\n const defaultExtract = useCallback((item: T) => {\n // If item is a string, return it directly\n if (typeof item === 'string') {\n return item;\n }\n // Otherwise, try to access 'label' property\n return (item as any)?.label ?? '';\n }, []);\n const extractFn = extract ?? defaultExtract;\n\n const defaultFilter = useCallback(\n (item: T, query: string) => {\n const searchable = extractFn(item);\n return searchable.toLowerCase().includes(query.toLowerCase());\n },\n [extractFn],\n );\n\n const filterFn = filter ?? defaultFilter;\n\n const handleSearch = useCallback((searchQuery: string) => {\n queryRef.current = searchQuery;\n setQuery(searchQuery);\n }, []);\n\n const results = useMemo(() => {\n const currentQuery = queryRef.current;\n if (!currentQuery) {\n return items;\n }\n\n if (fuzzy) {\n // Score and filter items using command-score.\n const scored = items\n .map((item) => ({\n item,\n score: commandScore(extractFn(item), currentQuery) as number,\n }))\n .filter(({ score }) => score > minScore)\n .sort((a, b) => b.score - a.score);\n\n return scored.map(({ item }) => item);\n } else {\n return items.filter((item) => filterFn(item, currentQuery));\n }\n }, [items, query, filterFn, fuzzy, extractFn, minScore]);\n\n return { results, handleSearch };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { type Scope, createContextScope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type ComponentPropsWithRef, forwardRef, useCallback, useEffect, useRef } from 'react';\n\nimport { Icon, type IconProps, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nconst commandItem = 'flex items-center overflow-hidden';\n\nconst LISTBOX_NAME = 'Listbox';\nconst LISTBOX_OPTION_NAME = 'ListboxOption';\nconst LISTBOX_OPTION_LABEL_NAME = 'ListboxOptionLabel';\nconst LISTBOX_OPTION_INDICATOR_NAME = 'ListboxOptionIndicator';\n\n//\n// Context\n//\n\ntype ListboxScopedProps<P> = P & { __listboxScope?: Scope };\ntype ListboxOptionScopedProps<P> = P & { __listboxOptionScope?: Scope };\n\ntype ListboxOptionProps = ThemedClassName<ComponentPropsWithRef<'li'>> & {\n value: string;\n};\n\nconst [createListboxContext, createListboxScope] = createContextScope(LISTBOX_NAME, []);\nconst [createListboxOptionContext, createListboxOptionScope] = createContextScope(LISTBOX_OPTION_NAME, [\n createListboxScope,\n]);\n\ntype ListboxContextValue = {\n selectedValue: string | undefined;\n onValueChange: (value: string) => void;\n};\n\ntype ListboxOptionContextValue = {\n value: string;\n isSelected: boolean;\n};\n\nconst [ListboxProvider, useListboxContext] = createListboxContext<ListboxContextValue>(LISTBOX_NAME);\nconst [ListboxOptionProvider, useListboxOptionContext] =\n createListboxOptionContext<ListboxOptionContextValue>(LISTBOX_OPTION_NAME);\n\n//\n// Root\n//\n\ntype ListboxRootProps = ThemedClassName<ComponentPropsWithRef<'ul'>> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n autoFocus?: boolean;\n};\n\n// TODO(thure): Note that this overlaps significantly with the the `SelectableListbox` story of `List.tsx` in `react-ui`,\n// making this an exemplar of `List` specifying standard `role=\"listbox\"` interactivity, though it is here because it\n// coheres with SearchList’s styles and norms. This can be promoted to `react-ui`, but doing so should involve clearing\n// the technical- and design-debt in its `List` component.\nconst ListboxRoot = forwardRef<HTMLUListElement, ListboxRootProps>(\n (props: ListboxScopedProps<ListboxRootProps>, forwardedRef) => {\n const {\n __listboxScope,\n children,\n classNames,\n value: propsValue,\n defaultValue,\n onValueChange,\n autoFocus,\n ...rootProps\n } = props;\n\n const arrowGroup = useArrowNavigationGroup({ axis: 'vertical' });\n const ref = useRef<HTMLUListElement | null>(null);\n const rootRef = useComposedRefs<HTMLUListElement>(ref, forwardedRef);\n\n const [selectedValue, setSelectedValue] = useControllableState({\n prop: propsValue,\n defaultProp: defaultValue,\n onChange: onValueChange,\n });\n\n const handleValueChange = (value: string) => {\n setSelectedValue(value);\n };\n\n useEffect(() => {\n // Autofocus the selected option on mount using querySelector\n (ref.current?.querySelector('[aria-selected=\"true\"]') as HTMLLIElement)?.focus();\n }, [autoFocus]);\n\n return (\n <ListboxProvider scope={__listboxScope} selectedValue={selectedValue} onValueChange={handleValueChange}>\n <ul\n role='listbox'\n {...rootProps}\n className={mx('w-full p-form-chrome', classNames)}\n ref={rootRef}\n {...arrowGroup}\n >\n {children}\n </ul>\n </ListboxProvider>\n );\n },\n);\n\nListboxRoot.displayName = LISTBOX_NAME;\n\n//\n// Option\n//\n\nconst ListboxOption = forwardRef<HTMLLIElement, ListboxOptionProps>(\n (props: ListboxScopedProps<ListboxOptionProps>, forwardedRef) => {\n const { __listboxScope, children, classNames, value, ...rootProps } = props;\n const { selectedValue, onValueChange } = useListboxContext(LISTBOX_OPTION_NAME, __listboxScope);\n\n const isSelected = selectedValue === value;\n\n const handleSelect = useCallback(() => {\n onValueChange(value);\n }, [value, onValueChange]);\n\n return (\n <ListboxOptionProvider scope={__listboxScope} value={value} isSelected={isSelected}>\n <li\n role='option'\n {...rootProps}\n aria-selected={isSelected}\n tabIndex={0}\n className={mx(\n 'dx-focus-ring',\n 'py-1 px-2 rounded-xs select-none cursor-pointer data-[selected=true]:bg-hover-overlay hover:bg-hover-overlay',\n commandItem,\n classNames,\n )}\n onClick={handleSelect}\n onKeyDown={({ key }) => {\n if (['Enter', ' '].includes(key)) {\n handleSelect();\n }\n }}\n ref={forwardedRef}\n >\n {children}\n </li>\n </ListboxOptionProvider>\n );\n },\n);\n\nListboxOption.displayName = LISTBOX_OPTION_NAME;\n\n//\n// OptionLabel\n//\n\nconst ListboxOptionLabel = forwardRef<HTMLDivElement, ThemedClassName<ComponentPropsWithRef<'div'>>>(\n ({ children, classNames, ...rootProps }, forwardedRef) => {\n return (\n <span {...rootProps} className={mx('grow truncate', classNames)} ref={forwardedRef}>\n {children}\n </span>\n );\n },\n);\n\nListboxOptionLabel.displayName = LISTBOX_OPTION_LABEL_NAME;\n\ntype ListboxOptionIndicatorProps = Omit<IconProps, 'icon'> & Partial<Pick<IconProps, 'icon'>>;\n\n//\n// OptionIndicator\n//\n\nconst ListboxOptionIndicator = forwardRef<SVGSVGElement, ListboxOptionIndicatorProps>(\n (props: ListboxOptionScopedProps<ListboxOptionIndicatorProps>, forwardedRef) => {\n const { __listboxOptionScope, classNames, ...rootProps } = props;\n const { isSelected } = useListboxOptionContext(LISTBOX_OPTION_INDICATOR_NAME, __listboxOptionScope);\n\n return (\n <Icon\n icon='ph--check--regular'\n {...rootProps}\n classNames={mx(!isSelected && 'invisible', classNames)}\n ref={forwardedRef}\n />\n );\n },\n);\n\nListboxOptionIndicator.displayName = LISTBOX_OPTION_INDICATOR_NAME;\n\n//\n// Listbox\n//\n\nexport const Listbox = {\n Root: ListboxRoot,\n Option: ListboxOption,\n OptionLabel: ListboxOptionLabel,\n OptionIndicator: ListboxOptionIndicator,\n};\n\nexport { createListboxScope, useListboxContext };\n\nexport type { ListboxRootProps, ListboxOptionProps, ListboxScopedProps };\n"],
5
+ "mappings": "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",
6
+ "names": ["createContext", "useControllableState", "React", "forwardRef", "useCallback", "Button", "Icon", "Popover", "useId", "mx", "useControllableState", "React", "forwardRef", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Icon", "ScrollArea", "useDensityContext", "useElevationContext", "useThemeContext", "useTranslation", "mx", "translationKey", "translations", "createContext", "SearchListItemContextProvider", "useSearchListItemContext", "createContext", "SearchListInputContextProvider", "useSearchListInputContext", "SearchListRoot", "children", "value", "valueProp", "defaultValue", "debounceMs", "onSearch", "query", "setQuery", "useControllableState", "prop", "defaultProp", "onChange", "undefined", "selectedValue", "setSelectedValue", "useState", "itemsRef", "useRef", "Map", "debounceRef", "handleQueryChange", "useCallback", "newQuery", "current", "clearTimeout", "setTimeout", "itemVersion", "setItemVersion", "useEffect", "currentItem", "get", "isSelectionValid", "disabled", "size", "entries", "Array", "from", "filter", "data", "length", "sort", "a", "b", "position", "element", "compareDocumentPosition", "Node", "DOCUMENT_POSITION_FOLLOWING", "DOCUMENT_POSITION_PRECEDING", "firstValue", "registerItem", "onSelect", "set", "v", "unregisterItem", "delete", "getItemValues", "map", "triggerSelect", "item", "itemContextValue", "useMemo", "onSelectedValueChange", "inputContextValue", "onQueryChange", "SearchListInputContextProvider", "SearchListItemContextProvider", "displayName", "SearchListContent", "forwardRef", "classNames", "props", "forwardedRef", "div", "role", "className", "mx", "ref", "SearchListInput", "density", "propsDensity", "elevation", "propsElevation", "variant", "placeholder", "useSearchListInputContext", "t", "useTranslation", "translationKey", "hasIosKeyboard", "tx", "useThemeContext", "useDensityContext", "useElevationContext", "defaultPlaceholder", "handleChange", "event", "target", "handleKeyDown", "values", "key", "currentIndex", "indexOf", "preventDefault", "nextIndex", "Math", "min", "nextValue", "prevIndex", "max", "prevValue", "lastValue", "input", "autoFocus", "type", "onKeyDown", "SearchListViewport", "ScrollArea", "Root", "thin", "Viewport", "SearchListItem", "label", "icon", "iconClassNames", "checked", "suffix", "useSearchListItemContext", "internalRef", "isSelected", "scrollIntoView", "block", "behavior", "handleClick", "node", "aria-selected", "aria-disabled", "data-selected", "data-disabled", "data-value", "tabIndex", "onClick", "Icon", "span", "SearchListEmpty", "SearchListGroup", "heading", "SearchList", "Content", "Input", "Item", "Empty", "Group", "React", "createContext", "useContext", "useMemo", "GlobalFilterContext", "createContext", "GlobalFilterProvider", "children", "filter", "value", "useMemo", "React", "Provider", "useGlobalFilter", "useContext", "useGlobalFilteredObjects", "objects", "useSearchListInput", "query", "onQueryChange", "selectedValue", "onSelectedValueChange", "getItemValues", "triggerSelect", "useSearchListInputContext", "useSearchListItem", "selectedValue", "registerItem", "unregisterItem", "useSearchListItemContext", "commandScore", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useSearchListResults", "items", "filter", "fuzzy", "extract", "minScore", "query", "setQuery", "useState", "queryRef", "useRef", "useEffect", "current", "defaultExtract", "useCallback", "item", "label", "extractFn", "defaultFilter", "searchable", "toLowerCase", "includes", "filterFn", "handleSearch", "searchQuery", "results", "useMemo", "currentQuery", "scored", "map", "score", "commandScore", "sort", "a", "b", "COMBOBOX_NAME", "COMBOBOX_CONTENT_NAME", "COMBOBOX_ITEM_NAME", "COMBOBOX_TRIGGER_NAME", "ComboboxProvider", "useComboboxContext", "createContext", "ComboboxRoot", "modal", "modalId", "propsModalId", "open", "propsOpen", "defaultOpen", "onOpenChange", "propsOnOpenChange", "value", "propsValue", "defaultValue", "onValueChange", "propsOnValueChange", "placeholder", "children", "useId", "useControllableState", "prop", "onChange", "defaultProp", "React", "Popover", "Root", "isCombobox", "ComboboxContent", "forwardRef", "side", "collisionPadding", "sideOffset", "align", "alignOffset", "avoidCollisions", "collisionBoundary", "arrowPadding", "sticky", "hideWhenDetached", "onOpenAutoFocus", "onCloseAutoFocus", "onEscapeKeyDown", "onPointerDownOutside", "onFocusOutside", "onInteractOutside", "forceMount", "classNames", "onSearch", "debounceMs", "label", "forwardedRef", "Content", "id", "ref", "SearchList", "displayName", "ComboboxTrigger", "onClick", "props", "handleClick", "useCallback", "event", "Trigger", "asChild", "Button", "role", "aria-expanded", "aria-controls", "aria-haspopup", "span", "className", "mx", "Icon", "icon", "size", "ComboboxVirtualTrigger", "VirtualTrigger", "ComboboxInput", "Input", "ComboboxList", "Viewport", "ComboboxItem", "onSelect", "closeOnSelect", "handleSelect", "undefined", "Item", "ComboboxArrow", "Arrow", "ComboboxEmpty", "Empty", "ComboboxPortal", "Portal", "Combobox", "List", "useArrowNavigationGroup", "useComposedRefs", "createContextScope", "useControllableState", "React", "forwardRef", "useCallback", "useEffect", "useRef", "Icon", "mx", "commandItem", "LISTBOX_NAME", "LISTBOX_OPTION_NAME", "LISTBOX_OPTION_LABEL_NAME", "LISTBOX_OPTION_INDICATOR_NAME", "createListboxContext", "createListboxScope", "createContextScope", "createListboxOptionContext", "createListboxOptionScope", "ListboxProvider", "useListboxContext", "ListboxOptionProvider", "useListboxOptionContext", "ListboxRoot", "forwardRef", "props", "forwardedRef", "__listboxScope", "children", "classNames", "value", "propsValue", "defaultValue", "onValueChange", "autoFocus", "rootProps", "arrowGroup", "useArrowNavigationGroup", "axis", "ref", "useRef", "rootRef", "useComposedRefs", "selectedValue", "setSelectedValue", "useControllableState", "prop", "defaultProp", "onChange", "handleValueChange", "useEffect", "current", "querySelector", "focus", "React", "scope", "ul", "role", "className", "mx", "displayName", "ListboxOption", "isSelected", "handleSelect", "useCallback", "li", "aria-selected", "tabIndex", "onClick", "onKeyDown", "key", "includes", "ListboxOptionLabel", "span", "ListboxOptionIndicator", "__listboxOptionScope", "Icon", "icon", "Listbox", "Root", "Option", "OptionLabel", "OptionIndicator"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"src/translations.ts":{"bytes":1226,"imports":[],"format":"esm"},"src/components/SearchList/context.ts":{"bytes":3162,"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true}],"format":"esm"},"src/components/SearchList/SearchList.tsx":{"bytes":49848,"imports":[{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"src/translations.ts","kind":"import-statement","original":"../../translations"},{"path":"src/components/SearchList/context.ts","kind":"import-statement","original":"./context"}],"format":"esm"},"src/components/SearchList/hooks/useGlobalFilter.tsx":{"bytes":5067,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/components/SearchList/hooks/useSearchListInput.ts":{"bytes":2012,"imports":[{"path":"src/components/SearchList/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"src/components/SearchList/hooks/useSearchListItem.ts":{"bytes":1753,"imports":[{"path":"src/components/SearchList/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"src/components/SearchList/hooks/useSearchListResults.ts":{"bytes":9665,"imports":[{"path":"command-score","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/components/SearchList/hooks/index.ts":{"bytes":852,"imports":[{"path":"src/components/SearchList/hooks/useGlobalFilter.tsx","kind":"import-statement","original":"./useGlobalFilter"},{"path":"src/components/SearchList/hooks/useSearchListInput.ts","kind":"import-statement","original":"./useSearchListInput"},{"path":"src/components/SearchList/hooks/useSearchListItem.ts","kind":"import-statement","original":"./useSearchListItem"},{"path":"src/components/SearchList/hooks/useSearchListResults.ts","kind":"import-statement","original":"./useSearchListResults"}],"format":"esm"},"src/components/SearchList/index.ts":{"bytes":567,"imports":[{"path":"src/components/SearchList/SearchList.tsx","kind":"import-statement","original":"./SearchList"},{"path":"src/components/SearchList/hooks/index.ts","kind":"import-statement","original":"./hooks"}],"format":"esm"},"src/components/Combobox/Combobox.tsx":{"bytes":24519,"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"src/components/SearchList/index.ts","kind":"import-statement","original":"../SearchList"}],"format":"esm"},"src/components/Combobox/index.ts":{"bytes":478,"imports":[{"path":"src/components/Combobox/Combobox.tsx","kind":"import-statement","original":"./Combobox"}],"format":"esm"},"src/components/Listbox/Listbox.tsx":{"bytes":19311,"imports":[{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@radix-ui/react-compose-refs","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"format":"esm"},"src/components/Listbox/index.ts":{"bytes":476,"imports":[{"path":"src/components/Listbox/Listbox.tsx","kind":"import-statement","original":"./Listbox"}],"format":"esm"},"src/components/index.ts":{"bytes":650,"imports":[{"path":"src/components/Combobox/index.ts","kind":"import-statement","original":"./Combobox"},{"path":"src/components/Listbox/index.ts","kind":"import-statement","original":"./Listbox"},{"path":"src/components/SearchList/index.ts","kind":"import-statement","original":"./SearchList"}],"format":"esm"},"src/index.ts":{"bytes":564,"imports":[{"path":"src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":61981},"dist/lib/browser/index.mjs":{"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"command-score","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@radix-ui/react-compose-refs","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"exports":["Combobox","GlobalFilterProvider","Listbox","SearchList","createListboxScope","translationKey","translations","useGlobalFilter","useGlobalFilteredObjects","useListboxContext","useSearchListInput","useSearchListItem","useSearchListResults"],"entryPoint":"src/index.ts","inputs":{"src/components/Combobox/Combobox.tsx":{"bytesInOutput":5817},"src/components/SearchList/SearchList.tsx":{"bytesInOutput":11463},"src/translations.ts":{"bytesInOutput":179},"src/components/SearchList/context.ts":{"bytesInOutput":254},"src/components/SearchList/hooks/useGlobalFilter.tsx":{"bytesInOutput":737},"src/components/SearchList/hooks/useSearchListInput.ts":{"bytesInOutput":317},"src/components/SearchList/hooks/useSearchListItem.ts":{"bytesInOutput":212},"src/components/SearchList/hooks/useSearchListResults.ts":{"bytesInOutput":1614},"src/components/Listbox/Listbox.tsx":{"bytesInOutput":4368},"src/index.ts":{"bytesInOutput":0}},"bytes":25765}}}
1
+ {"inputs":{"src/translations.ts":{"bytes":1226,"imports":[],"format":"esm"},"src/components/SearchList/context.ts":{"bytes":3162,"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true}],"format":"esm"},"src/components/SearchList/SearchList.tsx":{"bytes":49632,"imports":[{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"src/translations.ts","kind":"import-statement","original":"../../translations"},{"path":"src/components/SearchList/context.ts","kind":"import-statement","original":"./context"}],"format":"esm"},"src/components/SearchList/hooks/useGlobalFilter.tsx":{"bytes":5067,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/components/SearchList/hooks/useSearchListInput.ts":{"bytes":2012,"imports":[{"path":"src/components/SearchList/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"src/components/SearchList/hooks/useSearchListItem.ts":{"bytes":1753,"imports":[{"path":"src/components/SearchList/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"src/components/SearchList/hooks/useSearchListResults.ts":{"bytes":9665,"imports":[{"path":"command-score","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/components/SearchList/hooks/index.ts":{"bytes":852,"imports":[{"path":"src/components/SearchList/hooks/useGlobalFilter.tsx","kind":"import-statement","original":"./useGlobalFilter"},{"path":"src/components/SearchList/hooks/useSearchListInput.ts","kind":"import-statement","original":"./useSearchListInput"},{"path":"src/components/SearchList/hooks/useSearchListItem.ts","kind":"import-statement","original":"./useSearchListItem"},{"path":"src/components/SearchList/hooks/useSearchListResults.ts","kind":"import-statement","original":"./useSearchListResults"}],"format":"esm"},"src/components/SearchList/index.ts":{"bytes":567,"imports":[{"path":"src/components/SearchList/SearchList.tsx","kind":"import-statement","original":"./SearchList"},{"path":"src/components/SearchList/hooks/index.ts","kind":"import-statement","original":"./hooks"}],"format":"esm"},"src/components/Combobox/Combobox.tsx":{"bytes":24183,"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"src/components/SearchList/index.ts","kind":"import-statement","original":"../SearchList"}],"format":"esm"},"src/components/Combobox/index.ts":{"bytes":478,"imports":[{"path":"src/components/Combobox/Combobox.tsx","kind":"import-statement","original":"./Combobox"}],"format":"esm"},"src/components/Listbox/Listbox.tsx":{"bytes":19292,"imports":[{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@radix-ui/react-compose-refs","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"format":"esm"},"src/components/Listbox/index.ts":{"bytes":476,"imports":[{"path":"src/components/Listbox/Listbox.tsx","kind":"import-statement","original":"./Listbox"}],"format":"esm"},"src/components/index.ts":{"bytes":650,"imports":[{"path":"src/components/Combobox/index.ts","kind":"import-statement","original":"./Combobox"},{"path":"src/components/Listbox/index.ts","kind":"import-statement","original":"./Listbox"},{"path":"src/components/SearchList/index.ts","kind":"import-statement","original":"./SearchList"}],"format":"esm"},"src/index.ts":{"bytes":564,"imports":[{"path":"src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":61736},"dist/lib/browser/index.mjs":{"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"command-score","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@radix-ui/react-compose-refs","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"exports":["Combobox","GlobalFilterProvider","Listbox","SearchList","createListboxScope","translationKey","translations","useGlobalFilter","useGlobalFilteredObjects","useListboxContext","useSearchListInput","useSearchListItem","useSearchListResults"],"entryPoint":"src/index.ts","inputs":{"src/components/Combobox/Combobox.tsx":{"bytesInOutput":5729},"src/components/SearchList/SearchList.tsx":{"bytesInOutput":11488},"src/translations.ts":{"bytesInOutput":179},"src/components/SearchList/context.ts":{"bytesInOutput":254},"src/components/SearchList/hooks/useGlobalFilter.tsx":{"bytesInOutput":737},"src/components/SearchList/hooks/useSearchListInput.ts":{"bytesInOutput":317},"src/components/SearchList/hooks/useSearchListItem.ts":{"bytesInOutput":212},"src/components/SearchList/hooks/useSearchListResults.ts":{"bytesInOutput":1614},"src/components/Listbox/Listbox.tsx":{"bytesInOutput":4361},"src/index.ts":{"bytesInOutput":0}},"bytes":25695}}}