@spear-ai/spectral 1.11.3 → 1.12.0

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 (109) hide show
  1. package/README.md +4 -0
  2. package/dist/.js +124 -121
  3. package/dist/{Accordion-CDXdSAST.js → Accordion-Cyrb2byI.js} +1 -1
  4. package/dist/Accordion.js +1 -1
  5. package/dist/Alert/AlertBase.js +1 -1
  6. package/dist/Alert.js +3 -3
  7. package/dist/{AnimatePresence-D-9jXfgI.js → AnimatePresence-D9FLxIGV.js} +1 -1
  8. package/dist/Avatar.js +46 -48
  9. package/dist/Badge.js +1 -1
  10. package/dist/Button.js +1 -1
  11. package/dist/ButtonGroup/ButtonGroupButton.js +1 -1
  12. package/dist/ButtonGroup.js +1 -1
  13. package/dist/ButtonIcon.js +1 -1
  14. package/dist/{Calendar-s4lyijkn.js → Calendar-Cnh_PTbQ.js} +4 -4
  15. package/dist/Checkbox/CheckboxBase.js +1 -1
  16. package/dist/Checkbox.d.ts +10 -3
  17. package/dist/Checkbox.js +55 -35
  18. package/dist/Combobox/ComboboxBase.js +1 -1
  19. package/dist/Combobox.d.ts +5 -3
  20. package/dist/Combobox.js +64 -70
  21. package/dist/{ComboboxBase-qX-mQhT6.js → ComboboxBase-BzDGK36x.js} +1 -1
  22. package/dist/ControlGroup/ControlGroupSelect.d.ts +5 -2
  23. package/dist/ControlGroup/ControlGroupSelect.js +32 -29
  24. package/dist/ControlGroup.d.ts +3 -2
  25. package/dist/ControlGroup.js +41 -33
  26. package/dist/DataCard/Card.js +1 -1
  27. package/dist/DataCard.js +1 -1
  28. package/dist/DateTimePicker/Calendar.js +1 -1
  29. package/dist/DateTimePicker/DateTimeDisplayInput.js +84 -83
  30. package/dist/DateTimePicker/DateTimeInput.js +2 -2
  31. package/dist/DateTimePicker/DateTimeUtils.js +1 -1
  32. package/dist/DateTimePicker/TimePeriodSelect.js +32 -35
  33. package/dist/DateTimePicker/TimePicker.js +2 -2
  34. package/dist/DateTimePicker.d.ts +1 -1
  35. package/dist/DateTimePicker.js +55 -52
  36. package/dist/{DateTimeUtils-DVvG6H-p.js → DateTimeUtils-BJUAMuot.js} +1 -1
  37. package/dist/Dialog.js +1 -1
  38. package/dist/DropdownMenu.d.ts +61 -0
  39. package/dist/DropdownMenu.js +869 -0
  40. package/dist/{HoverCard-CYDsIiVK.js → HoverCard-DERasp0v.js} +1 -1
  41. package/dist/HoverCard.js +1 -1
  42. package/dist/Icons/AdjustmentsIcon.d.ts +5 -0
  43. package/dist/Icons/AdjustmentsIcon.js +78 -0
  44. package/dist/Icons/MenuDotsIcon.d.ts +5 -0
  45. package/dist/Icons/MenuDotsIcon.js +36 -0
  46. package/dist/Icons/MenuIcon.d.ts +5 -0
  47. package/dist/Icons/MenuIcon.js +36 -0
  48. package/dist/Icons/index.d.ts +3 -0
  49. package/dist/Icons.js +81 -78
  50. package/dist/IconsAnimated/PanelLeftCloseIcon.js +3 -3
  51. package/dist/IconsAnimated/PanelLeftOpenIcon.js +3 -3
  52. package/dist/Input.js +1 -1
  53. package/dist/InputNumeric.js +1 -1
  54. package/dist/{InputOTP-cVn5Bzyp.js → InputOTP-BkSw_KIB.js} +12 -10
  55. package/dist/InputOTP.js +1 -1
  56. package/dist/Kbd.js +1 -1
  57. package/dist/Label.js +1 -1
  58. package/dist/MultiSelect/MultiSelectBase.d.ts +6 -4
  59. package/dist/MultiSelect/MultiSelectBase.js +222 -201
  60. package/dist/MultiSelect.d.ts +2 -1
  61. package/dist/MultiSelect.js +14 -12
  62. package/dist/Popover.js +1 -1
  63. package/dist/RadioButton.js +1 -1
  64. package/dist/RadioButtonGroup/RadioButtonGroupBase.js +1 -1
  65. package/dist/RadioButtonGroup.js +1 -1
  66. package/dist/RadioGroup-DqKggFnI.js +328 -0
  67. package/dist/RadioGroup.d.ts +7 -0
  68. package/dist/RadioGroup.js +1 -1
  69. package/dist/Select.d.ts +5 -2
  70. package/dist/Select.js +98 -86
  71. package/dist/Separator.js +1 -1
  72. package/dist/Skeleton.js +1 -1
  73. package/dist/{Slider-BzzZT3Zm.js → Slider-CfUFkWU4.js} +1 -1
  74. package/dist/Slider.js +1 -1
  75. package/dist/Switch-Wj_zov--.js +144 -0
  76. package/dist/Switch.d.ts +12 -3
  77. package/dist/Switch.js +1 -1
  78. package/dist/Tabs/TabsBase.js +4 -4
  79. package/dist/Tabs.js +1 -1
  80. package/dist/Textarea.d.ts +3 -2
  81. package/dist/Textarea.js +50 -45
  82. package/dist/{Toast-9zqXxKKO.js → Toast-CJvzLlMD.js} +1 -1
  83. package/dist/Toast.js +1 -1
  84. package/dist/Toggle.js +1 -1
  85. package/dist/ToggleGroup.js +1 -1
  86. package/dist/{Tooltip-D1K8kY1y.js → Tooltip-BR0tdif4.js} +2 -2
  87. package/dist/Tooltip.js +1 -1
  88. package/dist/Tray.js +4 -4
  89. package/dist/{chunk-h9knIhTc.js → chunk-C4rFPcKS.js} +1 -1
  90. package/dist/dist-DcUGLq_y.js +149 -0
  91. package/dist/main.js +1 -1
  92. package/dist/primitives/button.js +1 -1
  93. package/dist/primitives/input-group.js +1 -1
  94. package/dist/primitives/input.js +1 -1
  95. package/dist/primitives/popover.js +1 -1
  96. package/dist/primitives/select.js +13 -13
  97. package/dist/primitives/textarea.js +1 -1
  98. package/dist/{proxy-Dn10Pl_g.js → proxy-CCB7C4Pu.js} +10 -10
  99. package/dist/styles/spectral.css +1 -1
  100. package/dist/{twUtils-VNWgstKL.js → twUtils-D_qzdiwM.js} +1 -1
  101. package/dist/{use-animation-CBUDycyW.js → use-animation-C-qL83hj.js} +1 -1
  102. package/dist/utils/formFieldUtils.d.ts +15 -1
  103. package/dist/utils/formFieldUtils.d.ts.map +1 -1
  104. package/dist/utils/formFieldUtils.js +35 -19
  105. package/dist/utils/twUtils.js +1 -1
  106. package/package.json +26 -22
  107. package/dist/RadioGroup-w_q6RGEK.js +0 -447
  108. package/dist/Switch-CVzRJ-0n.js +0 -126
  109. /package/dist/{dist-B4FgboI8.js → dist-Cujfuel1.js} +0 -0
