@spear-ai/spectral 1.11.2 → 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 (116) 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 +91 -92
  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 +33 -30
  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 +235 -209
  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 +100 -85
  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.d.ts.map +1 -1
  97. package/dist/primitives/select.js +56 -53
  98. package/dist/primitives/textarea.js +1 -1
  99. package/dist/{proxy-Dn10Pl_g.js → proxy-CCB7C4Pu.js} +10 -10
  100. package/dist/styles/spectral.css +1 -1
  101. package/dist/{twUtils-VNWgstKL.js → twUtils-D_qzdiwM.js} +1 -1
  102. package/dist/{use-animation-CBUDycyW.js → use-animation-C-qL83hj.js} +1 -1
  103. package/dist/utils/dropdownPositioning.d.ts +13 -0
  104. package/dist/utils/dropdownPositioning.d.ts.map +1 -0
  105. package/dist/utils/dropdownPositioning.js +43 -0
  106. package/dist/utils/dropdownPositioning.test.d.ts +2 -0
  107. package/dist/utils/dropdownPositioning.test.d.ts.map +1 -0
  108. package/dist/utils/dropdownPositioning.test.js +21 -0
  109. package/dist/utils/formFieldUtils.d.ts +15 -1
  110. package/dist/utils/formFieldUtils.d.ts.map +1 -1
  111. package/dist/utils/formFieldUtils.js +35 -19
  112. package/dist/utils/twUtils.js +1 -1
  113. package/package.json +26 -22
  114. package/dist/RadioGroup-w_q6RGEK.js +0 -447
  115. package/dist/Switch-CVzRJ-0n.js +0 -126
  116. /package/dist/{dist-B4FgboI8.js → dist-Cujfuel1.js} +0 -0
@@ -3,22 +3,18 @@ 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 { a as l, i as u, n as d, r as f } from "../dist-BtdmHAzK.js";
12
- import { useCallback as p, useEffect as ee, useId as m, useMemo as h, useRef as te, useState as g } from "react";
13
- import { Fragment as ne, jsx as _, jsxs as v } 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";
14
15
  //#region src/components/MultiSelect/MultiSelectBase.tsx
