@salt-ds/lab 1.0.0-alpha.19 → 1.0.0-alpha.20

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.
Files changed (50) hide show
  1. package/dist-cjs/combo-box-next/ComboBoxNext.js +6 -6
  2. package/dist-cjs/combo-box-next/ComboBoxNext.js.map +1 -1
  3. package/dist-cjs/combo-box-next/useComboBox.js +11 -11
  4. package/dist-cjs/combo-box-next/useComboBox.js.map +1 -1
  5. package/dist-cjs/combo-box-next/useComboboxPortal.js +1 -1
  6. package/dist-cjs/combo-box-next/useComboboxPortal.js.map +1 -1
  7. package/dist-cjs/combo-box-next/utils.js +5 -9
  8. package/dist-cjs/combo-box-next/utils.js.map +1 -1
  9. package/dist-cjs/dropdown-next/DropdownNext.js +20 -14
  10. package/dist-cjs/dropdown-next/DropdownNext.js.map +1 -1
  11. package/dist-cjs/dropdown-next/useDropdownNext.js +29 -16
  12. package/dist-cjs/dropdown-next/useDropdownNext.js.map +1 -1
  13. package/dist-cjs/index.js +0 -2
  14. package/dist-cjs/index.js.map +1 -1
  15. package/dist-cjs/pill-next/PillNext.css.js +1 -1
  16. package/dist-cjs/pill-next/PillNext.js +32 -20
  17. package/dist-cjs/pill-next/PillNext.js.map +1 -1
  18. package/dist-es/combo-box-next/ComboBoxNext.js +6 -6
  19. package/dist-es/combo-box-next/ComboBoxNext.js.map +1 -1
  20. package/dist-es/combo-box-next/useComboBox.js +11 -11
  21. package/dist-es/combo-box-next/useComboBox.js.map +1 -1
  22. package/dist-es/combo-box-next/useComboboxPortal.js +1 -1
  23. package/dist-es/combo-box-next/useComboboxPortal.js.map +1 -1
  24. package/dist-es/combo-box-next/utils.js +5 -9
  25. package/dist-es/combo-box-next/utils.js.map +1 -1
  26. package/dist-es/dropdown-next/DropdownNext.js +20 -14
  27. package/dist-es/dropdown-next/DropdownNext.js.map +1 -1
  28. package/dist-es/dropdown-next/useDropdownNext.js +29 -16
  29. package/dist-es/dropdown-next/useDropdownNext.js.map +1 -1
  30. package/dist-es/index.js +0 -1
  31. package/dist-es/index.js.map +1 -1
  32. package/dist-es/pill-next/PillNext.css.js +1 -1
  33. package/dist-es/pill-next/PillNext.js +33 -21
  34. package/dist-es/pill-next/PillNext.js.map +1 -1
  35. package/dist-types/combo-box-next/useComboBox.d.ts +3 -2
  36. package/dist-types/combo-box-next/utils.d.ts +1 -1
  37. package/dist-types/dropdown-next/useDropdownNext.d.ts +7 -3
  38. package/dist-types/index.d.ts +0 -1
  39. package/dist-types/pill-next/PillNext.d.ts +2 -2
  40. package/package.json +2 -2
  41. package/dist-cjs/switch/Switch.css.js +0 -6
  42. package/dist-cjs/switch/Switch.css.js.map +0 -1
  43. package/dist-cjs/switch/Switch.js +0 -117
  44. package/dist-cjs/switch/Switch.js.map +0 -1
  45. package/dist-es/switch/Switch.css.js +0 -4
  46. package/dist-es/switch/Switch.css.js.map +0 -1
  47. package/dist-es/switch/Switch.js +0 -113
  48. package/dist-es/switch/Switch.js.map +0 -1
  49. package/dist-types/switch/Switch.d.ts +0 -45
  50. package/dist-types/switch/index.d.ts +0 -1
