@dxos/react-ui-searchlist 0.8.4-main.69d29f4 → 0.8.4-main.6fa680abb7

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.
@@ -6,13 +6,13 @@ import { useControllableState as useControllableState2 } from "@radix-ui/react-u
6
6
  import React3, { forwardRef as forwardRef2, useCallback as useCallback3 } from "react";
7
7
  import { Button, Icon as Icon2, Popover } from "@dxos/react-ui";
8
8
  import { useId } from "@dxos/react-ui";
9
- import { mx as mx2, staticPlaceholderText } from "@dxos/ui-theme";
9
+ import { mx as mx2 } from "@dxos/ui-theme";
10
10
 
11
11
  // src/components/SearchList/SearchList.tsx
12
12
  import { useControllableState } from "@radix-ui/react-use-controllable-state";
13
13
  import React, { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
14
- import { Icon, useDensityContext, useElevationContext, useThemeContext, useTranslation } from "@dxos/react-ui";
15
- import { descriptionText, mx } from "@dxos/ui-theme";
14
+ import { Icon, ScrollArea, useDensityContext, useElevationContext, useThemeContext, useTranslation } from "@dxos/react-ui";
15
+ import { mx } from "@dxos/ui-theme";
16
16
 
17
17
  // src/translations.ts
18
18
  var translationKey = "@dxos/react-ui-searchlist";
@@ -157,18 +157,12 @@ var SearchListRoot = ({ children, value: valueProp, defaultValue = "", debounceM
157
157
  }, children));
158
158
  };
159
159
  SearchListRoot.displayName = "SearchList.Root";
