@spear-ai/spectral 1.11.1 → 1.11.3

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 (204) hide show
  1. package/dist/.js +3 -2
  2. package/dist/ButtonIcon.js +2 -2
  3. package/dist/Checkbox/CheckboxBase.js +1 -1
  4. package/dist/Combobox/ComboboxBase.js +1 -1
  5. package/dist/Combobox.d.ts +5 -2
  6. package/dist/Combobox.js +105 -72
  7. package/dist/{ComboboxBase-Dn8Lz9mG.js → ComboboxBase-qX-mQhT6.js} +2 -2
  8. package/dist/ControlGroup/ControlGroupSelect.d.ts +3 -2
  9. package/dist/ControlGroup/ControlGroupSelect.js +79 -71
  10. package/dist/DateTimePicker/DateTimeDisplayInput.js +1 -1
  11. package/dist/DateTimePicker.js +1 -1
  12. package/dist/Icons/AnalyzeIcon.d.ts +1 -1
  13. package/dist/Icons/AnalyzeIcon.js +5 -6
  14. package/dist/Icons/AnnotationsIcon.d.ts +1 -1
  15. package/dist/Icons/AnnotationsIcon.js +5 -6
  16. package/dist/Icons/ApprovedIcon.d.ts +1 -1
  17. package/dist/Icons/ApprovedIcon.js +5 -6
  18. package/dist/Icons/ArrowDownIcon.d.ts +1 -1
  19. package/dist/Icons/ArrowDownIcon.js +5 -6
  20. package/dist/Icons/ArrowUpIcon.d.ts +1 -1
  21. package/dist/Icons/ArrowUpIcon.js +5 -6
  22. package/dist/Icons/BoxToolIcon.d.ts +1 -1
  23. package/dist/Icons/BoxToolIcon.js +5 -6
  24. package/dist/Icons/CalendarIcon.d.ts +1 -1
  25. package/dist/Icons/CalendarIcon.js +5 -6
  26. package/dist/Icons/CheckCircleIcon.d.ts +1 -1
  27. package/dist/Icons/CheckCircleIcon.js +5 -6
  28. package/dist/Icons/CheckSquareIcon.d.ts +1 -1
  29. package/dist/Icons/CheckSquareIcon.js +5 -6
  30. package/dist/Icons/CheckmarkIcon.d.ts +1 -1
  31. package/dist/Icons/CheckmarkIcon.js +6 -7
  32. package/dist/Icons/ChevronDownIcon.d.ts +1 -1
  33. package/dist/Icons/ChevronDownIcon.js +5 -6
  34. package/dist/Icons/ChevronUpIcon.d.ts +1 -1
  35. package/dist/Icons/ChevronUpIcon.js +5 -6
  36. package/dist/Icons/ClockIcon.d.ts +1 -1
  37. package/dist/Icons/ClockIcon.js +5 -6
  38. package/dist/Icons/CloseCircleIcon.d.ts +1 -1
  39. package/dist/Icons/CloseCircleIcon.js +5 -6
  40. package/dist/Icons/CloseIcon.d.ts +1 -1
  41. package/dist/Icons/CloseIcon.js +5 -6
  42. package/dist/Icons/Crosshairs2Icon.d.ts +1 -1
  43. package/dist/Icons/Crosshairs2Icon.js +5 -6
  44. package/dist/Icons/CrosshairsIcon.d.ts +1 -1
  45. package/dist/Icons/CrosshairsIcon.js +5 -6
  46. package/dist/Icons/DashboardIcon.d.ts +1 -1
  47. package/dist/Icons/DashboardIcon.js +5 -6
  48. package/dist/Icons/DatabaseIcon.d.ts +1 -1
  49. package/dist/Icons/DatabaseIcon.js +5 -6
  50. package/dist/Icons/DeleteIcon.d.ts +1 -1
  51. package/dist/Icons/DeleteIcon.js +5 -6
  52. package/dist/Icons/DurationIcon.d.ts +1 -1
  53. package/dist/Icons/DurationIcon.js +5 -6
  54. package/dist/Icons/EditIcon.d.ts +1 -1
  55. package/dist/Icons/EditIcon.js +5 -6
  56. package/dist/Icons/EmailIcon.d.ts +1 -1
  57. package/dist/Icons/EmailIcon.js +5 -6
  58. package/dist/Icons/EraserIcon.d.ts +1 -1
  59. package/dist/Icons/EraserIcon.js +8 -9
  60. package/dist/Icons/ErrorIcon.d.ts +1 -1
  61. package/dist/Icons/ErrorIcon.js +5 -6
  62. package/dist/Icons/EyeClosedIcon.d.ts +1 -1
  63. package/dist/Icons/EyeClosedIcon.js +5 -6
  64. package/dist/Icons/EyeClosedIcon2.d.ts +1 -1
  65. package/dist/Icons/EyeClosedIcon2.js +5 -6
  66. package/dist/Icons/EyeOpenIcon.d.ts +1 -1
  67. package/dist/Icons/EyeOpenIcon.js +5 -6
  68. package/dist/Icons/FileDownloadIcon.d.ts +1 -1
  69. package/dist/Icons/FileDownloadIcon.js +5 -6
  70. package/dist/Icons/GoToFirstIcon.d.ts +1 -1
  71. package/dist/Icons/GoToFirstIcon.js +5 -6
  72. package/dist/Icons/GoToLastIcon.d.ts +1 -1
  73. package/dist/Icons/GoToLastIcon.js +5 -6
  74. package/dist/Icons/HarmonicCursorsIcon.d.ts +1 -1
  75. package/dist/Icons/HarmonicCursorsIcon.js +5 -6
  76. package/dist/Icons/IconBase.d.ts +2 -1
  77. package/dist/Icons/IconBase.js +26 -26
  78. package/dist/Icons/InfoIcon.d.ts +1 -1
  79. package/dist/Icons/InfoIcon.js +5 -6
  80. package/dist/Icons/KeyboardIcon.d.ts +1 -1
  81. package/dist/Icons/KeyboardIcon.js +5 -6
  82. package/dist/Icons/LabelIcon.d.ts +1 -1
  83. package/dist/Icons/LabelIcon.js +5 -6
  84. package/dist/Icons/LassoIcon.d.ts +1 -1
  85. package/dist/Icons/LassoIcon.js +5 -6
  86. package/dist/Icons/LineToolIcon.d.ts +1 -1
  87. package/dist/Icons/LineToolIcon.js +5 -6
  88. package/dist/Icons/LiveViewIcon.d.ts +1 -1
  89. package/dist/Icons/LiveViewIcon.js +5 -6
  90. package/dist/Icons/LoaderIcon.d.ts +1 -1
  91. package/dist/Icons/LoaderIcon.js +10 -11
  92. package/dist/Icons/LocationIcon.d.ts +1 -1
  93. package/dist/Icons/LocationIcon.js +5 -6
  94. package/dist/Icons/LogoutIcon.d.ts +1 -1
  95. package/dist/Icons/LogoutIcon.js +5 -6
  96. package/dist/Icons/MaximizeIcon.d.ts +1 -1
  97. package/dist/Icons/MaximizeIcon.js +5 -6
  98. package/dist/Icons/MeasureIcon.d.ts +1 -1
  99. package/dist/Icons/MeasureIcon.js +5 -6
  100. package/dist/Icons/MessagesIcon.d.ts +1 -1
  101. package/dist/Icons/MessagesIcon.js +5 -6
  102. package/dist/Icons/MetadataIcon.d.ts +1 -1
  103. package/dist/Icons/MetadataIcon.js +5 -6
  104. package/dist/Icons/MinimizeIcon.d.ts +1 -1
  105. package/dist/Icons/MinimizeIcon.js +5 -6
  106. package/dist/Icons/MinusIcon.d.ts +1 -1
  107. package/dist/Icons/MinusIcon.js +5 -6
  108. package/dist/Icons/OntologyIcon.d.ts +1 -1
  109. package/dist/Icons/OntologyIcon.js +5 -6
  110. package/dist/Icons/PanelIconClose.d.ts +1 -1
  111. package/dist/Icons/PanelIconClose.js +5 -6
  112. package/dist/Icons/PanelIconOpen.d.ts +1 -1
  113. package/dist/Icons/PanelIconOpen.js +5 -6
  114. package/dist/Icons/PauseIcon.d.ts +1 -1
  115. package/dist/Icons/PauseIcon.js +5 -6
  116. package/dist/Icons/PlayIcon.d.ts +1 -1
  117. package/dist/Icons/PlayIcon.js +5 -6
  118. package/dist/Icons/PlusIcon.d.ts +1 -1
  119. package/dist/Icons/PlusIcon.js +5 -6
  120. package/dist/Icons/PolygonIcon.d.ts +1 -1
  121. package/dist/Icons/PolygonIcon.js +5 -6
  122. package/dist/Icons/PrinterIcon.d.ts +1 -1
  123. package/dist/Icons/PrinterIcon.js +5 -6
  124. package/dist/Icons/ProgressCheckIcon.d.ts +1 -1
  125. package/dist/Icons/ProgressCheckIcon.js +5 -6
  126. package/dist/Icons/ResetIcon.d.ts +1 -1
  127. package/dist/Icons/ResetIcon.js +5 -6
  128. package/dist/Icons/ReviewedIcon.d.ts +1 -1
  129. package/dist/Icons/ReviewedIcon.js +5 -6
  130. package/dist/Icons/ScissorsIcon.d.ts +1 -1
  131. package/dist/Icons/ScissorsIcon.js +5 -6
  132. package/dist/Icons/SearchIcon.d.ts +1 -1
  133. package/dist/Icons/SearchIcon.js +5 -6
  134. package/dist/Icons/SettingsIcon.d.ts +1 -1
  135. package/dist/Icons/SettingsIcon.js +5 -6
  136. package/dist/Icons/SortAscendingIcon.d.ts +1 -1
  137. package/dist/Icons/SortAscendingIcon.js +5 -6
  138. package/dist/Icons/SortAtoZIcon.d.ts +1 -1
  139. package/dist/Icons/SortAtoZIcon.js +5 -6
  140. package/dist/Icons/SortDescendingIcon.d.ts +1 -1
  141. package/dist/Icons/SortDescendingIcon.js +5 -6
  142. package/dist/Icons/SortZtoAIcon.d.ts +1 -1
  143. package/dist/Icons/SortZtoAIcon.js +5 -6
  144. package/dist/Icons/SparklesIcon.d.ts +1 -1
  145. package/dist/Icons/SparklesIcon.js +5 -6
  146. package/dist/Icons/StackIcon.d.ts +1 -1
  147. package/dist/Icons/StackIcon.js +5 -6
  148. package/dist/Icons/StarIcon.d.ts +1 -1
  149. package/dist/Icons/StarIcon.js +5 -6
  150. package/dist/Icons/TrashIcon.d.ts +1 -1
  151. package/dist/Icons/TrashIcon.js +5 -6
  152. package/dist/Icons/UndoIcon.d.ts +1 -1
  153. package/dist/Icons/UndoIcon.js +5 -6
  154. package/dist/Icons/UploadIcon.d.ts +1 -1
  155. package/dist/Icons/UploadIcon.js +5 -6
  156. package/dist/Icons/User2Icon.d.ts +1 -1
  157. package/dist/Icons/User2Icon.js +5 -6
  158. package/dist/Icons/UserIcon.d.ts +1 -1
  159. package/dist/Icons/UserIcon.js +5 -6
  160. package/dist/Icons/WarningIcon.d.ts +1 -1
  161. package/dist/Icons/WarningIcon.js +5 -6
  162. package/dist/Icons/ZoomAllIcon.d.ts +1 -1
  163. package/dist/Icons/ZoomAllIcon.js +5 -6
  164. package/dist/Icons/ZoomXIcon.d.ts +1 -1
  165. package/dist/Icons/ZoomXIcon.js +5 -6
  166. package/dist/Icons/ZoomYIcon.d.ts +1 -1
  167. package/dist/Icons/ZoomYIcon.js +5 -6
  168. package/dist/Input.d.ts +1 -1
  169. package/dist/Input.js +95 -90
  170. package/dist/InputNumeric.d.ts +1 -1
  171. package/dist/InputNumeric.js +70 -65
  172. package/dist/MultiSelect/MultiSelectBase.d.ts +6 -3
  173. package/dist/MultiSelect/MultiSelectBase.js +153 -141
  174. package/dist/MultiSelect.d.ts +3 -2
  175. package/dist/MultiSelect.js +12 -11
  176. package/dist/Select.d.ts +2 -1
  177. package/dist/Select.js +90 -81
  178. package/dist/Switch/SwitchBase.js +1 -1
  179. package/dist/Textarea.d.ts +1 -1
  180. package/dist/Textarea.js +54 -49
  181. package/dist/Toggle/ToggleBase.js +1 -1
  182. package/dist/ToggleGroup/ToggleGroupBase.js +5 -2
  183. package/dist/hooks/useControllableState.d.ts +6 -1
  184. package/dist/hooks/useControllableState.d.ts.map +1 -1
  185. package/dist/hooks/useControllableState.js +2 -2
  186. package/dist/hooks/useUncontrolledState.d.ts +9 -0
  187. package/dist/hooks/useUncontrolledState.d.ts.map +1 -0
  188. package/dist/hooks/useUncontrolledState.js +16 -0
  189. package/dist/index.d.ts +1 -0
  190. package/dist/index.d.ts.map +1 -1
  191. package/dist/primitives/select.d.ts +6 -1
  192. package/dist/primitives/select.d.ts.map +1 -1
  193. package/dist/primitives/select.js +90 -38
  194. package/dist/styles/spectral.css +1 -1
  195. package/dist/utils/dropdownPositioning.d.ts +13 -0
  196. package/dist/utils/dropdownPositioning.d.ts.map +1 -0
  197. package/dist/utils/dropdownPositioning.js +43 -0
  198. package/dist/utils/dropdownPositioning.test.d.ts +2 -0
  199. package/dist/utils/dropdownPositioning.test.d.ts.map +1 -0
  200. package/dist/utils/dropdownPositioning.test.js +21 -0
  201. package/dist/utils/formFieldUtils.d.ts +2 -0
  202. package/dist/utils/formFieldUtils.d.ts.map +1 -1
  203. package/dist/utils/formFieldUtils.js +18 -15
  204. package/package.json +1 -1
