@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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var css_248z = "/* Styles applied to the root element */\n.saltPillNext {\n --pillNext-background: var(--salt-actionable-primary-background);\n --pillNext-background-active: var(--salt-actionable-primary-background-active);\n --pillNext-background-disabled: var(--salt-actionable-primary-background-disabled);\n --pillNext-background-hover: var(--salt-actionable-primary-background-hover);\n --pillNext-text-color: var(--salt-actionable-primary-foreground);\n --pillNext-text-color-active: var(--salt-actionable-primary-foreground-active);\n --pillNext-text-color-hover: var(--salt-actionable-primary-foreground-hover);\n --pillNext-text-color-disabled: var(--salt-actionable-primary-foreground-disabled);\n}\n\n.saltPillNext {\n appearance: none;\n -webkit-appearance: none;\n display: inline-flex;\n align-items: center;\n background: var(--pillNext-background);\n border-radius: 0;\n border: 0;\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n min-width: 4em;\n min-height: var(--salt-text-minHeight);\n outline: 0;\n position: relative;\n gap: var(--salt-spacing-50);\n padding-left: var(--salt-spacing-50);\n padding-right: var(--salt-spacing-50);\n color: var(--pillNext-text-color);\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-label-lineHeight);\n}\n\n.saltPillNext-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.saltPillNext .saltIcon {\n --saltIcon-color: currentColor;\n}\n\n/* Style applied to Pill if `onClick` prop is provided */\n.saltPillNext-clickable {\n cursor: var(--salt-selectable-cursor-hover);\n}\n\n.saltPillNext-clickable:hover {\n color: var(--pillNext-text-color-hover);\n background: var(--pillNext-background-hover);\n}\n\n.saltPillNext-clickable.saltPillNext-disabled:hover {\n color: var(--pillNext-text-color);\n background: var(--pillNext-background);\n}\n\n.saltPillNext-clickable.saltPillNext-active,\n.saltPillNext-clickable:active {\n background: var(--pillNext-background-active);\n color: var(--pillNext-text-color-active);\n}\n\n.saltPillNext-clickable.saltPillNext-disabled.saltPillNext-active,\n.saltPillNext-clickable.saltPillNext-disabled:active {\n background: var(--pillNext-background);\n color: var(--pillNext-text-color);\n}\n\n/* Style applied to Pill on focus */\n.saltPillNext:focus-visible {\n outline: var(--salt-focused-outline);\n}\n\n/* Style applied to Pill when disabled */\n.saltPillNext.saltPillNext-disabled,\n.saltPillNext.saltPillNext-disabled:hover,\n.saltPillNext.saltPillNext-disabled:active {\n color: var(--pillNext-text-color-disabled);\n background: var(--pillNext-background-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n";
3
+ var css_248z = "/* Styles applied to the root element */\n\n.saltPillNext {\n display: flex;\n max-width: 100%;\n}\n\n.saltPillNext-action {\n --pillNext-background: var(--salt-actionable-primary-background);\n --pillNext-background-active: var(--salt-actionable-primary-background-active);\n --pillNext-background-disabled: var(--salt-actionable-primary-background-disabled);\n --pillNext-background-hover: var(--salt-actionable-primary-background-hover);\n --pillNext-text-color: var(--salt-actionable-primary-foreground);\n --pillNext-text-color-active: var(--salt-actionable-primary-foreground-active);\n --pillNext-text-color-hover: var(--salt-actionable-primary-foreground-hover);\n --pillNext-text-color-disabled: var(--salt-actionable-primary-foreground-disabled);\n}\n\n.saltPillNext-action {\n appearance: none;\n -webkit-appearance: none;\n display: inline-flex;\n align-items: center;\n background: var(--pillNext-background);\n border-radius: 0;\n border: 0;\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n min-height: var(--salt-text-minHeight);\n outline: 0;\n position: relative;\n gap: var(--salt-spacing-50);\n padding-left: var(--salt-spacing-50);\n padding-right: var(--salt-spacing-50);\n color: var(--pillNext-text-color);\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n min-width: 4em;\n}\n\n.saltPillNext-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.saltPillNext-close-button {\n --saltButton-height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n --saltButton-padding: var(--salt-spacing-50);\n}\n\n.saltPillNext-action .saltIcon {\n --saltIcon-color: currentColor;\n}\n\n/* Style applied to Pill if `onClick` prop is provided */\n.saltPillNext-clickable {\n cursor: var(--salt-selectable-cursor-hover);\n}\n\n.saltPillNext-clickable:hover,\n.saltPillNext-clickable:focus-visible {\n color: var(--pillNext-text-color-hover);\n background: var(--pillNext-background-hover);\n}\n\n.saltPillNext-clickable.saltPillNext-disabled:hover {\n color: var(--pillNext-text-color);\n background: var(--pillNext-background);\n}\n\n.saltPillNext-clickable.saltPillNext-active,\n.saltPillNext-clickable:active {\n background: var(--pillNext-background-active);\n color: var(--pillNext-text-color-active);\n}\n\n.saltPillNext-clickable.saltPillNext-disabled.saltPillNext-active,\n.saltPillNext-clickable.saltPillNext-disabled:active {\n background: var(--pillNext-background);\n color: var(--pillNext-text-color);\n}\n\n/* Style applied to Pill on focus */\n.saltPillNext-action:focus-visible {\n outline: var(--salt-focused-outline);\n /* increase index by one so the focus ring sits on top of the sibling button */\n z-index: var(--salt-zIndex-default);\n}\n\n/* Style applied to Pill when disabled */\n.saltPillNext-action.saltPillNext-disabled,\n.saltPillNext-action.saltPillNext-disabled:hover {\n color: var(--pillNext-text-color-disabled);\n background: var(--pillNext-background-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n";
4
4
 