160
- var SearchListViewport = ({ classNames, children }) => {
160
+ var SearchListContent = /* @__PURE__ */ forwardRef(({ classNames, children, ...props }, forwardedRef) => {
161
161
  return /* @__PURE__ */ React.createElement("div", {
162
162
  role: "none",
163
- className: mx("is-full min-bs-0 grow overflow-y-auto", classNames)
164
- }, children);
165
- };
166
- SearchListViewport.displayName = "SearchList.Viewport";
167
- var SearchListContent = /* @__PURE__ */ forwardRef(({ classNames, children }, forwardedRef) => {
168
- return /* @__PURE__ */ React.createElement("div", {
169
- ref: forwardedRef,
170
- role: "listbox",
171
- className: mx("flex flex-col is-full min-bs-0 grow overflow-hidden", classNames)
163
+ ...props,
164
+ className: mx("dx-container flex flex-col gap-3", classNames),
165
+ ref: forwardedRef
172
166
  }, children);
173
167
  });
174
168
  SearchListContent.displayName = "SearchList.Content";
@@ -260,21 +254,30 @@ var SearchListInput = /* @__PURE__ */ forwardRef(({ classNames, density: propsDe
260
254
  autoFocus: true
261
255
  },
262
256
  type: "text",
263
- value: query,
264
257
  placeholder: placeholder ?? defaultPlaceholder,
265
- className: tx("input.input", "input", {
258
+ className: tx("input.input", {
266
259
  variant,
267
260
  disabled: props.disabled,
268
261
  density,
269
262
  elevation
270
263
  }, classNames),
264
+ value: query,
271
265
  onChange: handleChange,
272
266
  onKeyDown: handleKeyDown,
273
267
  ref: forwardedRef
274
268
  });
275
269
  });
276
270
  SearchListInput.displayName = "SearchList.Input";
277
- var SearchListItem = /* @__PURE__ */ forwardRef(({ classNames, value, label, icon, checked, suffix, onSelect, disabled }, forwardedRef) => {
271
+ var SearchListViewport = /* @__PURE__ */ forwardRef(({ classNames, children }, forwardedRef) => {
272
+ return /* @__PURE__ */ React.createElement(ScrollArea.Root, {
273
+ role: "listbox",
274
+ classNames: mx(classNames),
275
+ ref: forwardedRef,
276
+ thin: true
277
+ }, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, null, children));
278
+ });
279
+ SearchListViewport.displayName = "SearchList.Viewport";
280
+ var SearchListItem = /* @__PURE__ */ forwardRef(({ classNames, value, label, icon, iconClassNames, checked, suffix, onSelect, disabled }, forwardedRef) => {
278
281
  const { selectedValue, registerItem, unregisterItem } = useSearchListItemContext("SearchList.Item");
279
282
  const internalRef = useRef(null);
280
283
  const isSelected = selectedValue === value && !disabled;
@@ -325,15 +328,16 @@ var SearchListItem = /* @__PURE__ */ forwardRef(({ classNames, value, label, ico
325
328
  "data-disabled": disabled,
326
329
  "data-value": value,
327
330
  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),
331
+ 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
332
  onClick: handleClick
330
333
  }, icon && /* @__PURE__ */ React.createElement(Icon, {
331
334
  icon,
332
- size: 5
335
+ size: 5,
336
+ classNames: iconClassNames
333
337
  }), /* @__PURE__ */ React.createElement("span", {
334
- className: "is-0 grow truncate"
338
+ className: "w-0 grow truncate"
335
339
  }, label), suffix && /* @__PURE__ */ React.createElement("span", {
336
- className: mx("shrink-0", descriptionText)
340
+ className: "shrink-0 text-description"
337
341
  }, suffix), checked && /* @__PURE__ */ React.createElement(Icon, {
338
342
  icon: "ph--check--regular",
339
343
  size: 5
@@ -343,7 +347,7 @@ SearchListItem.displayName = "SearchList.Item";
343
347
  var SearchListEmpty = ({ classNames, children }) => {
344
348
  return /* @__PURE__ */ React.createElement("div", {
345
349
  role: "status",
346
- className: mx("flex flex-col is-full pli-2 plb-1", classNames)
350
+ className: mx("flex flex-col w-full px-2 py-1", classNames)
347
351
  }, children);
348
352
  };
349
353
  SearchListEmpty.displayName = "SearchList.Empty";
@@ -354,14 +358,14 @@ var SearchListGroup = /* @__PURE__ */ forwardRef(({ classNames, heading, childre
354
358
  className: mx("flex flex-col", classNames)
355
359
  }, heading && /* @__PURE__ */ React.createElement("div", {
356
360
  role: "presentation",
357
- className: "pli-2 plb-1 text-xs font-medium text-description"
361
+ className: "px-2 py-1 text-xs font-medium text-description"
358
362
  }, heading), children);
359
363
  });
360
364
  SearchListGroup.displayName = "SearchList.Group";
361
365
  var SearchList = {
362
366
  Root: SearchListRoot,
363
- Viewport: SearchListViewport,
364
367
  Content: SearchListContent,
368
+ Viewport: SearchListViewport,
365
369
  Input: SearchListInput,
366
370
  Item: SearchListItem,
367
371
  Empty: SearchListEmpty,
@@ -534,7 +538,7 @@ var ComboboxContent = /* @__PURE__ */ forwardRef2(({ side = "bottom", collisionP
534
538
  onInteractOutside,
535
539
  forceMount,
536
540
  classNames: [
537
- "is-[--radix-popover-trigger-width] max-bs-[--radix-popover-content-available-height] grid grid-rows-[min-content_1fr]",
541
+ "w-(--radix-popover-trigger-width) max-h-(--radix-popover-content-available-height) grid grid-rows-[min-content_1fr]",
538
542
  classNames
539
543
  ],
540
544
  id: modalId,
@@ -544,12 +548,7 @@ var ComboboxContent = /* @__PURE__ */ forwardRef2(({ side = "bottom", collisionP
544
548
  value,
545
549
  defaultValue,
546
550
  debounceMs
547
- }, /* @__PURE__ */ React3.createElement("div", {
548
- className: "contents density-fine",
549
- "aria-label": label,
550
- role: "combobox",
551
- "aria-expanded": "true"
552
- }, children)));
551
+ }, /* @__PURE__ */ React3.createElement(SearchList.Content, null, children)));
553
552
  });
554
553
  ComboboxContent.displayName = COMBOBOX_CONTENT_NAME;
555
554
  var ComboboxTrigger = /* @__PURE__ */ forwardRef2(({ children, onClick, ...props }, forwardedRef) => {
@@ -572,7 +571,7 @@ var ComboboxTrigger = /* @__PURE__ */ forwardRef2(({ children, onClick, ...props
572
571
  onClick: handleClick,
573
572
  ref: forwardedRef
574
573
  }, children ?? /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement("span", {
575
- className: mx2("font-normal text-start flex-1 min-is-0 truncate mie-2", !value && staticPlaceholderText)
574
+ className: mx2("font-normal text-start flex-1 min-w-0 truncate me-2", !value && "text-subdued")
576
575
  }, value || placeholder), /* @__PURE__ */ React3.createElement(Icon2, {
577
576
  icon: "ph--caret-down--bold",
578
577
  size: 3
@@ -584,17 +583,17 @@ var ComboboxInput = /* @__PURE__ */ forwardRef2(({ classNames, ...props }, forwa
584
583
  return /* @__PURE__ */ React3.createElement(SearchList.Input, {
585
584
  ...props,
586
585
  classNames: [
587
- "mli-cardSpacingChrome mbs-cardSpacingChrome mbe-0 is-[calc(100%-2*var(--dx-cardSpacingChrome))]",
586
+ "m-form-chrome mb-0 w-[calc(100%-2*var(--spacing-form-chrome))]",
588
587
  classNames
589
588
  ],
590
589
  ref: forwardedRef
591
590
  });
592
591
  });
593
592
  var ComboboxList = /* @__PURE__ */ forwardRef2(({ classNames, ...props }, forwardedRef) => {
594
- return /* @__PURE__ */ React3.createElement(SearchList.Content, {
593
+ return /* @__PURE__ */ React3.createElement(SearchList.Viewport, {
595
594
  ...props,
596
595
  classNames: [
597
- "min-bs-0 overflow-y-auto plb-cardSpacingChrome",
596
+ "py-form-chrome",
598
597
  classNames
599
598
  ],
600
599
  ref: forwardedRef
@@ -621,7 +620,7 @@ var ComboboxItem = /* @__PURE__ */ forwardRef2(({ classNames, onSelect, value, c
621
620
  ...props,
622
621
  value,
623
622
  classNames: [
624
- "mli-cardSpacingChrome pli-cardSpacingChrome",
623
+ "mx-form-chrome px-form-chrome",
625
624
  classNames
626
625
  ],
627
626
  onSelect: handleSelect,
@@ -691,7 +690,7 @@ var ListboxRoot = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
691
690
  }, /* @__PURE__ */ React4.createElement("ul", {
692
691
  role: "listbox",
693
692
  ...rootProps,
694
- className: mx3("is-full p-cardSpacingChrome", classNames),
693
+ className: mx3("w-full p-form-chrome", classNames),
695
694
  ref: rootRef,
696
695
  ...arrowGroup
697
696
  }, children));
@@ -716,7 +715,7 @@ var ListboxOption = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
716
715
  ...rootProps,
717
716
  "aria-selected": isSelected,
718
717
  tabIndex: 0,
719
- 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),
718
+ 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),
720
719
  onClick: handleSelect,
721
720
  onKeyDown: ({ key }) => {
722
721
  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 SearchListContentProps,\n type SearchListEmptyProps,\n type SearchListInputProps,\n type SearchListItemProps,\n type SearchListRootProps,\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 <div className='contents density-fine' aria-label={label} role='combobox' aria-expanded='true'>\n {children}\n </div>\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 = SearchListContentProps;\n\nconst ComboboxList = forwardRef<HTMLDivElement, ComboboxListProps>(({ classNames, ...props }, forwardedRef) => {\n return (\n <SearchList.Content\n {...props}\n classNames={['min-bs-0 overflow-y-auto plb-cardSpacingChrome', classNames]}\n ref={forwardedRef}\n />\n );\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 /** Default query value for uncontrolled mode. */\n defaultValue?: string;\n /** Debounce delay in milliseconds. */\n debounceMs?: number;\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// 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.\nconst SearchListViewport = ({ classNames, children }: SearchListViewportProps) => {\n return (\n <div role='none' className={mx('is-full min-bs-0 grow overflow-y-auto', classNames)}>\n {children}\n </div>\n );\n};\n\nSearchListViewport.displayName = 'SearchList.Viewport';\n\n//\n// Content\n//\n\ntype SearchListContentProps = ThemedClassName<PropsWithChildren<{}>>;\n\n/**\n * Container for search results. Does not scroll by default.\n * Wrap in Viewport for scrollable content.\n */\nconst SearchListContent = forwardRef<HTMLDivElement, SearchListContentProps>(\n ({ classNames, children }, forwardedRef) => {\n return (\n <div\n ref={forwardedRef}\n role='listbox'\n className={mx('flex flex-col is-full min-bs-0 grow overflow-hidden', classNames)}\n >\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 value={query}\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 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 Viewport: SearchListViewport,\n Content: SearchListContent,\n Input: SearchListInput,\n Item: SearchListItem,\n Empty: SearchListEmpty,\n Group: SearchListGroup,\n};\n\nexport type {\n SearchListRootProps,\n SearchListViewportProps,\n SearchListContentProps,\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": "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",
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", "SearchListViewport", "classNames", "div", "role", "className", "mx", "SearchListContent", "forwardRef", "forwardedRef", "ref", "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", "Viewport", "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", "div", "className", "aria-label", "role", "aria-expanded", "displayName", "ComboboxTrigger", "onClick", "props", "handleClick", "useCallback", "event", "Trigger", "asChild", "Button", "aria-controls", "aria-haspopup", "span", "mx", "staticPlaceholderText", "Icon", "icon", "size", "ComboboxVirtualTrigger", "VirtualTrigger", "ComboboxInput", "Input", "ComboboxList", "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":49710,"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":24920,"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/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":62103},"dist/lib/node-esm/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":5944},"src/components/SearchList/SearchList.tsx":{"bytesInOutput":11344},"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":25866}}}
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/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":61738},"dist/lib/node-esm/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":25788}}}