@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
@@ -20,15 +20,13 @@ const useDropdownNext = ({
20
20
  const {
21
21
  focusHandler: listFocusHandler,
22
22
  keyDownHandler: listKeyDownHandler,
23
- blurHandler: listBlurHandler,
24
23
  mouseOverHandler: listMouseOverHandler,
25
24
  activeDescendant,
26
25
  selectedItem,
27
26
  setSelectedItem,
28
27
  highlightedItem,
29
28
  setHighlightedItem,
30
- contextValue: listContextValue,
31
- focusVisibleRef
29
+ contextValue: listContextValue
32
30
  } = useList({
33
31
  ...listProps
34
32
  });
@@ -53,7 +51,17 @@ const useDropdownNext = ({
53
51
  setOpen(open2);
54
52
  onOpenChangeProp == null ? void 0 : onOpenChangeProp(open2);
55
53
  };
56
- const { floating, reference, x, y, strategy, placement, context, elements } = useFloatingUI({
54
+ const {
55
+ floating,
56
+ reference,
57
+ x,
58
+ y,
59
+ strategy,
60
+ placement,
61
+ context,
62
+ elements,
63
+ refs
64
+ } = useFloatingUI({
57
65
  open,
58
66
  onOpenChange,
59
67
  placement: placementProp,
@@ -70,10 +78,9 @@ const useDropdownNext = ({
70
78
  shift({ limiter: limitShift() })
71
79
  ]
72
80
  });
73
- const { getFloatingProps } = useInteractions([
74
- useDismiss(context),
75
- useRole(context, { role: "listbox" })
76
- ]);
81
+ const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(
82
+ [useDismiss(context), useRole(context, { role: "listbox" })]
83
+ );
77
84
  const getDropdownNextProps = () => {
78
85
  return getFloatingProps({
79
86
  "data-placement": placement,
@@ -90,10 +97,6 @@ const useDropdownNext = ({
90
97
  height: (_b = elements.floating) == null ? void 0 : _b.clientHeight
91
98
  };
92
99
  };
93
- const blurHandler = () => {
94
- listBlurHandler();
95
- setOpen(false);
96
- };
97
100
  const focusHandler = (event) => {
98
101
  if (selectedItem) {
99
102
  listFocusHandler(event);
@@ -105,6 +108,9 @@ const useDropdownNext = ({
105
108
  const mouseOverHandler = () => {
106
109
  listMouseOverHandler();
107
110
  };
111
+ const listSelectHandler = () => {
112
+ setOpen(false);
113
+ };
108
114
  const keyDownHandler = (event) => {
109
115
  const { key } = event;
110
116
  switch (key) {
@@ -130,6 +136,9 @@ const useDropdownNext = ({
130
136
  case "Escape":
131
137
  setOpen(false);
132
138
  break;
139
+ case "Tab":
140
+ setOpen(false);
141
+ break;
133
142
  case "PageUp":
134
143
  case "PageDown":
135
144
  case "Home":
@@ -143,24 +152,28 @@ const useDropdownNext = ({
143
152
  };
144
153
  return {
145
154
  handlers: {
146
- focusHandler,
147
155
  keyDownHandler,
148
- blurHandler,
156
+ focusHandler,
149
157
  mouseOverHandler,
150
- mouseDownHandler
158
+ mouseDownHandler,
159
+ listSelectHandler
151
160
  },
161
+ refs,
162
+ open,
163
+ getReferenceProps,
164
+ getItemProps,
152
165
  activeDescendant,
153
166
  selectedItem,
154
167
  setSelectedItem,
155
168
  highlightedItem,
156
169
  setHighlightedItem,
157
- focusVisibleRef,
158
170
  getListItems,
159
171
  portalProps: {
160
172
  open,
161
173
  setOpen,
162
174
  floating,
163
175
  reference,
176
+ getFloatingProps,
164
177
  getDropdownNextProps,
165
178
  getPosition
166
179
  }
@@ -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":["open","elements"],"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":["open","elements"],"mappings":"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"}
package/dist-es/index.js CHANGED
@@ -137,7 +137,6 @@ export { TrackerStep } from './stepped-tracker/TrackerStep/TrackerStep.js';
137
137
  export { StepLabel } from './stepped-tracker/StepLabel/StepLabel.js';
138
138
  export { useStepperInput } from './stepper-input/useStepperInput.js';
139
139
  export { StepperInput } from './stepper-input/StepperInput.js';
140
- export { Switch } from './switch/Switch.js';
141
140
  export { TabActivationIndicator } from './tabs/TabActivationIndicator.js';
142
141
  export { Tabstrip } from './tabs/Tabstrip.js';
143
142
  export { Tab } from './tabs/Tab.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- 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";
1
+ 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";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=PillNext.css.js.map
@@ -3,12 +3,13 @@ import { forwardRef } from 'react';
3
3
  import clsx from 'clsx';
4
4
  import { useWindow } from '@salt-ds/window';
5
5
  import { useComponentCssInjection } from '@salt-ds/styles';
6
- import { makePrefixer, useButton } from '@salt-ds/core';
6
+ import { makePrefixer, useButton, Button } from '@salt-ds/core';
7
7
  import css_248z from './PillNext.css.js';
8
+ import { CloseIcon } from '@salt-ds/icons';
8
9
 
9
10
  const withBaseName = makePrefixer("saltPillNext");
10
11
  const PillNext = forwardRef(
11
- function PillNext2({ children, className, icon, disabled, ...restProps }, ref) {
12
+ function PillNext2({ children, className, icon, disabled, onClose, ...restProps }, ref) {
12
13
  const targetWindow = useWindow();
13
14
  useComponentCssInjection({
14
15
  testId: "salt-pill-next",
@@ -20,26 +21,37 @@ const PillNext = forwardRef(
20
21
  ...restProps
21
22
  });
22
23
  const { tabIndex, ...restButtonProps } = buttonProps;
23
- return /* @__PURE__ */ jsxs("button", {
24
- "data-testid": "pill",
25
- ref,
26
- type: "button",
27
- className: clsx(
28
- withBaseName(),
29
- withBaseName("clickable"),
30
- {
31
- [withBaseName("active")]: active,
32
- [withBaseName("disabled")]: disabled
33
- },
34
- className
35
- ),
36
- ...restButtonProps,
37
- ...restProps,
24
+ return /* @__PURE__ */ jsxs("div", {
25
+ className: withBaseName(),
38
26
  children: [
39
- icon,
40
- /* @__PURE__ */ jsx("span", {
41
- className: withBaseName("label"),
42
- children
27
+ /* @__PURE__ */ jsxs("button", {
28
+ "data-testid": "pill",
29
+ ref,
30
+ className: clsx(
31
+ withBaseName("action"),
32
+ withBaseName("clickable"),
33
+ {
34
+ [withBaseName("active")]: active,
35
+ [withBaseName("disabled")]: disabled
36
+ },
37
+ className
38
+ ),
39
+ ...restButtonProps,
40
+ ...restProps,
41
+ children: [
42
+ icon,
43
+ /* @__PURE__ */ jsx("span", {
44
+ className: withBaseName("label"),
45
+ children
46
+ })
47
+ ]
48
+ }),
49
+ onClose && /* @__PURE__ */ jsx(Button, {
50
+ "data-testid": "pill-close-button",
51
+ className: withBaseName("close-button"),
52
+ disabled,
53
+ onClick: onClose,
54
+ children: /* @__PURE__ */ jsx(CloseIcon, {})
43
55
  })
44
56
  ]
45
57
  });
@@ -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":["PillNext","pillCss"],"mappings":";;;;;;;;AAuBA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA,CAAA;AAEzC,MAAM,QAAW,GAAA,UAAA;AAAA,EACtB,SAASA,UACP,EAAE,QAAA,EAAU,WAAW,IAAM,EAAA,QAAA,EAAA,GAAa,SAAU,EAAA,EACpD,GACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAA,MAAM,EAAE,WAAA,EAAa,MAAO,EAAA,GAAI,SAA6B,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,uBACG,IAAA,CAAA,QAAA,EAAA;AAAA,MACC,aAAY,EAAA,MAAA;AAAA,MACZ,GAAA;AAAA,MACA,IAAK,EAAA,QAAA;AAAA,MACL,SAAW,EAAA,IAAA;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,wBACA,GAAA,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":["PillNext","pillCss"],"mappings":";;;;;;;;;AAgBA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA,CAAA;AAEzC,MAAM,QAAW,GAAA,UAAA;AAAA,EACtB,SAASA,SACP,CAAA,EAAE,QAAU,EAAA,SAAA,EAAW,MAAM,QAAU,EAAA,OAAA,EAAA,GAAY,SAAU,EAAA,EAC7D,GACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAA,MAAM,EAAE,WAAA,EAAa,MAAO,EAAA,GAAI,SAA6B,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,uBACG,IAAA,CAAA,KAAA,EAAA;AAAA,MAAI,WAAW,YAAa,EAAA;AAAA,MAC3B,QAAA,EAAA;AAAA,wBAAC,IAAA,CAAA,QAAA,EAAA;AAAA,UACC,aAAY,EAAA,MAAA;AAAA,UACZ,GAAA;AAAA,UACA,SAAW,EAAA,IAAA;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,4BACA,GAAA,CAAA,MAAA,EAAA;AAAA,cAAK,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAAI,QAAA;AAAA,aAAS,CAAA;AAAA,WAAA;AAAA,SACpD,CAAA;AAAA,QACC,2BACE,GAAA,CAAA,MAAA,EAAA;AAAA,UACC,aAAY,EAAA,mBAAA;AAAA,UACZ,SAAA,EAAW,aAAa,cAAc,CAAA;AAAA,UACtC,QAAA;AAAA,UACA,OAAS,EAAA,OAAA;AAAA,UAET,8BAAC,SAAU,EAAA,EAAA,CAAA;AAAA,SACb,CAAA;AAAA,OAAA;AAAA,KAEJ,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -11,7 +11,7 @@ interface UseComboBoxProps {
11
11
  PortalProps?: UseComboBoxPortalProps;
12
12
  listProps: UseListProps;
13
13
  }
14
- export declare const useComboBox: ({ defaultInputValue, onFocus, onBlur, onMouseOver, onKeyDown, inputValue: inputValueProp, PortalProps, listProps, }: UseComboBoxProps) => {
14
+ export declare const useComboBox: ({ defaultInputValue, onFocus, onMouseOver, onKeyDown, inputValue: inputValueProp, PortalProps, listProps, }: UseComboBoxProps) => {
15
15
  inputValue: string | undefined;
16
16
  setInputValue: import("react").Dispatch<import("react").SetStateAction<string | undefined>>;
17
17
  portalProps: {
@@ -37,7 +37,8 @@ export declare const useComboBox: ({ defaultInputValue, onFocus, onBlur, onMouse
37
37
  focusVisibleRef: import("react").Ref<HTMLElement>;
38
38
  keyDownHandler: (event: KeyboardEvent<HTMLInputElement>) => void;
39
39
  focusHandler: (event: FocusEvent<HTMLInputElement>) => void;
40
- blurHandler: (event: FocusEvent<HTMLInputElement>) => void;
41
40
  mouseOverHandler: (event: SyntheticEvent<HTMLElement>) => void;
41
+ mouseDownHandler: () => void;
42
+ listSelectHandler: () => void;
42
43
  };
43
44
  export {};
@@ -4,4 +4,4 @@ export interface ComboBoxItemProps<T> extends Omit<ListItemNextProps, "value"> {
4
4
  value: T;
5
5
  matchPattern?: RegExp | string;
6
6
  }
7
- export declare const DefaultListItem: import("react").ForwardRefExoticComponent<ComboBoxItemProps<string> & import("react").RefAttributes<unknown>>;
7
+ export declare const DefaultListItem: import("react").ForwardRefExoticComponent<ComboBoxItemProps<string> & import("react").RefAttributes<HTMLLIElement>>;
@@ -7,24 +7,28 @@ interface UseDropdownNextProps extends Partial<Pick<UseFloatingUIProps, "onOpenC
7
7
  }
8
8
  export declare const useDropdownNext: ({ listProps, openControlProp, onOpenChange: onOpenChangeProp, placement: placementProp, }: UseDropdownNextProps) => {
9
9
  handlers: {
10
- focusHandler: (event: FocusEvent<HTMLElement>) => void;
11
10
  keyDownHandler: (event: KeyboardEvent<HTMLElement>) => void;
12
- blurHandler: () => void;
11
+ focusHandler: (event: FocusEvent<HTMLElement>) => void;
13
12
  mouseOverHandler: () => void;
14
13
  mouseDownHandler: () => void;
14
+ listSelectHandler: () => void;
15
15
  };
16
+ refs: import("@floating-ui/react").ExtendedRefs<import("@floating-ui/react").ReferenceType>;
17
+ open: boolean;
18
+ getReferenceProps: (userProps?: HTMLProps<Element> | undefined) => Record<string, unknown>;
19
+ getItemProps: (userProps?: HTMLProps<HTMLElement> | undefined) => Record<string, unknown>;
16
20
  activeDescendant: string | undefined;
17
21
  selectedItem: string | undefined;
18
22
  setSelectedItem: import("react").Dispatch<import("react").SetStateAction<string | undefined>>;
19
23
  highlightedItem: string | undefined;
20
24
  setHighlightedItem: import("react").Dispatch<import("react").SetStateAction<string | undefined>>;
21
- focusVisibleRef: import("react").Ref<HTMLElement>;
22
25
  getListItems: (source: string[]) => JSX.Element[] | undefined;
23
26
  portalProps: {
24
27
  open: boolean;
25
28
  setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
26
29
  floating: (node: HTMLElement | null) => void;
27
30
  reference: (node: import("@floating-ui/react").ReferenceType | null) => void;
31
+ getFloatingProps: (userProps?: HTMLProps<HTMLElement> | undefined) => Record<string, unknown>;
28
32
  getDropdownNextProps: () => HTMLProps<HTMLDivElement>;
29
33
  getPosition: () => {
30
34
  top: number;
@@ -50,7 +50,6 @@ export * from "./skip-link";
50
50
  export * from "./slider";
51
51
  export * from "./stepped-tracker";
52
52
  export * from "./stepper-input";
53
- export * from "./switch";
54
53
  export * from "./tabs";
55
54
  export * from "./tabs-next";
56
55
  export * from "./toast-group";
@@ -1,7 +1,7 @@
1
- import { MouseEvent, KeyboardEvent, ComponentPropsWithoutRef } from "react";
2
- export declare type PillClickEvent = MouseEvent<Element, globalThis.MouseEvent> | KeyboardEvent<HTMLDivElement>;
1
+ import { ComponentPropsWithoutRef, MouseEvent } from "react";
3
2
  export interface PillNextProps extends ComponentPropsWithoutRef<"button"> {
4
3
  disabled?: boolean;
4
+ onClose?: (event: MouseEvent<HTMLButtonElement>) => void;
5
5
  icon?: React.ReactNode;
6
6
  }
7
7
  export declare const PillNext: import("react").ForwardRefExoticComponent<PillNextProps & import("react").RefAttributes<HTMLButtonElement>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salt-ds/lab",
3
- "version": "1.0.0-alpha.19",
3
+ "version": "1.0.0-alpha.20",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,7 @@
26
26
  "react-window": "^1.8.6",
27
27
  "rifm": "^0.12.0",
28
28
  "tinycolor2": "^1.4.2",
29
- "@salt-ds/core": "^1.10.0",
29
+ "@salt-ds/core": "^1.11.0",
30
30
  "@salt-ds/window": "^0.1.1",
31
31
  "@salt-ds/styles": "^0.1.2",
32
32
  "@salt-ds/icons": "^1.7.0"
@@ -1,6 +0,0 @@
1
- 'use strict';
2
-
3
- var css_248z = ".saltSwitch {\n display: flex;\n gap: var(--salt-spacing-100);\n position: relative;\n cursor: var(--salt-selectable-cursor-hover);\n color: var(--salt-text-primary-foreground);\n}\n\n.saltSwitch-disabled {\n color: var(--salt-text-primary-foreground-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n\n.saltSwitch-track {\n border: var(--salt-size-border) var(--salt-selectable-borderStyle) var(--salt-selectable-borderColor);\n --saltIcon-color: currentColor;\n --saltIcon-size: 100%;\n display: flex;\n flex-shrink: 0;\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n width: calc((var(--salt-size-selectable) + var(--salt-spacing-25) + var(--salt-size-border)) * 2);\n align-items: center;\n color: var(--salt-selectable-foreground);\n background: var(--salt-container-primary-background);\n}\n\n/* Styles applied to the icon component if focused */\n.saltSwitch-input:focus-visible + .saltSwitch-track {\n outline-offset: var(--salt-focused-outlineOffset);\n outline: var(--salt-focused-outline);\n border-color: var(--salt-selectable-borderColor-hover);\n color: var(--salt-selectable-foreground-hover);\n}\n\n.saltSwitch:hover .saltSwitch-track {\n border-color: var(--salt-selectable-borderColor-hover);\n color: var(--salt-selectable-foreground-hover);\n}\n\n.saltSwitch-checked .saltSwitch-track,\n.saltSwitch-checked:hover .saltSwitch-track {\n border-color: var(--salt-selectable-borderColor-selected);\n color: var(--salt-selectable-foreground-selected);\n}\n\n.saltSwitch-disabled .saltSwitch-track,\n.saltSwitch-disabled:hover .saltSwitch-track {\n border-color: var(--salt-selectable-borderColor-disabled);\n color: var(--salt-selectable-foreground-disabled);\n background: var(--salt-container-primary-background-disabled);\n}\n\n.saltSwitch-checked.saltSwitch-disabled .saltSwitch-track,\n.saltSwitch-checked.saltSwitch-disabled:hover .saltSwitch-track {\n border-color: var(--salt-selectable-borderColor-selectedDisabled);\n color: var(--salt-selectable-foreground-selectedDisabled);\n}\n\n.saltSwitch-thumb {\n display: flex;\n aspect-ratio: 1;\n height: var(--salt-size-selectable);\n background: currentColor;\n margin: var(--salt-spacing-25);\n border: var(--salt-size-border) var(--salt-selectable-borderStyle) var(--salt-selectable-borderColor);\n transition: transform var(--salt-duration-perceptible) ease-in-out;\n}\n\n.saltSwitch-input:focus-visible + .saltSwitch-track .saltSwitch-thumb,\n.saltSwitch:hover .saltSwitch-thumb {\n border-color: var(--salt-selectable-borderColor-hover);\n}\n\n.saltSwitch-checked .saltSwitch-thumb,\n.saltSwitch-checked:hover .saltSwitch-thumb {\n background: transparent;\n border-color: var(--salt-selectable-borderColor-selected);\n transform: translateX(100%);\n}\n\n.saltSwitch-disabled .saltSwitch-thumb,\n.saltSwitch-disabled:hover .saltSwitch-thumb {\n border: 0;\n}\n\n/* Styles applied to input element */\n.saltSwitch-input {\n cursor: inherit;\n left: 0;\n margin: 0;\n opacity: 0;\n padding: 0;\n position: absolute;\n top: 0;\n z-index: var(--salt-zIndex-default);\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n width: calc((var(--salt-size-selectable) + var(--salt-spacing-25) + var(--salt-size-border)) * 2);\n}\n\n@media (prefers-reduced-motion) {\n .saltSwitch-thumb {\n transition: none;\n }\n}\n\n.salt-density-high .saltSwitch-thumb {\n border: 0;\n}\n";
4
-
5
- module.exports = css_248z;
6
- //# sourceMappingURL=Switch.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Switch.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,117 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var jsxRuntime = require('react/jsx-runtime');
6
- var clsx = require('clsx');
7
- var React = require('react');
8
- var core = require('@salt-ds/core');
9
- var window = require('@salt-ds/window');
10
- var styles = require('@salt-ds/styles');
11
- var Switch$1 = require('./Switch.css.js');
12
- var icons = require('@salt-ds/icons');
13
-
14
- const withBaseName = core.makePrefixer("saltSwitch");
15
- function CheckedIcon(props) {
16
- const density = core.useDensity();
17
- return density === "high" ? /* @__PURE__ */ jsxRuntime.jsx(icons.SuccessSmallSolidIcon, {
18
- ...props
19
- }) : /* @__PURE__ */ jsxRuntime.jsx(icons.SuccessSolidIcon, {
20
- ...props
21
- });
22
- }
23
- const Switch = React.forwardRef(function Switch2(props, ref) {
24
- const {
25
- checked: checkedProp,
26
- className,
27
- color,
28
- defaultChecked,
29
- disabled: disabledProp,
30
- inputProps = {},
31
- label,
32
- name,
33
- onBlur,
34
- onChange,
35
- onFocus,
36
- value,
37
- ...rest
38
- } = props;
39
- const targetWindow = window.useWindow();
40
- styles.useComponentCssInjection({
41
- testId: "salt-switch",
42
- css: Switch$1,
43
- window: targetWindow
44
- });
45
- const {
46
- "aria-describedby": inputDescribedBy,
47
- "aria-labelledby": inputLabelledBy,
48
- className: inputClassName,
49
- onChange: inputOnChange,
50
- ...restInputProps
51
- } = inputProps;
52
- const [checked, setChecked] = core.useControlled({
53
- controlled: checkedProp,
54
- default: Boolean(defaultChecked),
55
- name: "Switch",
56
- state: "checked"
57
- });
58
- const { a11yProps: formFieldA11yProps, disabled: formFieldDisabled } = core.useFormFieldProps();
59
- const disabled = formFieldDisabled != null ? formFieldDisabled : disabledProp;
60
- const handleChange = (event) => {
61
- if (event.nativeEvent.defaultPrevented) {
62
- return;
63
- }
64
- const value2 = event.target.checked;
65
- setChecked(value2);
66
- onChange == null ? void 0 : onChange(event);
67
- inputOnChange == null ? void 0 : inputOnChange(event);
68
- };
69
- return /* @__PURE__ */ jsxRuntime.jsxs("label", {
70
- className: clsx.clsx(
71
- withBaseName(),
72
- {
73
- [withBaseName("disabled")]: disabled,
74
- [withBaseName("checked")]: checked
75
- },
76
- className
77
- ),
78
- ref,
79
- ...rest,
80
- children: [
81
- /* @__PURE__ */ jsxRuntime.jsx("input", {
82
- "aria-describedby": clsx.clsx(
83
- formFieldA11yProps == null ? void 0 : formFieldA11yProps["aria-describedby"],
84
- inputDescribedBy
85
- ),
86
- "aria-labelledby": clsx.clsx(
87
- formFieldA11yProps == null ? void 0 : formFieldA11yProps["aria-labelledby"],
88
- inputLabelledBy
89
- ),
90
- name,
91
- value,
92
- checked,
93
- className: clsx.clsx(withBaseName("input"), inputClassName),
94
- defaultChecked,
95
- disabled,
96
- onBlur,
97
- onChange: handleChange,
98
- onFocus,
99
- type: "checkbox",
100
- ...restInputProps
101
- }),
102
- /* @__PURE__ */ jsxRuntime.jsx("span", {
103
- className: withBaseName("track"),
104
- children: /* @__PURE__ */ jsxRuntime.jsx("span", {
105
- className: withBaseName("thumb"),
106
- children: checked && /* @__PURE__ */ jsxRuntime.jsx(CheckedIcon, {
107
- className: withBaseName("icon")
108
- })
109
- })
110
- }),
111
- label
112
- ]
113
- });
114
- });
115
-
116
- exports.Switch = Switch;
117
- //# sourceMappingURL=Switch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Switch.js","sources":["../src/switch/Switch.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n FocusEventHandler,\n forwardRef,\n ReactNode,\n} from \"react\";\nimport {\n makePrefixer,\n useControlled,\n useDensity,\n useFormFieldProps,\n} from \"@salt-ds/core\";\n\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\n\nimport switchCss from \"./Switch.css\";\nimport {\n IconProps,\n SuccessSmallSolidIcon,\n SuccessSolidIcon,\n} from \"@salt-ds/icons\";\n\nexport interface SwitchProps\n extends Omit<\n ComponentPropsWithoutRef<\"label\">,\n \"children\" | \"onFocus\" | \"onBlur\" | \"onChange\"\n > {\n /**\n * If `true`, the checkbox will be checked.\n */\n checked?: boolean;\n /**\n * Whether the checkbox component is checked by default\n * This will be disregarded if checked is already set.\n */\n defaultChecked?: boolean;\n /**\n * If `true`, the checkbox will be disabled.\n */\n disabled?: boolean;\n /**\n * Properties applied to the input element.\n */\n inputProps?: Partial<ComponentPropsWithoutRef<\"input\">>;\n /**\n * The label to be shown next to the checkbox.\n */\n label?: ReactNode;\n /**\n * The name applied to the input.\n */\n name?: string;\n /**\n * Callback when checkbox loses focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Callback when checked state is changed.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Callback when checkbox gains focus.\n */\n onFocus?: FocusEventHandler<HTMLInputElement>;\n /**\n * The value of the checkbox.\n */\n value?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltSwitch\");\n\nfunction CheckedIcon(props: IconProps) {\n const density = useDensity();\n return density === \"high\" ? (\n <SuccessSmallSolidIcon {...props} />\n ) : (\n <SuccessSolidIcon {...props} />\n );\n}\n\nexport const Switch = forwardRef<HTMLLabelElement, SwitchProps>(function Switch(\n props,\n ref\n) {\n const {\n checked: checkedProp,\n className,\n color,\n defaultChecked,\n disabled: disabledProp,\n inputProps = {},\n label,\n name,\n onBlur,\n onChange,\n onFocus,\n value,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-switch\",\n css: switchCss,\n window: targetWindow,\n });\n\n const {\n \"aria-describedby\": inputDescribedBy,\n \"aria-labelledby\": inputLabelledBy,\n className: inputClassName,\n onChange: inputOnChange,\n ...restInputProps\n } = inputProps;\n\n const [checked, setChecked] = useControlled({\n controlled: checkedProp,\n default: Boolean(defaultChecked),\n name: \"Switch\",\n state: \"checked\",\n });\n\n const { a11yProps: formFieldA11yProps, disabled: formFieldDisabled } =\n useFormFieldProps();\n\n const disabled = formFieldDisabled ?? disabledProp;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n // Workaround for https://github.com/facebook/react/issues/9023\n if (event.nativeEvent.defaultPrevented) {\n return;\n }\n\n const value = event.target.checked;\n setChecked(value);\n onChange?.(event);\n inputOnChange?.(event);\n };\n\n return (\n <label\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"checked\")]: checked,\n },\n className\n )}\n ref={ref}\n {...rest}\n >\n <input\n aria-describedby={clsx(\n formFieldA11yProps?.[\"aria-describedby\"],\n inputDescribedBy\n )}\n aria-labelledby={clsx(\n formFieldA11yProps?.[\"aria-labelledby\"],\n inputLabelledBy\n )}\n name={name}\n value={value}\n checked={checked}\n className={clsx(withBaseName(\"input\"), inputClassName)}\n defaultChecked={defaultChecked}\n disabled={disabled}\n onBlur={onBlur}\n onChange={handleChange}\n onFocus={onFocus}\n type=\"checkbox\"\n {...restInputProps}\n />\n <span className={withBaseName(\"track\")}>\n <span className={withBaseName(\"thumb\")}>\n {checked && <CheckedIcon className={withBaseName(\"icon\")} />}\n </span>\n </span>\n {label}\n </label>\n );\n});\n"],"names":["makePrefixer","useDensity","jsx","SuccessSmallSolidIcon","SuccessSolidIcon","forwardRef","Switch","useWindow","useComponentCssInjection","switchCss","useControlled","useFormFieldProps","value","jsxs","clsx"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- var css_248z = ".saltSwitch {\n display: flex;\n gap: var(--salt-spacing-100);\n position: relative;\n cursor: var(--salt-selectable-cursor-hover);\n color: var(--salt-text-primary-foreground);\n}\n\n.saltSwitch-disabled {\n color: var(--salt-text-primary-foreground-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n\n.saltSwitch-track {\n border: var(--salt-size-border) var(--salt-selectable-borderStyle) var(--salt-selectable-borderColor);\n --saltIcon-color: currentColor;\n --saltIcon-size: 100%;\n display: flex;\n flex-shrink: 0;\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n width: calc((var(--salt-size-selectable) + var(--salt-spacing-25) + var(--salt-size-border)) * 2);\n align-items: center;\n color: var(--salt-selectable-foreground);\n background: var(--salt-container-primary-background);\n}\n\n/* Styles applied to the icon component if focused */\n.saltSwitch-input:focus-visible + .saltSwitch-track {\n outline-offset: var(--salt-focused-outlineOffset);\n outline: var(--salt-focused-outline);\n border-color: var(--salt-selectable-borderColor-hover);\n color: var(--salt-selectable-foreground-hover);\n}\n\n.saltSwitch:hover .saltSwitch-track {\n border-color: var(--salt-selectable-borderColor-hover);\n color: var(--salt-selectable-foreground-hover);\n}\n\n.saltSwitch-checked .saltSwitch-track,\n.saltSwitch-checked:hover .saltSwitch-track {\n border-color: var(--salt-selectable-borderColor-selected);\n color: var(--salt-selectable-foreground-selected);\n}\n\n.saltSwitch-disabled .saltSwitch-track,\n.saltSwitch-disabled:hover .saltSwitch-track {\n border-color: var(--salt-selectable-borderColor-disabled);\n color: var(--salt-selectable-foreground-disabled);\n background: var(--salt-container-primary-background-disabled);\n}\n\n.saltSwitch-checked.saltSwitch-disabled .saltSwitch-track,\n.saltSwitch-checked.saltSwitch-disabled:hover .saltSwitch-track {\n border-color: var(--salt-selectable-borderColor-selectedDisabled);\n color: var(--salt-selectable-foreground-selectedDisabled);\n}\n\n.saltSwitch-thumb {\n display: flex;\n aspect-ratio: 1;\n height: var(--salt-size-selectable);\n background: currentColor;\n margin: var(--salt-spacing-25);\n border: var(--salt-size-border) var(--salt-selectable-borderStyle) var(--salt-selectable-borderColor);\n transition: transform var(--salt-duration-perceptible) ease-in-out;\n}\n\n.saltSwitch-input:focus-visible + .saltSwitch-track .saltSwitch-thumb,\n.saltSwitch:hover .saltSwitch-thumb {\n border-color: var(--salt-selectable-borderColor-hover);\n}\n\n.saltSwitch-checked .saltSwitch-thumb,\n.saltSwitch-checked:hover .saltSwitch-thumb {\n background: transparent;\n border-color: var(--salt-selectable-borderColor-selected);\n transform: translateX(100%);\n}\n\n.saltSwitch-disabled .saltSwitch-thumb,\n.saltSwitch-disabled:hover .saltSwitch-thumb {\n border: 0;\n}\n\n/* Styles applied to input element */\n.saltSwitch-input {\n cursor: inherit;\n left: 0;\n margin: 0;\n opacity: 0;\n padding: 0;\n position: absolute;\n top: 0;\n z-index: var(--salt-zIndex-default);\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n width: calc((var(--salt-size-selectable) + var(--salt-spacing-25) + var(--salt-size-border)) * 2);\n}\n\n@media (prefers-reduced-motion) {\n .saltSwitch-thumb {\n transition: none;\n }\n}\n\n.salt-density-high .saltSwitch-thumb {\n border: 0;\n}\n";
2
-
3
- export { css_248z as default };
4
- //# sourceMappingURL=Switch.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Switch.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}