@@ -31,7 +31,6 @@ const ComboBoxNext = React.forwardRef(function ComboBoxNext2({
31
31
  ListItem = utils.DefaultListItem,
32
32
  itemFilter = utils.defaultFilter,
33
33
  onMouseOver,
34
- onBlur,
35
34
  onFocus,
36
35
  onKeyDown,
37
36
  onSelect,
@@ -68,14 +67,14 @@ const ComboBoxNext = React.forwardRef(function ComboBoxNext2({
68
67
  focusVisibleRef,
69
68
  keyDownHandler,
70
69
  focusHandler,
71
- blurHandler,
72
70
  setSelectedItem,
73
71
  setHighlightedItem,
74
- mouseOverHandler
72
+ mouseOverHandler,
73
+ mouseDownHandler,
74
+ listSelectHandler
75
75
  } = useComboBox.useComboBox({
76
76
  defaultInputValue,
77
77
  inputValue: inputValueProp,
78
- onBlur,
79
78
  onFocus,
80
79
  onMouseOver,
81
80
  onKeyDown,
@@ -116,7 +115,7 @@ const ComboBoxNext = React.forwardRef(function ComboBoxNext2({
116
115
  setHighlightedItem(filteredSource[0]);
117
116
  }
118
117
  }
119
- onInputChange == null ? void 0 : onInputChange(event, { value: inputValue || "" });
118
+ onInputChange == null ? void 0 : onInputChange(event, { value: inputValue != null ? inputValue : "" });
120
119
  };
121
120
  const adornment = open ? /* @__PURE__ */ jsxRuntime.jsx(icons.ChevronUpIcon, {
122
121
  className: withBaseName("chevron")
@@ -134,7 +133,7 @@ const ComboBoxNext = React.forwardRef(function ComboBoxNext2({
134
133
  disabled,
135
134
  endAdornment: adornment,
136
135
  onChange,
137
- onBlur: blurHandler,
136
+ onMouseDown: mouseDownHandler,
138
137
  inputRef,
139
138
  inputProps: {
140
139
  "aria-expanded": open,
@@ -158,6 +157,7 @@ const ComboBoxNext = React.forwardRef(function ComboBoxNext2({
158
157
  disableFocus: true,
159
158
  highlightedItem,
160
159
  onMouseOver: mouseOverHandler,
160
+ onSelect: listSelectHandler,
161
161
  selected: selectedItem,
162
162
  ...restListProps,
163
163
  ref: setListRef,
@@ -1 +1 @@
1
- {"version":3,"file":"ComboBoxNext.js","sources":["../src/combo-box-next/ComboBoxNext.tsx"],"sourcesContent":["import {\n ChangeEvent,\n ComponentPropsWithoutRef,\n ForwardedRef,\n forwardRef,\n ReactElement,\n Ref,\n SyntheticEvent,\n useRef,\n} from \"react\";\nimport {\n Input,\n makePrefixer,\n useForkRef,\n useId,\n useFloatingComponent,\n} from \"@salt-ds/core\";\nimport { ListNext, ListNextProps } from \"../list-next\";\nimport { useComboBox } from \"./useComboBox\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport comboBoxNextCss from \"./ComboBoxNext.css\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"@salt-ds/icons\";\nimport { DefaultListItem, defaultFilter, ComboBoxItemProps } from \"./utils\";\nimport { clsx } from \"clsx\";\nimport { UseComboBoxPortalProps } from \"./useComboboxPortal\";\n\nconst withBaseName = makePrefixer(\"saltComboBoxNext\");\n\nexport interface ComboBoxNextProps<T>\n extends Omit<ComponentPropsWithoutRef<\"input\">, \"onChange\" | \"onSelect\"> {\n /**\n * Additional props for the list component.\n */\n ListProps?: ListNextProps;\n /**\n * Additional props for the portal.\n */\n PortalProps?: UseComboBoxPortalProps;\n /**\n * Controlled prop. Controls the Input value in the Combo Box Input.\n */\n inputValue?: string;\n /**\n * Controlled prop. Controls the Highlighted item in the Combo Box list.\n */\n highlightedItem?: string;\n /**\n * Controlled prop. Controls the Selected value in the Combo Box list.\n */\n selected?: string;\n /**\n * Initial input value for when the list is uncontrolled.\n */\n defaultInputValue?: string;\n /**\n * Initial selected value for when the list is uncontrolled.\n */\n defaultSelected?: string;\n /**\n * If `true`, the component will be disabled.\n */\n disabled?: boolean;\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n /**\n /**\n * The source of combobox items.\n */\n source: T[];\n /**\n * Optional ref for the list component\n */\n listRef?: Ref<HTMLUListElement>;\n /**\n * The component used for item instead of the default.\n */\n ListItem?: (\n props: ComboBoxItemProps<T>\n ) => ReactElement<ComboBoxItemProps<T>>;\n /**\n * Function to be used as filter.\n */\n itemFilter?: (source: T[], filterValue?: string) => T[];\n /**\n * Callback for mouse over event\n */\n onMouseOver?: (event: SyntheticEvent) => void;\n /**\n * Callback for list selection event\n */\n onSelect?: (event: SyntheticEvent, data: { value: string }) => void;\n /**\n /**\n * Callback for list change event\n */\n onListChange?: (\n event: SyntheticEvent,\n data: { value: string | undefined }\n ) => void;\n /**\n * Callback for input change event\n */\n onChange?: (event: SyntheticEvent, data: { value: string }) => void;\n}\n\nexport const ComboBoxNext = forwardRef(function ComboBoxNext<T>(\n {\n ListProps = {},\n PortalProps = {},\n inputValue: inputValueProp,\n highlightedItem: highlightedItemProp,\n selected: selectedProp,\n defaultInputValue,\n defaultSelected,\n disabled,\n variant = \"primary\",\n source,\n listRef: listRefProp,\n ListItem = DefaultListItem as unknown as ComboBoxNextProps<T>[\"ListItem\"],\n itemFilter = defaultFilter as unknown as ComboBoxNextProps<T>[\"itemFilter\"],\n onMouseOver,\n onBlur,\n onFocus,\n onKeyDown,\n onSelect,\n onListChange,\n onChange: onInputChange,\n ...rest\n }: ComboBoxNextProps<T>,\n ref?: ForwardedRef<HTMLInputElement>\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-combo-box-next\",\n css: comboBoxNextCss,\n window: targetWindow,\n });\n const listId = useId(ListProps?.id);\n const listRef = useRef<HTMLUListElement>(null);\n\n const setListRef = useForkRef(listRefProp, listRef);\n const listProps = {\n disabled,\n highlightedItem: highlightedItemProp,\n selected: selectedProp,\n defaultSelected,\n onChange: onListChange,\n onSelect: onSelect,\n id: listId,\n ref: listRef,\n };\n\n const {\n inputValue,\n setInputValue,\n portalProps,\n selectedItem,\n highlightedItem,\n activeDescendant,\n focusVisibleRef,\n keyDownHandler,\n focusHandler,\n blurHandler,\n setSelectedItem,\n setHighlightedItem,\n mouseOverHandler,\n } = useComboBox({\n defaultInputValue,\n inputValue: inputValueProp,\n onBlur,\n onFocus,\n onMouseOver,\n onKeyDown,\n listProps,\n PortalProps,\n });\n\n const {\n open,\n setOpen,\n floating,\n reference,\n getTriggerProps,\n getPortalProps,\n getPosition,\n } = portalProps;\n\n // floating references\n const triggerRef = useForkRef(ref, reference);\n const inputRef = useForkRef(triggerRef, focusVisibleRef);\n\n const { Component: FloatingComponent } = useFloatingComponent();\n\n const getFilteredSource = () => {\n if (!source) return null;\n if (selectedItem && inputValue === selectedItem) return source;\n return itemFilter && itemFilter(source, inputValue);\n };\n const filteredSource = getFilteredSource();\n\n const onChange = (event: ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setInputValue(value);\n if (value === \"\") {\n setHighlightedItem(undefined);\n setSelectedItem(value);\n } else {\n if (!open) {\n setOpen(true);\n }\n if (filteredSource) {\n setHighlightedItem(filteredSource[0] as unknown as string);\n }\n }\n onInputChange?.(event, { value: inputValue || \"\" });\n };\n\n const adornment = open ? (\n <ChevronUpIcon className={withBaseName(\"chevron\")} />\n ) : (\n <ChevronDownIcon className={withBaseName(\"chevron\")} />\n );\n\n const { className: listClassName, ...restListProps } = ListProps;\n const { className: inputClassName, ...restInputProps } = rest;\n\n return (\n <>\n <Input\n aria-controls={listId}\n aria-activedescendant={disabled ? undefined : activeDescendant}\n className={clsx(withBaseName(\"input\"), inputClassName)}\n disabled={disabled}\n endAdornment={adornment}\n onChange={onChange}\n onBlur={blurHandler}\n inputRef={inputRef as Ref<HTMLInputElement>}\n inputProps={{\n \"aria-expanded\": open,\n tabIndex: disabled ? -1 : 0,\n onFocus: focusHandler,\n onKeyDown: keyDownHandler,\n }}\n role=\"combobox\"\n variant={variant}\n value={inputValue}\n {...getTriggerProps()}\n {...restInputProps}\n />\n\n <FloatingComponent\n open={Boolean(open && !disabled && filteredSource)}\n ref={floating}\n {...getPortalProps()}\n {...getPosition()}\n >\n <ListNext\n className={clsx(withBaseName(\"list\"), listClassName)}\n disableFocus\n highlightedItem={highlightedItem}\n onMouseOver={mouseOverHandler}\n selected={selectedItem}\n {...restListProps}\n ref={setListRef}\n >\n {filteredSource?.map((value, index) => {\n const onMouseDown = (event: SyntheticEvent<HTMLLIElement>) => {\n setSelectedItem(event.currentTarget?.dataset.value);\n setInputValue(event.currentTarget?.dataset.value);\n };\n return (\n ListItem && (\n <ListItem\n key={index}\n value={value}\n matchPattern={inputValue}\n onMouseDown={onMouseDown}\n />\n )\n );\n })}\n </ListNext>\n </FloatingComponent>\n </>\n );\n});\n"],"names":["makePrefixer","forwardRef","ComboBoxNext","DefaultListItem","defaultFilter","useWindow","useComponentCssInjection","comboBoxNextCss","useId","useRef","useForkRef","useComboBox","useFloatingComponent","jsx","ChevronUpIcon","ChevronDownIcon","jsxs","Fragment","Input","clsx","ListNext"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,MAAM,YAAA,GAAeA,kBAAa,kBAAkB,CAAA,CAAA;AAiFvC,MAAA,YAAA,GAAeC,gBAAW,CAAA,SAASC,aAC9C,CAAA;AAAA,EACE,YAAY,EAAC;AAAA,EACb,cAAc,EAAC;AAAA,EACf,UAAY,EAAA,cAAA;AAAA,EACZ,eAAiB,EAAA,mBAAA;AAAA,EACjB,QAAU,EAAA,YAAA;AAAA,EACV,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAU,GAAA,SAAA;AAAA,EACV,MAAA;AAAA,EACA,OAAS,EAAA,WAAA;AAAA,EACT,QAAW,GAAAC,qBAAA;AAAA,EACX,UAAa,GAAAC,mBAAA;AAAA,EACb,WAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAU,EAAA,aAAA;AAAA,EACP,GAAA,IAAA;AACL,CAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,qBAAA;AAAA,IACR,GAAK,EAAAC,cAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AACD,EAAM,MAAA,MAAA,GAASC,UAAM,CAAA,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAW,EAAE,CAAA,CAAA;AAClC,EAAM,MAAA,OAAA,GAAUC,aAAyB,IAAI,CAAA,CAAA;AAE7C,EAAM,MAAA,UAAA,GAAaC,eAAW,CAAA,WAAA,EAAa,OAAO,CAAA,CAAA;AAClD,EAAA,MAAM,SAAY,GAAA;AAAA,IAChB,QAAA;AAAA,IACA,eAAiB,EAAA,mBAAA;AAAA,IACjB,QAAU,EAAA,YAAA;AAAA,IACV,eAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,QAAA;AAAA,IACA,EAAI,EAAA,MAAA;AAAA,IACJ,GAAK,EAAA,OAAA;AAAA,GACP,CAAA;AAEA,EAAM,MAAA;AAAA,IACJ,UAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,gBAAA;AAAA,MACEC,uBAAY,CAAA;AAAA,IACd,iBAAA;AAAA,IACA,UAAY,EAAA,cAAA;AAAA,IACZ,MAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,GACE,GAAA,WAAA,CAAA;AAGJ,EAAM,MAAA,UAAA,GAAaD,eAAW,CAAA,GAAA,EAAK,SAAS,CAAA,CAAA;AAC5C,EAAM,MAAA,QAAA,GAAWA,eAAW,CAAA,UAAA,EAAY,eAAe,CAAA,CAAA;AAEvD,EAAA,MAAM,EAAE,SAAA,EAAW,iBAAkB,EAAA,GAAIE,yBAAqB,EAAA,CAAA;AAE9D,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,CAAC,MAAA;AAAQ,MAAO,OAAA,IAAA,CAAA;AACpB,IAAA,IAAI,gBAAgB,UAAe,KAAA,YAAA;AAAc,MAAO,OAAA,MAAA,CAAA;AACxD,IAAO,OAAA,UAAA,IAAc,UAAW,CAAA,MAAA,EAAQ,UAAU,CAAA,CAAA;AAAA,GACpD,CAAA;AACA,EAAA,MAAM,iBAAiB,iBAAkB,EAAA,CAAA;AAEzC,EAAM,MAAA,QAAA,GAAW,CAAC,KAAyC,KAAA;AACzD,IAAM,MAAA,KAAA,GAAQ,MAAM,MAAO,CAAA,KAAA,CAAA;AAC3B,IAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AACnB,IAAA,IAAI,UAAU,EAAI,EAAA;AAChB,MAAA,kBAAA,CAAmB,KAAS,CAAA,CAAA,CAAA;AAC5B,MAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,KAChB,MAAA;AACL,MAAA,IAAI,CAAC,IAAM,EAAA;AACT,QAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,OACd;AACA,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAA,kBAAA,CAAmB,eAAe,CAAuB,CAAA,CAAA,CAAA;AAAA,OAC3D;AAAA,KACF;AACA,IAAA,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAgB,KAAO,EAAA,EAAE,KAAO,EAAA,UAAA,IAAc,EAAG,EAAA,CAAA,CAAA;AAAA,GACnD,CAAA;AAEA,EAAM,MAAA,SAAA,GAAY,uBACfC,cAAA,CAAAC,mBAAA,EAAA;AAAA,IAAc,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,GAAG,oBAElDD,cAAA,CAAAE,qBAAA,EAAA;AAAA,IAAgB,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,GAAG,CAAA,CAAA;AAGvD,EAAA,MAAM,EAAE,SAAA,EAAW,aAAkB,EAAA,GAAA,aAAA,EAAkB,GAAA,SAAA,CAAA;AACvD,EAAA,MAAM,EAAE,SAAA,EAAW,cAAmB,EAAA,GAAA,cAAA,EAAmB,GAAA,IAAA,CAAA;AAEzD,EACE,uBAAAC,eAAA,CAAAC,mBAAA,EAAA;AAAA,IACE,QAAA,EAAA;AAAA,sBAACJ,cAAA,CAAAK,UAAA,EAAA;AAAA,QACC,eAAe,EAAA,MAAA;AAAA,QACf,uBAAA,EAAuB,WAAW,KAAY,CAAA,GAAA,gBAAA;AAAA,QAC9C,SAAW,EAAAC,SAAA,CAAK,YAAa,CAAA,OAAO,GAAG,cAAc,CAAA;AAAA,QACrD,QAAA;AAAA,QACA,YAAc,EAAA,SAAA;AAAA,QACd,QAAA;AAAA,QACA,MAAQ,EAAA,WAAA;AAAA,QACR,QAAA;AAAA,QACA,UAAY,EAAA;AAAA,UACV,eAAiB,EAAA,IAAA;AAAA,UACjB,QAAA,EAAU,WAAW,CAAK,CAAA,GAAA,CAAA;AAAA,UAC1B,OAAS,EAAA,YAAA;AAAA,UACT,SAAW,EAAA,cAAA;AAAA,SACb;AAAA,QACA,IAAK,EAAA,UAAA;AAAA,QACL,OAAA;AAAA,QACA,KAAO,EAAA,UAAA;AAAA,QACN,GAAG,eAAgB,EAAA;AAAA,QACnB,GAAG,cAAA;AAAA,OACN,CAAA;AAAA,sBAECN,cAAA,CAAA,iBAAA,EAAA;AAAA,QACC,IAAM,EAAA,OAAA,CAAQ,IAAQ,IAAA,CAAC,YAAY,cAAc,CAAA;AAAA,QACjD,GAAK,EAAA,QAAA;AAAA,QACJ,GAAG,cAAe,EAAA;AAAA,QAClB,GAAG,WAAY,EAAA;AAAA,QAEhB,QAAC,kBAAAA,cAAA,CAAAO,iBAAA,EAAA;AAAA,UACC,SAAW,EAAAD,SAAA,CAAK,YAAa,CAAA,MAAM,GAAG,aAAa,CAAA;AAAA,UACnD,YAAY,EAAA,IAAA;AAAA,UACZ,eAAA;AAAA,UACA,WAAa,EAAA,gBAAA;AAAA,UACb,QAAU,EAAA,YAAA;AAAA,UACT,GAAG,aAAA;AAAA,UACJ,GAAK,EAAA,UAAA;AAAA,UAEJ,QAAgB,EAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,GAAA,CAAI,CAAC,KAAA,EAAO,KAAU,KAAA;AACrC,YAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AA7Q1E,cAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA8Qc,cAAA,eAAA,CAAA,CAAgB,EAAM,GAAA,KAAA,CAAA,aAAA,KAAN,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAClD,cAAA,aAAA,CAAA,CAAc,EAAM,GAAA,KAAA,CAAA,aAAA,KAAN,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,aAClD,CAAA;AACA,YAAA,OACE,4BACGN,cAAA,CAAA,QAAA,EAAA;AAAA,cAEC,KAAA;AAAA,cACA,YAAc,EAAA,UAAA;AAAA,cACd,WAAA;AAAA,aAAA,EAHK,KAIP,CAAA,CAAA;AAAA,WAGN,CAAA;AAAA,SACF,CAAA;AAAA,OACF,CAAA;AAAA,KAAA;AAAA,GACF,CAAA,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"ComboBoxNext.js","sources":["../src/combo-box-next/ComboBoxNext.tsx"],"sourcesContent":["import {\n ChangeEvent,\n ComponentPropsWithoutRef,\n ForwardedRef,\n forwardRef,\n ReactElement,\n Ref,\n SyntheticEvent,\n useRef,\n} from \"react\";\nimport {\n Input,\n makePrefixer,\n useForkRef,\n useId,\n useFloatingComponent,\n} from \"@salt-ds/core\";\nimport { ListNext, ListNextProps } from \"../list-next\";\nimport { useComboBox } from \"./useComboBox\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport comboBoxNextCss from \"./ComboBoxNext.css\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"@salt-ds/icons\";\nimport { DefaultListItem, defaultFilter, ComboBoxItemProps } from \"./utils\";\nimport { clsx } from \"clsx\";\nimport { UseComboBoxPortalProps } from \"./useComboboxPortal\";\n\nconst withBaseName = makePrefixer(\"saltComboBoxNext\");\n\nexport interface ComboBoxNextProps<T>\n extends Omit<ComponentPropsWithoutRef<\"input\">, \"onChange\" | \"onSelect\"> {\n /**\n * Additional props for the list component.\n */\n ListProps?: ListNextProps;\n /**\n * Additional props for the portal.\n */\n PortalProps?: UseComboBoxPortalProps;\n /**\n * Controlled prop. Controls the Input value in the Combo Box Input.\n */\n inputValue?: string;\n /**\n * Controlled prop. Controls the Highlighted item in the Combo Box list.\n */\n highlightedItem?: string;\n /**\n * Controlled prop. Controls the Selected value in the Combo Box list.\n */\n selected?: string;\n /**\n * Initial input value for when the list is uncontrolled.\n */\n defaultInputValue?: string;\n /**\n * Initial selected value for when the list is uncontrolled.\n */\n defaultSelected?: string;\n /**\n * If `true`, the component will be disabled.\n */\n disabled?: boolean;\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n /**\n /**\n * The source of combobox items.\n */\n source: T[];\n /**\n * Optional ref for the list component\n */\n listRef?: Ref<HTMLUListElement>;\n /**\n * The component used for item instead of the default.\n */\n ListItem?: (\n props: ComboBoxItemProps<T>\n ) => ReactElement<ComboBoxItemProps<T>>;\n /**\n * Function to be used as filter.\n */\n itemFilter?: (source: T[], filterValue?: string) => T[];\n /**\n * Callback for mouse over event\n */\n onMouseOver?: (event: SyntheticEvent) => void;\n /**\n * Callback for list selection event\n */\n onSelect?: (event: SyntheticEvent, data: { value: string }) => void;\n /**\n /**\n * Callback for list change event\n */\n onListChange?: (\n event: SyntheticEvent,\n data: { value: string | undefined }\n ) => void;\n /**\n * Callback for input change event\n */\n onChange?: (event: SyntheticEvent, data: { value: string }) => void;\n}\n\nexport const ComboBoxNext = forwardRef(function ComboBoxNext<T>(\n {\n ListProps = {},\n PortalProps = {},\n inputValue: inputValueProp,\n highlightedItem: highlightedItemProp,\n selected: selectedProp,\n defaultInputValue,\n defaultSelected,\n disabled,\n variant = \"primary\",\n source,\n listRef: listRefProp,\n ListItem = DefaultListItem as unknown as ComboBoxNextProps<T>[\"ListItem\"],\n itemFilter = defaultFilter as unknown as ComboBoxNextProps<T>[\"itemFilter\"],\n onMouseOver,\n onFocus,\n onKeyDown,\n onSelect,\n onListChange,\n onChange: onInputChange,\n ...rest\n }: ComboBoxNextProps<T>,\n ref?: ForwardedRef<HTMLInputElement>\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-combo-box-next\",\n css: comboBoxNextCss,\n window: targetWindow,\n });\n const listId = useId(ListProps?.id);\n const listRef = useRef<HTMLUListElement>(null);\n\n const setListRef = useForkRef(listRefProp, listRef);\n const listProps = {\n disabled,\n highlightedItem: highlightedItemProp,\n selected: selectedProp,\n defaultSelected,\n onChange: onListChange,\n onSelect: onSelect,\n id: listId,\n ref: listRef,\n };\n\n const {\n inputValue,\n setInputValue,\n portalProps,\n selectedItem,\n highlightedItem,\n activeDescendant,\n focusVisibleRef,\n keyDownHandler,\n focusHandler,\n setSelectedItem,\n setHighlightedItem,\n mouseOverHandler,\n mouseDownHandler,\n listSelectHandler,\n } = useComboBox({\n defaultInputValue,\n inputValue: inputValueProp,\n onFocus,\n onMouseOver,\n onKeyDown,\n listProps,\n PortalProps,\n });\n\n const {\n open,\n setOpen,\n floating,\n reference,\n getTriggerProps,\n getPortalProps,\n getPosition,\n } = portalProps;\n\n // floating references\n const triggerRef = useForkRef(ref, reference);\n const inputRef = useForkRef(triggerRef, focusVisibleRef);\n\n const { Component: FloatingComponent } = useFloatingComponent();\n\n const getFilteredSource = () => {\n if (!source) return null;\n if (selectedItem && inputValue === selectedItem) return source;\n return itemFilter && itemFilter(source, inputValue);\n };\n const filteredSource = getFilteredSource();\n\n const onChange = (event: ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setInputValue(value);\n if (value === \"\") {\n setHighlightedItem(undefined);\n setSelectedItem(value);\n } else {\n if (!open) {\n setOpen(true);\n }\n if (filteredSource) {\n setHighlightedItem(filteredSource[0] as unknown as string);\n }\n }\n onInputChange?.(event, { value: inputValue ?? \"\" });\n };\n\n const adornment = open ? (\n <ChevronUpIcon className={withBaseName(\"chevron\")} />\n ) : (\n <ChevronDownIcon className={withBaseName(\"chevron\")} />\n );\n\n const { className: listClassName, ...restListProps } = ListProps;\n const { className: inputClassName, ...restInputProps } = rest;\n\n return (\n <>\n <Input\n aria-controls={listId}\n aria-activedescendant={disabled ? undefined : activeDescendant}\n className={clsx(withBaseName(\"input\"), inputClassName)}\n disabled={disabled}\n endAdornment={adornment}\n onChange={onChange}\n onMouseDown={mouseDownHandler}\n inputRef={inputRef as Ref<HTMLInputElement>}\n inputProps={{\n \"aria-expanded\": open,\n tabIndex: disabled ? -1 : 0,\n onFocus: focusHandler,\n onKeyDown: keyDownHandler,\n }}\n role=\"combobox\"\n variant={variant}\n value={inputValue}\n {...getTriggerProps()}\n {...restInputProps}\n />\n\n <FloatingComponent\n open={Boolean(open && !disabled && filteredSource)}\n ref={floating}\n {...getPortalProps()}\n {...getPosition()}\n >\n <ListNext\n className={clsx(withBaseName(\"list\"), listClassName)}\n disableFocus\n highlightedItem={highlightedItem}\n onMouseOver={mouseOverHandler}\n onSelect={listSelectHandler}\n selected={selectedItem}\n {...restListProps}\n ref={setListRef}\n >\n {filteredSource?.map((value, index) => {\n const onMouseDown = (event: SyntheticEvent<HTMLLIElement>) => {\n setSelectedItem(event.currentTarget?.dataset.value);\n setInputValue(event.currentTarget?.dataset.value);\n };\n return (\n ListItem && (\n <ListItem\n key={index}\n value={value}\n matchPattern={inputValue}\n onMouseDown={onMouseDown}\n />\n )\n );\n })}\n </ListNext>\n </FloatingComponent>\n </>\n );\n});\n"],"names":["makePrefixer","forwardRef","ComboBoxNext","DefaultListItem","defaultFilter","useWindow","useComponentCssInjection","comboBoxNextCss","useId","useRef","useForkRef","useComboBox","useFloatingComponent","jsx","ChevronUpIcon","ChevronDownIcon","jsxs","Fragment","Input","clsx","ListNext"],"mappings":"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"}
@@ -10,7 +10,6 @@ var core = require('@salt-ds/core');
10
10
  const useComboBox = ({
11
11
  defaultInputValue,
12
12
  onFocus,
13
- onBlur,
14
13
  onMouseOver,
15
14
  onKeyDown,
16
15
  inputValue: inputValueProp,
@@ -52,22 +51,19 @@ const useComboBox = ({
52
51
  setInputValue(selectedItem);
53
52
  }, [selectedItem]);
54
53
  const focusHandler = (event) => {
55
- setOpen(true);
56
54
  listFocusHandler(event);
57
55
  onFocus == null ? void 0 : onFocus(event);
58
56
  };
59
- const blurHandler = (event) => {
60
- setOpen(false);
61
- if (!selectedItem) {
62
- setSelected(void 0);
63
- setHighlightedItem(void 0);
64
- }
65
- onBlur == null ? void 0 : onBlur(event);
57
+ const mouseDownHandler = () => {
58
+ setOpen(!open);
66
59
  };
67
60
  const mouseOverHandler = (event) => {
68
61
  setHighlightedItem(event.currentTarget.dataset.value);
69
62
  onMouseOver == null ? void 0 : onMouseOver(event);
70
63
  };
64
+ const listSelectHandler = () => {
65
+ setOpen(false);
66
+ };
71
67
  const keyDownHandler = (event) => {
72
68
  const { key, altKey } = event;
73
69
  switch (key) {
@@ -110,6 +106,9 @@ const useComboBox = ({
110
106
  }
111
107
  }
112
108
  break;
109
+ case "Tab":
110
+ setOpen(false);
111
+ break;
113
112
  case "Backspace":
114
113
  if (!open) {
115
114
  setOpen(true);
@@ -138,8 +137,9 @@ const useComboBox = ({
138
137
  focusVisibleRef,
139
138
  keyDownHandler,
140
139
  focusHandler,
141
- blurHandler,
142
- mouseOverHandler
140
+ mouseOverHandler,
141
+ mouseDownHandler,
142
+ listSelectHandler
143
143
  };
144
144
  };
145
145
 
@@ -1 +1 @@
1
- {"version":3,"file":"useComboBox.js","sources":["../src/combo-box-next/useComboBox.tsx"],"sourcesContent":["import { FocusEvent, KeyboardEvent, SyntheticEvent, useEffect } from \"react\";\nimport { useList, UseListProps } from \"../list-next/useList\";\nimport { useComboboxPortal, UseComboBoxPortalProps } from \"./useComboboxPortal\";\nimport { useControlled } from \"@salt-ds/core\";\n\ninterface UseComboBoxProps {\n inputValue?: string;\n defaultInputValue?: string;\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n onMouseOver?: (event: SyntheticEvent) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLInputElement>) => void;\n PortalProps?: UseComboBoxPortalProps;\n listProps: UseListProps;\n}\n\nexport const useComboBox = ({\n defaultInputValue,\n onFocus,\n onBlur,\n onMouseOver,\n onKeyDown,\n inputValue: inputValueProp,\n PortalProps,\n listProps,\n}: UseComboBoxProps) => {\n const [inputValue, setInputValue] = useControlled({\n controlled: inputValueProp,\n default: defaultInputValue,\n name: \"Combo Box\",\n state: \"inputValue\",\n });\n\n const {\n open,\n setOpen,\n floating,\n reference,\n getPortalProps,\n getTriggerProps,\n getPosition,\n } = useComboboxPortal(PortalProps);\n\n const {\n keyDownHandler: listKeyDownHandler,\n focusHandler: listFocusHandler,\n activeDescendant,\n focusVisibleRef,\n selectedItem,\n setSelectedItem,\n setHighlightedItem,\n highlightedItem,\n } = useList({\n ...listProps,\n });\n\n const setSelected = (value: string | undefined) => {\n setSelectedItem(value);\n setInputValue(value);\n };\n\n useEffect(() => {\n setInputValue(selectedItem);\n }, [selectedItem]);\n\n const focusHandler = (event: FocusEvent<HTMLInputElement>) => {\n setOpen(true);\n listFocusHandler(event);\n onFocus?.(event);\n };\n\n const blurHandler = (event: FocusEvent<HTMLInputElement>) => {\n setOpen(false);\n if (!selectedItem) {\n setSelected(undefined);\n setHighlightedItem(undefined);\n }\n onBlur?.(event);\n };\n\n const mouseOverHandler = (event: SyntheticEvent<HTMLElement>) => {\n setHighlightedItem(event.currentTarget.dataset.value);\n onMouseOver?.(event);\n };\n\n const keyDownHandler = (event: KeyboardEvent<HTMLInputElement>) => {\n const { key, altKey } = event;\n switch (key) {\n case \"ArrowDown\":\n case \"ArrowUp\":\n if (altKey) {\n event.preventDefault();\n if (open && !selectedItem) {\n setSelected(undefined);\n }\n setOpen(!open);\n break;\n }\n if (!open) {\n setOpen(true);\n }\n listKeyDownHandler(event);\n break;\n case \"PageDown\":\n case \"PageUp\":\n case \"Home\":\n case \"End\":\n if (open) {\n listKeyDownHandler(event);\n }\n break;\n case \"Enter\":\n if (!open) {\n setOpen(true);\n } else {\n setSelected(highlightedItem);\n setOpen(false);\n }\n break;\n case \"Escape\":\n if (open) {\n setOpen(false);\n if (!selectedItem) {\n setSelected(undefined);\n }\n }\n break;\n case \"Backspace\":\n if (!open) {\n setOpen(true);\n }\n break;\n default:\n break;\n }\n onKeyDown?.(event);\n };\n\n return {\n inputValue,\n setInputValue,\n // portal\n portalProps: {\n open,\n setOpen,\n floating,\n reference,\n getTriggerProps,\n getPortalProps,\n getPosition,\n },\n // list\n selectedItem,\n setSelectedItem,\n highlightedItem,\n setHighlightedItem,\n activeDescendant,\n focusVisibleRef,\n keyDownHandler,\n focusHandler,\n blurHandler,\n mouseOverHandler,\n };\n};\n"],"names":["useControlled","useComboboxPortal","useList","useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"useComboBox.js","sources":["../src/combo-box-next/useComboBox.tsx"],"sourcesContent":["import { FocusEvent, KeyboardEvent, SyntheticEvent, useEffect } from \"react\";\nimport { useList, UseListProps } from \"../list-next/useList\";\nimport { useComboboxPortal, UseComboBoxPortalProps } from \"./useComboboxPortal\";\nimport { useControlled } from \"@salt-ds/core\";\n\ninterface UseComboBoxProps {\n inputValue?: string;\n defaultInputValue?: string;\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n onMouseOver?: (event: SyntheticEvent) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLInputElement>) => void;\n PortalProps?: UseComboBoxPortalProps;\n listProps: UseListProps;\n}\n\nexport const useComboBox = ({\n defaultInputValue,\n onFocus,\n onMouseOver,\n onKeyDown,\n inputValue: inputValueProp,\n PortalProps,\n listProps,\n}: UseComboBoxProps) => {\n const [inputValue, setInputValue] = useControlled({\n controlled: inputValueProp,\n default: defaultInputValue,\n name: \"Combo Box\",\n state: \"inputValue\",\n });\n\n const {\n open,\n setOpen,\n floating,\n reference,\n getPortalProps,\n getTriggerProps,\n getPosition,\n } = useComboboxPortal(PortalProps);\n\n const {\n keyDownHandler: listKeyDownHandler,\n focusHandler: listFocusHandler,\n activeDescendant,\n focusVisibleRef,\n selectedItem,\n setSelectedItem,\n setHighlightedItem,\n highlightedItem,\n } = useList({\n ...listProps,\n });\n\n const setSelected = (value: string | undefined) => {\n setSelectedItem(value);\n setInputValue(value);\n };\n\n useEffect(() => {\n setInputValue(selectedItem);\n }, [selectedItem]);\n\n const focusHandler = (event: FocusEvent<HTMLInputElement>) => {\n listFocusHandler(event);\n onFocus?.(event);\n };\n\n const mouseDownHandler = () => {\n setOpen(!open);\n };\n\n const mouseOverHandler = (event: SyntheticEvent<HTMLElement>) => {\n setHighlightedItem(event.currentTarget.dataset.value);\n onMouseOver?.(event);\n };\n\n const listSelectHandler = () => {\n setOpen(false);\n };\n\n const keyDownHandler = (event: KeyboardEvent<HTMLInputElement>) => {\n const { key, altKey } = event;\n switch (key) {\n case \"ArrowDown\":\n case \"ArrowUp\":\n if (altKey) {\n event.preventDefault();\n if (open && !selectedItem) {\n setSelected(undefined);\n }\n setOpen(!open);\n break;\n }\n if (!open) {\n setOpen(true);\n }\n listKeyDownHandler(event);\n break;\n case \"PageDown\":\n case \"PageUp\":\n case \"Home\":\n case \"End\":\n if (open) {\n listKeyDownHandler(event);\n }\n break;\n case \"Enter\":\n if (!open) {\n setOpen(true);\n } else {\n setSelected(highlightedItem);\n setOpen(false);\n }\n break;\n case \"Escape\":\n if (open) {\n setOpen(false);\n if (!selectedItem) {\n setSelected(undefined);\n }\n }\n break;\n case \"Tab\":\n setOpen(false);\n break;\n case \"Backspace\":\n if (!open) {\n setOpen(true);\n }\n break;\n default:\n break;\n }\n onKeyDown?.(event);\n };\n\n return {\n inputValue,\n setInputValue,\n // portal\n portalProps: {\n open,\n setOpen,\n floating,\n reference,\n getTriggerProps,\n getPortalProps,\n getPosition,\n },\n // list\n selectedItem,\n setSelectedItem,\n highlightedItem,\n setHighlightedItem,\n activeDescendant,\n focusVisibleRef,\n keyDownHandler,\n focusHandler,\n mouseOverHandler,\n mouseDownHandler,\n listSelectHandler,\n };\n};\n"],"names":["useControlled","useComboboxPortal","useList","useEffect"],"mappings":"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"}
@@ -10,7 +10,7 @@ function useComboboxPortal(props) {
10
10
  open: openProp,
11
11
  onOpenChange: onOpenChangeProp,
12
12
  placement: placementProp = "bottom"
13
- } = props || {};
13
+ } = props != null ? props : {};
14
14
  const [open, setOpen] = core.useControlled({
15
15
  controlled: openProp,
16
16
  default: false,
@@ -1 +1 @@
1
- {"version":3,"file":"useComboboxPortal.js","sources":["../src/combo-box-next/useComboboxPortal.ts"],"sourcesContent":["import {\n flip,\n limitShift,\n offset,\n Placement,\n shift,\n size,\n useDismiss,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport { HTMLProps } from \"react\";\nimport { useControlled, useFloatingUI } from \"@salt-ds/core\";\n\nexport interface UseComboBoxPortalProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n placement?: Placement;\n}\n\nexport function useComboboxPortal(props?: UseComboBoxPortalProps) {\n const {\n open: openProp,\n onOpenChange: onOpenChangeProp,\n placement: placementProp = \"bottom\",\n } = props || {};\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: false,\n name: \"Combo Box\",\n state: \"open\",\n });\n\n const onOpenChange = (open: boolean) => {\n setOpen(open);\n onOpenChangeProp?.(open);\n };\n\n const { floating, reference, x, y, strategy, context, elements } =\n useFloatingUI({\n open,\n onOpenChange: onOpenChange,\n placement: placementProp,\n middleware: [\n offset(0),\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n });\n },\n }),\n flip(),\n shift({ limiter: limitShift() }),\n ],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useRole(context, { role: \"listbox\" }),\n useDismiss(context),\n ]);\n\n const getPortalProps = (): HTMLProps<HTMLDivElement> => {\n return getFloatingProps({\n ref: floating,\n });\n };\n\n const getTriggerProps = () =>\n getReferenceProps({\n ref: reference,\n });\n\n const getPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.clientWidth,\n height: elements.floating?.clientHeight,\n });\n\n return {\n open,\n setOpen,\n floating,\n reference,\n getPortalProps,\n getTriggerProps,\n getPosition,\n };\n}\n"],"names":["useControlled","open","useFloatingUI","offset","size","elements","flip","shift","limitShift","useInteractions","useRole","useDismiss"],"mappings":"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"}
1
+ {"version":3,"file":"useComboboxPortal.js","sources":["../src/combo-box-next/useComboboxPortal.ts"],"sourcesContent":["import {\n flip,\n limitShift,\n offset,\n Placement,\n shift,\n size,\n useDismiss,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport { HTMLProps } from \"react\";\nimport { useControlled, useFloatingUI } from \"@salt-ds/core\";\n\nexport interface UseComboBoxPortalProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n placement?: Placement;\n}\n\nexport function useComboboxPortal(props?: UseComboBoxPortalProps) {\n const {\n open: openProp,\n onOpenChange: onOpenChangeProp,\n placement: placementProp = \"bottom\",\n } = props ?? {};\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: false,\n name: \"Combo Box\",\n state: \"open\",\n });\n\n const onOpenChange = (open: boolean) => {\n setOpen(open);\n onOpenChangeProp?.(open);\n };\n\n const { floating, reference, x, y, strategy, context, elements } =\n useFloatingUI({\n open,\n onOpenChange: onOpenChange,\n placement: placementProp,\n middleware: [\n offset(0),\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n });\n },\n }),\n flip(),\n shift({ limiter: limitShift() }),\n ],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useRole(context, { role: \"listbox\" }),\n useDismiss(context),\n ]);\n\n const getPortalProps = (): HTMLProps<HTMLDivElement> => {\n return getFloatingProps({\n ref: floating,\n });\n };\n\n const getTriggerProps = () =>\n getReferenceProps({\n ref: reference,\n });\n\n const getPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.clientWidth,\n height: elements.floating?.clientHeight,\n });\n\n return {\n open,\n setOpen,\n floating,\n reference,\n getPortalProps,\n getTriggerProps,\n getPosition,\n };\n}\n"],"names":["useControlled","open","useFloatingUI","offset","size","elements","flip","shift","limitShift","useInteractions","useRole","useDismiss"],"mappings":"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"}
@@ -3,31 +3,27 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
- require('../list-next/ListNext.js');
7
- var ListItemNext = require('../list-next/ListItemNext.js');
6
+ var React = require('react');
8
7
  var Highlighter = require('../list/Highlighter.js');
9
8
  require('../list/ListItem.js');
10
9
  require('../list/List.js');
11
- var React = require('react');
12
10
  require('@salt-ds/core');
13
11
  require('../common-hooks/collectionProvider.js');
14
12
  require('../common-hooks/keyUtils.js');
15
13
  require('../responsive/useResizeObserver.js');
16
14
  require('../list/VirtualizedList.js');
15
+ require('../list-next/ListNext.js');
16
+ var ListItemNext = require('../list-next/ListItemNext.js');
17
17
 
18
18
  const defaultFilter = (source, filterValue) => source.filter(
19
19
  (item) => !filterValue ? item : item.toLowerCase().includes(filterValue.toLowerCase())
20
20
  );
21
- const DefaultListItem = React.forwardRef(function DefaultListItem2({
22
- value,
23
- matchPattern,
24
- onMouseDown,
25
- ...rest
26
- }) {
21
+ const DefaultListItem = React.forwardRef(function DefaultListItem2({ value, matchPattern, onMouseDown, ...rest }, ref) {
27
22
  return /* @__PURE__ */ jsxRuntime.jsx(ListItemNext.ListItemNext, {
28
23
  value,
29
24
  onMouseDown,
30
25
  ...rest,
26
+ ref,
31
27
  children: /* @__PURE__ */ jsxRuntime.jsx(Highlighter.Highlighter, {
32
28
  matchPattern,
33
29
  text: value
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../src/combo-box-next/utils.tsx"],"sourcesContent":["import { ListItemNext, ListItemNextProps } from \"../list-next\";\nimport { Highlighter } from \"../list\";\nimport { forwardRef } from \"react\";\n\nexport const defaultFilter = (source: string[], filterValue?: string) =>\n source.filter((item: string) =>\n !filterValue ? item : item.toLowerCase().includes(filterValue.toLowerCase())\n );\n\nexport interface ComboBoxItemProps<T> extends Omit<ListItemNextProps, \"value\"> {\n value: T;\n matchPattern?: RegExp | string;\n}\nexport const DefaultListItem = forwardRef(function DefaultListItem({\n value,\n matchPattern,\n onMouseDown,\n ...rest\n}: ComboBoxItemProps<string>) {\n return (\n <ListItemNext value={value} onMouseDown={onMouseDown} {...rest}>\n <Highlighter matchPattern={matchPattern} text={value} />\n </ListItemNext>\n );\n});\n"],"names":["forwardRef","DefaultListItem","jsx","ListItemNext","Highlighter"],"mappings":";;;;;;;;;;;;;;;;;AAIO,MAAM,aAAgB,GAAA,CAAC,MAAkB,EAAA,WAAA,KAC9C,MAAO,CAAA,MAAA;AAAA,EAAO,CAAC,IACb,KAAA,CAAC,WAAc,GAAA,IAAA,GAAO,IAAK,CAAA,WAAA,EAAc,CAAA,QAAA,CAAS,WAAY,CAAA,WAAA,EAAa,CAAA;AAC7E,EAAA;AAMW,MAAA,eAAA,GAAkBA,gBAAW,CAAA,SAASC,gBAAgB,CAAA;AAAA,EACjE,KAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACG,GAAA,IAAA;AACL,CAA8B,EAAA;AAC5B,EAAA,uBACGC,cAAA,CAAAC,yBAAA,EAAA;AAAA,IAAa,KAAA;AAAA,IAAc,WAAA;AAAA,IAA2B,GAAG,IAAA;AAAA,IACxD,QAAC,kBAAAD,cAAA,CAAAE,uBAAA,EAAA;AAAA,MAAY,YAAA;AAAA,MAA4B,IAAM,EAAA,KAAA;AAAA,KAAO,CAAA;AAAA,GACxD,CAAA,CAAA;AAEJ,CAAC;;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../src/combo-box-next/utils.tsx"],"sourcesContent":["import { ForwardedRef, forwardRef } from \"react\";\nimport { Highlighter } from \"../list\";\nimport { ListItemNext, ListItemNextProps } from \"../list-next\";\n\nexport const defaultFilter = (source: string[], filterValue?: string) =>\n source.filter((item: string) =>\n !filterValue ? item : item.toLowerCase().includes(filterValue.toLowerCase())\n );\n\nexport interface ComboBoxItemProps<T> extends Omit<ListItemNextProps, \"value\"> {\n value: T;\n matchPattern?: RegExp | string;\n}\n\nexport const DefaultListItem = forwardRef(function DefaultListItem(\n { value, matchPattern, onMouseDown, ...rest }: ComboBoxItemProps<string>,\n ref: ForwardedRef<HTMLLIElement>\n) {\n return (\n <ListItemNext value={value} onMouseDown={onMouseDown} {...rest} ref={ref}>\n <Highlighter matchPattern={matchPattern} text={value} />\n </ListItemNext>\n );\n});\n"],"names":["forwardRef","DefaultListItem","jsx","ListItemNext","Highlighter"],"mappings":";;;;;;;;;;;;;;;;;AAIO,MAAM,aAAgB,GAAA,CAAC,MAAkB,EAAA,WAAA,KAC9C,MAAO,CAAA,MAAA;AAAA,EAAO,CAAC,IACb,KAAA,CAAC,WAAc,GAAA,IAAA,GAAO,IAAK,CAAA,WAAA,EAAc,CAAA,QAAA,CAAS,WAAY,CAAA,WAAA,EAAa,CAAA;AAC7E,EAAA;AAOW,MAAA,eAAA,GAAkBA,gBAAW,CAAA,SAASC,gBACjD,CAAA,EAAE,OAAO,YAAc,EAAA,WAAA,EAAA,GAAgB,IAAK,EAAA,EAC5C,GACA,EAAA;AACA,EAAA,uBACGC,cAAA,CAAAC,yBAAA,EAAA;AAAA,IAAa,KAAA;AAAA,IAAc,WAAA;AAAA,IAA2B,GAAG,IAAA;AAAA,IAAM,GAAA;AAAA,IAC9D,QAAC,kBAAAD,cAAA,CAAAE,uBAAA,EAAA;AAAA,MAAY,YAAA;AAAA,MAA4B,IAAM,EAAA,KAAA;AAAA,KAAO,CAAA;AAAA,GACxD,CAAA,CAAA;AAEJ,CAAC;;;;;"}
@@ -30,7 +30,6 @@ const DropdownNext = React.forwardRef(function DropdownNext2(props, ref) {
30
30
  highlightedItem: highlightedItemControlProp,
31
31
  onFocus,
32
32
  onKeyDown,
33
- onBlur,
34
33
  onMouseOver,
35
34
  onMouseDown,
36
35
  onSelect,
@@ -63,7 +62,9 @@ const DropdownNext = React.forwardRef(function DropdownNext2(props, ref) {
63
62
  selectedItem,
64
63
  highlightedItem,
65
64
  getListItems,
66
- portalProps
65
+ portalProps,
66
+ getReferenceProps,
67
+ refs
67
68
  } = useDropdownNext.useDropdownNext({
68
69
  listProps,
69
70
  placement,
@@ -74,11 +75,12 @@ const DropdownNext = React.forwardRef(function DropdownNext2(props, ref) {
74
75
  const {
75
76
  focusHandler,
76
77
  keyDownHandler,
77
- blurHandler,
78
78
  mouseOverHandler,
79
- mouseDownHandler
79
+ mouseDownHandler,
80
+ listSelectHandler
80
81
  } = handlers;
81
82
  const triggerRef = core.useForkRef(ref, reference);
83
+ const portalRef = core.useForkRef(ref, floating);
82
84
  const getIcon = () => {
83
85
  if (readOnly)
84
86
  return;
@@ -103,10 +105,6 @@ const DropdownNext = React.forwardRef(function DropdownNext2(props, ref) {
103
105
  keyDownHandler(event);
104
106
  onKeyDown == null ? void 0 : onKeyDown(event);
105
107
  };
106
- const handleBlur = (event) => {
107
- blurHandler();
108
- onBlur == null ? void 0 : onBlur(event);
109
- };
110
108
  const handleMouseOver = (event) => {
111
109
  mouseOverHandler();
112
110
  onMouseOver == null ? void 0 : onMouseOver(event);
@@ -117,17 +115,23 @@ const DropdownNext = React.forwardRef(function DropdownNext2(props, ref) {
117
115
  mouseDownHandler();
118
116
  onMouseDown == null ? void 0 : onMouseDown(event);
119
117
  };
118
+ const handleListSelect = () => {
119
+ var _a;
120
+ listSelectHandler();
121
+ (_a = refs.domReference.current) == null ? void 0 : _a.focus();
122
+ };
120
123
  return /* @__PURE__ */ jsxRuntime.jsxs("div", {
121
124
  className: clsx.clsx(withBaseName()),
122
125
  children: [
123
126
  /* @__PURE__ */ jsxRuntime.jsxs("button", {
124
127
  id: dropdownId,
125
128
  disabled,
126
- onFocus: handleFocus,
127
- onKeyDown: handleKeyDown,
128
- onMouseOver: handleMouseOver,
129
- onMouseDown: handleMouseDown,
130
- onBlur: handleBlur,
129
+ ...getReferenceProps({
130
+ onFocus: handleFocus,
131
+ onMouseOver: handleMouseOver,
132
+ onMouseDown: handleMouseDown,
133
+ onKeyDown: handleKeyDown
134
+ }),
131
135
  value: selectedItem,
132
136
  className: clsx.clsx(
133
137
  withBaseName("button"),
@@ -158,10 +162,11 @@ const DropdownNext = React.forwardRef(function DropdownNext2(props, ref) {
158
162
  }),
159
163
  /* @__PURE__ */ jsxRuntime.jsx(FloatingComponent, {
160
164
  open: open && !disabled,
161
- ref: floating,
165
+ ref: portalRef,
162
166
  ...getDropdownNextProps(),
163
167
  ...getPosition(),
164
168
  children: /* @__PURE__ */ jsxRuntime.jsx(ListNext.ListNext, {
169
+ "data-test-id": "list-container",
165
170
  id: listId,
166
171
  className: clsx.clsx(withBaseName("list"), ListProps == null ? void 0 : ListProps.className),
167
172
  disableFocus: true,
@@ -170,6 +175,7 @@ const DropdownNext = React.forwardRef(function DropdownNext2(props, ref) {
170
175
  highlightedItem,
171
176
  ...ListProps,
172
177
  ref: setListRef,
178
+ onSelect: handleListSelect,
173
179
  children: getListItems(source)
174
180
  })
175
181
  })
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownNext.js","sources":["../src/dropdown-next/DropdownNext.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { ListNext, ListNextProps } from \"../list-next\";\nimport {\n makePrefixer,\n useId,\n useForkRef,\n useFloatingComponent,\n} from \"@salt-ds/core\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"@salt-ds/icons\";\nimport {\n useRef,\n forwardRef,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n Ref,\n ForwardedRef,\n SyntheticEvent,\n ComponentPropsWithoutRef,\n} from \"react\";\nimport { useWindow } from \"@salt-ds/window\";\nimport dropdownNextCss from \"./DropdownNext.css\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { Placement } from \"@floating-ui/react\";\nimport { useDropdownNext } from \"./useDropdownNext\";\n\nconst withBaseName = makePrefixer(\"saltDropdownNext\");\n\nexport interface DropdownNextProps\n extends Omit<ComponentPropsWithoutRef<\"button\">, \"onSelect\"> {\n /**\n * If `true`, dropdown will be disabled.\n */\n disabled?: boolean;\n /**\n * Initially selected value for the dropdown, for use only in uncontrolled component.\n */\n defaultSelected?: string;\n /**\n * List of options when using a dropdown.\n */\n source: string[];\n /**\n * If `true`, dropdown is read only.\n */\n readOnly?: boolean;\n /**\n * Background styling variant. Defaults to `primary` .\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * Placement of dropdown list. Defaults to `bottom` .\n */\n placement?: Placement;\n /**\n * Optional ref for the list component.\n */\n listRef?: Ref<HTMLUListElement>;\n /**\n * Additional props for dropdown list.\n */\n ListProps?: ListNextProps;\n /* Status open or close for use in controlled component. */\n open?: boolean;\n /**\n * Callback for list selection event\n */\n onSelect?: (event: SyntheticEvent, data: { value: string }) => void;\n /**\n /* Selected prop for use in controlled component. */\n selected?: string;\n /* Highlighted item prop for use in controlled component. */\n highlightedItem?: string;\n}\n\nexport const DropdownNext = forwardRef(function DropdownNext(\n props: DropdownNextProps,\n ref: ForwardedRef<HTMLButtonElement>\n) {\n const {\n className,\n disabled,\n variant = \"primary\",\n id: dropdownIdProp,\n defaultSelected,\n readOnly,\n source,\n placement = \"bottom\",\n open: openControlProp,\n selected: selectedControlProp,\n highlightedItem: highlightedItemControlProp,\n onFocus,\n onKeyDown,\n onBlur,\n onMouseOver,\n onMouseDown,\n onSelect,\n listRef: listRefProp,\n ListProps,\n ...restProps\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-dropdown-next\",\n css: dropdownNextCss,\n window: targetWindow,\n });\n\n const listId = useId(ListProps?.id);\n const dropdownId = useId(dropdownIdProp);\n const listRef = useRef<HTMLUListElement>(null);\n\n const setListRef = useForkRef(listRefProp, listRef);\n const listProps = {\n defaultSelected,\n disabled,\n ref: listRef,\n id: listId,\n onSelect: onSelect,\n selected: selectedControlProp,\n highlightedItem: highlightedItemControlProp,\n };\n\n const {\n handlers,\n activeDescendant,\n selectedItem,\n highlightedItem,\n getListItems,\n portalProps,\n } = useDropdownNext({\n listProps,\n placement,\n openControlProp,\n });\n\n const { Component: FloatingComponent } = useFloatingComponent();\n\n const { open, floating, reference, getDropdownNextProps, getPosition } =\n portalProps;\n const {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseOverHandler,\n mouseDownHandler,\n } = handlers;\n\n const triggerRef = useForkRef<HTMLButtonElement>(ref, reference);\n\n const getIcon = () => {\n if (readOnly) return;\n\n const iconClassName = clsx(withBaseName(\"icon\"), {\n [withBaseName(\"disabled\")]: disabled,\n });\n\n return open ? (\n <ChevronUpIcon className={iconClassName} />\n ) : (\n <ChevronDownIcon className={iconClassName} />\n );\n };\n\n const handleFocus = (event: FocusEvent<HTMLButtonElement>) => {\n if (disabled) return;\n focusHandler(event);\n onFocus?.(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || readOnly) return;\n keyDownHandler(event);\n onKeyDown?.(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLButtonElement>) => {\n blurHandler();\n onBlur?.(event);\n };\n\n const handleMouseOver = (event: MouseEvent<HTMLButtonElement>) => {\n mouseOverHandler();\n onMouseOver?.(event);\n };\n\n const handleMouseDown = (event: MouseEvent<HTMLButtonElement>) => {\n if (disabled || readOnly) return;\n mouseDownHandler();\n onMouseDown?.(event);\n };\n\n return (\n <div className={clsx(withBaseName())}>\n <button\n id={dropdownId}\n disabled={disabled}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onMouseOver={handleMouseOver}\n onMouseDown={handleMouseDown}\n onBlur={handleBlur}\n value={selectedItem}\n className={clsx(\n withBaseName(\"button\"),\n withBaseName(variant),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"readOnly\")]: readOnly,\n },\n className\n )}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-activedescendant={activeDescendant}\n tabIndex={disabled ? -1 : 0}\n aria-owns={listId}\n aria-controls={listId}\n aria-disabled={disabled}\n {...restProps}\n ref={triggerRef}\n >\n <span className={clsx(withBaseName(\"buttonText\"))}>{selectedItem}</span>\n {getIcon()}\n </button>\n <FloatingComponent\n open={open && !disabled}\n ref={floating}\n {...getDropdownNextProps()}\n {...getPosition()}\n >\n <ListNext\n id={listId}\n className={clsx(withBaseName(\"list\"), ListProps?.className)}\n disableFocus\n disabled={disabled || ListProps?.disabled}\n selected={selectedItem}\n highlightedItem={highlightedItem}\n {...ListProps}\n ref={setListRef}\n >\n {getListItems(source)}\n </ListNext>\n </FloatingComponent>\n </div>\n );\n});\n"],"names":["makePrefixer","forwardRef","DropdownNext","useWindow","useComponentCssInjection","dropdownNextCss","useId","useRef","useForkRef","useDropdownNext","useFloatingComponent","clsx","jsx","ChevronUpIcon","ChevronDownIcon","jsxs","ListNext"],"mappings":"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"}
1
+ {"version":3,"file":"DropdownNext.js","sources":["../src/dropdown-next/DropdownNext.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { ListNext, ListNextProps } from \"../list-next\";\nimport {\n makePrefixer,\n useId,\n useForkRef,\n useFloatingComponent,\n} from \"@salt-ds/core\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"@salt-ds/icons\";\nimport {\n useRef,\n forwardRef,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n Ref,\n ForwardedRef,\n SyntheticEvent,\n ComponentPropsWithoutRef,\n} from \"react\";\nimport { useWindow } from \"@salt-ds/window\";\nimport dropdownNextCss from \"./DropdownNext.css\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { Placement } from \"@floating-ui/react\";\nimport { useDropdownNext } from \"./useDropdownNext\";\n\nconst withBaseName = makePrefixer(\"saltDropdownNext\");\n\nexport interface DropdownNextProps\n extends Omit<ComponentPropsWithoutRef<\"button\">, \"onSelect\"> {\n /**\n * If `true`, dropdown will be disabled.\n */\n disabled?: boolean;\n /**\n * Initially selected value for the dropdown, for use only in uncontrolled component.\n */\n defaultSelected?: string;\n /**\n * List of options when using a dropdown.\n */\n source: string[];\n /**\n * If `true`, dropdown is read only.\n */\n readOnly?: boolean;\n /**\n * Background styling variant. Defaults to `primary` .\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * Placement of dropdown list. Defaults to `bottom` .\n */\n placement?: Placement;\n /**\n * Optional ref for the list component.\n */\n listRef?: Ref<HTMLUListElement>;\n /**\n * Additional props for dropdown list.\n */\n ListProps?: ListNextProps;\n /* Status open or close for use in controlled component. */\n open?: boolean;\n /**\n * Callback for list selection event\n */\n onSelect?: (event: SyntheticEvent, data: { value: string }) => void;\n /**\n /* Selected prop for use in controlled component. */\n selected?: string;\n /* Highlighted item prop for use in controlled component. */\n highlightedItem?: string;\n}\n\nexport const DropdownNext = forwardRef(function DropdownNext(\n props: DropdownNextProps,\n ref: ForwardedRef<HTMLButtonElement>\n) {\n const {\n className,\n disabled,\n variant = \"primary\",\n id: dropdownIdProp,\n defaultSelected,\n readOnly,\n source,\n placement = \"bottom\",\n open: openControlProp,\n selected: selectedControlProp,\n highlightedItem: highlightedItemControlProp,\n onFocus,\n onKeyDown,\n onMouseOver,\n onMouseDown,\n onSelect,\n listRef: listRefProp,\n ListProps,\n ...restProps\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-dropdown-next\",\n css: dropdownNextCss,\n window: targetWindow,\n });\n\n const listId = useId(ListProps?.id);\n const dropdownId = useId(dropdownIdProp);\n const listRef = useRef<HTMLUListElement>(null);\n\n const setListRef = useForkRef(listRefProp, listRef);\n const listProps = {\n defaultSelected,\n disabled,\n ref: listRef,\n id: listId,\n onSelect: onSelect,\n selected: selectedControlProp,\n highlightedItem: highlightedItemControlProp,\n };\n\n const {\n handlers,\n activeDescendant,\n selectedItem,\n highlightedItem,\n getListItems,\n portalProps,\n getReferenceProps,\n refs,\n } = useDropdownNext({\n listProps,\n placement,\n openControlProp,\n });\n\n const { Component: FloatingComponent } = useFloatingComponent();\n\n const { open, floating, reference, getDropdownNextProps, getPosition } =\n portalProps;\n const {\n focusHandler,\n keyDownHandler,\n mouseOverHandler,\n mouseDownHandler,\n listSelectHandler,\n } = handlers;\n\n const triggerRef = useForkRef<HTMLButtonElement>(ref, reference);\n const portalRef = useForkRef<HTMLButtonElement>(ref, floating);\n\n const getIcon = () => {\n if (readOnly) return;\n\n const iconClassName = clsx(withBaseName(\"icon\"), {\n [withBaseName(\"disabled\")]: disabled,\n });\n\n return open ? (\n <ChevronUpIcon className={iconClassName} />\n ) : (\n <ChevronDownIcon className={iconClassName} />\n );\n };\n\n const handleFocus = (event: FocusEvent<HTMLButtonElement>) => {\n if (disabled) return;\n focusHandler(event);\n onFocus?.(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || readOnly) return;\n keyDownHandler(event);\n onKeyDown?.(event);\n };\n\n const handleMouseOver = (event: MouseEvent<HTMLButtonElement>) => {\n mouseOverHandler();\n onMouseOver?.(event);\n };\n\n const handleMouseDown = (event: MouseEvent<HTMLButtonElement>) => {\n if (disabled || readOnly) return;\n mouseDownHandler();\n onMouseDown?.(event);\n };\n\n const handleListSelect = () => {\n listSelectHandler();\n (refs.domReference.current as HTMLButtonElement)?.focus();\n };\n\n return (\n <div className={clsx(withBaseName())}>\n <button\n id={dropdownId}\n disabled={disabled}\n {...getReferenceProps({\n onFocus: handleFocus,\n onMouseOver: handleMouseOver,\n onMouseDown: handleMouseDown,\n onKeyDown: handleKeyDown,\n })}\n value={selectedItem}\n className={clsx(\n withBaseName(\"button\"),\n withBaseName(variant),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"readOnly\")]: readOnly,\n },\n className\n )}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-activedescendant={activeDescendant}\n tabIndex={disabled ? -1 : 0}\n aria-owns={listId}\n aria-controls={listId}\n aria-disabled={disabled}\n {...restProps}\n ref={triggerRef}\n >\n <span className={clsx(withBaseName(\"buttonText\"))}>{selectedItem}</span>\n {getIcon()}\n </button>\n <FloatingComponent\n open={open && !disabled}\n ref={portalRef}\n {...getDropdownNextProps()}\n {...getPosition()}\n >\n <ListNext\n data-test-id={\"list-container\"}\n id={listId}\n className={clsx(withBaseName(\"list\"), ListProps?.className)}\n disableFocus\n disabled={disabled || ListProps?.disabled}\n selected={selectedItem}\n highlightedItem={highlightedItem}\n {...ListProps}\n ref={setListRef}\n onSelect={handleListSelect}\n >\n {getListItems(source)}\n </ListNext>\n </FloatingComponent>\n </div>\n );\n});\n"],"names":["makePrefixer","forwardRef","DropdownNext","useWindow","useComponentCssInjection","dropdownNextCss","useId","useRef","useForkRef","useDropdownNext","useFloatingComponent","clsx","jsx","ChevronUpIcon","ChevronDownIcon","jsxs","ListNext"],"mappings":"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"}
@@ -24,15 +24,13 @@ const useDropdownNext = ({
24
24
  const {
25
25
  focusHandler: listFocusHandler,
26
26
  keyDownHandler: listKeyDownHandler,
27
- blurHandler: listBlurHandler,
28
27
  mouseOverHandler: listMouseOverHandler,
29
28
  activeDescendant,
30
29
  selectedItem,
31
30
  setSelectedItem,
32
31
  highlightedItem,
33
32
  setHighlightedItem,
34
- contextValue: listContextValue,
35
- focusVisibleRef
33
+ contextValue: listContextValue
36
34
  } = useList.useList({
37
35
  ...listProps
38
36
  });
@@ -57,7 +55,17 @@ const useDropdownNext = ({
57
55
  setOpen(open2);
58
56
  onOpenChangeProp == null ? void 0 : onOpenChangeProp(open2);
59
57
  };
60
- const { floating, reference, x, y, strategy, placement, context, elements } = core.useFloatingUI({
58
+ const {
59
+ floating,
60
+ reference,
61
+ x,
62
+ y,
63
+ strategy,
64
+ placement,
65
+ context,
66
+ elements,
67
+ refs
68
+ } = core.useFloatingUI({
61
69
  open,
62
70
  onOpenChange,
63
71
  placement: placementProp,
@@ -74,10 +82,9 @@ const useDropdownNext = ({
74
82
  react.shift({ limiter: react.limitShift() })
75
83
  ]
76
84
  });
77
- const { getFloatingProps } = react.useInteractions([
78
- react.useDismiss(context),
79
- react.useRole(context, { role: "listbox" })
80
- ]);
85
+ const { getReferenceProps, getFloatingProps, getItemProps } = react.useInteractions(
86
+ [react.useDismiss(context), react.useRole(context, { role: "listbox" })]
87
+ );
81
88
  const getDropdownNextProps = () => {
82
89
  return getFloatingProps({
83
90
  "data-placement": placement,
@@ -94,10 +101,6 @@ const useDropdownNext = ({
94
101
  height: (_b = elements.floating) == null ? void 0 : _b.clientHeight
95
102
  };
96
103
  };
97
- const blurHandler = () => {
98
- listBlurHandler();
99
- setOpen(false);
100
- };
101
104
  const focusHandler = (event) => {
102
105
  if (selectedItem) {
103
106
  listFocusHandler(event);
@@ -109,6 +112,9 @@ const useDropdownNext = ({
109
112
  const mouseOverHandler = () => {
110
113
  listMouseOverHandler();
111
114
  };
115
+ const listSelectHandler = () => {
116
+ setOpen(false);
117
+ };
112
118
  const keyDownHandler = (event) => {
113
119
  const { key } = event;
114
120
  switch (key) {
@@ -134,6 +140,9 @@ const useDropdownNext = ({
134
140
  case "Escape":
135
141
  setOpen(false);
136
142
  break;
143
+ case "Tab":
144
+ setOpen(false);
145
+ break;
137
146
  case "PageUp":
138
147
  case "PageDown":
139
148
  case "Home":
@@ -147,24 +156,28 @@ const useDropdownNext = ({
147
156
  };
148
157
  return {
149
158
  handlers: {
150
- focusHandler,
151
159
  keyDownHandler,
152
- blurHandler,
160
+ focusHandler,
153
161
  mouseOverHandler,
154
- mouseDownHandler
162
+ mouseDownHandler,
163
+ listSelectHandler
155
164
  },
165
+ refs,
166
+ open,
167
+ getReferenceProps,
168
+ getItemProps,
156
169
  activeDescendant,
157
170
  selectedItem,
158
171
  setSelectedItem,
159
172
  highlightedItem,
160
173
  setHighlightedItem,
161
- focusVisibleRef,
162
174
  getListItems,
163
175
  portalProps: {
164
176
  open,
165
177
  setOpen,
166
178
  floating,
167
179
  reference,
180
+ getFloatingProps,
168
181
  getDropdownNextProps,
169
182
  getPosition
170
183
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useDropdownNext.js","sources":["../src/dropdown-next/useDropdownNext.tsx"],"sourcesContent":["import {\n useInteractions,\n useDismiss,\n useRole,\n flip,\n shift,\n limitShift,\n offset,\n size,\n} from \"@floating-ui/react\";\nimport {\n useControlled,\n useFloatingUI,\n UseFloatingUIProps,\n} from \"@salt-ds/core\";\nimport { ListItemNext } from \"../list-next\";\nimport { HTMLProps, KeyboardEvent, FocusEvent } from \"react\";\nimport { useList, UseListProps } from \"../list-next/useList\";\n\ninterface UseDropdownNextProps\n extends Partial<\n Pick<UseFloatingUIProps, \"onOpenChange\" | \"open\" | \"placement\">\n > {\n listProps: UseListProps;\n // props for controlled dropdown\n openControlProp?: boolean;\n}\n\nexport const useDropdownNext = ({\n listProps,\n openControlProp,\n onOpenChange: onOpenChangeProp,\n placement: placementProp,\n}: UseDropdownNextProps) => {\n const [open, setOpen] = useControlled({\n controlled: openControlProp,\n default: false,\n name: \"DropdownNext\",\n state: \"open\",\n });\n\n // USELIST HOOK\n const {\n focusHandler: listFocusHandler,\n keyDownHandler: listKeyDownHandler,\n blurHandler: listBlurHandler,\n mouseOverHandler: listMouseOverHandler,\n activeDescendant,\n selectedItem,\n setSelectedItem,\n highlightedItem,\n setHighlightedItem,\n contextValue: listContextValue,\n focusVisibleRef,\n } = useList({\n ...listProps,\n });\n\n const { select, highlight } = listContextValue;\n\n // LIST SOURCE\n const getListItems = (source: string[]) => {\n if (!source) return;\n\n return source.map((item, index) => {\n return (\n <ListItemNext\n key={index}\n value={item}\n onMouseDown={(event) => {\n select(event);\n }}\n onMouseMove={(event) => {\n highlight(event);\n }}\n >\n {item}\n </ListItemNext>\n );\n });\n };\n\n // FLOATING PORTAL\n const onOpenChange = (open: boolean) => {\n setOpen(open);\n onOpenChangeProp?.(open);\n };\n\n const { floating, reference, x, y, strategy, placement, context, elements } =\n useFloatingUI({\n open,\n onOpenChange,\n placement: placementProp,\n middleware: [\n offset(0),\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n });\n },\n }),\n flip(),\n shift({ limiter: limitShift() }),\n ],\n });\n\n const { getFloatingProps } = useInteractions([\n useDismiss(context),\n useRole(context, { role: \"listbox\" }),\n ]);\n\n const getDropdownNextProps = (): HTMLProps<HTMLDivElement> => {\n return getFloatingProps({\n // @ts-ignore\n \"data-placement\": placement,\n ref: floating,\n });\n };\n\n const getPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.clientWidth,\n height: elements.floating?.clientHeight,\n });\n\n // HANDLERS\n const blurHandler = () => {\n listBlurHandler();\n setOpen(false);\n };\n\n // handles focus on mouse and keyboard\n const focusHandler = (event: FocusEvent<HTMLElement>) => {\n if (selectedItem) {\n listFocusHandler(event as FocusEvent<HTMLUListElement>);\n }\n };\n\n // handles mouse click on dropdown button\n const mouseDownHandler = () => {\n setOpen(!open);\n };\n\n // handles mouse hover on dropdown button\n const mouseOverHandler = () => {\n listMouseOverHandler();\n };\n\n const keyDownHandler = (event: KeyboardEvent<HTMLElement>) => {\n const { key } = event;\n switch (key) {\n case \"ArrowUp\":\n listKeyDownHandler(event);\n break;\n case \"ArrowDown\":\n setOpen(true);\n listKeyDownHandler(event);\n break;\n case \" \":\n case \"Enter\":\n if (!open) {\n setOpen(true);\n break;\n }\n if (open) {\n listKeyDownHandler(event);\n setOpen(false);\n break;\n }\n break;\n case \"Escape\":\n setOpen(false);\n break;\n case \"PageUp\":\n case \"PageDown\":\n case \"Home\":\n case \"End\":\n if (open) {\n listKeyDownHandler(event);\n break;\n }\n break;\n default:\n break;\n }\n };\n\n return {\n handlers: {\n focusHandler,\n keyDownHandler,\n blurHandler,\n mouseOverHandler,\n mouseDownHandler,\n },\n activeDescendant,\n selectedItem,\n setSelectedItem,\n highlightedItem,\n setHighlightedItem,\n focusVisibleRef,\n getListItems,\n portalProps: {\n open,\n setOpen,\n floating,\n reference,\n getDropdownNextProps,\n getPosition,\n },\n };\n};\n"],"names":["useControlled","useList","jsx","ListItemNext","open","useFloatingUI","offset","size","elements","flip","shift","limitShift","useInteractions","useDismiss","useRole"],"mappings":"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"}
1
+ {"version":3,"file":"useDropdownNext.js","sources":["../src/dropdown-next/useDropdownNext.tsx"],"sourcesContent":["import {\n useInteractions,\n useDismiss,\n useRole,\n flip,\n shift,\n limitShift,\n offset,\n size,\n} from \"@floating-ui/react\";\nimport {\n useControlled,\n useFloatingUI,\n UseFloatingUIProps,\n} from \"@salt-ds/core\";\nimport { ListItemNext } from \"../list-next\";\nimport { HTMLProps, KeyboardEvent, FocusEvent } from \"react\";\nimport { useList, UseListProps } from \"../list-next/useList\";\n\ninterface UseDropdownNextProps\n extends Partial<\n Pick<UseFloatingUIProps, \"onOpenChange\" | \"open\" | \"placement\">\n > {\n listProps: UseListProps;\n // props for controlled dropdown\n openControlProp?: boolean;\n}\n\nexport const useDropdownNext = ({\n listProps,\n openControlProp,\n onOpenChange: onOpenChangeProp,\n placement: placementProp,\n}: UseDropdownNextProps) => {\n const [open, setOpen] = useControlled({\n controlled: openControlProp,\n default: false,\n name: \"DropdownNext\",\n state: \"open\",\n });\n\n // USELIST HOOK\n const {\n focusHandler: listFocusHandler,\n keyDownHandler: listKeyDownHandler,\n mouseOverHandler: listMouseOverHandler,\n activeDescendant,\n selectedItem,\n setSelectedItem,\n highlightedItem,\n setHighlightedItem,\n contextValue: listContextValue,\n } = useList({\n ...listProps,\n });\n\n const { select, highlight } = listContextValue;\n\n // LIST SOURCE\n const getListItems = (source: string[]) => {\n if (!source) return;\n\n return source.map((item, index) => {\n return (\n <ListItemNext\n key={index}\n value={item}\n onMouseDown={(event) => {\n select(event);\n }}\n onMouseMove={(event) => {\n highlight(event);\n }}\n >\n {item}\n </ListItemNext>\n );\n });\n };\n\n // FLOATING PORTAL\n const onOpenChange = (open: boolean) => {\n setOpen(open);\n onOpenChangeProp?.(open);\n };\n\n const {\n floating,\n reference,\n x,\n y,\n strategy,\n placement,\n context,\n elements,\n refs,\n } = useFloatingUI({\n open,\n onOpenChange,\n placement: placementProp,\n middleware: [\n offset(0),\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n });\n },\n }),\n flip(),\n shift({ limiter: limitShift() }),\n ],\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [useDismiss(context), useRole(context, { role: \"listbox\" })]\n );\n\n const getDropdownNextProps = (): HTMLProps<HTMLDivElement> => {\n return getFloatingProps({\n // @ts-ignore\n \"data-placement\": placement,\n ref: floating,\n });\n };\n\n const getPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.clientWidth,\n height: elements.floating?.clientHeight,\n });\n\n // handles focus on mouse and keyboard\n const focusHandler = (event: FocusEvent<HTMLElement>) => {\n if (selectedItem) {\n listFocusHandler(event as FocusEvent<HTMLUListElement>);\n }\n };\n\n // handles mouse click on dropdown button\n const mouseDownHandler = () => {\n setOpen(!open);\n };\n\n // handles mouse hover on dropdown button\n const mouseOverHandler = () => {\n listMouseOverHandler();\n };\n\n const listSelectHandler = () => {\n setOpen(false);\n };\n\n const keyDownHandler = (event: KeyboardEvent<HTMLElement>) => {\n const { key } = event;\n switch (key) {\n case \"ArrowUp\":\n listKeyDownHandler(event);\n break;\n case \"ArrowDown\":\n setOpen(true);\n listKeyDownHandler(event);\n break;\n case \" \":\n case \"Enter\":\n if (!open) {\n setOpen(true);\n break;\n }\n if (open) {\n listKeyDownHandler(event);\n setOpen(false);\n break;\n }\n break;\n case \"Escape\":\n setOpen(false);\n break;\n case \"Tab\":\n setOpen(false);\n break;\n case \"PageUp\":\n case \"PageDown\":\n case \"Home\":\n case \"End\":\n if (open) {\n listKeyDownHandler(event);\n break;\n }\n break;\n default:\n break;\n }\n };\n\n return {\n handlers: {\n keyDownHandler,\n focusHandler,\n mouseOverHandler,\n mouseDownHandler,\n listSelectHandler,\n },\n refs,\n open,\n getReferenceProps,\n getItemProps,\n activeDescendant,\n selectedItem,\n setSelectedItem,\n highlightedItem,\n setHighlightedItem,\n getListItems,\n portalProps: {\n open,\n setOpen,\n floating,\n reference,\n getFloatingProps,\n getDropdownNextProps,\n getPosition,\n },\n };\n};\n"],"names":["useControlled","useList","jsx","ListItemNext","open","useFloatingUI","offset","size","elements","flip","shift","limitShift","useInteractions","useDismiss","useRole"],"mappings":"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"}
package/dist-cjs/index.js CHANGED
@@ -141,7 +141,6 @@ var TrackerStep = require('./stepped-tracker/TrackerStep/TrackerStep.js');
141
141
  var StepLabel = require('./stepped-tracker/StepLabel/StepLabel.js');
142
142
  var useStepperInput = require('./stepper-input/useStepperInput.js');
143
143
  var StepperInput = require('./stepper-input/StepperInput.js');
144
- var Switch = require('./switch/Switch.js');
145
144
  var TabActivationIndicator = require('./tabs/TabActivationIndicator.js');
146
145
  var Tabstrip = require('./tabs/Tabstrip.js');
147
146
  var Tab = require('./tabs/Tab.js');
@@ -334,7 +333,6 @@ exports.TrackerStep = TrackerStep.TrackerStep;
334
333
  exports.StepLabel = StepLabel.StepLabel;
335
334
  exports.useStepperInput = useStepperInput.useStepperInput;
336
335
  exports.StepperInput = StepperInput.StepperInput;
337
- exports.Switch = Switch.Switch;
338
336
  exports.TabActivationIndicator = TabActivationIndicator.TabActivationIndicator;
339
337
  exports.Tabstrip = Tabstrip.Tabstrip;
340
338
  exports.Tab = Tab.Tab;