@@ -3,22 +3,17 @@ import "../styles/main.css";
3
3
  import { CheckmarkIcon as e } from "../Icons/CheckmarkIcon.js";
4
4
  import { ChevronDownIcon as t } from "../Icons/ChevronDownIcon.js";
5
5
  import { CloseIcon as n } from "../Icons/CloseIcon.js";
6
- import { LoaderIcon as r } from "../Icons/LoaderIcon.js";
7
- import { SearchIcon as i } from "../Icons/SearchIcon.js";
8
- import { t as a } from "../twUtils-VNWgstKL.js";
9
- import { ErrorMessage as o, getDropdownSurfaceClasses as s } from "../utils/formFieldUtils.js";
10
- import { useUncontrolledState as c } from "../hooks/useUncontrolledState.js";
11
- import { useAutoDropdownHorizontalShift as l } from "../utils/dropdownPositioning.js";
12
- import { a as u, i as d, n as f, r as ee } from "../dist-BtdmHAzK.js";
13
- import { useCallback as p, useEffect as te, useId as ne, useMemo as m, useRef as re, useState as h } from "react";
14
- import { Fragment as ie, jsx as g, jsxs as _ } from "react/jsx-runtime";
6
+ import { SearchIcon as r } from "../Icons/SearchIcon.js";
7
+ import { t as i } from "../twUtils-D_qzdiwM.js";
8
+ import { EmptyState as a, ErrorMessage as o, LoadingState as s, WarningMessage as c, getAriaProps as l, getDropdownSurfaceClasses as u, getDropdownWidthStyles as d, getErrorMessageId as f, getTriggerClasses as ee, useFormFieldId as te } from "../utils/formFieldUtils.js";
9
+ import { useUncontrolledState as ne } from "../hooks/useUncontrolledState.js";
10
+ import { Label as re } from "../Label.js";
11
+ import { useAutoDropdownHorizontalShift as ie } from "../utils/dropdownPositioning.js";
12
+ import { a as ae, i as oe, n as se, r as ce } from "../dist-BtdmHAzK.js";
13
+ import { useCallback as p, useEffect as le, useId as ue, useMemo as m, useRef as de, useState as h } from "react";
14
+ import { Fragment as fe, jsx as g, jsxs as _ } from "react/jsx-runtime";
15
15
  //#region src/components/MultiSelect/MultiSelectBase.tsx
