@spear-ai/spectral 1.11.0 → 1.11.2

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 (198) 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 +97 -69
  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 +2 -1
  169. package/dist/Input.js +111 -92
  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 +126 -119
  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 +83 -77
  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 +85 -36
  194. package/dist/styles/spectral.css +2 -2
  195. package/dist/utils/formFieldUtils.d.ts +11 -3
  196. package/dist/utils/formFieldUtils.d.ts.map +1 -1
  197. package/dist/utils/formFieldUtils.js +31 -16
  198. package/package.json +1 -1
@@ -6,18 +6,19 @@ 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 { 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";
13
14
  //#region src/components/MultiSelect/MultiSelectBase.tsx
14
- var te = "h-4 w-4", y = (e) => ({
15
+ var re = "h-4 w-4", y = (e) => ({
15
16
  error: "border-danger hover:border-danger focus-visible:border-danger focus-visible:ring-danger",
16
17
  loading: "cursor-wait border-input-border--disabled",
17
18
  disabled: "cursor-not-allowed opacity-50 border-input-border--disabled bg-input-bg--disabled",
18
19
  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(() => {
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(() => {
21
22
  let t = [];
22
23
  return o && t.push({ type: "search" }), s && t.push({ type: "select-all" }), e.forEach((e, n) => {
23
24
  e.disabled || t.push({
@@ -31,49 +32,49 @@ var te = "h-4 w-4", y = (e) => ({
31
32
  o,
32
33
  s,
33
34
  c
34
- ]), p = d((e) => {
35
- e < 0 || e >= f.length || f[e].type === "search" && a.current?.focus();
36
- }, [f, a]);
35
+ ]), f = p((e) => {
36
+ e < 0 || e >= d.length || d[e].type === "search" && a.current?.focus();
37
+ }, [d, a]);
37
38
  return {
38
39
  focusedIndex: l,
39
40
  setFocusedIndex: u,
40
- handleKeyDown: d((e) => {
41
- let a = l >= 0 && l < f.length ? f[l] : null;
41
+ handleKeyDown: p((e) => {
42
+ let a = l >= 0 && l < d.length ? d[l] : null;
42
43
  if (e.key === " " && a?.type === "search" || e.key === "Enter" && a?.type === "search") return;
43
44
  let o = {
44
45
  ArrowDown: () => {
45
46
  e.preventDefault();
46
- let t = Math.min(l + 1, f.length - 1);
47
- u(t), p(t);
47
+ let t = Math.min(l + 1, d.length - 1);
48
+ u(t), f(t);
48
49
  },
49
50
  ArrowUp: () => {
50
51
  e.preventDefault();
51
52
  let t = Math.max(l - 1, 0);
52
- u(t), p(t);
53
+ u(t), f(t);
53
54
  },
54
55
  Tab: () => {
55
56
  if (e.shiftKey) if (l <= 0) n();
56
57
  else {
57
58
  e.preventDefault();
58
59
  let t = l - 1;
59
- u(t), p(t);
60
+ u(t), f(t);
60
61
  }
61
- else if (l >= f.length - 1) n();
62
+ else if (l >= d.length - 1) n();
62
63
  else {
63
64
  e.preventDefault();
64
65
  let t = l + 1;
65
- u(t), p(t);
66
+ u(t), f(t);
66
67
  }
67
68
  },
68
69
  Enter: () => {
69
- if (e.preventDefault(), l >= 0 && l < f.length) {
70
- let e = f[l];
70
+ if (e.preventDefault(), l >= 0 && l < d.length) {
71
+ let e = d[l];
71
72
  e.type === "select-all" ? i() : e.type === "clear-all" ? t() : e.type === "option" && r(e.value);
72
73
  }
73
74
  },
74
75
  " ": () => {
75
- if (e.preventDefault(), l >= 0 && l < f.length) {
76
- let e = f[l];
76
+ if (e.preventDefault(), l >= 0 && l < d.length) {
77
+ let e = d[l];
77
78
  e.type === "select-all" ? i() : e.type === "clear-all" ? t() : e.type === "option" && r(e.value);
78
79
  }
79
80
  },
@@ -83,72 +84,76 @@ var te = "h-4 w-4", y = (e) => ({
83
84
  }[e.key];
84
85
  o && o();
85
86
  }, [
86
- f,
87
+ d,
87
88
  l,
88
89
  r,
89
90
  i,
90
91
  t,
91
92
  n,
92
- p
93
+ f
93
94
  ]),
94
- getOptionFocusIndex: d((e) => {
95
- if (l < 0 || l >= f.length) return !1;
96
- let t = f[l];
95
+ getOptionFocusIndex: p((e) => {
96
+ if (l < 0 || l >= d.length) return !1;
97
+ let t = d[l];
97
98
  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])
99
+ }, [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])
102
103
  };
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;
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;
107
112
  }, [
108
- k,
109
- H,
110
- M
111
- ]), K = m(() => {
113
+ E,
114
+ B,
115
+ j
116
+ ]), q = h(() => {
112
117
  let e = {}, t = [];
113
- return G.forEach((n) => {
118
+ return K.forEach((n) => {
114
119
  n.group ? (e[n.group] || (e[n.group] = []), e[n.group].push(n)) : t.push(n);
115
120
  }), {
116
121
  groups: e,
117
122
  ungrouped: t,
118
123
  hasGroups: Object.keys(e).length > 0
119
124
  };
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));
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));
122
127
  }, [
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);
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);
130
135
  }, [
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", {
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", {
144
149
  className: "min-h-8 flex items-center text-input-text-placeholder",
145
- children: oe
150
+ children: D
146
151
  });
147
- let e = P.slice(0, E), t = P.length - E;
152
+ let e = V.slice(0, w), t = V.length - w;
148
153
  return /* @__PURE__ */ v("div", {
149
154
  className: "gap-1 flex flex-wrap items-center overflow-hidden",
150
155
  children: [e.map((e) => {
151
- let t = k.find((t) => t.value === e);
156
+ let t = E.find((t) => t.value === e);
152
157
  return t ? /* @__PURE__ */ v("span", {
153
158
  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
159
  children: [/* @__PURE__ */ _("span", {
@@ -159,7 +164,7 @@ var te = "h-4 w-4", y = (e) => ({
159
164
  className: "hover:text-danger rounded-sm cursor-pointer",
160
165
  "data-testid": "spectral-multiselect-remove-item-button",
161
166
  onClick: (t) => {
162
- t.preventDefault(), t.stopPropagation(), q(e);
167
+ t.preventDefault(), t.stopPropagation(), J(e);
163
168
  },
164
169
  onPointerDown: (e) => {
165
170
  e.stopPropagation();
@@ -178,11 +183,11 @@ var te = "h-4 w-4", y = (e) => ({
178
183
  })]
179
184
  });
180
185
  }, $ = (t, n) => {
181
- let r = P.includes(t.value);
186
+ let r = V.includes(t.value);
182
187
  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"),
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"),
184
189
  disabled: t.disabled,
185
- onClick: () => q(t.value),
190
+ onClick: () => J(t.value),
186
191
  type: "button",
187
192
  children: [/* @__PURE__ */ _("div", {
188
193
  "data-testid": "spectral-multiselect-selected-indicator",
@@ -190,7 +195,7 @@ var te = "h-4 w-4", y = (e) => ({
190
195
  children: r && /* @__PURE__ */ _(e, { size: 12 })
191
196
  }), /* @__PURE__ */ _("span", { children: t.label })]
192
197
  }, t.value);
193
- }, xe = () => ({
198
+ }, Oe = () => ({
194
199
  "--multiselect-border-radius": "0.5rem",
195
200
  "--multiselect-trigger-height": "3rem",
196
201
  "--multiselect-dropdown-max-height": "20rem"
@@ -198,122 +203,124 @@ var te = "h-4 w-4", y = (e) => ({
198
203
  return /* @__PURE__ */ v("div", {
199
204
  className: "w-full",
200
205
  "data-testid": "spectral-multiselect-root",
201
- children: [/* @__PURE__ */ _(c, {
202
- open: B,
203
- onOpenChange: V,
206
+ children: [/* @__PURE__ */ _(u, {
207
+ open: R,
208
+ onOpenChange: z,
204
209
  children: /* @__PURE__ */ v("div", {
205
210
  className: "relative",
206
211
  "data-testid": "spectral-multiselect-wrapper",
207
- onKeyDown: B ? ve : void 0,
212
+ onKeyDown: R ? we : void 0,
208
213
  role: "none",
209
214
  children: [
210
- /* @__PURE__ */ _(s, {
215
+ /* @__PURE__ */ _(l, {
211
216
  asChild: !0,
212
217
  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
+ "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,
219
224
  "data-testid": "spectral-multiselect-trigger",
220
225
  disabled: W,
221
- id: L,
222
- name: D,
223
- ref: se,
226
+ id: F,
227
+ name: T,
228
+ ref: O,
224
229
  role: "combobox",
225
- style: xe(),
230
+ style: Oe(),
226
231
  type: "button",
227
- ...F,
232
+ ...N,
228
233
  children: [/* @__PURE__ */ _("div", {
229
234
  className: "min-w-0 flex-1 overflow-hidden",
230
235
  "data-testid": "spectral-multiselect-selected-items",
231
- children: be()
236
+ children: De()
232
237
  }), /* @__PURE__ */ _("div", {
233
238
  className: "gap-2 ml-2 flex shrink-0 items-center",
234
239
  children: /* @__PURE__ */ _(t, {
235
- className: a("text-input-icon transition-transform duration-200", B && "rotate-180"),
240
+ className: a("text-input-icon transition-transform duration-200", R && "rotate-180"),
236
241
  size: 20
237
242
  })
238
243
  })]
239
244
  })
240
245
  }),
241
- ue && P.length > 0 && /* @__PURE__ */ _("button", {
246
+ me && V.length > 0 && /* @__PURE__ */ _("button", {
242
247
  "aria-label": "Clear all selections",
243
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",
244
249
  "data-testid": "spectral-multiselect-clear-all-button",
245
250
  disabled: W,
246
251
  onClick: (e) => {
247
- e.stopPropagation(), Y(), document.getElementById(L)?.focus();
252
+ e.stopPropagation(), X(), document.getElementById(F)?.focus();
248
253
  },
249
254
  type: "button",
250
255
  children: /* @__PURE__ */ _(n, { size: 12 })
251
256
  }),
252
- /* @__PURE__ */ _(u, { children: /* @__PURE__ */ _(l, {
257
+ /* @__PURE__ */ _(f, { children: /* @__PURE__ */ _(d, {
253
258
  align: "start",
254
259
  avoidCollisions: !0,
255
- className: x(),
260
+ className: ae(),
256
261
  collisionPadding: 10,
262
+ "data-dropdown-width-mode": G,
263
+ "data-dropdown-width-value": G === "custom" ? x : void 0,
257
264
  "data-testid": "spectral-multiselect-dropdown",
258
265
  onOpenAutoFocus: (e) => {
259
- e.preventDefault(), A && U.current?.focus();
266
+ e.preventDefault(), k && U.current?.focus();
260
267
  },
261
268
  side: "bottom",
262
269
  sideOffset: 4,
263
- style: { width: "var(--radix-popover-trigger-width)" },
270
+ style: { width: xe },
264
271
  children: /* @__PURE__ */ v("div", {
265
272
  className: "p-1",
266
- children: [A && /* @__PURE__ */ v("div", {
273
+ children: [k && /* @__PURE__ */ v("div", {
267
274
  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", {
275
+ children: [/* @__PURE__ */ _(i, { className: a(re, "left-3 text-input-icon absolute top-1/2 -translate-y-1/2") }), /* @__PURE__ */ _("input", {
269
276
  "aria-label": "Search options",
270
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",
271
278
  "data-testid": "spectral-multiselect-search-input",
272
- onChange: ye,
273
- placeholder: ce,
279
+ onChange: Ee,
280
+ placeholder: fe,
274
281
  ref: U,
275
282
  type: "text",
276
- value: H
283
+ value: B
277
284
  })]
278
285
  }), /* @__PURE__ */ _("div", {
279
286
  className: "max-h-64 overflow-y-auto",
280
- id: R,
287
+ id: I,
281
288
  role: "listbox",
282
289
  "aria-multiselectable": "true",
283
- children: me ? /* @__PURE__ */ v("div", {
290
+ children: ye ? /* @__PURE__ */ v("div", {
284
291
  "data-testid": "spectral-multiselect-loading",
285
292
  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", {
293
+ children: [/* @__PURE__ */ _(r, {}), ue]
294
+ }) : K.length === 0 ? /* @__PURE__ */ _("div", {
288
295
  "data-testid": "spectral-multiselect-empty-message",
289
296
  className: "py-6 text-sm text-input-text-secondary text-center",
290
- children: ne
291
- }) : /* @__PURE__ */ v(g, { children: [
292
- j && /* @__PURE__ */ v("div", {
297
+ children: se
298
+ }) : /* @__PURE__ */ v(ne, { children: [
299
+ A && /* @__PURE__ */ v("div", {
293
300
  className: "mb-1",
294
301
  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"),
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"),
296
303
  "data-testid": "spectral-multiselect-select-all-button",
297
- onClick: J,
304
+ onClick: Y,
298
305
  type: "button",
299
- children: ge ? C : le
306
+ children: Se ? y : pe
300
307
  }), /* @__PURE__ */ _("div", { className: "mx-3 my-1 h-px bg-input-border" })]
301
308
  }),
302
- K.ungrouped.length > 0 && /* @__PURE__ */ _("div", {
309
+ q.ungrouped.length > 0 && /* @__PURE__ */ _("div", {
303
310
  className: "mb-1",
304
- children: K.ungrouped.map((e, t) => $(e, t))
311
+ children: q.ungrouped.map((e, t) => $(e, t))
305
312
  }),
306
- Object.entries(K.groups).map(([e, t]) => /* @__PURE__ */ v("div", {
313
+ Object.entries(q.groups).map(([e, t]) => /* @__PURE__ */ v("div", {
307
314
  className: "mb-1",
308
315
  "data-testid": "spectral-multiselect-group",
309
316
  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" }),
317
+ (q.ungrouped.length > 0 || Object.keys(q.groups).indexOf(e) > 0) && /* @__PURE__ */ _("div", { className: "mx-3 my-1 h-px bg-input-border" }),
311
318
  /* @__PURE__ */ _("div", {
312
319
  "data-testid": "spectral-multiselect-group-name",
313
320
  className: "px-3 py-1 text-xs font-semibold text-input-text-secondary tracking-wide uppercase",
314
321
  children: e
315
322
  }),
316
- t.map((e, t) => $(e, G.indexOf(e)))
323
+ t.map((e, t) => $(e, K.indexOf(e)))
317
324
  ]
318
325
  }, e))
319
326
  ] })
@@ -322,13 +329,13 @@ var te = "h-4 w-4", y = (e) => ({
322
329
  }) })
323
330
  ]
324
331
  })
325
- }), N === "error" && T && /* @__PURE__ */ _(o, {
332
+ }), M === "error" && S && /* @__PURE__ */ _(o, {
326
333
  dataTestId: "spectral-multiselect-error-message",
327
- id: z,
328
- message: T
334
+ id: L,
335
+ message: S
329
336
  })]
330
337
  });
331
338
  };
332
- C.displayName = "MultiSelectBase";
339
+ b.displayName = "MultiSelectBase";
333
340
  //#endregion
334
- export { C as MultiSelectBase };
341
+ export { b 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;