5
5
  module.exports = css_248z;
6
6
  //# sourceMappingURL=PillNext.css.js.map
@@ -9,6 +9,7 @@ var window = require('@salt-ds/window');
9
9
  var styles = require('@salt-ds/styles');
10
10
  var core = require('@salt-ds/core');
11
11
  var PillNext$1 = require('./PillNext.css.js');
12
+ var icons = require('@salt-ds/icons');
12
13
 
13
14
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
15
 
@@ -16,7 +17,7 @@ var clsx__default = /*#__PURE__*/_interopDefaultLegacy(clsx);
16
17
 
17
18
  const withBaseName = core.makePrefixer("saltPillNext");
18
19
  const PillNext = React.forwardRef(
19
- function PillNext2({ children, className, icon, disabled, ...restProps }, ref) {
20
+ function PillNext2({ children, className, icon, disabled, onClose, ...restProps }, ref) {
20
21
  const targetWindow = window.useWindow();
21
22
  styles.useComponentCssInjection({
22
23
  testId: "salt-pill-next",
@@ -28,26 +29,37 @@ const PillNext = React.forwardRef(
28
29
  ...restProps
29
30
  });
30
31
  const { tabIndex, ...restButtonProps } = buttonProps;
31
- return /* @__PURE__ */ jsxRuntime.jsxs("button", {
32
- "data-testid": "pill",
33
- ref,
34
- type: "button",
35
- className: clsx__default["default"](
36
- withBaseName(),
37
- withBaseName("clickable"),
38
- {
39
- [withBaseName("active")]: active,
40
- [withBaseName("disabled")]: disabled
41
- },
42
- className
43
- ),
44
- ...restButtonProps,
45
- ...restProps,
32
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", {
33
+ className: withBaseName(),
46
34
  children: [
47
- icon,
48
- /* @__PURE__ */ jsxRuntime.jsx("span", {
49
- className: withBaseName("label"),
50
- children
35
+ /* @__PURE__ */ jsxRuntime.jsxs("button", {
36
+ "data-testid": "pill",
37
+ ref,
38
+ className: clsx__default["default"](
39
+ withBaseName("action"),
40
+ withBaseName("clickable"),
41
+ {
42
+ [withBaseName("active")]: active,
43
+ [withBaseName("disabled")]: disabled
44
+ },
45
+ className
46
+ ),
47
+ ...restButtonProps,
48
+ ...restProps,
49
+ children: [
50
+ icon,
51
+ /* @__PURE__ */ jsxRuntime.jsx("span", {
52
+ className: withBaseName("label"),
53
+ children
54
+ })
55
+ ]
56
+ }),
57
+ onClose && /* @__PURE__ */ jsxRuntime.jsx(core.Button, {
58
+ "data-testid": "pill-close-button",
59
+ className: withBaseName("close-button"),
60
+ disabled,
61
+ onClick: onClose,
62
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.CloseIcon, {})
51
63
  })
52
64
  ]
53
65
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PillNext.js","sources":["../src/pill-next/PillNext.tsx"],"sourcesContent":["import {\n forwardRef,\n MouseEvent,\n KeyboardEvent,\n ComponentPropsWithoutRef,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { makePrefixer, useButton } from \"@salt-ds/core\";\nimport pillCss from \"./PillNext.css\";\n\nexport type PillClickEvent =\n | MouseEvent<Element, globalThis.MouseEvent>\n | KeyboardEvent<HTMLDivElement>;\n\nexport interface PillNextProps extends ComponentPropsWithoutRef<\"button\"> {\n /* If true the pill will be disabled */\n disabled?: boolean;\n /* Pass an element to render an icon descriptor on the left of the label */\n icon?: React.ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltPillNext\");\n\nexport const PillNext = forwardRef<HTMLButtonElement, PillNextProps>(\n function PillNext(\n { children, className, icon, disabled, ...restProps },\n ref\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-pill-next\",\n css: pillCss,\n window: targetWindow,\n });\n const { buttonProps, active } = useButton<HTMLButtonElement>({\n disabled,\n ...restProps,\n });\n // we do not want to spread tab index in this case because the button element\n // does not require tabindex=\"0\" attribute\n const { tabIndex, ...restButtonProps } = buttonProps;\n\n return (\n <button\n data-testid=\"pill\"\n ref={ref}\n type=\"button\"\n className={clsx(\n withBaseName(),\n withBaseName(\"clickable\"),\n {\n [withBaseName(\"active\")]: active,\n [withBaseName(\"disabled\")]: disabled,\n },\n className\n )}\n {...restButtonProps}\n {...restProps}\n >\n {icon}\n <span className={withBaseName(\"label\")}>{children}</span>\n </button>\n );\n }\n);\n"],"names":["makePrefixer","forwardRef","PillNext","useWindow","useComponentCssInjection","pillCss","useButton","jsxs","clsx","jsx"],"mappings":";;;;;;;;;;;;;;;;AAuBA,MAAM,YAAA,GAAeA,kBAAa,cAAc,CAAA,CAAA;AAEzC,MAAM,QAAW,GAAAC,gBAAA;AAAA,EACtB,SAASC,UACP,EAAE,QAAA,EAAU,WAAW,IAAM,EAAA,QAAA,EAAA,GAAa,SAAU,EAAA,EACpD,GACA,EAAA;AACA,IAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,UAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAA,MAAM,EAAE,WAAA,EAAa,MAAO,EAAA,GAAIC,cAA6B,CAAA;AAAA,MAC3D,QAAA;AAAA,MACA,GAAG,SAAA;AAAA,KACJ,CAAA,CAAA;AAGD,IAAM,MAAA,EAAE,QAAa,EAAA,GAAA,eAAA,EAAoB,GAAA,WAAA,CAAA;AAEzC,IAAA,uBACGC,eAAA,CAAA,QAAA,EAAA;AAAA,MACC,aAAY,EAAA,MAAA;AAAA,MACZ,GAAA;AAAA,MACA,IAAK,EAAA,QAAA;AAAA,MACL,SAAW,EAAAC,wBAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb,aAAa,WAAW,CAAA;AAAA,QACxB;AAAA,UACE,CAAC,YAAa,CAAA,QAAQ,CAAI,GAAA,MAAA;AAAA,UAC1B,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,SAC9B;AAAA,QACA,SAAA;AAAA,OACF;AAAA,MACC,GAAG,eAAA;AAAA,MACH,GAAG,SAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,wBACAC,cAAA,CAAA,MAAA,EAAA;AAAA,UAAK,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,UAAI,QAAA;AAAA,SAAS,CAAA;AAAA,OAAA;AAAA,KACpD,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"PillNext.js","sources":["../src/pill-next/PillNext.tsx"],"sourcesContent":["import { forwardRef, ComponentPropsWithoutRef, MouseEvent } from \"react\";\nimport clsx from \"clsx\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { Button, makePrefixer, useButton } from \"@salt-ds/core\";\nimport pillCss from \"./PillNext.css\";\nimport { CloseIcon } from \"@salt-ds/icons\";\n\nexport interface PillNextProps extends ComponentPropsWithoutRef<\"button\"> {\n /* If true the pill will be disabled */\n disabled?: boolean;\n onClose?: (event: MouseEvent<HTMLButtonElement>) => void;\n /* Pass an element to render an icon descriptor on the left of the label */\n icon?: React.ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltPillNext\");\n\nexport const PillNext = forwardRef<HTMLButtonElement, PillNextProps>(\n function PillNext(\n { children, className, icon, disabled, onClose, ...restProps },\n ref\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-pill-next\",\n css: pillCss,\n window: targetWindow,\n });\n const { buttonProps, active } = useButton<HTMLButtonElement>({\n disabled,\n ...restProps,\n });\n // we do not want to spread tab index in this case because the button element\n // does not require tabindex=\"0\" attribute\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { tabIndex, ...restButtonProps } = buttonProps;\n\n return (\n <div className={withBaseName()}>\n <button\n data-testid=\"pill\"\n ref={ref}\n className={clsx(\n withBaseName(\"action\"),\n withBaseName(\"clickable\"),\n {\n [withBaseName(\"active\")]: active,\n [withBaseName(\"disabled\")]: disabled,\n },\n className\n )}\n {...restButtonProps}\n {...restProps}\n >\n {icon}\n <span className={withBaseName(\"label\")}>{children}</span>\n </button>\n {onClose && (\n <Button\n data-testid=\"pill-close-button\"\n className={withBaseName(\"close-button\")}\n disabled={disabled}\n onClick={onClose}\n >\n <CloseIcon />\n </Button>\n )}\n </div>\n );\n }\n);\n"],"names":["makePrefixer","forwardRef","PillNext","useWindow","useComponentCssInjection","pillCss","useButton","jsxs","clsx","jsx","Button","CloseIcon"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,MAAM,YAAA,GAAeA,kBAAa,cAAc,CAAA,CAAA;AAEzC,MAAM,QAAW,GAAAC,gBAAA;AAAA,EACtB,SAASC,SACP,CAAA,EAAE,QAAU,EAAA,SAAA,EAAW,MAAM,QAAU,EAAA,OAAA,EAAA,GAAY,SAAU,EAAA,EAC7D,GACA,EAAA;AACA,IAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,UAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAA,MAAM,EAAE,WAAA,EAAa,MAAO,EAAA,GAAIC,cAA6B,CAAA;AAAA,MAC3D,QAAA;AAAA,MACA,GAAG,SAAA;AAAA,KACJ,CAAA,CAAA;AAID,IAAM,MAAA,EAAE,QAAa,EAAA,GAAA,eAAA,EAAoB,GAAA,WAAA,CAAA;AAEzC,IAAA,uBACGC,eAAA,CAAA,KAAA,EAAA;AAAA,MAAI,WAAW,YAAa,EAAA;AAAA,MAC3B,QAAA,EAAA;AAAA,wBAACA,eAAA,CAAA,QAAA,EAAA;AAAA,UACC,aAAY,EAAA,MAAA;AAAA,UACZ,GAAA;AAAA,UACA,SAAW,EAAAC,wBAAA;AAAA,YACT,aAAa,QAAQ,CAAA;AAAA,YACrB,aAAa,WAAW,CAAA;AAAA,YACxB;AAAA,cACE,CAAC,YAAa,CAAA,QAAQ,CAAI,GAAA,MAAA;AAAA,cAC1B,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,aAC9B;AAAA,YACA,SAAA;AAAA,WACF;AAAA,UACC,GAAG,eAAA;AAAA,UACH,GAAG,SAAA;AAAA,UAEH,QAAA,EAAA;AAAA,YAAA,IAAA;AAAA,4BACAC,cAAA,CAAA,MAAA,EAAA;AAAA,cAAK,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAAI,QAAA;AAAA,aAAS,CAAA;AAAA,WAAA;AAAA,SACpD,CAAA;AAAA,QACC,2BACEA,cAAA,CAAAC,WAAA,EAAA;AAAA,UACC,aAAY,EAAA,mBAAA;AAAA,UACZ,SAAA,EAAW,aAAa,cAAc,CAAA;AAAA,UACtC,QAAA;AAAA,UACA,OAAS,EAAA,OAAA;AAAA,UAET,yCAACC,eAAU,EAAA,EAAA,CAAA;AAAA,SACb,CAAA;AAAA,OAAA;AAAA,KAEJ,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -27,7 +27,6 @@ const ComboBoxNext = forwardRef(function ComboBoxNext2({
27
27
  ListItem = DefaultListItem,
28
28
  itemFilter = defaultFilter,
29
29
  onMouseOver,
30
- onBlur,
31
30
  onFocus,
32
31
  onKeyDown,
33
32
  onSelect,
@@ -64,14 +63,14 @@ const ComboBoxNext = forwardRef(function ComboBoxNext2({
64
63
  focusVisibleRef,
65
64
  keyDownHandler,
66
65
  focusHandler,
67
- blurHandler,
68
66
  setSelectedItem,
69
67
  setHighlightedItem,
70
- mouseOverHandler
68
+ mouseOverHandler,
69
+ mouseDownHandler,
70
+ listSelectHandler
71
71
  } = useComboBox({
72
72
  defaultInputValue,
73
73
  inputValue: inputValueProp,
74
- onBlur,
75
74
  onFocus,
76
75
  onMouseOver,
77
76
  onKeyDown,
@@ -112,7 +111,7 @@ const ComboBoxNext = forwardRef(function ComboBoxNext2({
112
111
  setHighlightedItem(filteredSource[0]);
113
112
  }
114
113
  }
115
- onInputChange == null ? void 0 : onInputChange(event, { value: inputValue || "" });
114
+ onInputChange == null ? void 0 : onInputChange(event, { value: inputValue != null ? inputValue : "" });
116
115
  };
117
116
  const adornment = open ? /* @__PURE__ */ jsx(ChevronUpIcon, {
118
117
  className: withBaseName("chevron")
@@ -130,7 +129,7 @@ const ComboBoxNext = forwardRef(function ComboBoxNext2({
130
129
  disabled,
131
130
  endAdornment: adornment,
132
131
  onChange,
133
- onBlur: blurHandler,
132
+ onMouseDown: mouseDownHandler,
134
133
  inputRef,
135
134
  inputProps: {
136
135
  "aria-expanded": open,
@@ -154,6 +153,7 @@ const ComboBoxNext = forwardRef(function ComboBoxNext2({
154
153
  disableFocus: true,
155
154
  highlightedItem,
156
155
  onMouseOver: mouseOverHandler,
156
+ onSelect: listSelectHandler,
157
157
  selected: selectedItem,
158
158
  ...restListProps,
159
159
  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":["ComboBoxNext","comboBoxNextCss"],"mappings":"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"}
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":["ComboBoxNext","comboBoxNextCss"],"mappings":"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"}
@@ -6,7 +6,6 @@ import { useControlled } from '@salt-ds/core';
6
6
  const useComboBox = ({
7
7
  defaultInputValue,
8
8
  onFocus,
9
- onBlur,
10
9
  onMouseOver,
11
10
  onKeyDown,
12
11
  inputValue: inputValueProp,
@@ -48,22 +47,19 @@ const useComboBox = ({
48
47
  setInputValue(selectedItem);
49
48
  }, [selectedItem]);
50
49
  const focusHandler = (event) => {
51
- setOpen(true);
52
50
  listFocusHandler(event);
53
51
  onFocus == null ? void 0 : onFocus(event);
54
52
  };
55
- const blurHandler = (event) => {
56
- setOpen(false);
57
- if (!selectedItem) {
58
- setSelected(void 0);
59
- setHighlightedItem(void 0);
60
- }
61
- onBlur == null ? void 0 : onBlur(event);
53
+ const mouseDownHandler = () => {
54
+ setOpen(!open);
62
55
  };
63
56
  const mouseOverHandler = (event) => {
64
57
  setHighlightedItem(event.currentTarget.dataset.value);
65
58
  onMouseOver == null ? void 0 : onMouseOver(event);
66
59
  };
60
+ const listSelectHandler = () => {
61
+ setOpen(false);
62
+ };
67
63
  const keyDownHandler = (event) => {
68
64
  const { key, altKey } = event;
69
65
  switch (key) {
@@ -106,6 +102,9 @@ const useComboBox = ({
106
102
  }
107
103
  }
108
104
  break;
105
+ case "Tab":
106
+ setOpen(false);
107
+ break;
109
108
  case "Backspace":
110
109
  if (!open) {
111
110
  setOpen(true);
@@ -134,8 +133,9 @@ const useComboBox = ({
134
133
  focusVisibleRef,
135
134
  keyDownHandler,
136
135
  focusHandler,
137
- blurHandler,
138
- mouseOverHandler
136
+ mouseOverHandler,
137
+ mouseDownHandler,
138
+ listSelectHandler
139
139
  };
140
140
  };
141
141
 
@@ -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":[],"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":[],"mappings":"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"}
@@ -6,7 +6,7 @@ function useComboboxPortal(props) {
6
6
  open: openProp,
7
7
  onOpenChange: onOpenChangeProp,
8
8
  placement: placementProp = "bottom"
9
- } = props || {};
9
+ } = props != null ? props : {};
10
10
  const [open, setOpen] = useControlled({
11
11
  controlled: openProp,
12
12
  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":["open","elements"],"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":["open","elements"],"mappings":"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"}
@@ -1,29 +1,25 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import '../list-next/ListNext.js';
3
- import { ListItemNext } from '../list-next/ListItemNext.js';
2
+ import { forwardRef } from 'react';
4
3
  import { Highlighter } from '../list/Highlighter.js';
5
4
  import '../list/ListItem.js';
6
5
  import '../list/List.js';
7
- import { forwardRef } from 'react';
8
6
  import '@salt-ds/core';
9
7
  import '../common-hooks/collectionProvider.js';
10
8
  import '../common-hooks/keyUtils.js';
11
9
  import '../responsive/useResizeObserver.js';
12
10
  import '../list/VirtualizedList.js';
11
+ import '../list-next/ListNext.js';
12
+ import { ListItemNext } from '../list-next/ListItemNext.js';
13
13
 
14
14
  const defaultFilter = (source, filterValue) => source.filter(
15
15
  (item) => !filterValue ? item : item.toLowerCase().includes(filterValue.toLowerCase())
16
16
  );
17
- const DefaultListItem = forwardRef(function DefaultListItem2({
18
- value,
19
- matchPattern,
20
- onMouseDown,
21
- ...rest
22
- }) {
17
+ const DefaultListItem = forwardRef(function DefaultListItem2({ value, matchPattern, onMouseDown, ...rest }, ref) {
23
18
  return /* @__PURE__ */ jsx(ListItemNext, {
24
19
  value,
25
20
  onMouseDown,
26
21
  ...rest,
22
+ ref,
27
23
  children: /* @__PURE__ */ jsx(Highlighter, {
28
24
  matchPattern,
29
25
  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":["DefaultListItem"],"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,GAAkB,UAAW,CAAA,SAASA,gBAAgB,CAAA;AAAA,EACjE,KAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACG,GAAA,IAAA;AACL,CAA8B,EAAA;AAC5B,EAAA,uBACG,GAAA,CAAA,YAAA,EAAA;AAAA,IAAa,KAAA;AAAA,IAAc,WAAA;AAAA,IAA2B,GAAG,IAAA;AAAA,IACxD,QAAC,kBAAA,GAAA,CAAA,WAAA,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":["DefaultListItem"],"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,GAAkB,UAAW,CAAA,SAASA,gBACjD,CAAA,EAAE,OAAO,YAAc,EAAA,WAAA,EAAA,GAAgB,IAAK,EAAA,EAC5C,GACA,EAAA;AACA,EAAA,uBACG,GAAA,CAAA,YAAA,EAAA;AAAA,IAAa,KAAA;AAAA,IAAc,WAAA;AAAA,IAA2B,GAAG,IAAA;AAAA,IAAM,GAAA;AAAA,IAC9D,QAAC,kBAAA,GAAA,CAAA,WAAA,EAAA;AAAA,MAAY,YAAA;AAAA,MAA4B,IAAM,EAAA,KAAA;AAAA,KAAO,CAAA;AAAA,GACxD,CAAA,CAAA;AAEJ,CAAC;;;;"}
@@ -26,7 +26,6 @@ const DropdownNext = forwardRef(function DropdownNext2(props, ref) {
26
26
  highlightedItem: highlightedItemControlProp,
27
27
  onFocus,
28
28
  onKeyDown,
29
- onBlur,
30
29
  onMouseOver,
31
30
  onMouseDown,
32
31
  onSelect,
@@ -59,7 +58,9 @@ const DropdownNext = forwardRef(function DropdownNext2(props, ref) {
59
58
  selectedItem,
60
59
  highlightedItem,
61
60
  getListItems,
62
- portalProps
61
+ portalProps,
62
+ getReferenceProps,
63
+ refs
63
64
  } = useDropdownNext({
64
65
  listProps,
65
66
  placement,
@@ -70,11 +71,12 @@ const DropdownNext = forwardRef(function DropdownNext2(props, ref) {
70
71
  const {
71
72
  focusHandler,
72
73
  keyDownHandler,
73
- blurHandler,
74
74
  mouseOverHandler,
75
- mouseDownHandler
75
+ mouseDownHandler,
76
+ listSelectHandler
76
77
  } = handlers;
77
78
  const triggerRef = useForkRef(ref, reference);
79
+ const portalRef = useForkRef(ref, floating);
78
80
  const getIcon = () => {
79
81
  if (readOnly)
80
82
  return;
@@ -99,10 +101,6 @@ const DropdownNext = forwardRef(function DropdownNext2(props, ref) {
99
101
  keyDownHandler(event);
100
102
  onKeyDown == null ? void 0 : onKeyDown(event);
101
103
  };
102
- const handleBlur = (event) => {
103
- blurHandler();
104
- onBlur == null ? void 0 : onBlur(event);
105
- };
106
104
  const handleMouseOver = (event) => {
107
105
  mouseOverHandler();
108
106
  onMouseOver == null ? void 0 : onMouseOver(event);
@@ -113,17 +111,23 @@ const DropdownNext = forwardRef(function DropdownNext2(props, ref) {
113
111
  mouseDownHandler();
114
112
  onMouseDown == null ? void 0 : onMouseDown(event);
115
113
  };
114
+ const handleListSelect = () => {
115
+ var _a;
116
+ listSelectHandler();
117
+ (_a = refs.domReference.current) == null ? void 0 : _a.focus();
118
+ };
116
119
  return /* @__PURE__ */ jsxs("div", {
117
120
  className: clsx(withBaseName()),
118
121
  children: [
119
122
  /* @__PURE__ */ jsxs("button", {
120
123
  id: dropdownId,
121
124
  disabled,
122
- onFocus: handleFocus,
123
- onKeyDown: handleKeyDown,
124
- onMouseOver: handleMouseOver,
125
- onMouseDown: handleMouseDown,
126
- onBlur: handleBlur,
125
+ ...getReferenceProps({
126
+ onFocus: handleFocus,
127
+ onMouseOver: handleMouseOver,
128
+ onMouseDown: handleMouseDown,
129
+ onKeyDown: handleKeyDown
130
+ }),
127
131
  value: selectedItem,
128
132
  className: clsx(
129
133
  withBaseName("button"),
@@ -154,10 +158,11 @@ const DropdownNext = forwardRef(function DropdownNext2(props, ref) {
154
158
  }),
155
159
  /* @__PURE__ */ jsx(FloatingComponent, {
156
160
  open: open && !disabled,
157
- ref: floating,
161
+ ref: portalRef,
158
162
  ...getDropdownNextProps(),
159
163
  ...getPosition(),
160
164
  children: /* @__PURE__ */ jsx(ListNext, {
165
+ "data-test-id": "list-container",
161
166
  id: listId,
162
167
  className: clsx(withBaseName("list"), ListProps == null ? void 0 : ListProps.className),
163
168
  disableFocus: true,
@@ -166,6 +171,7 @@ const DropdownNext = forwardRef(function DropdownNext2(props, ref) {
166
171
  highlightedItem,
167
172
  ...ListProps,
168
173
  ref: setListRef,
174
+ onSelect: handleListSelect,
169
175
  children: getListItems(source)
170
176
  })
171
177
  })
@@ -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":["DropdownNext","dropdownNextCss"],"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":["DropdownNext","dropdownNextCss"],"mappings":";;;;;;;;;;;;AA0BA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA,CAAA;AAiD7C,MAAM,YAAe,GAAA,UAAA,CAAW,SAASA,aAAAA,CAC9C,OACA,GACA,EAAA;AACA,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAU,GAAA,SAAA;AAAA,IACV,EAAI,EAAA,cAAA;AAAA,IACJ,eAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAY,GAAA,QAAA;AAAA,IACZ,IAAM,EAAA,eAAA;AAAA,IACN,QAAU,EAAA,mBAAA;AAAA,IACV,eAAiB,EAAA,0BAAA;AAAA,IACjB,OAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAS,EAAA,WAAA;AAAA,IACT,SAAA;AAAA,IACG,GAAA,SAAA;AAAA,GACD,GAAA,KAAA,CAAA;AAEJ,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,oBAAA;AAAA,IACR,GAAK,EAAAC,QAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,MAAA,GAAS,KAAM,CAAA,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAW,EAAE,CAAA,CAAA;AAClC,EAAM,MAAA,UAAA,GAAa,MAAM,cAAc,CAAA,CAAA;AACvC,EAAM,MAAA,OAAA,GAAU,OAAyB,IAAI,CAAA,CAAA;AAE7C,EAAM,MAAA,UAAA,GAAa,UAAW,CAAA,WAAA,EAAa,OAAO,CAAA,CAAA;AAClD,EAAA,MAAM,SAAY,GAAA;AAAA,IAChB,eAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAK,EAAA,OAAA;AAAA,IACL,EAAI,EAAA,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,QAAU,EAAA,mBAAA;AAAA,IACV,eAAiB,EAAA,0BAAA;AAAA,GACnB,CAAA;AAEA,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,IAAA;AAAA,MACE,eAAgB,CAAA;AAAA,IAClB,SAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,SAAA,EAAW,iBAAkB,EAAA,GAAI,oBAAqB,EAAA,CAAA;AAE9D,EAAA,MAAM,EAAE,IAAM,EAAA,QAAA,EAAU,SAAW,EAAA,oBAAA,EAAsB,aACvD,GAAA,WAAA,CAAA;AACF,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,GACE,GAAA,QAAA,CAAA;AAEJ,EAAM,MAAA,UAAA,GAAa,UAA8B,CAAA,GAAA,EAAK,SAAS,CAAA,CAAA;AAC/D,EAAM,MAAA,SAAA,GAAY,UAA8B,CAAA,GAAA,EAAK,QAAQ,CAAA,CAAA;AAE7D,EAAA,MAAM,UAAU,MAAM;AACpB,IAAI,IAAA,QAAA;AAAU,MAAA,OAAA;AAEd,IAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,YAAa,CAAA,MAAM,CAAG,EAAA;AAAA,MAC/C,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,KAC7B,CAAA,CAAA;AAED,IAAA,OAAO,uBACJ,GAAA,CAAA,aAAA,EAAA;AAAA,MAAc,SAAW,EAAA,aAAA;AAAA,KAAe,oBAExC,GAAA,CAAA,eAAA,EAAA;AAAA,MAAgB,SAAW,EAAA,aAAA;AAAA,KAAe,CAAA,CAAA;AAAA,GAE/C,CAAA;AAEA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,IAAI,IAAA,QAAA;AAAU,MAAA,OAAA;AACd,IAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AAClB,IAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,KAA4C,KAAA;AACjE,IAAA,IAAI,QAAY,IAAA,QAAA;AAAU,MAAA,OAAA;AAC1B,IAAA,cAAA,CAAe,KAAK,CAAA,CAAA;AACpB,IAAY,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACd,CAAA;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,KAAyC,KAAA;AAChE,IAAiB,gBAAA,EAAA,CAAA;AACjB,IAAc,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GAChB,CAAA;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,KAAyC,KAAA;AAChE,IAAA,IAAI,QAAY,IAAA,QAAA;AAAU,MAAA,OAAA;AAC1B,IAAiB,gBAAA,EAAA,CAAA;AACjB,IAAc,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GAChB,CAAA;AAEA,EAAA,MAAM,mBAAmB,MAAM;AA9LjC,IAAA,IAAA,EAAA,CAAA;AA+LI,IAAkB,iBAAA,EAAA,CAAA;AAClB,IAAC,CAAA,EAAA,GAAA,IAAA,CAAK,YAAa,CAAA,OAAA,KAAlB,IAAiD,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;AAAA,GACpD,CAAA;AAEA,EAAA,uBACG,IAAA,CAAA,KAAA,EAAA;AAAA,IAAI,SAAA,EAAW,IAAK,CAAA,YAAA,EAAc,CAAA;AAAA,IACjC,QAAA,EAAA;AAAA,sBAAC,IAAA,CAAA,QAAA,EAAA;AAAA,QACC,EAAI,EAAA,UAAA;AAAA,QACJ,QAAA;AAAA,QACC,GAAG,iBAAkB,CAAA;AAAA,UACpB,OAAS,EAAA,WAAA;AAAA,UACT,WAAa,EAAA,eAAA;AAAA,UACb,WAAa,EAAA,eAAA;AAAA,UACb,SAAW,EAAA,aAAA;AAAA,SACZ,CAAA;AAAA,QACD,KAAO,EAAA,YAAA;AAAA,QACP,SAAW,EAAA,IAAA;AAAA,UACT,aAAa,QAAQ,CAAA;AAAA,UACrB,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,YACE,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,YAC5B,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,WAC9B;AAAA,UACA,SAAA;AAAA,SACF;AAAA,QACA,IAAK,EAAA,UAAA;AAAA,QACL,eAAc,EAAA,SAAA;AAAA,QACd,eAAe,EAAA,IAAA;AAAA,QACf,uBAAuB,EAAA,gBAAA;AAAA,QACvB,QAAA,EAAU,WAAW,CAAK,CAAA,GAAA,CAAA;AAAA,QAC1B,WAAW,EAAA,MAAA;AAAA,QACX,eAAe,EAAA,MAAA;AAAA,QACf,eAAe,EAAA,QAAA;AAAA,QACd,GAAG,SAAA;AAAA,QACJ,GAAK,EAAA,UAAA;AAAA,QAEL,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,MAAA,EAAA;AAAA,YAAK,SAAW,EAAA,IAAA,CAAK,YAAa,CAAA,YAAY,CAAC,CAAA;AAAA,YAAI,QAAA,EAAA,YAAA;AAAA,WAAa,CAAA;AAAA,UAChE,OAAQ,EAAA;AAAA,SAAA;AAAA,OACX,CAAA;AAAA,sBACC,GAAA,CAAA,iBAAA,EAAA;AAAA,QACC,IAAA,EAAM,QAAQ,CAAC,QAAA;AAAA,QACf,GAAK,EAAA,SAAA;AAAA,QACJ,GAAG,oBAAqB,EAAA;AAAA,QACxB,GAAG,WAAY,EAAA;AAAA,QAEhB,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA;AAAA,UACC,cAAc,EAAA,gBAAA;AAAA,UACd,EAAI,EAAA,MAAA;AAAA,UACJ,WAAW,IAAK,CAAA,YAAA,CAAa,MAAM,CAAA,EAAG,uCAAW,SAAS,CAAA;AAAA,UAC1D,YAAY,EAAA,IAAA;AAAA,UACZ,QAAA,EAAU,aAAY,SAAW,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,QAAA,CAAA;AAAA,UACjC,QAAU,EAAA,YAAA;AAAA,UACV,eAAA;AAAA,UACC,GAAG,SAAA;AAAA,UACJ,GAAK,EAAA,UAAA;AAAA,UACL,QAAU,EAAA,gBAAA;AAAA,UAET,uBAAa,MAAM,CAAA;AAAA,SACtB,CAAA;AAAA,OACF,CAAA;AAAA,KAAA;AAAA,GACF,CAAA,CAAA;AAEJ,CAAC;;;;"}