16
- var v = "h-4 w-4", y = (e) => ({
17
- error: "border-danger hover:border-danger focus-visible:border-danger focus-visible:ring-danger",
18
- loading: "cursor-wait border-input-border--disabled",
19
- disabled: "cursor-not-allowed opacity-50 border-input-border--disabled bg-input-bg--disabled",
20
- default: ""
21
- })[e], b = (e, t, n) => a("min-h-12 rounded-lg px-4 py-2 text-sm flex max-h-[5.5rem] w-full items-center justify-between border border-input-border bg-input-bg", "hover:border-input-border--hover focus-visible:border-input-border--focus", "focus:outline-none focus-visible:outline focus-visible:outline-offset-2 focus-visible:outline-accent", "disabled:cursor-not-allowed disabled:border-input-border--disabled disabled:bg-input-bg--disabled disabled:opacity-50", "overflow-hidden text-input-text transition duration-200", t && "border-input-border--focus", y(e), n), ae = () => a("max-h-80 z-50 overflow-hidden", s(), "motion-safe:data-[state=closed]:animate-out motion-safe:data-[state=open]:animate-in", "motion-safe:data-[state=closed]:fade-out-0 motion-safe:data-[state=open]:fade-in-0", "motion-safe:data-[state=closed]:zoom-out-95 motion-safe:data-[state=open]:zoom-in-95", "motion-safe:data-[side=bottom]:slide-in-from-top-2", "motion-safe:data-[side=top]:slide-in-from-bottom-2", "origin-(--radix-popover-content-transform-origin)"), oe = (e, t, n, r, i, a, o, s, c) => {
16
+ var pe = "h-4 w-4", me = () => i("max-h-80 z-50 overflow-hidden", u(), "motion-safe:data-[state=closed]:animate-out motion-safe:data-[state=open]:animate-in", "motion-safe:data-[state=closed]:fade-out-0 motion-safe:data-[state=open]:fade-in-0", "motion-safe:data-[state=closed]:zoom-out-95 motion-safe:data-[state=open]:zoom-in-95", "motion-safe:data-[side=bottom]:slide-in-from-top-2", "motion-safe:data-[side=top]:slide-in-from-bottom-2", "origin-(--radix-popover-content-transform-origin)"), he = (e, t, n, r, i, a, o, s, c) => {
22
17
  let [l, u] = h(-1), d = m(() => {
23
18
  let t = [];
24
19
  return o && t.push({ type: "search" }), s && t.push({ type: "select-all" }), e.forEach((e, n) => {
@@ -100,77 +95,84 @@ var v = "h-4 w-4", y = (e) => ({
100
95
  }, [l, d]),
101
96
  isSearchFocused: m(() => l < 0 || l >= d.length ? !1 : d[l].type === "search", [l, d]),
102
97
  isSelectAllFocused: m(() => l < 0 || l >= d.length ? !1 : d[l].type === "select-all", [l, d]),
103
- isClearAllFocused: m(() => l < 0 || l >= d.length ? !1 : d[l].type === "clear-all", [l, d])
98
+ isClearAllFocused: m(() => l < 0 || l >= d.length ? !1 : d[l].type === "clear-all", [l, d]),
99
+ focusedOptionValue: m(() => {
100
+ if (l < 0 || l >= d.length) return null;
101
+ let e = d[l];
102
+ return e.type === "option" ? e.value : null;
103
+ }, [l, d])
104
104
  };
105
- }, x = ({ className: s, clearAllLabel: y = "Clear all", closeOnSelect: x = !1, dropdownWidth: S = "trigger", emptyMessage: se = "No options found", errorMessage: C, defaultValue: ce = [], id: le, label: ue, loadingMessage: de = "Loading options…", maxCount: w = 3, name: T, onChange: fe, options: E = [], placeholder: D = "Select options", ref: pe, searchPlaceholder: me = "Search options…", selectAllLabel: he = "Select all", showClearAll: ge = !0, showSearch: O = !0, showSelectAll: k = !0, sortAlphabetically: A = !1, state: j = "default", value: _e, "aria-label": ve, "aria-describedby": M, ...N }) => {
106
- let P = ne(), F = le ?? `${T}-${P}`, I = `${F}-listbox`, L = `${F}-error`, [R, z] = h(!1), { dropdownShiftStyle: ye, setDropdownElement: be } = l(R), [B, xe] = h(""), [V, H] = c({
107
- value: _e,
108
- defaultValue: ce,
109
- onChange: fe
110
- }), U = re(null), W = N.disabled ?? j === "disabled", Se = j === "loading", Ce = j === "error", we = S === "trigger" ? "var(--radix-popover-trigger-width)" : S === "content" ? "max-content" : S, G = S === "trigger" || S === "content" ? S : "custom", K = m(() => {
111
- let e = E.filter((e) => e.label.toLowerCase().includes(B.toLowerCase()));
112
- return A && (e = [...e].sort((e, t) => e.label.localeCompare(t.label))), e;
105
+ }, v = ({ className: u, clearAllLabel: v = "Clear all", closeOnSelect: y = !1, dropdownWidth: b = "trigger", emptyMessage: ge = "No options found", errorMessage: x, defaultValue: _e = [], disabled: ve, id: ye, label: S, loadingMessage: be = "Loading options…", maxCount: C = 3, name: w, onChange: xe, options: T = [], placeholder: Se = "Select options", ref: Ce, searchPlaceholder: we = "Search options…", selectAllLabel: Te = "Select all", showClearAll: Ee = !0, showSearch: E = !0, showSelectAll: D = !0, sortAlphabetically: O = !1, state: k = "default", value: De, warningMessage: A, "aria-label": Oe, "aria-describedby": ke, ...j }) => {
106
+ let Ae = ue(), M = te(ye, w ?? `multiselect-${Ae}`), N = `${M}-listbox`, P = f(M), F = `${M}-warning`, je = k === "error" ? P : k === "warning" && A ? F : void 0, [I, L] = h(!1), { dropdownShiftStyle: Me, setDropdownElement: Ne } = ie(I), [R, z] = h(""), [B, V] = ne({
107
+ value: De,
108
+ defaultValue: _e,
109
+ onChange: xe
110
+ }), H = de(null), U = !!ve, Pe = k === "loading", Fe = l(k, ke, j.required, je), { dropdownOverflowStyle: Ie, dropdownWidthMode: W, resolvedDropdownWidth: Le } = d({
111
+ dropdownWidth: b,
112
+ triggerWidth: "var(--radix-popover-trigger-width)"
113
+ }), G = m(() => {
114
+ let e = T.filter((e) => e.label.toLowerCase().includes(R.toLowerCase()));
115
+ return O && (e = [...e].sort((e, t) => e.label.localeCompare(t.label))), e;
113
116
  }, [
114
- E,
115
- B,
116
- A
117
- ]), q = m(() => {
117
+ T,
118
+ R,
119
+ O
120
+ ]), K = m(() => {
118
121
  let e = {}, t = [];
119
- return K.forEach((n) => {
122
+ return G.forEach((n) => {
120
123
  n.group ? (e[n.group] || (e[n.group] = []), e[n.group].push(n)) : t.push(n);
121
124
  }), {
122
125
  groups: e,
123
126
  ungrouped: t,
124
127
  hasGroups: Object.keys(e).length > 0
125
128
  };
126
- }, [K]), J = p((e) => {
127
- E.find((t) => t.value === e)?.disabled || (H(V.includes(e) ? V.filter((t) => t !== e) : [...V, e]), x && z(!1));
129
+ }, [G]), q = p((e) => {
130
+ T.find((t) => t.value === e)?.disabled || (V(B.includes(e) ? B.filter((t) => t !== e) : [...B, e]), y && L(!1));
128
131
  }, [
129
- x,
130
- E,
131
- H,
132
- V
133
- ]), Y = p(() => {
134
- let e = E.filter((e) => !e.disabled).map((e) => e.value);
135
- e.every((e) => V.includes(e)) ? H([]) : H(e);
132
+ y,
133
+ T,
134
+ V,
135
+ B
136
+ ]), J = p(() => {
137
+ let e = T.filter((e) => !e.disabled).map((e) => e.value);
138
+ e.every((e) => B.includes(e)) ? V([]) : V(e);
136
139
  }, [
137
- E,
138
- H,
139
- V
140
- ]), X = p(() => {
141
- H([]);
142
- }, [H]), Z = m(() => E.filter((e) => !e.disabled).map((e) => e.value), [E]), Te = Z.length > 0 && Z.every((e) => V.includes(e)), { getOptionFocusIndex: Ee, handleKeyDown: De, isSelectAllFocused: Oe, setFocusedIndex: Q } = oe(K, X, () => z(!1), J, Y, U, O, k, !1);
143
- te(() => {
144
- Q(R ? 0 : -1);
145
- }, [R, Q]);
146
- let ke = p((e) => {
147
- xe(e.target.value);
148
- }, []), Ae = () => {
149
- if (V.length === 0) return /* @__PURE__ */ g("span", {
140
+ T,
141
+ V,
142
+ B
143
+ ]), Y = p(() => {
144
+ V([]);
145
+ }, [V]), X = m(() => T.filter((e) => !e.disabled).map((e) => e.value), [T]), Re = X.length > 0 && X.every((e) => B.includes(e)), { focusedOptionValue: Z, getOptionFocusIndex: ze, handleKeyDown: Be, isSelectAllFocused: Ve, setFocusedIndex: Q } = he(G, Y, () => L(!1), q, J, H, E, D, !1);
146
+ le(() => {
147
+ Q(I ? 0 : -1);
148
+ }, [I, Q]);
149
+ let He = p((e) => {
150
+ z(e.target.value);
151
+ }, []), Ue = () => {
152
+ if (B.length === 0) return /* @__PURE__ */ g("span", {
150
153
  className: "min-h-8 flex items-center text-input-text-placeholder",
151
- children: D
154
+ children: Se
152
155
  });
153
- let e = V.slice(0, w), t = V.length - w;
156
+ let e = B.slice(0, C), t = B.length - C;
154
157
  return /* @__PURE__ */ _("div", {
155
158
  className: "gap-1 flex flex-wrap items-center overflow-hidden",
156
159
  children: [e.map((e) => {
157
- let t = E.find((t) => t.value === e);
160
+ let t = T.find((t) => t.value === e);
158
161
  return t ? /* @__PURE__ */ _("span", {
159
162
  className: "gap-1 px-2 py-1 rounded-md text-xs max-w-48 inline-flex items-center bg-input-bg--selected text-input-text",
160
163
  children: [/* @__PURE__ */ g("span", {
161
164
  className: "truncate",
162
165
  children: t.label
163
- }), /* @__PURE__ */ g("button", {
164
- "aria-label": `Remove ${t.label}`,
166
+ }), /* @__PURE__ */ g("span", {
167
+ "aria-hidden": "true",
165
168
  className: "hover:text-danger rounded-sm cursor-pointer",
166
169
  "data-testid": "spectral-multiselect-remove-item-button",
167
170
  onClick: (t) => {
168
- t.preventDefault(), t.stopPropagation(), J(e);
171
+ t.preventDefault(), t.stopPropagation(), q(e);
169
172
  },
170
173
  onPointerDown: (e) => {
171
174
  e.stopPropagation();
172
175
  },
173
- type: "button",
174
176
  children: /* @__PURE__ */ g(n, { size: 12 })
175
177
  })]
176
178
  }, e) : null;
@@ -184,163 +186,182 @@ var v = "h-4 w-4", y = (e) => ({
184
186
  })]
185
187
  });
186
188
  }, $ = (t, n) => {
187
- let r = V.includes(t.value);
189
+ let r = B.includes(t.value), a = ze(n), o = `${N}-option-${t.value}`;
188
190
  return /* @__PURE__ */ _("button", {
189
- className: a("gap-3 px-3 py-2 text-sm flex w-full items-center text-left hover:bg-input-bg--hover focus-visible:bg-input-bg--hover focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50", Ee(n) && "bg-input-bg--hover", r && "font-medium text-input-text"),
191
+ "aria-selected": r,
192
+ className: i("gap-3 px-3 py-2 text-sm flex w-full items-center text-left hover:bg-input-bg--hover focus-visible:bg-input-bg--hover focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50", a && "bg-input-bg--hover", r && "font-medium text-input-text"),
190
193
  disabled: t.disabled,
191
- onClick: () => J(t.value),
194
+ id: o,
195
+ onClick: () => q(t.value),
196
+ role: "option",
192
197
  type: "button",
193
198
  children: [/* @__PURE__ */ g("div", {
194
199
  "data-testid": "spectral-multiselect-selected-indicator",
195
- className: a("w-4 h-4 rounded flex items-center justify-center border border-input-border", r && "bg-primary border-primary"),
200
+ className: i("w-4 h-4 rounded flex items-center justify-center border border-input-border", r && "bg-primary border-primary"),
196
201
  children: r && /* @__PURE__ */ g(e, { size: 12 })
197
202
  }), /* @__PURE__ */ g("span", { children: t.label })]
198
203
  }, t.value);
199
- }, je = () => ({
200
- "--multiselect-border-radius": "0.5rem",
201
- "--multiselect-trigger-height": "3rem",
202
- "--multiselect-dropdown-max-height": "20rem"
203
- });
204
+ };
204
205
  return /* @__PURE__ */ _("div", {
205
206
  className: "w-full",
206
207
  "data-testid": "spectral-multiselect-root",
207
- children: [/* @__PURE__ */ g(d, {
208
- open: R,
209
- onOpenChange: z,
210
- children: /* @__PURE__ */ _("div", {
211
- className: "relative",
212
- "data-testid": "spectral-multiselect-wrapper",
213
- onKeyDown: R ? De : void 0,
214
- role: "none",
215
- children: [
216
- /* @__PURE__ */ g(u, {
217
- asChild: !0,
218
- children: /* @__PURE__ */ _("button", {
219
- "aria-controls": R ? I : void 0,
220
- "aria-describedby": [Ce ? L : null, M].filter(Boolean).join(" ") || void 0,
221
- "aria-expanded": R,
222
- "aria-label": ve ?? ue,
223
- className: b(j, R, s),
224
- "data-state": j,
225
- "data-testid": "spectral-multiselect-trigger",
226
- disabled: W,
227
- id: F,
228
- name: T,
229
- ref: pe,
230
- role: "combobox",
231
- style: je(),
208
+ children: [
209
+ S && /* @__PURE__ */ g(re, {
210
+ className: i("mb-2 block text-text-primary", U && "text-text-secondary"),
211
+ "data-testid": "spectral-multiselect-label",
212
+ htmlFor: M,
213
+ children: S
214
+ }),
215
+ /* @__PURE__ */ g(oe, {
216
+ open: I,
217
+ onOpenChange: L,
218
+ children: /* @__PURE__ */ _("div", {
219
+ className: "relative",
220
+ "data-testid": "spectral-multiselect-wrapper",
221
+ onKeyDown: I ? Be : void 0,
222
+ role: "none",
223
+ children: [
224
+ /* @__PURE__ */ g(ae, {
225
+ asChild: !0,
226
+ children: /* @__PURE__ */ _("button", {
227
+ "aria-activedescendant": I && Z ? `${N}-option-${Z}` : void 0,
228
+ "aria-controls": I ? N : void 0,
229
+ "aria-expanded": I,
230
+ "aria-label": Oe ?? S,
231
+ className: i(ee(I, k, u), "max-h-22 py-2 text-sm"),
232
+ "data-state": k,
233
+ "data-testid": "spectral-multiselect-trigger",
234
+ disabled: U,
235
+ id: M,
236
+ name: w,
237
+ ref: Ce,
238
+ role: "combobox",
239
+ style: {
240
+ "--multiselect-border-radius": "0.5rem",
241
+ "--multiselect-trigger-height": "3rem",
242
+ "--multiselect-dropdown-max-height": "20rem"
243
+ },
244
+ type: "button",
245
+ ...Fe,
246
+ ...j,
247
+ children: [/* @__PURE__ */ g("div", {
248
+ className: "min-w-0 flex-1 overflow-hidden",
249
+ "data-testid": "spectral-multiselect-selected-items",
250
+ children: Ue()
251
+ }), /* @__PURE__ */ g("div", {
252
+ className: "gap-2 ml-2 flex shrink-0 items-center",
253
+ children: /* @__PURE__ */ g(t, {
254
+ className: i("text-input-icon transition-transform duration-200", I && "rotate-180"),
255
+ size: 20
256
+ })
257
+ })]
258
+ })
259
+ }),
260
+ Ee && B.length > 0 && /* @__PURE__ */ g("button", {
261
+ "aria-label": "Clear all selections",
262
+ className: "right-10 text-input-icon hover:text-input-icon--hover rounded-sm absolute top-1/2 z-10 -translate-y-1/2 cursor-pointer focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-50",
263
+ "data-testid": "spectral-multiselect-clear-all-button",
264
+ disabled: U,
265
+ onClick: (e) => {
266
+ e.stopPropagation(), Y(), document.getElementById(M)?.focus();
267
+ },
232
268
  type: "button",
233
- ...N,
234
- children: [/* @__PURE__ */ g("div", {
235
- className: "min-w-0 flex-1 overflow-hidden",
236
- "data-testid": "spectral-multiselect-selected-items",
237
- children: Ae()
238
- }), /* @__PURE__ */ g("div", {
239
- className: "gap-2 ml-2 flex shrink-0 items-center",
240
- children: /* @__PURE__ */ g(t, {
241
- className: a("text-input-icon transition-transform duration-200", R && "rotate-180"),
242
- size: 20
243
- })
244
- })]
245
- })
246
- }),
247
- ge && V.length > 0 && /* @__PURE__ */ g("button", {
248
- "aria-label": "Clear all selections",
249
- className: "right-10 text-input-icon hover:text-input-icon--hover rounded-sm absolute top-1/2 z-10 -translate-y-1/2 cursor-pointer focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-50",
250
- "data-testid": "spectral-multiselect-clear-all-button",
251
- disabled: W,
252
- onClick: (e) => {
253
- e.stopPropagation(), X(), document.getElementById(F)?.focus();
254
- },
255
- type: "button",
256
- children: /* @__PURE__ */ g(n, { size: 12 })
257
- }),
258
- /* @__PURE__ */ g(ee, { children: /* @__PURE__ */ g(f, {
259
- align: "start",
260
- avoidCollisions: !0,
261
- className: ae(),
262
- collisionPadding: 10,
263
- "data-dropdown-width-mode": G,
264
- "data-dropdown-width-value": G === "custom" ? S : void 0,
265
- "data-testid": "spectral-multiselect-dropdown",
266
- onOpenAutoFocus: (e) => {
267
- e.preventDefault(), O && U.current?.focus();
268
- },
269
- side: "bottom",
270
- sideOffset: 4,
271
- ref: be,
272
- style: {
273
- width: we,
274
- ...ye
275
- },
276
- children: /* @__PURE__ */ _("div", {
277
- className: "p-1",
278
- children: [O && /* @__PURE__ */ _("div", {
279
- className: "mb-2 relative",
280
- children: [/* @__PURE__ */ g(i, { className: a(v, "left-3 text-input-icon absolute top-1/2 -translate-y-1/2") }), /* @__PURE__ */ g("input", {
281
- "aria-label": "Search options",
282
- className: "pl-9 pr-3 py-2 text-sm rounded-md focus-visible:ring-black w-full border border-input-border bg-input-bg focus-visible:border-input-border--focus focus-visible:ring-1 focus-visible:outline-none",
283
- "data-testid": "spectral-multiselect-search-input",
284
- onChange: ke,
285
- placeholder: me,
286
- ref: U,
287
- type: "text",
288
- value: B
269
+ children: /* @__PURE__ */ g(n, { size: 12 })
270
+ }),
271
+ /* @__PURE__ */ g(ce, { children: /* @__PURE__ */ g(se, {
272
+ align: "start",
273
+ avoidCollisions: !0,
274
+ className: me(),
275
+ collisionPadding: 10,
276
+ "data-dropdown-width-mode": W,
277
+ "data-dropdown-width-value": W === "custom" ? b : void 0,
278
+ "data-testid": "spectral-multiselect-dropdown",
279
+ onOpenAutoFocus: (e) => {
280
+ e.preventDefault(), E && H.current?.focus();
281
+ },
282
+ side: "bottom",
283
+ sideOffset: 4,
284
+ ref: Ne,
285
+ style: {
286
+ width: Le,
287
+ ...b === "trigger" ? {} : Ie,
288
+ ...Me
289
+ },
290
+ children: /* @__PURE__ */ _("div", {
291
+ className: "p-1",
292
+ children: [E && /* @__PURE__ */ _("div", {
293
+ className: "mb-2 relative",
294
+ children: [/* @__PURE__ */ g(r, { className: i(pe, "left-3 text-input-icon absolute top-1/2 -translate-y-1/2") }), /* @__PURE__ */ g("input", {
295
+ "aria-label": "Search options",
296
+ className: "pl-9 pr-3 py-2 text-sm rounded-md focus-visible:ring-black w-full border border-input-border bg-input-bg focus-visible:border-input-border--focus focus-visible:ring-1 focus-visible:outline-none",
297
+ "data-testid": "spectral-multiselect-search-input",
298
+ onChange: He,
299
+ placeholder: we,
300
+ ref: H,
301
+ type: "text",
302
+ value: R
303
+ })]
304
+ }), /* @__PURE__ */ g("div", {
305
+ className: "max-h-64 overflow-y-auto",
306
+ id: N,
307
+ role: "listbox",
308
+ "aria-multiselectable": "true",
309
+ children: Pe ? /* @__PURE__ */ g(s, {
310
+ className: "text-sm",
311
+ message: be,
312
+ "data-testid": "spectral-multiselect-loading"
313
+ }) : G.length === 0 ? /* @__PURE__ */ g(a, {
314
+ className: "text-sm",
315
+ "data-testid": "spectral-multiselect-empty-message",
316
+ message: ge
317
+ }) : /* @__PURE__ */ _(fe, { children: [
318
+ D && /* @__PURE__ */ _("div", {
319
+ className: "mb-1",
320
+ children: [/* @__PURE__ */ g("button", {
321
+ className: i("gap-3 px-3 py-2 text-sm font-medium text-input-text-secondary flex w-full items-center hover:bg-input-bg--hover focus:outline-none", Ve && "bg-input-bg--hover"),
322
+ "data-testid": "spectral-multiselect-select-all-button",
323
+ onClick: J,
324
+ type: "button",
325
+ children: Re ? v : Te
326
+ }), /* @__PURE__ */ g("div", { className: "mx-3 my-1 h-px bg-input-border" })]
327
+ }),
328
+ K.ungrouped.length > 0 && /* @__PURE__ */ g("div", {
329
+ className: "mb-1",
330
+ children: K.ungrouped.map((e, t) => $(e, t))
331
+ }),
332
+ Object.entries(K.groups).map(([e, t]) => /* @__PURE__ */ _("div", {
333
+ className: "mb-1",
334
+ "data-testid": "spectral-multiselect-group",
335
+ children: [
336
+ (K.ungrouped.length > 0 || Object.keys(K.groups).indexOf(e) > 0) && /* @__PURE__ */ g("div", { className: "mx-3 my-1 h-px bg-input-border" }),
337
+ /* @__PURE__ */ g("div", {
338
+ "data-testid": "spectral-multiselect-group-name",
339
+ className: "px-3 py-1 text-xs font-semibold text-input-text-secondary tracking-wide uppercase",
340
+ children: e
341
+ }),
342
+ t.map((e, t) => $(e, G.indexOf(e)))
343
+ ]
344
+ }, e))
345
+ ] })
289
346
  })]
290
- }), /* @__PURE__ */ g("div", {
291
- className: "max-h-64 overflow-y-auto",
292
- id: I,
293
- role: "listbox",
294
- "aria-multiselectable": "true",
295
- children: Se ? /* @__PURE__ */ _("div", {
296
- "data-testid": "spectral-multiselect-loading",
297
- className: "gap-2 py-6 text-sm text-input-text-secondary flex items-center justify-center",
298
- children: [/* @__PURE__ */ g(r, {}), de]
299
- }) : K.length === 0 ? /* @__PURE__ */ g("div", {
300
- "data-testid": "spectral-multiselect-empty-message",
301
- className: "py-6 text-sm text-input-text-secondary text-center",
302
- children: se
303
- }) : /* @__PURE__ */ _(ie, { children: [
304
- k && /* @__PURE__ */ _("div", {
305
- className: "mb-1",
306
- children: [/* @__PURE__ */ g("button", {
307
- className: a("gap-3 px-3 py-2 text-sm font-medium text-input-text-secondary flex w-full items-center hover:bg-input-bg--hover focus:outline-none", Oe && "bg-input-bg--hover"),
308
- "data-testid": "spectral-multiselect-select-all-button",
309
- onClick: Y,
310
- type: "button",
311
- children: Te ? y : he
312
- }), /* @__PURE__ */ g("div", { className: "mx-3 my-1 h-px bg-input-border" })]
313
- }),
314
- q.ungrouped.length > 0 && /* @__PURE__ */ g("div", {
315
- className: "mb-1",
316
- children: q.ungrouped.map((e, t) => $(e, t))
317
- }),
318
- Object.entries(q.groups).map(([e, t]) => /* @__PURE__ */ _("div", {
319
- className: "mb-1",
320
- "data-testid": "spectral-multiselect-group",
321
- children: [
322
- (q.ungrouped.length > 0 || Object.keys(q.groups).indexOf(e) > 0) && /* @__PURE__ */ g("div", { className: "mx-3 my-1 h-px bg-input-border" }),
323
- /* @__PURE__ */ g("div", {
324
- "data-testid": "spectral-multiselect-group-name",
325
- className: "px-3 py-1 text-xs font-semibold text-input-text-secondary tracking-wide uppercase",
326
- children: e
327
- }),
328
- t.map((e, t) => $(e, K.indexOf(e)))
329
- ]
330
- }, e))
331
- ] })
332
- })]
333
- })
334
- }) })
335
- ]
347
+ })
348
+ }) })
349
+ ]
350
+ })
351
+ }),
352
+ k === "error" && x && /* @__PURE__ */ g(o, {
353
+ dataTestId: "spectral-multiselect-error-message",
354
+ id: P,
355
+ message: x
356
+ }),
357
+ k === "warning" && A && /* @__PURE__ */ g(c, {
358
+ dataTestId: "spectral-multiselect-warning-message",
359
+ id: F,
360
+ message: A
336
361
  })
337
- }), j === "error" && C && /* @__PURE__ */ g(o, {
338
- dataTestId: "spectral-multiselect-error-message",
339
- id: L,
340
- message: C
341
- })]
362
+ ]
342
363
  });
343
364
  };
344
- x.displayName = "MultiSelectBase";
365
+ v.displayName = "MultiSelectBase";
345
366
  //#endregion
346
- export { x as MultiSelectBase };
367
+ export { v as MultiSelectBase };
@@ -4,6 +4,7 @@ export interface MultiSelectProps extends Omit<MultiSelectBaseProps, 'defaultVal
4
4
  defaultValue?: string[];
5
5
  emptyText?: string;
6
6
  loading?: boolean;
7
+ onChange?: (value: string[]) => void;
7
8
  onSearchChange?: (search: string) => void;
8
9
  onValueChange?: (value: string[]) => void;
9
10
  options: {
@@ -16,7 +17,7 @@ export interface MultiSelectProps extends Omit<MultiSelectBaseProps, 'defaultVal
16
17
  value?: string[];
17
18
  }
18
19
  export declare const MultiSelect: {
19
- ({ emptyText, loading, onValueChange, options, defaultValue, ref, state, value, ...props }: MultiSelectProps & {
20
+ ({ emptyText, loading, onChange, onValueChange, options, defaultValue, ref, state, value, ...props }: MultiSelectProps & {
20
21
  ref?: Ref<HTMLButtonElement>;
21
22
  }): import("react/jsx-runtime").JSX.Element;
22
23
  displayName: string;
@@ -3,24 +3,26 @@ import { MultiSelectBase as e } from "./MultiSelect/MultiSelectBase.js";
3
3
  import "react";
4
4
  import { jsx as t } from "react/jsx-runtime";
5
5
  //#region src/components/MultiSelect/MultiSelect.tsx
6
- var n = ({ emptyText: n = "No matches found.", loading: r = !1, onValueChange: i, options: a, defaultValue: o, ref: s, state: c, value: l, ...u }) => {
7
- let d = a.map((e) => ({
6
+ var n = ({ emptyText: n = "No matches found.", loading: r = !1, onChange: i, onValueChange: a, options: o, defaultValue: s, ref: c, state: l, value: u, ...d }) => {
7
+ let f = o.map((e) => ({
8
8
  disabled: e.disabled ?? !1,
9
9
  group: e.group,
10
10
  label: e.label,
11
11
  value: e.value
12
- })), f = r ? "loading" : c;
12
+ })), p = r ? "loading" : l;
13
13
  return /* @__PURE__ */ t(e, {
14
- "data-disabled": u.disabled,
15
- defaultValue: o,
16
- disabled: u.disabled,
14
+ "data-disabled": d.disabled,
15
+ defaultValue: s,
16
+ disabled: d.disabled,
17
17
  emptyMessage: n,
18
- onChange: i,
19
- options: d,
20
- ref: s,
21
- state: f,
22
- value: l,
23
- ...u
18
+ onChange: (e) => {
19
+ a?.(e), i?.(e);
20
+ },
21
+ options: f,
22
+ ref: c,
23
+ state: p,
24
+ value: u,
25
+ ...d
24
26
  });
25
27
  };
26
28
  n.displayName = "MultiSelect";
package/dist/Popover.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./styles/main.css";
2
- import { t as e } from "./twUtils-VNWgstKL.js";
2
+ import { t as e } from "./twUtils-D_qzdiwM.js";
3
3
  import { a as t, i as n, n as r, r as i, t as a } from "./dist-BtdmHAzK.js";
4
4
  import "react";
5
5
  import { jsx as o } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
1
  import "./styles/main.css";
2
- import { t as e } from "./twUtils-VNWgstKL.js";
2
+ import { t as e } from "./twUtils-D_qzdiwM.js";
3
3
  import { Slot as t } from "./primitives/slot.js";
4
4
  import "react";
5
5
  import { jsx as n } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import "../styles/main.css";
3
- import { t as e } from "../twUtils-VNWgstKL.js";
3
+ import { t as e } from "../twUtils-D_qzdiwM.js";
4
4
  import { Slot as t } from "../primitives/slot.js";
5
5
  import { createContext as n, useContext as r } from "react";
6
6
  import { jsx as i } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
1
  import "./styles/main.css";
2
- import { t as e } from "./twUtils-VNWgstKL.js";
2
+ import { t as e } from "./twUtils-D_qzdiwM.js";
3
3
  import { RadioButtonGroupBase as t, RadioButtonGroupItem as n } from "./RadioButtonGroup/RadioButtonGroupBase.js";
4
4
  import "react";
5
5
  import { jsx as r } from "react/jsx-runtime";