15
- var re = "h-4 w-4", y = (e) => ({
16
- error: "border-danger hover:border-danger focus-visible:border-danger focus-visible:ring-danger",
17
- loading: "cursor-wait border-input-border--disabled",
18
- disabled: "cursor-not-allowed opacity-50 border-input-border--disabled bg-input-bg--disabled",
19
- default: ""
20
- })[e], ie = (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) => {
21
- let [l, u] = g(-1), d = h(() => {
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) => {
17
+ let [l, u] = h(-1), d = m(() => {
22
18
  let t = [];
23
19
  return o && t.push({ type: "search" }), s && t.push({ type: "select-all" }), e.forEach((e, n) => {
24
20
  e.disabled || t.push({
@@ -97,83 +93,90 @@ var re = "h-4 w-4", y = (e) => ({
97
93
  let t = d[l];
98
94
  return t.type === "option" && t.index === e;
99
95
  }, [l, d]),
100
- isSearchFocused: h(() => l < 0 || l >= d.length ? !1 : d[l].type === "search", [l, d]),
101
- isSelectAllFocused: h(() => l < 0 || l >= d.length ? !1 : d[l].type === "select-all", [l, d]),
102
- isClearAllFocused: h(() => l < 0 || l >= d.length ? !1 : d[l].type === "clear-all", [l, d])
96
+ isSearchFocused: m(() => l < 0 || l >= d.length ? !1 : d[l].type === "search", [l, d]),
97
+ isSelectAllFocused: m(() => l < 0 || l >= d.length ? !1 : d[l].type === "select-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])
103
104
  };
104
- }, b = ({ className: s, clearAllLabel: y = "Clear all", closeOnSelect: b = !1, dropdownWidth: x = "trigger", emptyMessage: se = "No options found", errorMessage: S, defaultValue: ce = [], id: C, label: le, loadingMessage: ue = "Loading options…", maxCount: w = 3, name: T, onChange: de, options: E = [], placeholder: D = "Select options", ref: O, searchPlaceholder: fe = "Search options…", selectAllLabel: pe = "Select all", showClearAll: me = !0, showSearch: k = !0, showSelectAll: A = !0, sortAlphabetically: j = !1, state: M = "default", value: he, "aria-label": ge, "aria-describedby": _e, ...N }) => {
105
- let P = m(), F = C ?? `${T}-${P}`, I = `${F}-listbox`, L = `${F}-error`, [R, z] = g(!1), [B, ve] = g(""), [V, H] = c({
106
- value: he,
107
- defaultValue: ce,
108
- onChange: de
109
- }), U = te(null), W = N.disabled ?? M === "disabled", ye = M === "loading", be = M === "error", xe = x === "trigger" ? "var(--radix-popover-trigger-width)" : x === "content" ? "max-content" : x, G = x === "trigger" || x === "content" ? x : "custom", K = h(() => {
110
- let e = E.filter((e) => e.label.toLowerCase().includes(B.toLowerCase()));
111
- return j && (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;
112
116
  }, [
113
- E,
114
- B,
115
- j
116
- ]), q = h(() => {
117
+ T,
118
+ R,
119
+ O
120
+ ]), K = m(() => {
117
121
  let e = {}, t = [];
118
- return K.forEach((n) => {
122
+ return G.forEach((n) => {
119
123
  n.group ? (e[n.group] || (e[n.group] = []), e[n.group].push(n)) : t.push(n);
120
124
  }), {
121
125
  groups: e,
122
126
  ungrouped: t,
123
127
  hasGroups: Object.keys(e).length > 0
124
128
  };
125
- }, [K]), J = p((e) => {
126
- E.find((t) => t.value === e)?.disabled || (H(V.includes(e) ? V.filter((t) => t !== e) : [...V, e]), b && 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));
127
131
  }, [
128
- b,
129
- E,
130
- H,
131
- V
132
- ]), Y = p(() => {
133
- let e = E.filter((e) => !e.disabled).map((e) => e.value);
134
- 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);
135
139
  }, [
136
- E,
137
- H,
138
- V
139
- ]), X = p(() => {
140
- H([]);
141
- }, [H]), Z = h(() => E.filter((e) => !e.disabled).map((e) => e.value), [E]), Se = Z.length > 0 && Z.every((e) => V.includes(e)), { getOptionFocusIndex: Ce, handleKeyDown: we, isSelectAllFocused: Te, setFocusedIndex: Q } = oe(K, X, () => z(!1), J, Y, U, k, A, !1);
142
- ee(() => {
143
- Q(R ? 0 : -1);
144
- }, [R, Q]);
145
- let Ee = p((e) => {
146
- ve(e.target.value);
147
- }, []), De = () => {
148
- if (V.length === 0) return /* @__PURE__ */ _("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", {
149
153
  className: "min-h-8 flex items-center text-input-text-placeholder",
150
- children: D
154
+ children: Se
151
155
  });
152
- let e = V.slice(0, w), t = V.length - w;
153
- return /* @__PURE__ */ v("div", {
156
+ let e = B.slice(0, C), t = B.length - C;
157
+ return /* @__PURE__ */ _("div", {
154
158
  className: "gap-1 flex flex-wrap items-center overflow-hidden",
155
159
  children: [e.map((e) => {
156
- let t = E.find((t) => t.value === e);
157
- return t ? /* @__PURE__ */ v("span", {
160
+ let t = T.find((t) => t.value === e);
161
+ return t ? /* @__PURE__ */ _("span", {
158
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",
159
- children: [/* @__PURE__ */ _("span", {
163
+ children: [/* @__PURE__ */ g("span", {
160
164
  className: "truncate",
161
165
  children: t.label
162
- }), /* @__PURE__ */ _("button", {
163
- "aria-label": `Remove ${t.label}`,
166
+ }), /* @__PURE__ */ g("span", {
167
+ "aria-hidden": "true",
164
168
  className: "hover:text-danger rounded-sm cursor-pointer",
165
169
  "data-testid": "spectral-multiselect-remove-item-button",
166
170
  onClick: (t) => {
167
- t.preventDefault(), t.stopPropagation(), J(e);
171
+ t.preventDefault(), t.stopPropagation(), q(e);
168
172
  },
169
173
  onPointerDown: (e) => {
170
174
  e.stopPropagation();
171
175
  },
172
- type: "button",
173
- children: /* @__PURE__ */ _(n, { size: 12 })
176
+ children: /* @__PURE__ */ g(n, { size: 12 })
174
177
  })]
175
178
  }, e) : null;
176
- }), t > 0 && /* @__PURE__ */ v("span", {
179
+ }), t > 0 && /* @__PURE__ */ _("span", {
177
180
  className: "text-input-text-secondary text-xs py-1 flex items-center",
178
181
  children: [
179
182
  "+",
@@ -183,159 +186,182 @@ var re = "h-4 w-4", y = (e) => ({
183
186
  })]
184
187
  });
185
188
  }, $ = (t, n) => {
186
- let r = V.includes(t.value);
187
- return /* @__PURE__ */ v("button", {
188
- 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", Ce(n) && "bg-input-bg--hover", r && "font-medium text-input-text"),
189
+ let r = B.includes(t.value), a = ze(n), o = `${N}-option-${t.value}`;
190
+ return /* @__PURE__ */ _("button", {
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"),
189
193
  disabled: t.disabled,
190
- onClick: () => J(t.value),
194
+ id: o,
195
+ onClick: () => q(t.value),
196
+ role: "option",
191
197
  type: "button",
192
- children: [/* @__PURE__ */ _("div", {
198
+ children: [/* @__PURE__ */ g("div", {
193
199
  "data-testid": "spectral-multiselect-selected-indicator",
194
- className: a("w-4 h-4 rounded flex items-center justify-center border border-input-border", r && "bg-primary border-primary"),
195
- children: r && /* @__PURE__ */ _(e, { size: 12 })
196
- }), /* @__PURE__ */ _("span", { children: t.label })]
200
+ className: i("w-4 h-4 rounded flex items-center justify-center border border-input-border", r && "bg-primary border-primary"),
201
+ children: r && /* @__PURE__ */ g(e, { size: 12 })
202
+ }), /* @__PURE__ */ g("span", { children: t.label })]
197
203
  }, t.value);
198
- }, Oe = () => ({
199
- "--multiselect-border-radius": "0.5rem",
200
- "--multiselect-trigger-height": "3rem",
201
- "--multiselect-dropdown-max-height": "20rem"
202
- });
203
- return /* @__PURE__ */ v("div", {
204
+ };
205
+ return /* @__PURE__ */ _("div", {
204
206
  className: "w-full",
205
207
  "data-testid": "spectral-multiselect-root",
206
- children: [/* @__PURE__ */ _(u, {
207
- open: R,
208
- onOpenChange: z,
209
- children: /* @__PURE__ */ v("div", {
210
- className: "relative",
211
- "data-testid": "spectral-multiselect-wrapper",
212
- onKeyDown: R ? we : void 0,
213
- role: "none",
214
- children: [
215
- /* @__PURE__ */ _(l, {
216
- asChild: !0,
217
- children: /* @__PURE__ */ v("button", {
218
- "aria-controls": R ? I : void 0,
219
- "aria-describedby": [be ? L : null, _e].filter(Boolean).join(" ") || void 0,
220
- "aria-expanded": R,
221
- "aria-label": ge ?? le,
222
- className: ie(M, R, s),
223
- "data-state": M,
224
- "data-testid": "spectral-multiselect-trigger",
225
- disabled: W,
226
- id: F,
227
- name: T,
228
- ref: O,
229
- role: "combobox",
230
- style: Oe(),
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
+ },
231
268
  type: "button",
232
- ...N,
233
- children: [/* @__PURE__ */ _("div", {
234
- className: "min-w-0 flex-1 overflow-hidden",
235
- "data-testid": "spectral-multiselect-selected-items",
236
- children: De()
237
- }), /* @__PURE__ */ _("div", {
238
- className: "gap-2 ml-2 flex shrink-0 items-center",
239
- children: /* @__PURE__ */ _(t, {
240
- className: a("text-input-icon transition-transform duration-200", R && "rotate-180"),
241
- size: 20
242
- })
243
- })]
244
- })
245
- }),
246
- me && V.length > 0 && /* @__PURE__ */ _("button", {
247
- "aria-label": "Clear all selections",
248
- 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",
249
- "data-testid": "spectral-multiselect-clear-all-button",
250
- disabled: W,
251
- onClick: (e) => {
252
- e.stopPropagation(), X(), document.getElementById(F)?.focus();
253
- },
254
- type: "button",
255
- children: /* @__PURE__ */ _(n, { size: 12 })
256
- }),
257
- /* @__PURE__ */ _(f, { children: /* @__PURE__ */ _(d, {
258
- align: "start",
259
- avoidCollisions: !0,
260
- className: ae(),
261
- collisionPadding: 10,
262
- "data-dropdown-width-mode": G,
263
- "data-dropdown-width-value": G === "custom" ? x : void 0,
264
- "data-testid": "spectral-multiselect-dropdown",
265
- onOpenAutoFocus: (e) => {
266
- e.preventDefault(), k && U.current?.focus();
267
- },
268
- side: "bottom",
269
- sideOffset: 4,
270
- style: { width: xe },
271
- children: /* @__PURE__ */ v("div", {
272
- className: "p-1",
273
- children: [k && /* @__PURE__ */ v("div", {
274
- className: "mb-2 relative",
275
- children: [/* @__PURE__ */ _(i, { className: a(re, "left-3 text-input-icon absolute top-1/2 -translate-y-1/2") }), /* @__PURE__ */ _("input", {
276
- "aria-label": "Search options",
277
- 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",
278
- "data-testid": "spectral-multiselect-search-input",
279
- onChange: Ee,
280
- placeholder: fe,
281
- ref: U,
282
- type: "text",
283
- 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
+ ] })
284
346
  })]
285
- }), /* @__PURE__ */ _("div", {
286
- className: "max-h-64 overflow-y-auto",
287
- id: I,
288
- role: "listbox",
289
- "aria-multiselectable": "true",
290
- children: ye ? /* @__PURE__ */ v("div", {
291
- "data-testid": "spectral-multiselect-loading",
292
- className: "gap-2 py-6 text-sm text-input-text-secondary flex items-center justify-center",
293
- children: [/* @__PURE__ */ _(r, {}), ue]
294
- }) : K.length === 0 ? /* @__PURE__ */ _("div", {
295
- "data-testid": "spectral-multiselect-empty-message",
296
- className: "py-6 text-sm text-input-text-secondary text-center",
297
- children: se
298
- }) : /* @__PURE__ */ v(ne, { children: [
299
- A && /* @__PURE__ */ v("div", {
300
- className: "mb-1",
301
- children: [/* @__PURE__ */ _("button", {
302
- 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", Te && "bg-input-bg--hover"),
303
- "data-testid": "spectral-multiselect-select-all-button",
304
- onClick: Y,
305
- type: "button",
306
- children: Se ? y : pe
307
- }), /* @__PURE__ */ _("div", { className: "mx-3 my-1 h-px bg-input-border" })]
308
- }),
309
- q.ungrouped.length > 0 && /* @__PURE__ */ _("div", {
310
- className: "mb-1",
311
- children: q.ungrouped.map((e, t) => $(e, t))
312
- }),
313
- Object.entries(q.groups).map(([e, t]) => /* @__PURE__ */ v("div", {
314
- className: "mb-1",
315
- "data-testid": "spectral-multiselect-group",
316
- children: [
317
- (q.ungrouped.length > 0 || Object.keys(q.groups).indexOf(e) > 0) && /* @__PURE__ */ _("div", { className: "mx-3 my-1 h-px bg-input-border" }),
318
- /* @__PURE__ */ _("div", {
319
- "data-testid": "spectral-multiselect-group-name",
320
- className: "px-3 py-1 text-xs font-semibold text-input-text-secondary tracking-wide uppercase",
321
- children: e
322
- }),
323
- t.map((e, t) => $(e, K.indexOf(e)))
324
- ]
325
- }, e))
326
- ] })
327
- })]
328
- })
329
- }) })
330
- ]
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
331
361
  })
332
- }), M === "error" && S && /* @__PURE__ */ _(o, {
333
- dataTestId: "spectral-multiselect-error-message",
334
- id: L,
335
- message: S
336
- })]
362
+ ]
337
363
  });
338
364
  };
339
- b.displayName = "MultiSelectBase";
365
+ v.displayName = "MultiSelectBase";
340
366
  //#endregion
341
- export { b 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";