@@ -6,18 +6,20 @@ import { CloseIcon as n } from "../Icons/CloseIcon.js";
6
6
  import { LoaderIcon as r } from "../Icons/LoaderIcon.js";
7
7
  import { SearchIcon as i } from "../Icons/SearchIcon.js";
8
8
  import { t as a } from "../twUtils-VNWgstKL.js";
9
- import { ErrorMessage as o } from "../utils/formFieldUtils.js";
10
- import { a as s, i as c, n as l, r as u } from "../dist-BtdmHAzK.js";
11
- import { useCallback as d, useEffect as f, useId as p, useMemo as m, useRef as ee, useState as h } from "react";
12
- import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
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";
13
15
  //#region src/components/MultiSelect/MultiSelectBase.tsx
14
- var te = "h-4 w-4", y = (e) => ({
16
+ var v = "h-4 w-4", y = (e) => ({
15
17
  error: "border-danger hover:border-danger focus-visible:border-danger focus-visible:ring-danger",
16
18
  loading: "cursor-wait border-input-border--disabled",
17
19
  disabled: "cursor-not-allowed opacity-50 border-input-border--disabled bg-input-bg--disabled",
18
20
  default: ""
19
- })[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), x = () => a("max-h-80 rounded-lg shadow-lg z-50 overflow-hidden border border-input-border bg-input-bg", "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)"), S = (e, t, n, r, i, a, o, s, c) => {
20
- let [l, u] = h(-1), f = m(() => {
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) => {
22
+ let [l, u] = h(-1), d = m(() => {
21
23
  let t = [];
22
24
  return o && t.push({ type: "search" }), s && t.push({ type: "select-all" }), e.forEach((e, n) => {
23
25
  e.disabled || t.push({
@@ -31,49 +33,49 @@ var te = "h-4 w-4", y = (e) => ({
31
33
  o,
32
34
  s,
33
35
  c
34
- ]), p = d((e) => {
35
- e < 0 || e >= f.length || f[e].type === "search" && a.current?.focus();
36
- }, [f, a]);
36
+ ]), f = p((e) => {
37
+ e < 0 || e >= d.length || d[e].type === "search" && a.current?.focus();
38
+ }, [d, a]);
37
39
  return {
38
40
  focusedIndex: l,
39
41
  setFocusedIndex: u,
40
- handleKeyDown: d((e) => {
41
- let a = l >= 0 && l < f.length ? f[l] : null;
42
+ handleKeyDown: p((e) => {
43
+ let a = l >= 0 && l < d.length ? d[l] : null;
42
44
  if (e.key === " " && a?.type === "search" || e.key === "Enter" && a?.type === "search") return;
43
45
  let o = {
44
46
  ArrowDown: () => {
45
47
  e.preventDefault();
46
- let t = Math.min(l + 1, f.length - 1);
47
- u(t), p(t);
48
+ let t = Math.min(l + 1, d.length - 1);
49
+ u(t), f(t);
48
50
  },
49
51
  ArrowUp: () => {
50
52
  e.preventDefault();
51
53
  let t = Math.max(l - 1, 0);
52
- u(t), p(t);
54
+ u(t), f(t);
53
55
  },
54
56
  Tab: () => {
55
57
  if (e.shiftKey) if (l <= 0) n();
56
58
  else {
57
59
  e.preventDefault();
58
60
  let t = l - 1;
59
- u(t), p(t);
61
+ u(t), f(t);
60
62
  }
61
- else if (l >= f.length - 1) n();
63
+ else if (l >= d.length - 1) n();
62
64
  else {
63
65
  e.preventDefault();
64
66
  let t = l + 1;
65
- u(t), p(t);
67
+ u(t), f(t);
66
68
  }
67
69
  },
68
70
  Enter: () => {
69
- if (e.preventDefault(), l >= 0 && l < f.length) {
70
- let e = f[l];
71
+ if (e.preventDefault(), l >= 0 && l < d.length) {
72
+ let e = d[l];
71
73
  e.type === "select-all" ? i() : e.type === "clear-all" ? t() : e.type === "option" && r(e.value);
72
74
  }
73
75
  },
74
76
  " ": () => {
75
- if (e.preventDefault(), l >= 0 && l < f.length) {
76
- let e = f[l];
77
+ if (e.preventDefault(), l >= 0 && l < d.length) {
78
+ let e = d[l];
77
79
  e.type === "select-all" ? i() : e.type === "clear-all" ? t() : e.type === "option" && r(e.value);
78
80
  }
79
81
  },
@@ -83,92 +85,96 @@ var te = "h-4 w-4", y = (e) => ({
83
85
  }[e.key];
84
86
  o && o();
85
87
  }, [
86
- f,
88
+ d,
87
89
  l,
88
90
  r,
89
91
  i,
90
92
  t,
91
93
  n,
92
- p
94
+ f
93
95
  ]),
94
- getOptionFocusIndex: d((e) => {
95
- if (l < 0 || l >= f.length) return !1;
96
- let t = f[l];
96
+ getOptionFocusIndex: p((e) => {
97
+ if (l < 0 || l >= d.length) return !1;
98
+ let t = d[l];
97
99
  return t.type === "option" && t.index === e;
98
- }, [l, f]),
99
- isSearchFocused: m(() => l < 0 || l >= f.length ? !1 : f[l].type === "search", [l, f]),
100
- isSelectAllFocused: m(() => l < 0 || l >= f.length ? !1 : f[l].type === "select-all", [l, f]),
101
- isClearAllFocused: m(() => l < 0 || l >= f.length ? !1 : f[l].type === "clear-all", [l, f])
100
+ }, [l, d]),
101
+ isSearchFocused: m(() => l < 0 || l >= d.length ? !1 : d[l].type === "search", [l, d]),
102
+ 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])
102
104
  };
103
- }, C = ({ className: y, clearAllLabel: C = "Clear all", closeOnSelect: w = !1, emptyMessage: ne = "No options found", errorMessage: T, id: re, label: ie, loadingMessage: ae = "Loading options…", maxCount: E = 3, name: D, onChange: O, options: k = [], placeholder: oe = "Select options", ref: se, searchPlaceholder: ce = "Search options…", selectAllLabel: le = "Select all", showClearAll: ue = !0, showSearch: A = !0, showSelectAll: j = !0, sortAlphabetically: M = !1, state: N = "default", value: P = [], "aria-label": de, "aria-describedby": fe, ...F }) => {
104
- let I = p(), L = re ?? `${D}-${I}`, R = `${L}-listbox`, z = `${L}-error`, [B, V] = h(!1), [H, pe] = h(""), U = ee(null), W = F.disabled ?? N === "disabled", me = N === "loading", he = N === "error", G = m(() => {
105
- let e = k.filter((e) => e.label.toLowerCase().includes(H.toLowerCase()));
106
- return M && (e = [...e].sort((e, t) => e.label.localeCompare(t.label))), e;
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;
107
113
  }, [
108
- k,
109
- H,
110
- M
111
- ]), K = m(() => {
114
+ E,
115
+ B,
116
+ A
117
+ ]), q = m(() => {
112
118
  let e = {}, t = [];
113
- return G.forEach((n) => {
119
+ return K.forEach((n) => {
114
120
  n.group ? (e[n.group] || (e[n.group] = []), e[n.group].push(n)) : t.push(n);
115
121
  }), {
116
122
  groups: e,
117
123
  ungrouped: t,
118
124
  hasGroups: Object.keys(e).length > 0
119
125
  };
120
- }, [G]), q = d((e) => {
121
- k.find((t) => t.value === e)?.disabled || (O(P.includes(e) ? P.filter((t) => t !== e) : [...P, e]), w && V(!1));
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));
122
128
  }, [
123
- k,
124
- P,
125
- O,
126
- w
127
- ]), J = d(() => {
128
- let e = k.filter((e) => !e.disabled).map((e) => e.value);
129
- e.every((e) => P.includes(e)) ? O([]) : O(e);
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);
130
136
  }, [
131
- k,
132
- P,
133
- O
134
- ]), Y = d(() => {
135
- O([]);
136
- }, [O]), X = m(() => k.filter((e) => !e.disabled).map((e) => e.value), [k]), ge = X.length > 0 && X.every((e) => P.includes(e)), { getOptionFocusIndex: _e, handleKeyDown: ve, isSelectAllFocused: Z, setFocusedIndex: Q } = S(G, Y, () => V(!1), q, J, U, A, j, !1);
137
- f(() => {
138
- Q(B ? 0 : -1);
139
- }, [B, Q]);
140
- let ye = d((e) => {
141
- pe(e.target.value);
142
- }, []), be = () => {
143
- if (P.length === 0) return /* @__PURE__ */ _("span", {
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", {
144
150
  className: "min-h-8 flex items-center text-input-text-placeholder",
145
- children: oe
151
+ children: D
146
152
  });
147
- let e = P.slice(0, E), t = P.length - E;
148
- return /* @__PURE__ */ v("div", {
153
+ let e = V.slice(0, w), t = V.length - w;
154
+ return /* @__PURE__ */ _("div", {
149
155
  className: "gap-1 flex flex-wrap items-center overflow-hidden",
150
156
  children: [e.map((e) => {
151
- let t = k.find((t) => t.value === e);
152
- return t ? /* @__PURE__ */ v("span", {
157
+ let t = E.find((t) => t.value === e);
158
+ return t ? /* @__PURE__ */ _("span", {
153
159
  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",
154
- children: [/* @__PURE__ */ _("span", {
160
+ children: [/* @__PURE__ */ g("span", {
155
161
  className: "truncate",
156
162
  children: t.label
157
- }), /* @__PURE__ */ _("button", {
163
+ }), /* @__PURE__ */ g("button", {
158
164
  "aria-label": `Remove ${t.label}`,
159
165
  className: "hover:text-danger rounded-sm cursor-pointer",
160
166
  "data-testid": "spectral-multiselect-remove-item-button",
161
167
  onClick: (t) => {
162
- t.preventDefault(), t.stopPropagation(), q(e);
168
+ t.preventDefault(), t.stopPropagation(), J(e);
163
169
  },
164
170
  onPointerDown: (e) => {
165
171
  e.stopPropagation();
166
172
  },
167
173
  type: "button",
168
- children: /* @__PURE__ */ _(n, { size: 12 })
174
+ children: /* @__PURE__ */ g(n, { size: 12 })
169
175
  })]
170
176
  }, e) : null;
171
- }), t > 0 && /* @__PURE__ */ v("span", {
177
+ }), t > 0 && /* @__PURE__ */ _("span", {
172
178
  className: "text-input-text-secondary text-xs py-1 flex items-center",
173
179
  children: [
174
180
  "+",
@@ -178,142 +184,148 @@ var te = "h-4 w-4", y = (e) => ({
178
184
  })]
179
185
  });
180
186
  }, $ = (t, n) => {
181
- let r = P.includes(t.value);
182
- return /* @__PURE__ */ v("button", {
183
- 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", _e(n) && "bg-input-bg--hover", r && "font-medium text-input-text"),
187
+ let r = V.includes(t.value);
188
+ 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"),
184
190
  disabled: t.disabled,
185
- onClick: () => q(t.value),
191
+ onClick: () => J(t.value),
186
192
  type: "button",
187
- children: [/* @__PURE__ */ _("div", {
193
+ children: [/* @__PURE__ */ g("div", {
188
194
  "data-testid": "spectral-multiselect-selected-indicator",
189
195
  className: a("w-4 h-4 rounded flex items-center justify-center border border-input-border", r && "bg-primary border-primary"),
190
- children: r && /* @__PURE__ */ _(e, { size: 12 })
191
- }), /* @__PURE__ */ _("span", { children: t.label })]
196
+ children: r && /* @__PURE__ */ g(e, { size: 12 })
197
+ }), /* @__PURE__ */ g("span", { children: t.label })]
192
198
  }, t.value);
193
- }, xe = () => ({
199
+ }, je = () => ({
194
200
  "--multiselect-border-radius": "0.5rem",
195
201
  "--multiselect-trigger-height": "3rem",
196
202
  "--multiselect-dropdown-max-height": "20rem"
197
203
  });
198
- return /* @__PURE__ */ v("div", {
204
+ return /* @__PURE__ */ _("div", {
199
205
  className: "w-full",
200
206
  "data-testid": "spectral-multiselect-root",
201
- children: [/* @__PURE__ */ _(c, {
202
- open: B,
203
- onOpenChange: V,
204
- children: /* @__PURE__ */ v("div", {
207
+ children: [/* @__PURE__ */ g(d, {
208
+ open: R,
209
+ onOpenChange: z,
210
+ children: /* @__PURE__ */ _("div", {
205
211
  className: "relative",
206
212
  "data-testid": "spectral-multiselect-wrapper",
207
- onKeyDown: B ? ve : void 0,
213
+ onKeyDown: R ? De : void 0,
208
214
  role: "none",
209
215
  children: [
210
- /* @__PURE__ */ _(s, {
216
+ /* @__PURE__ */ g(u, {
211
217
  asChild: !0,
212
- children: /* @__PURE__ */ v("button", {
213
- "aria-controls": B ? R : void 0,
214
- "aria-describedby": [he ? z : null, fe].filter(Boolean).join(" ") || void 0,
215
- "aria-expanded": B,
216
- "aria-label": de ?? ie,
217
- className: b(N, B, y),
218
- "data-state": N,
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,
219
225
  "data-testid": "spectral-multiselect-trigger",
220
226
  disabled: W,
221
- id: L,
222
- name: D,
223
- ref: se,
227
+ id: F,
228
+ name: T,
229
+ ref: pe,
224
230
  role: "combobox",
225
- style: xe(),
231
+ style: je(),
226
232
  type: "button",
227
- ...F,
228
- children: [/* @__PURE__ */ _("div", {
233
+ ...N,
234
+ children: [/* @__PURE__ */ g("div", {
229
235
  className: "min-w-0 flex-1 overflow-hidden",
230
236
  "data-testid": "spectral-multiselect-selected-items",
231
- children: be()
232
- }), /* @__PURE__ */ _("div", {
237
+ children: Ae()
238
+ }), /* @__PURE__ */ g("div", {
233
239
  className: "gap-2 ml-2 flex shrink-0 items-center",
234
- children: /* @__PURE__ */ _(t, {
235
- className: a("text-input-icon transition-transform duration-200", B && "rotate-180"),
240
+ children: /* @__PURE__ */ g(t, {
241
+ className: a("text-input-icon transition-transform duration-200", R && "rotate-180"),
236
242
  size: 20
237
243
  })
238
244
  })]
239
245
  })
240
246
  }),
241
- ue && P.length > 0 && /* @__PURE__ */ _("button", {
247
+ ge && V.length > 0 && /* @__PURE__ */ g("button", {
242
248
  "aria-label": "Clear all selections",
243
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",
244
250
  "data-testid": "spectral-multiselect-clear-all-button",
245
251
  disabled: W,
246
252
  onClick: (e) => {
247
- e.stopPropagation(), Y(), document.getElementById(L)?.focus();
253
+ e.stopPropagation(), X(), document.getElementById(F)?.focus();
248
254
  },
249
255
  type: "button",
250
- children: /* @__PURE__ */ _(n, { size: 12 })
256
+ children: /* @__PURE__ */ g(n, { size: 12 })
251
257
  }),
252
- /* @__PURE__ */ _(u, { children: /* @__PURE__ */ _(l, {
258
+ /* @__PURE__ */ g(ee, { children: /* @__PURE__ */ g(f, {
253
259
  align: "start",
254
260
  avoidCollisions: !0,
255
- className: x(),
261
+ className: ae(),
256
262
  collisionPadding: 10,
263
+ "data-dropdown-width-mode": G,
264
+ "data-dropdown-width-value": G === "custom" ? S : void 0,
257
265
  "data-testid": "spectral-multiselect-dropdown",
258
266
  onOpenAutoFocus: (e) => {
259
- e.preventDefault(), A && U.current?.focus();
267
+ e.preventDefault(), O && U.current?.focus();
260
268
  },
261
269
  side: "bottom",
262
270
  sideOffset: 4,
263
- style: { width: "var(--radix-popover-trigger-width)" },
264
- children: /* @__PURE__ */ v("div", {
271
+ ref: be,
272
+ style: {
273
+ width: we,
274
+ ...ye
275
+ },
276
+ children: /* @__PURE__ */ _("div", {
265
277
  className: "p-1",
266
- children: [A && /* @__PURE__ */ v("div", {
278
+ children: [O && /* @__PURE__ */ _("div", {
267
279
  className: "mb-2 relative",
268
- children: [/* @__PURE__ */ _(i, { className: a(te, "left-3 text-input-icon absolute top-1/2 -translate-y-1/2") }), /* @__PURE__ */ _("input", {
280
+ children: [/* @__PURE__ */ g(i, { className: a(v, "left-3 text-input-icon absolute top-1/2 -translate-y-1/2") }), /* @__PURE__ */ g("input", {
269
281
  "aria-label": "Search options",
270
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",
271
283
  "data-testid": "spectral-multiselect-search-input",
272
- onChange: ye,
273
- placeholder: ce,
284
+ onChange: ke,
285
+ placeholder: me,
274
286
  ref: U,
275
287
  type: "text",
276
- value: H
288
+ value: B
277
289
  })]
278
- }), /* @__PURE__ */ _("div", {
290
+ }), /* @__PURE__ */ g("div", {
279
291
  className: "max-h-64 overflow-y-auto",
280
- id: R,
292
+ id: I,
281
293
  role: "listbox",
282
294
  "aria-multiselectable": "true",
283
- children: me ? /* @__PURE__ */ v("div", {
295
+ children: Se ? /* @__PURE__ */ _("div", {
284
296
  "data-testid": "spectral-multiselect-loading",
285
297
  className: "gap-2 py-6 text-sm text-input-text-secondary flex items-center justify-center",
286
- children: [/* @__PURE__ */ _(r, {}), ae]
287
- }) : G.length === 0 ? /* @__PURE__ */ _("div", {
298
+ children: [/* @__PURE__ */ g(r, {}), de]
299
+ }) : K.length === 0 ? /* @__PURE__ */ g("div", {
288
300
  "data-testid": "spectral-multiselect-empty-message",
289
301
  className: "py-6 text-sm text-input-text-secondary text-center",
290
- children: ne
291
- }) : /* @__PURE__ */ v(g, { children: [
292
- j && /* @__PURE__ */ v("div", {
302
+ children: se
303
+ }) : /* @__PURE__ */ _(ie, { children: [
304
+ k && /* @__PURE__ */ _("div", {
293
305
  className: "mb-1",
294
- children: [/* @__PURE__ */ _("button", {
295
- 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", Z && "bg-input-bg--hover"),
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"),
296
308
  "data-testid": "spectral-multiselect-select-all-button",
297
- onClick: J,
309
+ onClick: Y,
298
310
  type: "button",
299
- children: ge ? C : le
300
- }), /* @__PURE__ */ _("div", { className: "mx-3 my-1 h-px bg-input-border" })]
311
+ children: Te ? y : he
312
+ }), /* @__PURE__ */ g("div", { className: "mx-3 my-1 h-px bg-input-border" })]
301
313
  }),
302
- K.ungrouped.length > 0 && /* @__PURE__ */ _("div", {
314
+ q.ungrouped.length > 0 && /* @__PURE__ */ g("div", {
303
315
  className: "mb-1",
304
- children: K.ungrouped.map((e, t) => $(e, t))
316
+ children: q.ungrouped.map((e, t) => $(e, t))
305
317
  }),
306
- Object.entries(K.groups).map(([e, t]) => /* @__PURE__ */ v("div", {
318
+ Object.entries(q.groups).map(([e, t]) => /* @__PURE__ */ _("div", {
307
319
  className: "mb-1",
308
320
  "data-testid": "spectral-multiselect-group",
309
321
  children: [
310
- (K.ungrouped.length > 0 || Object.keys(K.groups).indexOf(e) > 0) && /* @__PURE__ */ _("div", { className: "mx-3 my-1 h-px bg-input-border" }),
311
- /* @__PURE__ */ _("div", {
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", {
312
324
  "data-testid": "spectral-multiselect-group-name",
313
325
  className: "px-3 py-1 text-xs font-semibold text-input-text-secondary tracking-wide uppercase",
314
326
  children: e
315
327
  }),
316
- t.map((e, t) => $(e, G.indexOf(e)))
328
+ t.map((e, t) => $(e, K.indexOf(e)))
317
329
  ]
318
330
  }, e))
319
331
  ] })
@@ -322,13 +334,13 @@ var te = "h-4 w-4", y = (e) => ({
322
334
  }) })
323
335
  ]
324
336
  })
325
- }), N === "error" && T && /* @__PURE__ */ _(o, {
337
+ }), j === "error" && C && /* @__PURE__ */ g(o, {
326
338
  dataTestId: "spectral-multiselect-error-message",
327
- id: z,
328
- message: T
339
+ id: L,
340
+ message: C
329
341
  })]
330
342
  });
331
343
  };
332
- C.displayName = "MultiSelectBase";
344
+ x.displayName = "MultiSelectBase";
333
345
  //#endregion
334
- export { C as MultiSelectBase };
346
+ export { x as MultiSelectBase };
@@ -1,6 +1,7 @@
1
1
  import { Ref } from 'react';
2
2
  import { MultiSelectBaseProps } from './MultiSelectBase';
3
- export interface MultiSelectProps extends Omit<MultiSelectBaseProps, 'onChange' | 'options' | 'value'> {
3
+ export interface MultiSelectProps extends Omit<MultiSelectBaseProps, 'defaultValue' | 'onChange' | 'options' | 'value'> {
4
+ defaultValue?: string[];
4
5
  emptyText?: string;
5
6
  loading?: boolean;
6
7
  onSearchChange?: (search: string) => void;
@@ -15,7 +16,7 @@ export interface MultiSelectProps extends Omit<MultiSelectBaseProps, 'onChange'
15
16
  value?: string[];
16
17
  }
17
18
  export declare const MultiSelect: {
18
- ({ emptyText, loading, onValueChange, options, ref, state, value, ...props }: MultiSelectProps & {
19
+ ({ emptyText, loading, onValueChange, options, defaultValue, ref, state, value, ...props }: MultiSelectProps & {
19
20
  ref?: Ref<HTMLButtonElement>;
20
21
  }): import("react/jsx-runtime").JSX.Element;
21
22
  displayName: string;
@@ -3,23 +3,24 @@ 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, ref: o, state: s, value: c = [], ...l }) => {
7
- let u = a.map((e) => ({
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) => ({
8
8
  disabled: e.disabled ?? !1,
9
9
  group: e.group,
10
10
  label: e.label,
11
11
  value: e.value
12
- })), d = r ? "loading" : s;
12
+ })), f = r ? "loading" : c;
13
13
  return /* @__PURE__ */ t(e, {
14
- "data-disabled": l.disabled,
15
- disabled: l.disabled,
14
+ "data-disabled": u.disabled,
15
+ defaultValue: o,
16
+ disabled: u.disabled,
16
17
  emptyMessage: n,
17
- onChange: i ?? (() => {}),
18
- options: u,
19
- ref: o,
20
- state: d,
21
- value: c,
22
- ...l
18
+ onChange: i,
19
+ options: d,
20
+ ref: s,
21
+ state: f,
22
+ value: l,
23
+ ...u
23
24
  });
24
25
  };
25
26
  n.displayName = "MultiSelect";
package/dist/Select.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- import { BaseFormFieldProps, BaseOption } from './utils/formFieldUtils';
1
+ import { BaseFormFieldProps, BaseOption, DropdownWidth } from './utils/formFieldUtils';
2
2
  import { ComponentPropsWithoutRef, ReactNode, Ref } from 'react';
3
3
  type SelectOption = BaseOption;
4
4
  type Align = 'start' | 'center' | 'end';
5
5
  type Side = 'top' | 'bottom' | 'left' | 'right';
6
6
  export interface SelectProps extends Omit<ComponentPropsWithoutRef<'button'>, 'value' | 'onChange' | 'aria-disabled' | 'aria-invalid' | 'aria-required' | 'aria-describedby' | 'aria-label'>, BaseFormFieldProps {
7
7
  defaultValue?: string;
8
+ dropdownWidth?: DropdownWidth;
8
9
  emptyMessage?: ReactNode;
9
10
  id?: string;
10
11
  label?: string;