@brycks/core-front 0.3.1 → 0.3.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 (109) hide show
  1. package/dist/components/data/List/List.cjs +1 -1
  2. package/dist/components/data/List/List.cjs.map +1 -1
  3. package/dist/components/data/List/List.js +92 -88
  4. package/dist/components/data/List/List.js.map +1 -1
  5. package/dist/components/data/Table/Table.cjs +1 -1
  6. package/dist/components/data/Table/Table.cjs.map +1 -1
  7. package/dist/components/data/Table/Table.js +129 -125
  8. package/dist/components/data/Table/Table.js.map +1 -1
  9. package/dist/components/data/TreeView/TreeView.cjs +2 -0
  10. package/dist/components/data/TreeView/TreeView.cjs.map +1 -0
  11. package/dist/components/data/TreeView/TreeView.js +256 -0
  12. package/dist/components/data/TreeView/TreeView.js.map +1 -0
  13. package/dist/components/data/VirtualList/VirtualList.cjs +2 -0
  14. package/dist/components/data/VirtualList/VirtualList.cjs.map +1 -0
  15. package/dist/components/data/VirtualList/VirtualList.js +186 -0
  16. package/dist/components/data/VirtualList/VirtualList.js.map +1 -0
  17. package/dist/components/data.cjs +1 -1
  18. package/dist/components/data.js +21 -16
  19. package/dist/components/data.js.map +1 -1
  20. package/dist/components/feedback/Modal/Modal.cjs +1 -1
  21. package/dist/components/feedback/Modal/Modal.cjs.map +1 -1
  22. package/dist/components/feedback/Modal/Modal.js +81 -77
  23. package/dist/components/feedback/Modal/Modal.js.map +1 -1
  24. package/dist/components/form/Combobox/Combobox.cjs +7 -0
  25. package/dist/components/form/Combobox/Combobox.cjs.map +1 -0
  26. package/dist/components/form/Combobox/Combobox.js +338 -0
  27. package/dist/components/form/Combobox/Combobox.js.map +1 -0
  28. package/dist/components/form/DateRangePicker/DateRangePicker.cjs +2 -0
  29. package/dist/components/form/DateRangePicker/DateRangePicker.cjs.map +1 -0
  30. package/dist/components/form/DateRangePicker/DateRangePicker.js +372 -0
  31. package/dist/components/form/DateRangePicker/DateRangePicker.js.map +1 -0
  32. package/dist/components/form/MultiSelect/MultiSelect.cjs +2 -0
  33. package/dist/components/form/MultiSelect/MultiSelect.cjs.map +1 -0
  34. package/dist/components/form/MultiSelect/MultiSelect.js +393 -0
  35. package/dist/components/form/MultiSelect/MultiSelect.js.map +1 -0
  36. package/dist/components/form/Rating/Rating.cjs +2 -0
  37. package/dist/components/form/Rating/Rating.cjs.map +1 -0
  38. package/dist/components/form/Rating/Rating.js +163 -0
  39. package/dist/components/form/Rating/Rating.js.map +1 -0
  40. package/dist/components/form/Slider/Slider.cjs +1 -1
  41. package/dist/components/form/Slider/Slider.cjs.map +1 -1
  42. package/dist/components/form/Slider/Slider.js +120 -85
  43. package/dist/components/form/Slider/Slider.js.map +1 -1
  44. package/dist/components/form/TagInput/TagInput.cjs +2 -0
  45. package/dist/components/form/TagInput/TagInput.cjs.map +1 -0
  46. package/dist/components/form/TagInput/TagInput.js +286 -0
  47. package/dist/components/form/TagInput/TagInput.js.map +1 -0
  48. package/dist/components/form/TimePicker/TimePicker.cjs +2 -0
  49. package/dist/components/form/TimePicker/TimePicker.cjs.map +1 -0
  50. package/dist/components/form/TimePicker/TimePicker.js +328 -0
  51. package/dist/components/form/TimePicker/TimePicker.js.map +1 -0
  52. package/dist/components/form.cjs +1 -1
  53. package/dist/components/form.js +34 -22
  54. package/dist/components/form.js.map +1 -1
  55. package/dist/components/layout/Card/Card.cjs +1 -1
  56. package/dist/components/layout/Card/Card.cjs.map +1 -1
  57. package/dist/components/layout/Card/Card.js +62 -59
  58. package/dist/components/layout/Card/Card.js.map +1 -1
  59. package/dist/components/layout/Collapse/Collapse.cjs +2 -0
  60. package/dist/components/layout/Collapse/Collapse.cjs.map +1 -0
  61. package/dist/components/layout/Collapse/Collapse.js +140 -0
  62. package/dist/components/layout/Collapse/Collapse.js.map +1 -0
  63. package/dist/components/layout.cjs +1 -1
  64. package/dist/components/layout.js +27 -24
  65. package/dist/components/layout.js.map +1 -1
  66. package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs +1 -1
  67. package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs.map +1 -1
  68. package/dist/components/navigation/Breadcrumb/Breadcrumb.js +66 -62
  69. package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -1
  70. package/dist/components/navigation/ContextMenu/ContextMenu.cjs +2 -0
  71. package/dist/components/navigation/ContextMenu/ContextMenu.cjs.map +1 -0
  72. package/dist/components/navigation/ContextMenu/ContextMenu.js +227 -0
  73. package/dist/components/navigation/ContextMenu/ContextMenu.js.map +1 -0
  74. package/dist/components/navigation/Dropdown/Dropdown.cjs +2 -2
  75. package/dist/components/navigation/Dropdown/Dropdown.cjs.map +1 -1
  76. package/dist/components/navigation/Dropdown/Dropdown.js +84 -80
  77. package/dist/components/navigation/Dropdown/Dropdown.js.map +1 -1
  78. package/dist/components/navigation/Menu/Menu.cjs +1 -1
  79. package/dist/components/navigation/Menu/Menu.cjs.map +1 -1
  80. package/dist/components/navigation/Menu/Menu.js +132 -94
  81. package/dist/components/navigation/Menu/Menu.js.map +1 -1
  82. package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
  83. package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
  84. package/dist/components/navigation/Pagination/Pagination.js +111 -107
  85. package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
  86. package/dist/components/navigation/Stepper/Stepper.cjs +2 -0
  87. package/dist/components/navigation/Stepper/Stepper.cjs.map +1 -0
  88. package/dist/components/navigation/Stepper/Stepper.js +187 -0
  89. package/dist/components/navigation/Stepper/Stepper.js.map +1 -0
  90. package/dist/components/navigation.cjs +1 -1
  91. package/dist/components/navigation.js +27 -21
  92. package/dist/components/navigation.js.map +1 -1
  93. package/dist/components/utility/Badge/Badge.cjs +1 -1
  94. package/dist/components/utility/Badge/Badge.cjs.map +1 -1
  95. package/dist/components/utility/Badge/Badge.js +38 -35
  96. package/dist/components/utility/Badge/Badge.js.map +1 -1
  97. package/dist/data.d.ts +116 -0
  98. package/dist/form.d.ts +316 -0
  99. package/dist/hooks/useInteractionState.cjs +2 -0
  100. package/dist/hooks/useInteractionState.cjs.map +1 -0
  101. package/dist/hooks/useInteractionState.js +67 -0
  102. package/dist/hooks/useInteractionState.js.map +1 -0
  103. package/dist/hooks.cjs +1 -1
  104. package/dist/hooks.d.ts +87 -0
  105. package/dist/hooks.js +16 -14
  106. package/dist/hooks.js.map +1 -1
  107. package/dist/layout.d.ts +44 -0
  108. package/dist/navigation.d.ts +88 -0
  109. package/package.json +1 -1
@@ -0,0 +1,372 @@
1
+ import { jsxs as u, jsx as t } from "react/jsx-runtime";
2
+ import { forwardRef as Te, useState as f, useRef as ze, useCallback as y, useEffect as Q } from "react";
3
+ import { createPortal as Ee } from "react-dom";
4
+ import { cx as Le } from "../../../utils/styles.js";
5
+ import { spacing as r } from "../../../design-system/tokens/spacing.js";
6
+ import { componentPaddingX as E, componentHeights as L } from "../../../design-system/primitives/sizing.js";
7
+ import { fontSizes as g } from "../../../design-system/tokens/typography.js";
8
+ import { durations as w, easings as C } from "../../../design-system/tokens/motion.js";
9
+ const Pe = {
10
+ sm: { height: L.sm, fontSize: g.base - 1, padding: E.sm },
11
+ md: { height: L.md, fontSize: g.base, padding: E.md },
12
+ lg: { height: L.lg, fontSize: g.md, padding: E.lg }
13
+ }, We = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], Be = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], je = (n) => `${n.getMonth() + 1}/${n.getDate()}/${n.getFullYear()}`;
14
+ function Fe() {
15
+ return /* @__PURE__ */ u("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
16
+ /* @__PURE__ */ t("rect", { x: "2", y: "3", width: "12", height: "11", rx: "2", stroke: "currentColor", strokeWidth: "1.5" }),
17
+ /* @__PURE__ */ t("path", { d: "M2 6h12", stroke: "currentColor", strokeWidth: "1.5" }),
18
+ /* @__PURE__ */ t("path", { d: "M5 1v3M11 1v3", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" })
19
+ ] });
20
+ }
21
+ function U({ direction: n }) {
22
+ return /* @__PURE__ */ t("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ t(
23
+ "path",
24
+ {
25
+ d: n === "left" ? "M10 4l-4 4 4 4" : "M6 4l4 4-4 4",
26
+ stroke: "currentColor",
27
+ strokeWidth: "1.5",
28
+ strokeLinecap: "round",
29
+ strokeLinejoin: "round"
30
+ }
31
+ ) });
32
+ }
33
+ function Oe() {
34
+ return /* @__PURE__ */ t("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ t("path", { d: "M4 4l6 6M10 4l-6 6", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) });
35
+ }
36
+ const He = (n, o) => new Date(n, o + 1, 0).getDate(), Ne = (n, o) => new Date(n, o, 1).getDay(), P = (n, o) => !n || !o ? !1 : n.getFullYear() === o.getFullYear() && n.getMonth() === o.getMonth() && n.getDate() === o.getDate(), Ye = (n, o, d) => {
37
+ if (!o || !d) return !1;
38
+ const b = n.getTime();
39
+ return b > o.getTime() && b < d.getTime();
40
+ }, Z = (n, o, d) => !!(o && n < o || d && n > d), Ae = Te(function({
41
+ value: o,
42
+ defaultValue: d = { start: null, end: null },
43
+ onChange: b,
44
+ size: W = "md",
45
+ minDate: M,
46
+ maxDate: $,
47
+ placeholder: _ = "Select date range",
48
+ disabled: m = !1,
49
+ isInvalid: B = !1,
50
+ clearable: j = !0,
51
+ presets: I,
52
+ dateFormat: R = je,
53
+ "aria-label": ee = "Select date range",
54
+ className: te,
55
+ testId: re
56
+ }, x) {
57
+ const [ne, oe] = f(d), [h, k] = f(!1), [F, O] = f(!1), [se, H] = f(() => {
58
+ const e = o?.start || d.start || /* @__PURE__ */ new Date();
59
+ return { year: e.getFullYear(), month: e.getMonth() };
60
+ }), [S, p] = f(!1), [N, Y] = f(null), D = ze(null), s = o !== void 0 ? o : ne, v = Pe[W], c = y(
61
+ (e) => {
62
+ o === void 0 && oe(e), b?.(e);
63
+ },
64
+ [o, b]
65
+ ), ae = y(
66
+ (e) => {
67
+ Z(e, M, $) || (!S || !s.start ? (c({ start: e, end: null }), p(!0)) : (e < s.start ? c({ start: e, end: s.start }) : c({ start: s.start, end: e }), p(!1), k(!1)));
68
+ },
69
+ [S, s.start, M, $, c]
70
+ ), ie = y(
71
+ (e) => {
72
+ const i = e.getValue();
73
+ c(i), k(!1), p(!1);
74
+ },
75
+ [c]
76
+ ), le = y(
77
+ (e) => {
78
+ e.stopPropagation(), c({ start: null, end: null }), p(!1);
79
+ },
80
+ [c]
81
+ ), de = y(
82
+ (e) => {
83
+ e.key === "Escape" && (k(!1), p(!1));
84
+ },
85
+ []
86
+ );
87
+ Q(() => {
88
+ if (!h) return;
89
+ const e = (i) => {
90
+ D.current?.contains(i.target) || (k(!1), p(!1));
91
+ };
92
+ return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
93
+ }, [h]);
94
+ const [A, ce] = f({ top: 0, left: 0 });
95
+ Q(() => {
96
+ if (!h || !D.current) return;
97
+ const e = () => {
98
+ const i = D.current.getBoundingClientRect();
99
+ ce({
100
+ top: i.bottom + window.scrollY + r[1],
101
+ left: i.left + window.scrollX
102
+ });
103
+ };
104
+ return e(), window.addEventListener("resize", e), window.addEventListener("scroll", e, !0), () => {
105
+ window.removeEventListener("resize", e), window.removeEventListener("scroll", e, !0);
106
+ };
107
+ }, [h]);
108
+ const ue = y(() => {
109
+ H((e) => e.month === 0 ? { year: e.year - 1, month: 11 } : { ...e, month: e.month - 1 });
110
+ }, []), ge = y(() => {
111
+ H((e) => e.month === 11 ? { year: e.year + 1, month: 0 } : { ...e, month: e.month + 1 });
112
+ }, []), J = (e = 0) => {
113
+ let { year: i, month: l } = se;
114
+ l += e, l > 11 && (l = 0, i++);
115
+ const T = He(i, l), De = Ne(i, l), z = [];
116
+ for (let a = 0; a < De; a++)
117
+ z.push(null);
118
+ for (let a = 1; a <= T; a++)
119
+ z.push(new Date(i, l, a));
120
+ const V = S && N && s.start && !s.end ? N : s.end;
121
+ return /* @__PURE__ */ u("div", { style: { flex: 1 }, children: [
122
+ /* @__PURE__ */ u("div", { style: ke, children: [
123
+ e === 0 && /* @__PURE__ */ t(
124
+ "button",
125
+ {
126
+ type: "button",
127
+ "aria-label": "Previous month",
128
+ style: X,
129
+ onClick: ue,
130
+ children: /* @__PURE__ */ t(U, { direction: "left" })
131
+ }
132
+ ),
133
+ /* @__PURE__ */ u("span", { style: { fontWeight: 600 }, children: [
134
+ Be[l],
135
+ " ",
136
+ i
137
+ ] }),
138
+ e === 1 && /* @__PURE__ */ t(
139
+ "button",
140
+ {
141
+ type: "button",
142
+ "aria-label": "Next month",
143
+ style: X,
144
+ onClick: ge,
145
+ children: /* @__PURE__ */ t(U, { direction: "right" })
146
+ }
147
+ )
148
+ ] }),
149
+ /* @__PURE__ */ t("div", { style: ve, children: We.map((a) => /* @__PURE__ */ t("div", { style: we, children: a }, a)) }),
150
+ /* @__PURE__ */ t("div", { style: Ce, children: z.map((a, Me) => {
151
+ if (!a)
152
+ return /* @__PURE__ */ t("div", { style: G(!1, !1, !1, !1) }, `empty-${Me}`);
153
+ const $e = P(a, s.start), Ie = P(a, V), Re = Ye(a, s.start, V), q = Z(a, M, $);
154
+ return /* @__PURE__ */ t(
155
+ "button",
156
+ {
157
+ type: "button",
158
+ disabled: q,
159
+ style: G($e || Ie, Re, q, P(a, /* @__PURE__ */ new Date())),
160
+ onClick: () => ae(a),
161
+ onMouseEnter: () => S && Y(a),
162
+ onMouseLeave: () => Y(null),
163
+ children: a.getDate()
164
+ },
165
+ a.toISOString()
166
+ );
167
+ }) })
168
+ ] });
169
+ }, K = s.start && s.end ? `${R(s.start)} - ${R(s.end)}` : s.start ? `${R(s.start)} - ...` : "", fe = {
170
+ position: "relative",
171
+ display: "inline-flex",
172
+ width: "100%"
173
+ }, ye = {
174
+ position: "relative",
175
+ display: "flex",
176
+ alignItems: "center",
177
+ width: "100%",
178
+ height: v.height,
179
+ backgroundColor: m ? "var(--brycks-background-muted)" : "var(--brycks-background-default)",
180
+ border: `1px solid ${B ? "var(--brycks-error-default)" : F ? "var(--brycks-primary-default)" : "var(--brycks-border-default)"}`,
181
+ borderRadius: "var(--brycks-radius-md)",
182
+ transition: `all ${w.fast}ms ${C.easeOut}`,
183
+ cursor: m ? "not-allowed" : "pointer",
184
+ boxShadow: F ? "var(--brycks-focus-ring)" : void 0,
185
+ padding: `0 ${v.padding}px`,
186
+ paddingRight: j && (s.start || s.end) ? r[10] : v.padding
187
+ }, he = {
188
+ display: "flex",
189
+ alignItems: "center",
190
+ justifyContent: "center",
191
+ marginRight: r[2],
192
+ color: "var(--brycks-foreground-muted)"
193
+ }, pe = {
194
+ flex: 1,
195
+ fontSize: v.fontSize,
196
+ color: K ? "var(--brycks-foreground-default)" : "var(--brycks-foreground-muted)"
197
+ }, be = {
198
+ position: "absolute",
199
+ right: v.padding,
200
+ display: "flex",
201
+ alignItems: "center",
202
+ justifyContent: "center",
203
+ width: r[5],
204
+ height: r[5],
205
+ color: "var(--brycks-foreground-muted)",
206
+ cursor: "pointer",
207
+ borderRadius: "var(--brycks-radius-sm)",
208
+ transition: `all ${w.fast}ms ${C.easeOut}`
209
+ }, me = {
210
+ position: "absolute",
211
+ top: A.top,
212
+ left: A.left,
213
+ backgroundColor: "var(--brycks-background-elevated)",
214
+ border: "1px solid var(--brycks-border-default)",
215
+ borderRadius: "var(--brycks-radius-lg)",
216
+ boxShadow: "var(--brycks-shadow-lg)",
217
+ zIndex: "var(--brycks-z-dropdown)",
218
+ padding: r[3],
219
+ display: "flex",
220
+ gap: r[4]
221
+ }, ke = {
222
+ display: "flex",
223
+ alignItems: "center",
224
+ justifyContent: "space-between",
225
+ marginBottom: r[2],
226
+ minHeight: r[8],
227
+ fontSize: g.base
228
+ }, X = {
229
+ display: "flex",
230
+ alignItems: "center",
231
+ justifyContent: "center",
232
+ width: r[7],
233
+ height: r[7],
234
+ backgroundColor: "transparent",
235
+ border: "none",
236
+ borderRadius: "var(--brycks-radius-md)",
237
+ cursor: "pointer",
238
+ color: "var(--brycks-foreground-default)",
239
+ transition: `all ${w.fast}ms ${C.easeOut}`
240
+ }, ve = {
241
+ display: "grid",
242
+ gridTemplateColumns: "repeat(7, 1fr)",
243
+ gap: r[0.5],
244
+ marginBottom: r[1]
245
+ }, we = {
246
+ display: "flex",
247
+ alignItems: "center",
248
+ justifyContent: "center",
249
+ height: r[7],
250
+ fontSize: g.xs,
251
+ fontWeight: 600,
252
+ color: "var(--brycks-foreground-muted)"
253
+ }, Ce = {
254
+ display: "grid",
255
+ gridTemplateColumns: "repeat(7, 1fr)",
256
+ gap: r[0.5]
257
+ }, G = (e, i, l, T) => ({
258
+ display: "flex",
259
+ alignItems: "center",
260
+ justifyContent: "center",
261
+ width: r[8],
262
+ height: r[8],
263
+ fontSize: g.sm,
264
+ fontWeight: e ? 600 : 400,
265
+ color: l ? "var(--brycks-foreground-disabled)" : e ? "white" : "var(--brycks-foreground-default)",
266
+ backgroundColor: e ? "var(--brycks-primary-default)" : i ? "var(--brycks-primary-50)" : "transparent",
267
+ border: T && !e ? "1px solid var(--brycks-border-strong)" : "none",
268
+ borderRadius: "var(--brycks-radius-md)",
269
+ cursor: l ? "not-allowed" : "pointer",
270
+ opacity: l ? 0.5 : 1,
271
+ transition: `all ${w.fast}ms ${C.easeOut}`
272
+ }), xe = {
273
+ display: "flex",
274
+ flexDirection: "column",
275
+ gap: r[1],
276
+ borderLeft: "1px solid var(--brycks-border-default)",
277
+ paddingLeft: r[3],
278
+ minWidth: 140
279
+ }, Se = {
280
+ display: "flex",
281
+ alignItems: "center",
282
+ padding: `${r[2]}px ${r[3]}px`,
283
+ fontSize: g.sm,
284
+ color: "var(--brycks-foreground-default)",
285
+ backgroundColor: "transparent",
286
+ border: "none",
287
+ borderRadius: "var(--brycks-radius-md)",
288
+ cursor: "pointer",
289
+ textAlign: "left",
290
+ transition: `all ${w.fast}ms ${C.easeOut}`
291
+ };
292
+ return /* @__PURE__ */ u(
293
+ "div",
294
+ {
295
+ ref: (e) => {
296
+ D.current = e, typeof x == "function" ? x(e) : x && (x.current = e);
297
+ },
298
+ className: Le("brycks-daterangepicker", `brycks-daterangepicker--${W}`, te),
299
+ style: fe,
300
+ "data-testid": re,
301
+ onKeyDown: de,
302
+ children: [
303
+ /* @__PURE__ */ u(
304
+ "div",
305
+ {
306
+ role: "button",
307
+ tabIndex: m ? -1 : 0,
308
+ "aria-label": ee,
309
+ "aria-expanded": h,
310
+ "aria-haspopup": "dialog",
311
+ "aria-invalid": B,
312
+ style: ye,
313
+ onClick: () => !m && k(!0),
314
+ onFocus: () => O(!0),
315
+ onBlur: () => O(!1),
316
+ children: [
317
+ /* @__PURE__ */ t("span", { style: he, children: /* @__PURE__ */ t(Fe, {}) }),
318
+ /* @__PURE__ */ t("span", { style: pe, children: K || _ }),
319
+ j && (s.start || s.end) && !m && /* @__PURE__ */ t(
320
+ "button",
321
+ {
322
+ type: "button",
323
+ "aria-label": "Clear date range",
324
+ style: be,
325
+ onClick: le,
326
+ onMouseEnter: (e) => {
327
+ e.currentTarget.style.backgroundColor = "var(--brycks-background-muted)", e.currentTarget.style.color = "var(--brycks-foreground-default)";
328
+ },
329
+ onMouseLeave: (e) => {
330
+ e.currentTarget.style.backgroundColor = "transparent", e.currentTarget.style.color = "var(--brycks-foreground-muted)";
331
+ },
332
+ children: /* @__PURE__ */ t(Oe, {})
333
+ }
334
+ )
335
+ ]
336
+ }
337
+ ),
338
+ h && Ee(
339
+ /* @__PURE__ */ u("div", { role: "dialog", "aria-label": "Date range picker", style: me, children: [
340
+ J(0),
341
+ J(1),
342
+ I && I.length > 0 && /* @__PURE__ */ u("div", { style: xe, children: [
343
+ /* @__PURE__ */ t("div", { style: { fontSize: g.xs, fontWeight: 600, color: "var(--brycks-foreground-muted)", marginBottom: r[1] }, children: "Presets" }),
344
+ I.map((e, i) => /* @__PURE__ */ t(
345
+ "button",
346
+ {
347
+ type: "button",
348
+ style: Se,
349
+ onClick: () => ie(e),
350
+ onMouseEnter: (l) => {
351
+ l.currentTarget.style.backgroundColor = "var(--brycks-background-muted)";
352
+ },
353
+ onMouseLeave: (l) => {
354
+ l.currentTarget.style.backgroundColor = "transparent";
355
+ },
356
+ children: e.label
357
+ },
358
+ i
359
+ ))
360
+ ] })
361
+ ] }),
362
+ document.body
363
+ )
364
+ ]
365
+ }
366
+ );
367
+ });
368
+ Ae.displayName = "DateRangePicker";
369
+ export {
370
+ Ae as DateRangePicker
371
+ };
372
+ //# sourceMappingURL=DateRangePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateRangePicker.js","sources":["../../../../src/components/form/DateRangePicker/DateRangePicker.tsx"],"sourcesContent":["/**\n * DateRangePicker Component\n *\n * A date range selection component with calendar UI.\n * Supports preset ranges and custom date selection.\n *\n * @module components/form/DateRangePicker\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useRef,\n useEffect,\n type CSSProperties,\n type KeyboardEvent,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { cx } from '../../../utils/styles'\nimport { spacing, fontSizes, durations, easings } from '../../../design-system'\nimport { componentHeights, componentPaddingX } from '../../../design-system/primitives'\n\nexport type DateRangePickerSize = 'sm' | 'md' | 'lg'\n\nexport interface DateRange {\n start: Date | null\n end: Date | null\n}\n\nexport interface DateRangePreset {\n label: string\n getValue: () => DateRange\n}\n\nexport interface DateRangePickerProps {\n /** Current date range value */\n value?: DateRange\n /** Default date range value (uncontrolled) */\n defaultValue?: DateRange\n /** Callback when date range changes */\n onChange?: (value: DateRange) => void\n /** Component size */\n size?: DateRangePickerSize\n /** Minimum selectable date */\n minDate?: Date\n /** Maximum selectable date */\n maxDate?: Date\n /** Placeholder text */\n placeholder?: string\n /** Whether the input is disabled */\n disabled?: boolean\n /** Whether the input is invalid */\n isInvalid?: boolean\n /** Whether to allow clearing */\n clearable?: boolean\n /** Preset date ranges */\n presets?: DateRangePreset[]\n /** Date format display */\n dateFormat?: (date: Date) => string\n /** Label for accessibility */\n 'aria-label'?: string\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<DateRangePickerSize, { height: number; fontSize: number; padding: number }> = {\n sm: { height: componentHeights.sm, fontSize: fontSizes.base - 1, padding: componentPaddingX.sm },\n md: { height: componentHeights.md, fontSize: fontSizes.base, padding: componentPaddingX.md },\n lg: { height: componentHeights.lg, fontSize: fontSizes.md, padding: componentPaddingX.lg },\n}\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n\nconst defaultDateFormat = (date: Date): string => {\n return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`\n}\n\nfunction CalendarIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"3\" width=\"12\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6h12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 1v3M11 1v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nfunction ChevronIcon({ direction }: { direction: 'left' | 'right' }) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d={direction === 'left' ? 'M10 4l-4 4 4 4' : 'M6 4l4 4-4 4'}\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction ClearIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 4l6 6M10 4l-6 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate()\n}\n\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay()\n}\n\nconst isSameDay = (date1: Date | null, date2: Date | null): boolean => {\n if (!date1 || !date2) return false\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n )\n}\n\nconst isInRange = (date: Date, start: Date | null, end: Date | null): boolean => {\n if (!start || !end) return false\n const time = date.getTime()\n return time > start.getTime() && time < end.getTime()\n}\n\nconst isDateDisabled = (date: Date, minDate?: Date, maxDate?: Date): boolean => {\n if (minDate && date < minDate) return true\n if (maxDate && date > maxDate) return true\n return false\n}\n\nexport const DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(function DateRangePicker(\n {\n value: controlledValue,\n defaultValue = { start: null, end: null },\n onChange,\n size = 'md',\n minDate,\n maxDate,\n placeholder = 'Select date range',\n disabled = false,\n isInvalid = false,\n clearable = true,\n presets,\n dateFormat = defaultDateFormat,\n 'aria-label': ariaLabel = 'Select date range',\n className,\n testId,\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState<DateRange>(defaultValue)\n const [isOpen, setIsOpen] = useState(false)\n const [isFocused, setIsFocused] = useState(false)\n const [viewDate, setViewDate] = useState(() => {\n const initial = controlledValue?.start || defaultValue.start || new Date()\n return { year: initial.getFullYear(), month: initial.getMonth() }\n })\n const [selectingEnd, setSelectingEnd] = useState(false)\n const [hoverDate, setHoverDate] = useState<Date | null>(null)\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const value = controlledValue !== undefined ? controlledValue : internalValue\n const config = sizeConfig[size]\n\n const updateValue = useCallback(\n (newValue: DateRange) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n },\n [controlledValue, onChange]\n )\n\n const handleDateClick = useCallback(\n (date: Date) => {\n if (isDateDisabled(date, minDate, maxDate)) return\n\n if (!selectingEnd || !value.start) {\n // Start new selection\n updateValue({ start: date, end: null })\n setSelectingEnd(true)\n } else {\n // Complete selection\n if (date < value.start) {\n updateValue({ start: date, end: value.start })\n } else {\n updateValue({ start: value.start, end: date })\n }\n setSelectingEnd(false)\n setIsOpen(false)\n }\n },\n [selectingEnd, value.start, minDate, maxDate, updateValue]\n )\n\n const handlePresetClick = useCallback(\n (preset: DateRangePreset) => {\n const newValue = preset.getValue()\n updateValue(newValue)\n setIsOpen(false)\n setSelectingEnd(false)\n },\n [updateValue]\n )\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n updateValue({ start: null, end: null })\n setSelectingEnd(false)\n },\n [updateValue]\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n setSelectingEnd(false)\n }\n },\n []\n )\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return\n\n const handleClick = (e: MouseEvent) => {\n if (!containerRef.current?.contains(e.target as Node)) {\n setIsOpen(false)\n setSelectingEnd(false)\n }\n }\n\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [isOpen])\n\n // Calculate dropdown position\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 })\n\n useEffect(() => {\n if (!isOpen || !containerRef.current) return\n\n const updatePosition = () => {\n const rect = containerRef.current!.getBoundingClientRect()\n setDropdownPosition({\n top: rect.bottom + window.scrollY + spacing[1],\n left: rect.left + window.scrollX,\n })\n }\n\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition, true)\n\n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition, true)\n }\n }, [isOpen])\n\n const goToPrevMonth = useCallback(() => {\n setViewDate((prev) => {\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 }\n }\n return { ...prev, month: prev.month - 1 }\n })\n }, [])\n\n const goToNextMonth = useCallback(() => {\n setViewDate((prev) => {\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 }\n }\n return { ...prev, month: prev.month + 1 }\n })\n }, [])\n\n // Generate calendar days\n const renderCalendar = (monthOffset: number = 0) => {\n let { year, month } = viewDate\n month += monthOffset\n if (month > 11) {\n month = 0\n year++\n }\n\n const daysInMonth = getDaysInMonth(year, month)\n const firstDay = getFirstDayOfMonth(year, month)\n const days: (Date | null)[] = []\n\n // Empty cells for days before the first day\n for (let i = 0; i < firstDay; i++) {\n days.push(null)\n }\n\n // Days of the month\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(new Date(year, month, i))\n }\n\n const effectiveEnd = selectingEnd && hoverDate && value.start && !value.end ? hoverDate : value.end\n\n return (\n <div style={{ flex: 1 }}>\n <div style={calendarHeaderStyle}>\n {monthOffset === 0 && (\n <button\n type=\"button\"\n aria-label=\"Previous month\"\n style={navButtonStyle}\n onClick={goToPrevMonth}\n >\n <ChevronIcon direction=\"left\" />\n </button>\n )}\n <span style={{ fontWeight: 600 }}>\n {MONTHS[month]} {year}\n </span>\n {monthOffset === 1 && (\n <button\n type=\"button\"\n aria-label=\"Next month\"\n style={navButtonStyle}\n onClick={goToNextMonth}\n >\n <ChevronIcon direction=\"right\" />\n </button>\n )}\n </div>\n <div style={daysHeaderStyle}>\n {DAYS.map((day) => (\n <div key={day} style={dayHeaderStyle}>\n {day}\n </div>\n ))}\n </div>\n <div style={daysGridStyle}>\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} style={dayStyle(false, false, false, false)} />\n }\n\n const isStart = isSameDay(date, value.start)\n const isEnd = isSameDay(date, effectiveEnd)\n const isRange = isInRange(date, value.start, effectiveEnd)\n const isDisabled = isDateDisabled(date, minDate, maxDate)\n\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n disabled={isDisabled}\n style={dayStyle(isStart || isEnd, isRange, isDisabled, isSameDay(date, new Date()))}\n onClick={() => handleDateClick(date)}\n onMouseEnter={() => selectingEnd && setHoverDate(date)}\n onMouseLeave={() => setHoverDate(null)}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n )\n }\n\n const displayValue = value.start && value.end\n ? `${dateFormat(value.start)} - ${dateFormat(value.end)}`\n : value.start\n ? `${dateFormat(value.start)} - ...`\n : ''\n\n const containerStyle: CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n width: '100%',\n }\n\n const inputWrapperStyle: CSSProperties = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n height: config.height,\n backgroundColor: disabled ? 'var(--brycks-background-muted)' : 'var(--brycks-background-default)',\n border: `1px solid ${\n isInvalid\n ? 'var(--brycks-error-default)'\n : isFocused\n ? 'var(--brycks-primary-default)'\n : 'var(--brycks-border-default)'\n }`,\n borderRadius: 'var(--brycks-radius-md)',\n transition: `all ${durations.fast}ms ${easings.easeOut}`,\n cursor: disabled ? 'not-allowed' : 'pointer',\n boxShadow: isFocused ? 'var(--brycks-focus-ring)' : undefined,\n padding: `0 ${config.padding}px`,\n paddingRight: clearable && (value.start || value.end) ? spacing[10] : config.padding,\n }\n\n const iconStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: spacing[2],\n color: 'var(--brycks-foreground-muted)',\n }\n\n const textStyle: CSSProperties = {\n flex: 1,\n fontSize: config.fontSize,\n color: displayValue ? 'var(--brycks-foreground-default)' : 'var(--brycks-foreground-muted)',\n }\n\n const clearButtonStyle: CSSProperties = {\n position: 'absolute',\n right: config.padding,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: spacing[5],\n height: spacing[5],\n color: 'var(--brycks-foreground-muted)',\n cursor: 'pointer',\n borderRadius: 'var(--brycks-radius-sm)',\n transition: `all ${durations.fast}ms ${easings.easeOut}`,\n }\n\n const dropdownStyle: CSSProperties = {\n position: 'absolute',\n top: dropdownPosition.top,\n left: dropdownPosition.left,\n backgroundColor: 'var(--brycks-background-elevated)',\n border: '1px solid var(--brycks-border-default)',\n borderRadius: 'var(--brycks-radius-lg)',\n boxShadow: 'var(--brycks-shadow-lg)',\n zIndex: 'var(--brycks-z-dropdown)' as unknown as number,\n padding: spacing[3],\n display: 'flex',\n gap: spacing[4],\n }\n\n const calendarHeaderStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: spacing[2],\n minHeight: spacing[8],\n fontSize: fontSizes.base,\n }\n\n const navButtonStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: spacing[7],\n height: spacing[7],\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: 'var(--brycks-radius-md)',\n cursor: 'pointer',\n color: 'var(--brycks-foreground-default)',\n transition: `all ${durations.fast}ms ${easings.easeOut}`,\n }\n\n const daysHeaderStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: spacing[0.5],\n marginBottom: spacing[1],\n }\n\n const dayHeaderStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: spacing[7],\n fontSize: fontSizes.xs,\n fontWeight: 600,\n color: 'var(--brycks-foreground-muted)',\n }\n\n const daysGridStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: spacing[0.5],\n }\n\n const dayStyle = (isSelected: boolean, isRange: boolean, isDisabled: boolean, isToday: boolean): CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: spacing[8],\n height: spacing[8],\n fontSize: fontSizes.sm,\n fontWeight: isSelected ? 600 : 400,\n color: isDisabled\n ? 'var(--brycks-foreground-disabled)'\n : isSelected\n ? 'white'\n : 'var(--brycks-foreground-default)',\n backgroundColor: isSelected\n ? 'var(--brycks-primary-default)'\n : isRange\n ? 'var(--brycks-primary-50)'\n : 'transparent',\n border: isToday && !isSelected ? '1px solid var(--brycks-border-strong)' : 'none',\n borderRadius: 'var(--brycks-radius-md)',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n opacity: isDisabled ? 0.5 : 1,\n transition: `all ${durations.fast}ms ${easings.easeOut}`,\n })\n\n const presetsStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: spacing[1],\n borderLeft: '1px solid var(--brycks-border-default)',\n paddingLeft: spacing[3],\n minWidth: 140,\n }\n\n const presetButtonStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: `${spacing[2]}px ${spacing[3]}px`,\n fontSize: fontSizes.sm,\n color: 'var(--brycks-foreground-default)',\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: 'var(--brycks-radius-md)',\n cursor: 'pointer',\n textAlign: 'left',\n transition: `all ${durations.fast}ms ${easings.easeOut}`,\n }\n\n return (\n <div\n ref={(node) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n className={cx('brycks-daterangepicker', `brycks-daterangepicker--${size}`, className)}\n style={containerStyle}\n data-testid={testId}\n onKeyDown={handleKeyDown}\n >\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={ariaLabel}\n aria-expanded={isOpen}\n aria-haspopup=\"dialog\"\n aria-invalid={isInvalid}\n style={inputWrapperStyle}\n onClick={() => !disabled && setIsOpen(true)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n >\n <span style={iconStyle}>\n <CalendarIcon />\n </span>\n <span style={textStyle}>{displayValue || placeholder}</span>\n {clearable && (value.start || value.end) && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear date range\"\n style={clearButtonStyle}\n onClick={handleClear}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--brycks-background-muted)'\n e.currentTarget.style.color = 'var(--brycks-foreground-default)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent'\n e.currentTarget.style.color = 'var(--brycks-foreground-muted)'\n }}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {isOpen &&\n createPortal(\n <div role=\"dialog\" aria-label=\"Date range picker\" style={dropdownStyle}>\n {renderCalendar(0)}\n {renderCalendar(1)}\n {presets && presets.length > 0 && (\n <div style={presetsStyle}>\n <div style={{ fontSize: fontSizes.xs, fontWeight: 600, color: 'var(--brycks-foreground-muted)', marginBottom: spacing[1] }}>\n Presets\n </div>\n {presets.map((preset, index) => (\n <button\n key={index}\n type=\"button\"\n style={presetButtonStyle}\n onClick={() => handlePresetClick(preset)}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--brycks-background-muted)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent'\n }}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n </div>,\n document.body\n )}\n </div>\n )\n})\n\nDateRangePicker.displayName = 'DateRangePicker'\n"],"names":["sizeConfig","componentHeights","fontSizes","componentPaddingX","DAYS","MONTHS","defaultDateFormat","date","CalendarIcon","jsxs","jsx","ChevronIcon","direction","ClearIcon","getDaysInMonth","year","month","getFirstDayOfMonth","isSameDay","date1","date2","isInRange","start","end","time","isDateDisabled","minDate","maxDate","DateRangePicker","forwardRef","controlledValue","defaultValue","onChange","size","placeholder","disabled","isInvalid","clearable","presets","dateFormat","ariaLabel","className","testId","ref","internalValue","setInternalValue","useState","isOpen","setIsOpen","isFocused","setIsFocused","viewDate","setViewDate","initial","selectingEnd","setSelectingEnd","hoverDate","setHoverDate","containerRef","useRef","value","config","updateValue","useCallback","newValue","handleDateClick","handlePresetClick","preset","handleClear","handleKeyDown","useEffect","handleClick","e","dropdownPosition","setDropdownPosition","updatePosition","rect","spacing","goToPrevMonth","prev","goToNextMonth","renderCalendar","monthOffset","daysInMonth","firstDay","days","i","effectiveEnd","calendarHeaderStyle","navButtonStyle","daysHeaderStyle","day","dayHeaderStyle","daysGridStyle","index","dayStyle","isStart","isEnd","isRange","isDisabled","displayValue","containerStyle","inputWrapperStyle","durations","easings","iconStyle","textStyle","clearButtonStyle","dropdownStyle","isSelected","isToday","presetsStyle","presetButtonStyle","node","cx","createPortal"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),s=require("react"),ye=require("react-dom"),be=require("../../../utils/styles.cjs"),d=require("../../../design-system/tokens/motion.cjs"),n=require("../../../design-system/tokens/spacing.cjs"),g=require("../../../design-system/primitives/sizing.cjs"),k=require("../../../design-system/tokens/typography.cjs"),me={sm:{minHeight:g.componentHeights.sm,fontSize:k.fontSizes.base-1,chipHeight:n.spacing[5],padding:g.componentPaddingX.xs,gap:n.spacing[1]},md:{minHeight:g.componentHeights.md,fontSize:k.fontSizes.base,chipHeight:n.spacing[6],padding:g.componentPaddingX.sm,gap:n.spacing[1.5]},lg:{minHeight:g.componentHeights.lg,fontSize:k.fontSizes.md,chipHeight:n.spacing[7],padding:g.componentPaddingX.sm,gap:n.spacing[2]}};function ve(){return r.jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:r.jsx("path",{d:"M4 6l4 4 4-4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function N(){return r.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:r.jsx("path",{d:"M3 3l6 6M9 3l-6 6",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})}function ke(){return r.jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:r.jsx("path",{d:"M3 8l3 3 7-7",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}const Y=s.forwardRef(function({options:x,value:w,defaultValue:K=[],onChange:H,placeholder:O="Select options...",size:D="md",maxSelections:z,searchable:P=!0,disabled:b=!1,isInvalid:T=!1,clearable:G=!0,emptyText:U="No options found",closeOnSelect:q=!1,"aria-label":W,"aria-labelledby":_,className:J,testId:Q},S){const[V,Z]=s.useState(K),[a,f]=s.useState(!1),[h,I]=s.useState(""),[c,u]=s.useState(-1),[A,B]=s.useState(!1),j=s.useRef(null),C=s.useRef(null),X=s.useRef(null),i=w!==void 0?w:V,l=me[D],R=s.useMemo(()=>x.filter(e=>i.includes(e.value)),[x,i]),$=s.useMemo(()=>{let e=x.filter(o=>!o.disabled&&(o.label.toLowerCase().includes(h.toLowerCase())||o.description?.toLowerCase().includes(h.toLowerCase())));const t=new Map;return e.forEach(o=>{const y=o.group;t.has(y)||t.set(y,[]),t.get(y).push(o)}),t},[x,h]),m=s.useMemo(()=>{const e=[];return $.forEach(t=>e.push(...t)),e},[$]),p=s.useCallback(e=>{w===void 0&&Z(e),H?.(e)},[w,H]),M=s.useCallback(e=>{if(i.includes(e))p(i.filter(o=>o!==e));else{if(z&&i.length>=z)return;p([...i,e])}q&&f(!1),I(""),C.current?.focus()},[i,z,q,p]),L=s.useCallback((e,t)=>{t?.stopPropagation(),p(i.filter(o=>o!==e))},[i,p]),ee=s.useCallback(e=>{e.stopPropagation(),p([]),C.current?.focus()},[p]),te=s.useCallback(e=>{switch(e.key){case"ArrowDown":e.preventDefault(),a?u(t=>Math.min(t+1,m.length-1)):(f(!0),u(0));break;case"ArrowUp":e.preventDefault(),a&&u(t=>Math.max(t-1,0));break;case"Enter":e.preventDefault(),a&&c>=0&&m[c]&&M(m[c].value);break;case"Escape":e.preventDefault(),f(!1),u(-1);break;case"Backspace":!h&&i.length>0&&L(i[i.length-1]);break}},[a,c,m,h,i,M,L]);s.useEffect(()=>{if(!a)return;const e=t=>{j.current?.contains(t.target)||(f(!1),u(-1),I(""))};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[a]),s.useEffect(()=>{if(!a||c<0)return;X.current?.querySelectorAll('[role="option"]')?.[c]?.scrollIntoView({block:"nearest"})},[a,c]);const[E,re]=s.useState({top:0,left:0,width:0});s.useEffect(()=>{if(!a||!j.current)return;const e=()=>{const t=j.current.getBoundingClientRect();re({top:t.bottom+window.scrollY+n.spacing[1],left:t.left+window.scrollX,width:t.width})};return e(),window.addEventListener("resize",e),window.addEventListener("scroll",e,!0),()=>{window.removeEventListener("resize",e),window.removeEventListener("scroll",e,!0)}},[a]);const ne={position:"relative",width:"100%"},se={display:"flex",flexWrap:"wrap",alignItems:"center",gap:l.gap,minHeight:l.minHeight,padding:`${n.spacing[1]}px ${l.padding}px`,paddingRight:n.spacing[10],backgroundColor:b?"var(--brycks-background-muted)":"var(--brycks-background-default)",border:`1px solid ${T?"var(--brycks-error-default)":A?"var(--brycks-primary-default)":"var(--brycks-border-default)"}`,borderRadius:"var(--brycks-radius-md)",transition:`all ${d.durations.fast}ms ${d.easings.easeOut}`,cursor:b?"not-allowed":"pointer",boxShadow:A?"var(--brycks-focus-ring)":void 0},oe={display:"inline-flex",alignItems:"center",gap:n.spacing[1],height:l.chipHeight,padding:`0 ${n.spacing[2]}px`,fontSize:l.fontSize-1,fontWeight:500,color:"var(--brycks-foreground-default)",backgroundColor:"var(--brycks-background-muted)",borderRadius:"var(--brycks-radius-full)",whiteSpace:"nowrap"},ie={display:"flex",alignItems:"center",justifyContent:"center",width:n.spacing[4],height:n.spacing[4],marginLeft:n.spacing[.5],marginRight:-n.spacing[1],color:"inherit",opacity:.7,cursor:"pointer",borderRadius:"var(--brycks-radius-full)"},ae={flex:1,minWidth:60,height:l.chipHeight,padding:0,fontSize:l.fontSize,color:"var(--brycks-foreground-default)",backgroundColor:"transparent",border:"none",outline:"none"},le={position:"absolute",right:l.padding,top:"50%",transform:"translateY(-50%)",display:"flex",alignItems:"center",gap:n.spacing[1]},ce={display:"flex",alignItems:"center",justifyContent:"center",width:n.spacing[5],height:n.spacing[5],color:"var(--brycks-foreground-muted)",cursor:"pointer",borderRadius:"var(--brycks-radius-sm)",transition:`all ${d.durations.fast}ms ${d.easings.easeOut}`},de={display:"flex",alignItems:"center",justifyContent:"center",color:"var(--brycks-foreground-muted)",transform:a?"rotate(180deg)":"rotate(0)",transition:`transform ${d.durations.fast}ms ${d.easings.easeOut}`,pointerEvents:"none"},ue={position:"absolute",top:E.top,left:E.left,width:E.width,maxHeight:300,overflowY:"auto",backgroundColor:"var(--brycks-background-elevated)",border:"1px solid var(--brycks-border-default)",borderRadius:"var(--brycks-radius-lg)",boxShadow:"var(--brycks-shadow-lg)",zIndex:"var(--brycks-z-dropdown)",padding:n.spacing[1]},pe={padding:`${n.spacing[2]}px ${n.spacing[3]}px ${n.spacing[1]}px`,fontSize:k.fontSizes.xs,fontWeight:600,color:"var(--brycks-foreground-muted)",textTransform:"uppercase",letterSpacing:"0.05em"},ge=(e,t)=>({display:"flex",alignItems:"center",gap:g.componentGap.md,padding:`${n.spacing[2]}px ${n.spacing[3]}px`,fontSize:l.fontSize,color:"var(--brycks-foreground-default)",backgroundColor:e?"var(--brycks-background-muted)":"transparent",borderRadius:"var(--brycks-radius-md)",cursor:"pointer",transition:`background-color ${d.durations.fast}ms ${d.easings.easeOut}`}),fe={padding:`${n.spacing[4]}px ${n.spacing[3]}px`,fontSize:l.fontSize,color:"var(--brycks-foreground-muted)",textAlign:"center"};let F=-1;return r.jsxs("div",{ref:e=>{j.current=e,typeof S=="function"?S(e):S&&(S.current=e)},className:be.cx("brycks-multiselect",`brycks-multiselect--${D}`,J),style:ne,"data-testid":Q,children:[r.jsxs("div",{style:se,onClick:()=>{b||(f(!0),C.current?.focus())},children:[R.map(e=>r.jsxs("span",{style:oe,children:[e.label,r.jsx("button",{type:"button","aria-label":`Remove ${e.label}`,style:ie,onClick:t=>L(e.value,t),onMouseEnter:t=>{t.currentTarget.style.opacity="1",t.currentTarget.style.backgroundColor="rgba(0,0,0,0.1)"},onMouseLeave:t=>{t.currentTarget.style.opacity="0.7",t.currentTarget.style.backgroundColor="transparent"},children:r.jsx(N,{})})]},e.value)),P&&r.jsx("input",{ref:C,type:"text",role:"combobox","aria-label":W,"aria-labelledby":_,"aria-expanded":a,"aria-haspopup":"listbox","aria-autocomplete":"list","aria-invalid":T,value:h,placeholder:R.length===0?O:"",disabled:b,style:ae,onChange:e=>{I(e.target.value),a||f(!0),u(0)},onKeyDown:te,onFocus:()=>B(!0),onBlur:()=>B(!1)}),!P&&R.length===0&&r.jsx("span",{style:{color:"var(--brycks-foreground-muted)",fontSize:l.fontSize},children:O}),r.jsxs("div",{style:le,children:[G&&i.length>0&&!b&&r.jsx("button",{type:"button","aria-label":"Clear all",style:ce,onClick:ee,onMouseEnter:e=>{e.currentTarget.style.backgroundColor="var(--brycks-background-muted)",e.currentTarget.style.color="var(--brycks-foreground-default)"},onMouseLeave:e=>{e.currentTarget.style.backgroundColor="transparent",e.currentTarget.style.color="var(--brycks-foreground-muted)"},children:r.jsx(N,{})}),r.jsx("span",{style:de,children:r.jsx(ve,{})})]})]}),a&&ye.createPortal(r.jsx("ul",{ref:X,role:"listbox","aria-label":W||"Options","aria-multiselectable":"true",style:ue,children:m.length>0?Array.from($.entries()).map(([e,t])=>r.jsxs("li",{role:"group","aria-label":e,children:[e&&r.jsx("div",{style:pe,children:e}),r.jsx("ul",{role:"presentation",style:{listStyle:"none",margin:0,padding:0},children:t.map(o=>{F++;const y=F,v=i.includes(o.value),he=y===c;return r.jsxs("li",{role:"option","aria-selected":v,style:ge(he),onClick:()=>M(o.value),onMouseEnter:()=>u(y),children:[r.jsx("span",{style:{display:"flex",alignItems:"center",justifyContent:"center",width:n.spacing[5],height:n.spacing[5],borderRadius:"var(--brycks-radius-sm)",border:v?"none":"1px solid var(--brycks-border-default)",backgroundColor:v?"var(--brycks-primary-default)":"transparent",color:"white",flexShrink:0},children:v&&r.jsx(ke,{})}),o.icon&&r.jsx("span",{style:{flexShrink:0},children:o.icon}),r.jsxs("div",{style:{flex:1,minWidth:0},children:[r.jsx("div",{style:{fontWeight:v?500:400},children:o.label}),o.description&&r.jsx("div",{style:{fontSize:k.fontSizes.sm,color:"var(--brycks-foreground-muted)"},children:o.description})]})]},o.value)})})]},e||"ungrouped")):r.jsx("li",{style:fe,children:U})}),document.body)]})});Y.displayName="MultiSelect";exports.MultiSelect=Y;
2
+ //# sourceMappingURL=MultiSelect.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiSelect.cjs","sources":["../../../../src/components/form/MultiSelect/MultiSelect.tsx"],"sourcesContent":["/**\n * MultiSelect Component\n *\n * A dropdown component for selecting multiple options.\n * Displays selected items as chips with removal capability.\n *\n * @module components/form/MultiSelect\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useRef,\n useEffect,\n useMemo,\n type CSSProperties,\n type ReactNode,\n type KeyboardEvent,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { cx } from '../../../utils/styles'\nimport { spacing, fontSizes, durations, easings } from '../../../design-system'\nimport { componentHeights, componentPaddingX, componentGap } from '../../../design-system/primitives'\n\nexport type MultiSelectSize = 'sm' | 'md' | 'lg'\n\nexport interface MultiSelectOption {\n /** Unique identifier */\n value: string\n /** Display label */\n label: string\n /** Optional description */\n description?: string\n /** Optional icon */\n icon?: ReactNode\n /** Whether the option is disabled */\n disabled?: boolean\n /** Optional group */\n group?: string\n}\n\nexport interface MultiSelectProps {\n /** Available options */\n options: MultiSelectOption[]\n /** Selected values (controlled) */\n value?: string[]\n /** Default selected values (uncontrolled) */\n defaultValue?: string[]\n /** Callback when selection changes */\n onChange?: (values: string[]) => void\n /** Placeholder text */\n placeholder?: string\n /** Component size */\n size?: MultiSelectSize\n /** Maximum selections allowed */\n maxSelections?: number\n /** Whether the select is searchable */\n searchable?: boolean\n /** Whether the select is disabled */\n disabled?: boolean\n /** Whether the select is invalid */\n isInvalid?: boolean\n /** Whether to allow clearing all */\n clearable?: boolean\n /** Text when no options match search */\n emptyText?: string\n /** Whether to close on select */\n closeOnSelect?: boolean\n /** Label for accessibility */\n 'aria-label'?: string\n /** ID of element that labels this select */\n 'aria-labelledby'?: string\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<MultiSelectSize, { minHeight: number; fontSize: number; chipHeight: number; padding: number; gap: number }> = {\n sm: { minHeight: componentHeights.sm, fontSize: fontSizes.base - 1, chipHeight: spacing[5], padding: componentPaddingX.xs, gap: spacing[1] },\n md: { minHeight: componentHeights.md, fontSize: fontSizes.base, chipHeight: spacing[6], padding: componentPaddingX.sm, gap: spacing[1.5] },\n lg: { minHeight: componentHeights.lg, fontSize: fontSizes.md, chipHeight: spacing[7], padding: componentPaddingX.sm, gap: spacing[2] },\n}\n\nfunction ChevronDownIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 3l6 6M9 3l-6 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 8l3 3 7-7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(function MultiSelect(\n {\n options,\n value: controlledValue,\n defaultValue = [],\n onChange,\n placeholder = 'Select options...',\n size = 'md',\n maxSelections,\n searchable = true,\n disabled = false,\n isInvalid = false,\n clearable = true,\n emptyText = 'No options found',\n closeOnSelect = false,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n className,\n testId,\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState<string[]>(defaultValue)\n const [isOpen, setIsOpen] = useState(false)\n const [searchValue, setSearchValue] = useState('')\n const [activeIndex, setActiveIndex] = useState(-1)\n const [isFocused, setIsFocused] = useState(false)\n\n const containerRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLUListElement>(null)\n\n const value = controlledValue !== undefined ? controlledValue : internalValue\n const config = sizeConfig[size]\n\n // Get selected options\n const selectedOptions = useMemo(\n () => options.filter((opt) => value.includes(opt.value)),\n [options, value]\n )\n\n // Filter and group options\n const filteredOptions = useMemo(() => {\n let filtered = options.filter(\n (opt) =>\n !opt.disabled &&\n (opt.label.toLowerCase().includes(searchValue.toLowerCase()) ||\n opt.description?.toLowerCase().includes(searchValue.toLowerCase()))\n )\n\n // Group by group property\n const groups = new Map<string | undefined, MultiSelectOption[]>()\n filtered.forEach((opt) => {\n const group = opt.group\n if (!groups.has(group)) {\n groups.set(group, [])\n }\n groups.get(group)!.push(opt)\n })\n\n return groups\n }, [options, searchValue])\n\n // Flatten for keyboard navigation\n const flatOptions = useMemo(() => {\n const flat: MultiSelectOption[] = []\n filteredOptions.forEach((opts) => flat.push(...opts))\n return flat\n }, [filteredOptions])\n\n const updateValue = useCallback(\n (newValue: string[]) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n },\n [controlledValue, onChange]\n )\n\n const toggleOption = useCallback(\n (optionValue: string) => {\n const isSelected = value.includes(optionValue)\n\n if (isSelected) {\n updateValue(value.filter((v) => v !== optionValue))\n } else {\n if (maxSelections && value.length >= maxSelections) return\n updateValue([...value, optionValue])\n }\n\n if (closeOnSelect) {\n setIsOpen(false)\n }\n\n setSearchValue('')\n inputRef.current?.focus()\n },\n [value, maxSelections, closeOnSelect, updateValue]\n )\n\n const removeOption = useCallback(\n (optionValue: string, e?: React.MouseEvent) => {\n e?.stopPropagation()\n updateValue(value.filter((v) => v !== optionValue))\n },\n [value, updateValue]\n )\n\n const clearAll = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n updateValue([])\n inputRef.current?.focus()\n },\n [updateValue]\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n if (!isOpen) {\n setIsOpen(true)\n setActiveIndex(0)\n } else {\n setActiveIndex((prev) => Math.min(prev + 1, flatOptions.length - 1))\n }\n break\n case 'ArrowUp':\n e.preventDefault()\n if (isOpen) {\n setActiveIndex((prev) => Math.max(prev - 1, 0))\n }\n break\n case 'Enter':\n e.preventDefault()\n if (isOpen && activeIndex >= 0 && flatOptions[activeIndex]) {\n toggleOption(flatOptions[activeIndex].value)\n }\n break\n case 'Escape':\n e.preventDefault()\n setIsOpen(false)\n setActiveIndex(-1)\n break\n case 'Backspace':\n if (!searchValue && value.length > 0) {\n removeOption(value[value.length - 1])\n }\n break\n }\n },\n [isOpen, activeIndex, flatOptions, searchValue, value, toggleOption, removeOption]\n )\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return\n\n const handleClick = (e: MouseEvent) => {\n if (!containerRef.current?.contains(e.target as Node)) {\n setIsOpen(false)\n setActiveIndex(-1)\n setSearchValue('')\n }\n }\n\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [isOpen])\n\n // Scroll active option into view\n useEffect(() => {\n if (!isOpen || activeIndex < 0) return\n const list = listRef.current\n const items = list?.querySelectorAll('[role=\"option\"]')\n const activeItem = items?.[activeIndex] as HTMLElement | undefined\n activeItem?.scrollIntoView({ block: 'nearest' })\n }, [isOpen, activeIndex])\n\n // Calculate dropdown position\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0, width: 0 })\n\n useEffect(() => {\n if (!isOpen || !containerRef.current) return\n\n const updatePosition = () => {\n const rect = containerRef.current!.getBoundingClientRect()\n setDropdownPosition({\n top: rect.bottom + window.scrollY + spacing[1],\n left: rect.left + window.scrollX,\n width: rect.width,\n })\n }\n\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition, true)\n\n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition, true)\n }\n }, [isOpen])\n\n const containerStyle: CSSProperties = {\n position: 'relative',\n width: '100%',\n }\n\n const wrapperStyle: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: config.gap,\n minHeight: config.minHeight,\n padding: `${spacing[1]}px ${config.padding}px`,\n paddingRight: spacing[10],\n backgroundColor: disabled ? 'var(--brycks-background-muted)' : 'var(--brycks-background-default)',\n border: `1px solid ${\n isInvalid\n ? 'var(--brycks-error-default)'\n : isFocused\n ? 'var(--brycks-primary-default)'\n : 'var(--brycks-border-default)'\n }`,\n borderRadius: 'var(--brycks-radius-md)',\n transition: `all ${durations.fast}ms ${easings.easeOut}`,\n cursor: disabled ? 'not-allowed' : 'pointer',\n boxShadow: isFocused ? 'var(--brycks-focus-ring)' : undefined,\n }\n\n const chipStyle: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacing[1],\n height: config.chipHeight,\n padding: `0 ${spacing[2]}px`,\n fontSize: config.fontSize - 1,\n fontWeight: 500,\n color: 'var(--brycks-foreground-default)',\n backgroundColor: 'var(--brycks-background-muted)',\n borderRadius: 'var(--brycks-radius-full)',\n whiteSpace: 'nowrap',\n }\n\n const chipRemoveStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: spacing[4],\n height: spacing[4],\n marginLeft: spacing[0.5],\n marginRight: -spacing[1],\n color: 'inherit',\n opacity: 0.7,\n cursor: 'pointer',\n borderRadius: 'var(--brycks-radius-full)',\n }\n\n const inputStyle: CSSProperties = {\n flex: 1,\n minWidth: 60,\n height: config.chipHeight,\n padding: 0,\n fontSize: config.fontSize,\n color: 'var(--brycks-foreground-default)',\n backgroundColor: 'transparent',\n border: 'none',\n outline: 'none',\n }\n\n const iconsStyle: CSSProperties = {\n position: 'absolute',\n right: config.padding,\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n gap: spacing[1],\n }\n\n const clearButtonStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: spacing[5],\n height: spacing[5],\n color: 'var(--brycks-foreground-muted)',\n cursor: 'pointer',\n borderRadius: 'var(--brycks-radius-sm)',\n transition: `all ${durations.fast}ms ${easings.easeOut}`,\n }\n\n const chevronStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--brycks-foreground-muted)',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0)',\n transition: `transform ${durations.fast}ms ${easings.easeOut}`,\n pointerEvents: 'none',\n }\n\n const dropdownStyle: CSSProperties = {\n position: 'absolute',\n top: dropdownPosition.top,\n left: dropdownPosition.left,\n width: dropdownPosition.width,\n maxHeight: 300,\n overflowY: 'auto',\n backgroundColor: 'var(--brycks-background-elevated)',\n border: '1px solid var(--brycks-border-default)',\n borderRadius: 'var(--brycks-radius-lg)',\n boxShadow: 'var(--brycks-shadow-lg)',\n zIndex: 'var(--brycks-z-dropdown)' as unknown as number,\n padding: spacing[1],\n }\n\n const groupLabelStyle: CSSProperties = {\n padding: `${spacing[2]}px ${spacing[3]}px ${spacing[1]}px`,\n fontSize: fontSizes.xs,\n fontWeight: 600,\n color: 'var(--brycks-foreground-muted)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }\n\n const optionStyle = (isActive: boolean, _isSelected: boolean): CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n gap: componentGap.md,\n padding: `${spacing[2]}px ${spacing[3]}px`,\n fontSize: config.fontSize,\n color: 'var(--brycks-foreground-default)',\n backgroundColor: isActive ? 'var(--brycks-background-muted)' : 'transparent',\n borderRadius: 'var(--brycks-radius-md)',\n cursor: 'pointer',\n transition: `background-color ${durations.fast}ms ${easings.easeOut}`,\n })\n\n const emptyStyle: CSSProperties = {\n padding: `${spacing[4]}px ${spacing[3]}px`,\n fontSize: config.fontSize,\n color: 'var(--brycks-foreground-muted)',\n textAlign: 'center',\n }\n\n let optionIndex = -1\n\n return (\n <div\n ref={(node) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n className={cx('brycks-multiselect', `brycks-multiselect--${size}`, className)}\n style={containerStyle}\n data-testid={testId}\n >\n <div\n style={wrapperStyle}\n onClick={() => {\n if (!disabled) {\n setIsOpen(true)\n inputRef.current?.focus()\n }\n }}\n >\n {selectedOptions.map((opt) => (\n <span key={opt.value} style={chipStyle}>\n {opt.label}\n <button\n type=\"button\"\n aria-label={`Remove ${opt.label}`}\n style={chipRemoveStyle}\n onClick={(e) => removeOption(opt.value, e)}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n e.currentTarget.style.backgroundColor = 'rgba(0,0,0,0.1)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.7'\n e.currentTarget.style.backgroundColor = 'transparent'\n }}\n >\n <CloseIcon />\n </button>\n </span>\n ))}\n {searchable && (\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n aria-invalid={isInvalid}\n value={searchValue}\n placeholder={selectedOptions.length === 0 ? placeholder : ''}\n disabled={disabled}\n style={inputStyle}\n onChange={(e) => {\n setSearchValue(e.target.value)\n if (!isOpen) setIsOpen(true)\n setActiveIndex(0)\n }}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n />\n )}\n {!searchable && selectedOptions.length === 0 && (\n <span style={{ color: 'var(--brycks-foreground-muted)', fontSize: config.fontSize }}>\n {placeholder}\n </span>\n )}\n <div style={iconsStyle}>\n {clearable && value.length > 0 && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear all\"\n style={clearButtonStyle}\n onClick={clearAll}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--brycks-background-muted)'\n e.currentTarget.style.color = 'var(--brycks-foreground-default)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent'\n e.currentTarget.style.color = 'var(--brycks-foreground-muted)'\n }}\n >\n <CloseIcon />\n </button>\n )}\n <span style={chevronStyle}>\n <ChevronDownIcon />\n </span>\n </div>\n </div>\n\n {isOpen &&\n createPortal(\n <ul\n ref={listRef}\n role=\"listbox\"\n aria-label={ariaLabel || 'Options'}\n aria-multiselectable=\"true\"\n style={dropdownStyle}\n >\n {flatOptions.length > 0 ? (\n Array.from(filteredOptions.entries()).map(([group, opts]) => (\n <li key={group || 'ungrouped'} role=\"group\" aria-label={group}>\n {group && <div style={groupLabelStyle}>{group}</div>}\n <ul role=\"presentation\" style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {opts.map((option) => {\n optionIndex++\n const currentIndex = optionIndex\n const isSelected = value.includes(option.value)\n const isActive = currentIndex === activeIndex\n\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n style={optionStyle(isActive, isSelected)}\n onClick={() => toggleOption(option.value)}\n onMouseEnter={() => setActiveIndex(currentIndex)}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: spacing[5],\n height: spacing[5],\n borderRadius: 'var(--brycks-radius-sm)',\n border: isSelected\n ? 'none'\n : '1px solid var(--brycks-border-default)',\n backgroundColor: isSelected\n ? 'var(--brycks-primary-default)'\n : 'transparent',\n color: 'white',\n flexShrink: 0,\n }}\n >\n {isSelected && <CheckIcon />}\n </span>\n {option.icon && <span style={{ flexShrink: 0 }}>{option.icon}</span>}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontWeight: isSelected ? 500 : 400 }}>{option.label}</div>\n {option.description && (\n <div style={{ fontSize: fontSizes.sm, color: 'var(--brycks-foreground-muted)' }}>\n {option.description}\n </div>\n )}\n </div>\n </li>\n )\n })}\n </ul>\n </li>\n ))\n ) : (\n <li style={emptyStyle}>{emptyText}</li>\n )}\n </ul>,\n document.body\n )}\n </div>\n )\n})\n\nMultiSelect.displayName = 'MultiSelect'\n"],"names":["sizeConfig","componentHeights","fontSizes","spacing","componentPaddingX","ChevronDownIcon","jsx","CloseIcon","CheckIcon","MultiSelect","forwardRef","options","controlledValue","defaultValue","onChange","placeholder","size","maxSelections","searchable","disabled","isInvalid","clearable","emptyText","closeOnSelect","ariaLabel","ariaLabelledby","className","testId","ref","internalValue","setInternalValue","useState","isOpen","setIsOpen","searchValue","setSearchValue","activeIndex","setActiveIndex","isFocused","setIsFocused","containerRef","useRef","inputRef","listRef","value","config","selectedOptions","useMemo","opt","filteredOptions","filtered","groups","group","flatOptions","flat","opts","updateValue","useCallback","newValue","toggleOption","optionValue","v","removeOption","e","clearAll","handleKeyDown","prev","useEffect","handleClick","dropdownPosition","setDropdownPosition","updatePosition","rect","containerStyle","wrapperStyle","durations","easings","chipStyle","chipRemoveStyle","inputStyle","iconsStyle","clearButtonStyle","chevronStyle","dropdownStyle","groupLabelStyle","optionStyle","isActive","_isSelected","componentGap","emptyStyle","optionIndex","jsxs","node","cx","createPortal","option","currentIndex","isSelected"],"mappings":"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"}