premium-ds 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/dist/alert.d.ts +31 -0
  4. package/dist/alert.js +6 -0
  5. package/dist/alert.js.map +1 -0
  6. package/dist/avatar-group.d.ts +13 -0
  7. package/dist/avatar-group.js +3 -0
  8. package/dist/avatar-group.js.map +1 -0
  9. package/dist/avatar.d.ts +25 -0
  10. package/dist/avatar.js +3 -0
  11. package/dist/avatar.js.map +1 -0
  12. package/dist/badge.d.ts +23 -0
  13. package/dist/badge.js +3 -0
  14. package/dist/badge.js.map +1 -0
  15. package/dist/button.d.ts +20 -0
  16. package/dist/button.js +3 -0
  17. package/dist/button.js.map +1 -0
  18. package/dist/checkbox.d.ts +25 -0
  19. package/dist/checkbox.js +3 -0
  20. package/dist/checkbox.js.map +1 -0
  21. package/dist/chunk-2OWHZ4JT.js +36 -0
  22. package/dist/chunk-2OWHZ4JT.js.map +1 -0
  23. package/dist/chunk-34SIXSYL.js +64 -0
  24. package/dist/chunk-34SIXSYL.js.map +1 -0
  25. package/dist/chunk-37O2ZXD6.js +55 -0
  26. package/dist/chunk-37O2ZXD6.js.map +1 -0
  27. package/dist/chunk-4AZL76UJ.js +89 -0
  28. package/dist/chunk-4AZL76UJ.js.map +1 -0
  29. package/dist/chunk-4HSCN5TZ.js +86 -0
  30. package/dist/chunk-4HSCN5TZ.js.map +1 -0
  31. package/dist/chunk-5DDOOT33.js +258 -0
  32. package/dist/chunk-5DDOOT33.js.map +1 -0
  33. package/dist/chunk-5FVHWIMY.js +117 -0
  34. package/dist/chunk-5FVHWIMY.js.map +1 -0
  35. package/dist/chunk-5K6KRJGX.js +147 -0
  36. package/dist/chunk-5K6KRJGX.js.map +1 -0
  37. package/dist/chunk-5PQMQBQC.js +74 -0
  38. package/dist/chunk-5PQMQBQC.js.map +1 -0
  39. package/dist/chunk-7OCTVQ7C.js +95 -0
  40. package/dist/chunk-7OCTVQ7C.js.map +1 -0
  41. package/dist/chunk-7OPMOET7.js +39 -0
  42. package/dist/chunk-7OPMOET7.js.map +1 -0
  43. package/dist/chunk-BXXS7YRC.js +270 -0
  44. package/dist/chunk-BXXS7YRC.js.map +1 -0
  45. package/dist/chunk-CV2Q4YXX.js +272 -0
  46. package/dist/chunk-CV2Q4YXX.js.map +1 -0
  47. package/dist/chunk-EIMMDWIW.js +282 -0
  48. package/dist/chunk-EIMMDWIW.js.map +1 -0
  49. package/dist/chunk-EZ2CWTBE.js +230 -0
  50. package/dist/chunk-EZ2CWTBE.js.map +1 -0
  51. package/dist/chunk-FGHDG3Y4.js +89 -0
  52. package/dist/chunk-FGHDG3Y4.js.map +1 -0
  53. package/dist/chunk-FPP2XLKX.js +127 -0
  54. package/dist/chunk-FPP2XLKX.js.map +1 -0
  55. package/dist/chunk-G6OY35DI.js +295 -0
  56. package/dist/chunk-G6OY35DI.js.map +1 -0
  57. package/dist/chunk-H6KWJNOE.js +65 -0
  58. package/dist/chunk-H6KWJNOE.js.map +1 -0
  59. package/dist/chunk-HGILYGY3.js +45 -0
  60. package/dist/chunk-HGILYGY3.js.map +1 -0
  61. package/dist/chunk-I3BCB4Z5.js +88 -0
  62. package/dist/chunk-I3BCB4Z5.js.map +1 -0
  63. package/dist/chunk-KBWNUUWM.js +582 -0
  64. package/dist/chunk-KBWNUUWM.js.map +1 -0
  65. package/dist/chunk-KN7JFAZ6.js +113 -0
  66. package/dist/chunk-KN7JFAZ6.js.map +1 -0
  67. package/dist/chunk-MEF7PI6U.js +16 -0
  68. package/dist/chunk-MEF7PI6U.js.map +1 -0
  69. package/dist/chunk-NKGMQL6I.js +310 -0
  70. package/dist/chunk-NKGMQL6I.js.map +1 -0
  71. package/dist/chunk-NMFQRGLL.js +127 -0
  72. package/dist/chunk-NMFQRGLL.js.map +1 -0
  73. package/dist/chunk-OUBWD6CX.js +433 -0
  74. package/dist/chunk-OUBWD6CX.js.map +1 -0
  75. package/dist/chunk-PFNXVBLU.js +96 -0
  76. package/dist/chunk-PFNXVBLU.js.map +1 -0
  77. package/dist/chunk-PUPZ4HME.js +165 -0
  78. package/dist/chunk-PUPZ4HME.js.map +1 -0
  79. package/dist/chunk-QFS52OK5.js +690 -0
  80. package/dist/chunk-QFS52OK5.js.map +1 -0
  81. package/dist/chunk-QNC6O3PG.js +45 -0
  82. package/dist/chunk-QNC6O3PG.js.map +1 -0
  83. package/dist/chunk-QUHOXWBK.js +82 -0
  84. package/dist/chunk-QUHOXWBK.js.map +1 -0
  85. package/dist/chunk-UIQGSTBJ.js +106 -0
  86. package/dist/chunk-UIQGSTBJ.js.map +1 -0
  87. package/dist/chunk-UJQKVP6V.js +193 -0
  88. package/dist/chunk-UJQKVP6V.js.map +1 -0
  89. package/dist/chunk-VVPGEAC6.js +11 -0
  90. package/dist/chunk-VVPGEAC6.js.map +1 -0
  91. package/dist/chunk-XA3T5KWA.js +58 -0
  92. package/dist/chunk-XA3T5KWA.js.map +1 -0
  93. package/dist/chunk-YSHJHSJM.js +19 -0
  94. package/dist/chunk-YSHJHSJM.js.map +1 -0
  95. package/dist/chunk-YVHOAVSM.js +182 -0
  96. package/dist/chunk-YVHOAVSM.js.map +1 -0
  97. package/dist/collapse.d.ts +16 -0
  98. package/dist/collapse.js +3 -0
  99. package/dist/collapse.js.map +1 -0
  100. package/dist/count-badge.d.ts +11 -0
  101. package/dist/count-badge.js +4 -0
  102. package/dist/count-badge.js.map +1 -0
  103. package/dist/date-field.d.ts +39 -0
  104. package/dist/date-field.js +8 -0
  105. package/dist/date-field.js.map +1 -0
  106. package/dist/date-range-field.d.ts +30 -0
  107. package/dist/date-range-field.js +8 -0
  108. package/dist/date-range-field.js.map +1 -0
  109. package/dist/datetime-field.d.ts +28 -0
  110. package/dist/datetime-field.js +10 -0
  111. package/dist/datetime-field.js.map +1 -0
  112. package/dist/dialog.d.ts +26 -0
  113. package/dist/dialog.js +7 -0
  114. package/dist/dialog.js.map +1 -0
  115. package/dist/index.d.ts +35 -0
  116. package/dist/index.js +40 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/motion-tokens.d.ts +29 -0
  119. package/dist/motion-tokens.js +3 -0
  120. package/dist/motion-tokens.js.map +1 -0
  121. package/dist/multi-select.d.ts +25 -0
  122. package/dist/multi-select.js +7 -0
  123. package/dist/multi-select.js.map +1 -0
  124. package/dist/number-field.d.ts +24 -0
  125. package/dist/number-field.js +4 -0
  126. package/dist/number-field.js.map +1 -0
  127. package/dist/otp-field.d.ts +20 -0
  128. package/dist/otp-field.js +3 -0
  129. package/dist/otp-field.js.map +1 -0
  130. package/dist/overlay.d.ts +31 -0
  131. package/dist/overlay.js +4 -0
  132. package/dist/overlay.js.map +1 -0
  133. package/dist/pagination.d.ts +24 -0
  134. package/dist/pagination.js +5 -0
  135. package/dist/pagination.js.map +1 -0
  136. package/dist/radio-group.d.ts +46 -0
  137. package/dist/radio-group.js +6 -0
  138. package/dist/radio-group.js.map +1 -0
  139. package/dist/select-core-SAyS-8w0.d.ts +16 -0
  140. package/dist/select.d.ts +27 -0
  141. package/dist/select.js +7 -0
  142. package/dist/select.js.map +1 -0
  143. package/dist/status-badge.d.ts +17 -0
  144. package/dist/status-badge.js +5 -0
  145. package/dist/status-badge.js.map +1 -0
  146. package/dist/table.d.ts +65 -0
  147. package/dist/table.js +5 -0
  148. package/dist/table.js.map +1 -0
  149. package/dist/tabs.d.ts +44 -0
  150. package/dist/tabs.js +5 -0
  151. package/dist/tabs.js.map +1 -0
  152. package/dist/tag.d.ts +28 -0
  153. package/dist/tag.js +5 -0
  154. package/dist/tag.js.map +1 -0
  155. package/dist/text-field.d.ts +30 -0
  156. package/dist/text-field.js +6 -0
  157. package/dist/text-field.js.map +1 -0
  158. package/dist/textarea.d.ts +33 -0
  159. package/dist/textarea.js +5 -0
  160. package/dist/textarea.js.map +1 -0
  161. package/dist/time-field.d.ts +27 -0
  162. package/dist/time-field.js +6 -0
  163. package/dist/time-field.js.map +1 -0
  164. package/dist/toast-store.d.ts +75 -0
  165. package/dist/toast-store.js +3 -0
  166. package/dist/toast-store.js.map +1 -0
  167. package/dist/toast.d.ts +3 -0
  168. package/dist/toast.js +6 -0
  169. package/dist/toast.js.map +1 -0
  170. package/dist/toggle-tag.d.ts +24 -0
  171. package/dist/toggle-tag.js +4 -0
  172. package/dist/toggle-tag.js.map +1 -0
  173. package/dist/toggle.d.ts +21 -0
  174. package/dist/toggle.js +3 -0
  175. package/dist/toggle.js.map +1 -0
  176. package/dist/tooltip.d.ts +27 -0
  177. package/dist/tooltip.js +4 -0
  178. package/dist/tooltip.js.map +1 -0
  179. package/llms.txt +165 -0
  180. package/package.json +205 -0
  181. package/src/components/alert/Alert.tsx +118 -0
  182. package/src/components/alert/alert.css +136 -0
  183. package/src/components/avatar/Avatar.tsx +128 -0
  184. package/src/components/avatar/AvatarGroup.tsx +50 -0
  185. package/src/components/avatar/avatar.css +200 -0
  186. package/src/components/badge/Badge.tsx +66 -0
  187. package/src/components/badge/CountBadge.tsx +46 -0
  188. package/src/components/badge/StatusBadge.tsx +132 -0
  189. package/src/components/badge/badge.css +243 -0
  190. package/src/components/button/Button.tsx +68 -0
  191. package/src/components/button/button.css +222 -0
  192. package/src/components/checkbox/Checkbox.tsx +90 -0
  193. package/src/components/checkbox/checkbox.css +179 -0
  194. package/src/components/date-picker/DateField.tsx +362 -0
  195. package/src/components/date-picker/DateRangeField.tsx +533 -0
  196. package/src/components/date-picker/DateTimeField.tsx +177 -0
  197. package/src/components/date-picker/TimeField.tsx +100 -0
  198. package/src/components/date-picker/date-picker.css +591 -0
  199. package/src/components/date-picker/date-utils.ts +55 -0
  200. package/src/components/date-picker/field-shell.tsx +78 -0
  201. package/src/components/date-picker/glide-pill.tsx +81 -0
  202. package/src/components/date-picker/time-core.tsx +305 -0
  203. package/src/components/dialog/Dialog.tsx +181 -0
  204. package/src/components/dialog/dialog.css +170 -0
  205. package/src/components/glass/glass.css +100 -0
  206. package/src/components/icon/Icon.tsx +76 -0
  207. package/src/components/icon/IconSlot.tsx +11 -0
  208. package/src/components/icon/icon.css +33 -0
  209. package/src/components/input/NumberField.tsx +117 -0
  210. package/src/components/input/OtpField.tsx +118 -0
  211. package/src/components/input/TextField.tsx +123 -0
  212. package/src/components/input/input.css +335 -0
  213. package/src/components/motion/Collapse.tsx +33 -0
  214. package/src/components/motion/collapse.css +41 -0
  215. package/src/components/overlay/Overlay.tsx +239 -0
  216. package/src/components/overlay/overlay-core.tsx +565 -0
  217. package/src/components/overlay/overlay.css +119 -0
  218. package/src/components/overlay/sheet-drag.tsx +146 -0
  219. package/src/components/pagination/Pagination.tsx +140 -0
  220. package/src/components/pagination/pagination.css +48 -0
  221. package/src/components/radio-group/RadioGroup.tsx +182 -0
  222. package/src/components/radio-group/radio-group.css +277 -0
  223. package/src/components/select/MultiSelect.tsx +251 -0
  224. package/src/components/select/Select.tsx +235 -0
  225. package/src/components/select/select-core.tsx +417 -0
  226. package/src/components/select/select.css +386 -0
  227. package/src/components/table/Table.tsx +433 -0
  228. package/src/components/table/table.css +348 -0
  229. package/src/components/tabs/Tabs.tsx +371 -0
  230. package/src/components/tabs/tabs.css +228 -0
  231. package/src/components/tag/Tag.tsx +145 -0
  232. package/src/components/tag/ToggleTag.tsx +125 -0
  233. package/src/components/tag/tag.css +248 -0
  234. package/src/components/textarea/Textarea.tsx +197 -0
  235. package/src/components/textarea/textarea.css +219 -0
  236. package/src/components/toast/Toast.tsx +349 -0
  237. package/src/components/toast/toast-store.ts +266 -0
  238. package/src/components/toast/toast.css +233 -0
  239. package/src/components/toggle/Toggle.tsx +94 -0
  240. package/src/components/toggle/toggle.css +152 -0
  241. package/src/components/tooltip/Tooltip.tsx +365 -0
  242. package/src/components/tooltip/tooltip.css +86 -0
  243. package/src/index.ts +42 -0
  244. package/src/styles.css +39 -0
  245. package/src/tokens/avatar.css +20 -0
  246. package/src/tokens/color.css +56 -0
  247. package/src/tokens/elevation.css +20 -0
  248. package/src/tokens/fonts.css +3 -0
  249. package/src/tokens/glass.css +21 -0
  250. package/src/tokens/icons.css +7 -0
  251. package/src/tokens/layers.css +6 -0
  252. package/src/tokens/motion-tokens.ts +72 -0
  253. package/src/tokens/motion.css +49 -0
  254. package/src/tokens/radius.css +11 -0
  255. package/src/tokens/semantic.css +75 -0
  256. package/src/tokens/spacing.css +26 -0
  257. package/src/tokens/typography.css +54 -0
@@ -0,0 +1,433 @@
1
+ 'use client';import { parse, today, useGlide, GlidePill, tzLabel, MONTHS, pad, key, add, grid, DOW, col } from './chunk-UIQGSTBJ.js';
2
+ import { useControllable, FieldShell } from './chunk-QNC6O3PG.js';
3
+ import { Overlay } from './chunk-QFS52OK5.js';
4
+ import { Icon } from './chunk-KBWNUUWM.js';
5
+ import { UIMotion } from './chunk-37O2ZXD6.js';
6
+ import * as React from 'react';
7
+ import { motion } from 'motion/react';
8
+ import { jsx, jsxs } from 'react/jsx-runtime';
9
+
10
+ var { useState, useRef, useEffect } = React;
11
+ var drpMotion = motion;
12
+ var drpSM = UIMotion;
13
+ function drpDisplay(key2, withYear) {
14
+ const d = parse(key2);
15
+ const mon = MONTHS[d.getMonth()].slice(0, 3);
16
+ return mon + " " + pad(d.getDate()) + (withYear ? ", " + d.getFullYear() : "");
17
+ }
18
+ function drpRangeText(start, end) {
19
+ const sameYear = parse(start).getFullYear() === parse(end).getFullYear();
20
+ const curYear = (/* @__PURE__ */ new Date()).getFullYear();
21
+ const startYr = !sameYear || parse(start).getFullYear() !== curYear;
22
+ const endYr = parse(end).getFullYear() !== curYear;
23
+ return drpDisplay(start, startYr) + " - " + drpDisplay(end, endYr);
24
+ }
25
+ var drpDays = (start, end) => Math.round((+parse(end) - +parse(start)) / 864e5) + 1;
26
+ function drpPresets() {
27
+ const t = today();
28
+ const now = /* @__PURE__ */ new Date();
29
+ const firstThis = key(new Date(now.getFullYear(), now.getMonth(), 1));
30
+ const firstPrev = key(new Date(now.getFullYear(), now.getMonth() - 1, 1));
31
+ const lastPrev = key(new Date(now.getFullYear(), now.getMonth(), 0));
32
+ const jan1 = key(new Date(now.getFullYear(), 0, 1));
33
+ return [
34
+ { id: "today", label: "Today", start: t, end: t },
35
+ { id: "yest", label: "Yesterday", start: add(t, -1), end: add(t, -1) },
36
+ { id: "7d", label: "Last 7 days", start: add(t, -6), end: t },
37
+ { id: "30d", label: "Last 30 days", start: add(t, -29), end: t },
38
+ { id: "mtd", label: "This month", start: firstThis, end: t },
39
+ { id: "lastm", label: "Last month", start: firstPrev, end: lastPrev },
40
+ { id: "90d", label: "Last 90 days", start: add(t, -89), end: t },
41
+ { id: "ytd", label: "Year to date", start: jan1, end: t }
42
+ ];
43
+ }
44
+ function useResponsiveOverlayMode(query) {
45
+ const q = "(max-width: 640px)";
46
+ const [narrow, setNarrow] = useState(
47
+ () => typeof matchMedia === "function" ? matchMedia(q).matches : false
48
+ );
49
+ useEffect(() => {
50
+ const mq = matchMedia(q);
51
+ const fn = (e) => setNarrow(e.matches);
52
+ mq.addEventListener("change", fn);
53
+ setNarrow(mq.matches);
54
+ return () => mq.removeEventListener("change", fn);
55
+ }, [q]);
56
+ return narrow;
57
+ }
58
+ function DrpPanel({
59
+ value,
60
+ commit,
61
+ close,
62
+ min,
63
+ max,
64
+ timezone,
65
+ label,
66
+ months,
67
+ layout
68
+ }) {
69
+ const seedKey = value && value.start || today();
70
+ const seed = parse(seedKey);
71
+ const [view, setView] = useState({
72
+ y: seed.getFullYear(),
73
+ m: seed.getMonth()
74
+ });
75
+ const [anchor, setAnchor] = useState(null);
76
+ const [hoverKey, setHoverKey] = useState(null);
77
+ const [focusKey, setFocusKey] = useState(seedKey);
78
+ const daysRef = useRef(null);
79
+ const presetsRef = useRef(null);
80
+ const pendingFocusRef = useRef(false);
81
+ const grid2 = useGlide(daysRef);
82
+ const presetGlide = useGlide(presetsRef);
83
+ const inBounds = (key2) => (!min || key2 >= min) && (!max || key2 <= max);
84
+ let lo = null, hi = null, provisional = false;
85
+ if (anchor) {
86
+ const other = hoverKey || anchor;
87
+ lo = anchor < other ? anchor : other;
88
+ hi = anchor < other ? other : anchor;
89
+ provisional = true;
90
+ } else if (value && value.start && value.end) {
91
+ lo = value.start;
92
+ hi = value.end;
93
+ }
94
+ function pickDay(key2) {
95
+ if (!inBounds(key2)) return;
96
+ if (!anchor) {
97
+ setAnchor(key2);
98
+ setHoverKey(key2);
99
+ } else {
100
+ const start = anchor < key2 ? anchor : key2;
101
+ const end = anchor < key2 ? key2 : anchor;
102
+ setAnchor(null);
103
+ setHoverKey(null);
104
+ commit({ start, end });
105
+ }
106
+ }
107
+ function applyPreset(p) {
108
+ setAnchor(null);
109
+ setHoverKey(null);
110
+ const d = parse(p.start);
111
+ setView({ y: d.getFullYear(), m: d.getMonth() });
112
+ setFocusKey(p.start);
113
+ commit({ start: p.start, end: p.end });
114
+ }
115
+ function nav(dir) {
116
+ setView((v) => {
117
+ const d = new Date(v.y, v.m + dir, 1);
118
+ return { y: d.getFullYear(), m: d.getMonth() };
119
+ });
120
+ }
121
+ const viewIdx = view.y * 12 + view.m;
122
+ const prevViewIdxRef = useRef(viewIdx);
123
+ const navDir = prevViewIdxRef.current === viewIdx ? 0 : viewIdx > prevViewIdxRef.current ? 1 : -1;
124
+ useEffect(() => {
125
+ prevViewIdxRef.current = viewIdx;
126
+ }, [viewIdx]);
127
+ useEffect(() => {
128
+ const el = daysRef.current;
129
+ if (!el) return;
130
+ const btn = el.querySelector('[data-key="' + focusKey + '"]:not(:disabled)') || el.querySelector(".dtp__day:not(:disabled)");
131
+ if (btn) btn.focus({ preventScroll: true });
132
+ }, []);
133
+ useEffect(() => {
134
+ if (!pendingFocusRef.current || !daysRef.current) return;
135
+ pendingFocusRef.current = false;
136
+ const btn = daysRef.current.querySelector('[data-key="' + focusKey + '"]');
137
+ if (btn) btn.focus({ preventScroll: true });
138
+ }, [focusKey]);
139
+ function moveFocus(deltaDays) {
140
+ const key2 = add(focusKey, deltaDays);
141
+ const d = parse(key2);
142
+ pendingFocusRef.current = true;
143
+ setFocusKey(key2);
144
+ if (anchor) setHoverKey(key2);
145
+ const first = months === 2 ? view.y * 12 + view.m : view.y * 12 + view.m;
146
+ const idx = d.getFullYear() * 12 + d.getMonth();
147
+ const last = first + (months - 1);
148
+ if (idx < first) setView({ y: d.getFullYear(), m: d.getMonth() });
149
+ else if (idx > last) {
150
+ const back = new Date(d.getFullYear(), d.getMonth() - (months - 1), 1);
151
+ setView({ y: back.getFullYear(), m: back.getMonth() });
152
+ }
153
+ }
154
+ function onGridKeyDown(e) {
155
+ const k = e.key;
156
+ if (k === "ArrowLeft") moveFocus(-1);
157
+ else if (k === "ArrowRight") moveFocus(1);
158
+ else if (k === "ArrowUp") moveFocus(-7);
159
+ else if (k === "ArrowDown") moveFocus(7);
160
+ else if (k === "PageUp") {
161
+ nav(-1);
162
+ return;
163
+ } else if (k === "PageDown") {
164
+ nav(1);
165
+ return;
166
+ } else if (k === "Enter" || k === " ") pickDay(focusKey);
167
+ else if (k === "Escape" && anchor) {
168
+ setAnchor(null);
169
+ setHoverKey(null);
170
+ } else return;
171
+ e.preventDefault();
172
+ }
173
+ const todayKey = today();
174
+ function renderDay(d, viewMonth) {
175
+ const key2 = key(d);
176
+ const out = d.getMonth() !== viewMonth;
177
+ const disabled = !inBounds(key2);
178
+ const col2 = col(d);
179
+ const isLo = lo && key2 === lo;
180
+ const isHi = hi && key2 === hi;
181
+ const single = lo && hi && lo === hi;
182
+ const inRange = lo && hi && key2 >= lo && key2 <= hi;
183
+ const loGhost = provisional && isLo && lo !== anchor;
184
+ const hiGhost = provisional && isHi && !single && hi !== anchor;
185
+ const band = inRange && !single;
186
+ const extL = band && !isLo && col2 !== 0;
187
+ const extR = band && !isHi && col2 !== 6;
188
+ const capHere = months === 1 || !out;
189
+ const loCap = isLo && capHere;
190
+ const hiCap = isHi && !single && capHere;
191
+ const cls = ["dtp__day"];
192
+ if (out) cls.push("is-out");
193
+ if (inRange) cls.push("is-in-range");
194
+ if ((loGhost || hiGhost) && capHere) cls.push("is-cap-ghost");
195
+ else if (loCap || hiCap) cls.push("is-cap");
196
+ const bandCls = ["drp__band"];
197
+ if (extL) bandCls.push("drp__band--extL");
198
+ if (extR) bandCls.push("drp__band--extR");
199
+ if (!extL) bandCls.push("drp__band--roundL");
200
+ if (!extR) bandCls.push("drp__band--roundR");
201
+ return /* @__PURE__ */ jsxs(
202
+ "button",
203
+ {
204
+ type: "button",
205
+ role: "gridcell",
206
+ "data-key": key2,
207
+ className: cls.join(" "),
208
+ disabled,
209
+ tabIndex: key2 === focusKey ? 0 : -1,
210
+ "aria-label": MONTHS[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear(),
211
+ "aria-selected": isLo || isHi || void 0,
212
+ onClick: () => pickDay(key2),
213
+ onPointerEnter: (e) => {
214
+ setHoverKey(key2);
215
+ if (!anchor && !disabled) grid2.enter(e.currentTarget);
216
+ else grid2.leave();
217
+ },
218
+ children: [
219
+ band ? /* @__PURE__ */ jsx("span", { className: bandCls.join(" "), "aria-hidden": "true" }) : null,
220
+ loCap ? /* @__PURE__ */ jsx(
221
+ drpMotion.span,
222
+ {
223
+ className: "drp__cap" + (loGhost ? " drp__cap--ghost" : ""),
224
+ layoutId: "drp-cap-lo",
225
+ transition: drpSM.t.settle,
226
+ "aria-hidden": "true"
227
+ }
228
+ ) : null,
229
+ hiCap ? /* @__PURE__ */ jsx(
230
+ drpMotion.span,
231
+ {
232
+ className: "drp__cap" + (hiGhost ? " drp__cap--ghost" : ""),
233
+ layoutId: "drp-cap-hi",
234
+ transition: drpSM.t.settle,
235
+ "aria-hidden": "true"
236
+ }
237
+ ) : null,
238
+ /* @__PURE__ */ jsx("span", { className: "dtp__num", children: d.getDate() }),
239
+ key2 === todayKey ? /* @__PURE__ */ jsx("span", { className: "dtp__dot", "aria-hidden": "true" }) : null
240
+ ]
241
+ },
242
+ key2
243
+ );
244
+ }
245
+ function renderMonth(offset, withPrev, withNext) {
246
+ const base = new Date(view.y, view.m + offset, 1);
247
+ const y = base.getFullYear(), m = base.getMonth();
248
+ const cells = grid(y, m);
249
+ const prevEnd = key(new Date(y, m, 0));
250
+ const nextStart = key(new Date(y, m + 1, 1));
251
+ return /* @__PURE__ */ jsxs("div", { className: "dtp__cal", children: [
252
+ /* @__PURE__ */ jsxs("div", { className: "drp__mhead" + (withNext && !withPrev ? " drp__mhead--right" : ""), children: [
253
+ withPrev ? /* @__PURE__ */ jsx(
254
+ "button",
255
+ {
256
+ type: "button",
257
+ className: "dtp__nav",
258
+ "aria-label": "Previous month",
259
+ disabled: min && prevEnd < min,
260
+ onClick: () => nav(-1),
261
+ children: /* @__PURE__ */ jsx(Icon, { name: "caret-left", size: "sm" })
262
+ }
263
+ ) : null,
264
+ /* @__PURE__ */ jsxs("span", { className: "dtp__month", children: [
265
+ MONTHS[m],
266
+ " ",
267
+ /* @__PURE__ */ jsx("span", { className: "dtp__year", children: y })
268
+ ] }),
269
+ withNext ? /* @__PURE__ */ jsx(
270
+ "button",
271
+ {
272
+ type: "button",
273
+ className: "dtp__nav",
274
+ "aria-label": "Next month",
275
+ disabled: max && nextStart > max,
276
+ onClick: () => nav(1),
277
+ children: /* @__PURE__ */ jsx(Icon, { name: "caret-right", size: "sm" })
278
+ }
279
+ ) : null
280
+ ] }),
281
+ /* @__PURE__ */ jsx("div", { className: "dtp__dow", "aria-hidden": "true", children: DOW.map((d) => /* @__PURE__ */ jsx("span", { children: d }, d)) }),
282
+ /* @__PURE__ */ jsx(
283
+ "div",
284
+ {
285
+ className: "dtp__days",
286
+ role: "grid",
287
+ "aria-label": MONTHS[m] + " " + y,
288
+ "data-enter": navDir || void 0,
289
+ children: cells.map((d) => renderDay(d, m))
290
+ },
291
+ "days-" + viewIdx + "-" + offset
292
+ )
293
+ ] }, offset);
294
+ }
295
+ const presets = drpPresets();
296
+ function presetActive(p) {
297
+ return value && value.start === p.start && value.end === p.end;
298
+ }
299
+ return /* @__PURE__ */ jsxs(
300
+ "div",
301
+ {
302
+ className: "drp" + (layout === "sheet" ? " drp--sheet" : ""),
303
+ role: "dialog",
304
+ "aria-label": label || "Pick a date range",
305
+ children: [
306
+ /* @__PURE__ */ jsxs("div", { className: "drp__body", children: [
307
+ /* @__PURE__ */ jsxs(
308
+ "div",
309
+ {
310
+ className: "drp__presets",
311
+ role: "group",
312
+ "aria-label": "Quick ranges",
313
+ ref: presetsRef,
314
+ onPointerLeave: presetGlide.leave,
315
+ children: [
316
+ presets.map((p) => /* @__PURE__ */ jsx(
317
+ "button",
318
+ {
319
+ type: "button",
320
+ className: "drp__preset" + (presetActive(p) ? " is-active" : ""),
321
+ onPointerEnter: (e) => presetGlide.enter(e.currentTarget),
322
+ onClick: () => applyPreset(p),
323
+ children: p.label
324
+ },
325
+ p.id
326
+ )),
327
+ /* @__PURE__ */ jsx(
328
+ GlidePill,
329
+ {
330
+ className: "drp__presetGlide",
331
+ rect: presetGlide.rect,
332
+ active: presetGlide.active
333
+ }
334
+ )
335
+ ]
336
+ }
337
+ ),
338
+ /* @__PURE__ */ jsxs(
339
+ "div",
340
+ {
341
+ className: "drp__months",
342
+ ref: daysRef,
343
+ onKeyDown: onGridKeyDown,
344
+ onPointerLeave: () => {
345
+ if (anchor) setHoverKey(anchor);
346
+ grid2.leave();
347
+ },
348
+ children: [
349
+ months === 2 ? [renderMonth(0, true, false), renderMonth(1, false, true)] : renderMonth(0, true, true),
350
+ /* @__PURE__ */ jsx(GlidePill, { className: "dtp__hover", rect: grid2.rect, active: grid2.active })
351
+ ]
352
+ }
353
+ )
354
+ ] }),
355
+ /* @__PURE__ */ jsxs("div", { className: "drp__foot", children: [
356
+ /* @__PURE__ */ jsx("span", { className: "drp__readout" + (lo && hi ? "" : " is-empty"), children: lo && hi ? /* @__PURE__ */ jsxs(React.Fragment, { children: [
357
+ drpRangeText(lo, hi),
358
+ " ",
359
+ /* @__PURE__ */ jsxs("span", { className: "drp__count", children: [
360
+ "- ",
361
+ drpDays(lo, hi),
362
+ " ",
363
+ drpDays(lo, hi) === 1 ? "day" : "days"
364
+ ] })
365
+ ] }) : anchor ? "Pick the end date" : "Pick a start date" }),
366
+ timezone ? /* @__PURE__ */ jsx("span", { className: "drp__tz", children: tzLabel(timezone) }) : null,
367
+ /* @__PURE__ */ jsx("span", { className: "drp__footSpacer" }),
368
+ /* @__PURE__ */ jsx("button", { type: "button", className: "btn btn--primary btn--sm", onClick: close, children: "Done" })
369
+ ] })
370
+ ]
371
+ }
372
+ );
373
+ }
374
+ function DateRangeField({
375
+ value,
376
+ defaultValue = null,
377
+ onChange,
378
+ label,
379
+ placeholder = "Pick a date range",
380
+ timezone,
381
+ min,
382
+ max,
383
+ required = false,
384
+ invalid = false,
385
+ message,
386
+ disabled = false,
387
+ className = ""
388
+ }) {
389
+ const [val, commit] = useControllable(value, defaultValue, onChange);
390
+ const narrow = useResponsiveOverlayMode();
391
+ const mode = narrow ? "sheet" : "popover";
392
+ const display = val && val.start && val.end ? drpRangeText(val.start, val.end) : null;
393
+ const trigger = /* @__PURE__ */ jsx("button", { type: "button", className: "fld__input dtf__trigger", disabled, children: display ? /* @__PURE__ */ jsx("span", { className: "dtf__value", children: display }) : /* @__PURE__ */ jsx("span", { className: "dtf__placeholder", children: placeholder }) });
394
+ return /* @__PURE__ */ jsx(
395
+ FieldShell,
396
+ {
397
+ variant: "dtf",
398
+ label,
399
+ required,
400
+ invalid,
401
+ message,
402
+ icon: "calendar",
403
+ className,
404
+ children: /* @__PURE__ */ jsx(
405
+ Overlay,
406
+ {
407
+ trigger,
408
+ mode,
409
+ side: mode === "sheet" ? "bottom" : "bottom",
410
+ align: "start",
411
+ children: (api) => /* @__PURE__ */ jsx(
412
+ DrpPanel,
413
+ {
414
+ value: val,
415
+ commit,
416
+ close: api.close,
417
+ min,
418
+ max,
419
+ timezone,
420
+ label,
421
+ months: narrow ? 1 : 2,
422
+ layout: mode
423
+ }
424
+ )
425
+ }
426
+ )
427
+ }
428
+ );
429
+ }
430
+
431
+ export { DateRangeField };
432
+ //# sourceMappingURL=chunk-OUBWD6CX.js.map
433
+ //# sourceMappingURL=chunk-OUBWD6CX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/date-picker/DateRangeField.tsx"],"names":["key","grid","col"],"mappings":";;;;;;;;;AAwBA,IAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAU,GAAI,KAAA;AACxC,IAAM,SAAA,GAAY,MAAA;AAClB,IAAM,KAAA,GAAQ,QAAA;AAed,SAAS,UAAA,CAAWA,MAAa,QAAA,EAA2B;AAC1D,EAAA,MAAM,CAAA,GAAI,MAASA,IAAG,CAAA;AACtB,EAAA,MAAM,GAAA,GAAM,OAAW,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC/C,EAAA,OAAO,GAAA,GAAM,GAAA,GAAM,GAAA,CAAO,CAAA,CAAE,OAAA,EAAS,CAAA,IAAK,QAAA,GAAW,IAAA,GAAO,CAAA,CAAE,WAAA,EAAY,GAAI,EAAA,CAAA;AAChF;AACA,SAAS,YAAA,CAAa,OAAe,GAAA,EAAqB;AACxD,EAAA,MAAM,QAAA,GAAW,MAAS,KAAK,CAAA,CAAE,aAAY,KAAM,KAAA,CAAS,GAAG,CAAA,CAAE,WAAA,EAAY;AAC7E,EAAA,MAAM,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACvC,EAAA,MAAM,UAAU,CAAC,QAAA,IAAY,MAAS,KAAK,CAAA,CAAE,aAAY,KAAM,OAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAS,GAAG,CAAA,CAAE,aAAY,KAAM,OAAA;AAC9C,EAAA,OAAO,WAAW,KAAA,EAAO,OAAO,IAAI,KAAA,GAAQ,UAAA,CAAW,KAAK,KAAK,CAAA;AACnE;AACA,IAAM,OAAA,GAAU,CAAC,KAAA,EAAe,GAAA,KAC9B,KAAK,KAAA,CAAA,CAAO,CAAC,KAAA,CAAS,GAAG,IAAI,CAAC,KAAA,CAAS,KAAK,CAAA,IAAK,KAAQ,CAAA,GAAI,CAAA;AAE/D,SAAS,UAAA,GAA0B;AACjC,EAAA,MAAM,IAAI,KAAA,EAAS;AACnB,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,SAAA,GAAY,GAAA,CAAO,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAY,EAAG,GAAA,CAAI,QAAA,EAAS,EAAG,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,SAAA,GAAY,GAAA,CAAO,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAY,EAAG,GAAA,CAAI,QAAA,EAAS,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3E,EAAA,MAAM,QAAA,GAAW,GAAA,CAAO,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAY,EAAG,GAAA,CAAI,QAAA,EAAS,EAAG,CAAC,CAAC,CAAA;AACtE,EAAA,MAAM,IAAA,GAAO,IAAO,IAAI,IAAA,CAAK,IAAI,WAAA,EAAY,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AACrD,EAAA,OAAO;AAAA,IACL,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,SAAS,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,EAAE;AAAA,IAChD,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,aAAa,KAAA,EAAO,GAAA,CAAO,CAAA,EAAG,EAAE,CAAA,EAAG,GAAA,EAAK,GAAA,CAAO,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,IAC3E,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,GAAA,CAAO,CAAA,EAAG,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,IAC/D,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,GAAA,CAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,IAClE,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,cAAc,KAAA,EAAO,SAAA,EAAW,KAAK,CAAA,EAAE;AAAA,IAC3D,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,cAAc,KAAA,EAAO,SAAA,EAAW,KAAK,QAAA,EAAS;AAAA,IACpE,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,GAAA,CAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,IAClE,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,gBAAgB,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AAAE,GAC1D;AACF;AAEA,SAAS,yBAAyB,KAAA,EAAyB;AACzD,EAAA,MAAM,IAAa,oBAAA;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA;AAAA,IAAS,MACnC,OAAO,UAAA,KAAe,aAAa,UAAA,CAAW,CAAC,EAAE,OAAA,GAAU;AAAA,GAC7D;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,WAAW,CAAC,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAA2B,SAAA,CAAU,EAAE,OAAO,CAAA;AAC1D,IAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,EAAE,CAAA;AAChC,IAAA,SAAA,CAAU,GAAG,OAAO,CAAA;AACpB,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,QAAA,EAAU,EAAE,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AACN,EAAA,OAAO,MAAA;AACT;AAeA,SAAS,QAAA,CAAS;AAAA,EAChB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,OAAA,GAAW,KAAA,IAAS,KAAA,CAAM,KAAA,IAAU,KAAA,EAAS;AACnD,EAAA,MAAM,IAAA,GAAO,MAAS,OAAO,CAAA;AAC7B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,CAAmC;AAAA,IACzD,CAAA,EAAG,KAAK,WAAA,EAAY;AAAA,IACpB,CAAA,EAAG,KAAK,QAAA;AAAS,GAClB,CAAA;AAGD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAiB,OAAO,CAAA;AAExD,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,OAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,OAAO,KAAK,CAAA;AAGpC,EAAA,MAAMC,KAAAA,GAAO,SAAS,OAAO,CAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,SAAS,UAAU,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAW,CAACD,IAAAA,KAAAA,CAA0B,CAAC,OAAOA,IAAAA,IAAO,GAAA,MAAS,CAAC,GAAA,IAAOA,IAAAA,IAAO,GAAA,CAAA;AAGnF,EAAA,IAAI,EAAA,GAAoB,IAAA,EACtB,EAAA,GAAoB,IAAA,EACpB,WAAA,GAAc,KAAA;AAChB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,QAAQ,QAAA,IAAY,MAAA;AAC1B,IAAA,EAAA,GAAK,MAAA,GAAS,QAAQ,MAAA,GAAS,KAAA;AAC/B,IAAA,EAAA,GAAK,MAAA,GAAS,QAAQ,KAAA,GAAQ,MAAA;AAC9B,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB,CAAA,MAAA,IAAW,KAAA,IAAS,KAAA,CAAM,KAAA,IAAS,MAAM,GAAA,EAAK;AAC5C,IAAA,EAAA,GAAK,KAAA,CAAM,KAAA;AACX,IAAA,EAAA,GAAK,KAAA,CAAM,GAAA;AAAA,EACb;AAEA,EAAA,SAAS,QAAQA,IAAAA,EAAa;AAC5B,IAAA,IAAI,CAAC,QAAA,CAASA,IAAG,CAAA,EAAG;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,SAAA,CAAUA,IAAG,CAAA;AACb,MAAA,WAAA,CAAYA,IAAG,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,MAAA,GAASA,IAAAA,GAAM,MAAA,GAASA,IAAAA;AACtC,MAAA,MAAM,GAAA,GAAM,MAAA,GAASA,IAAAA,GAAMA,IAAAA,GAAM,MAAA;AACjC,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,MAAA,CAAO,EAAE,KAAA,EAAc,GAAA,EAAU,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,SAAS,YAAY,CAAA,EAAc;AACjC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAC1B,IAAA,OAAA,CAAQ,EAAE,GAAG,CAAA,CAAE,WAAA,IAAe,CAAA,EAAG,CAAA,CAAE,QAAA,EAAS,EAAG,CAAA;AAC/C,IAAA,WAAA,CAAY,EAAE,KAAK,CAAA;AACnB,IAAA,MAAA,CAAO,EAAE,KAAA,EAAO,CAAA,CAAE,OAAO,GAAA,EAAK,CAAA,CAAE,KAAK,CAAA;AAAA,EACvC;AAEA,EAAA,SAAS,IAAI,GAAA,EAAa;AACxB,IAAA,OAAA,CAAQ,CAAC,CAAA,KAAM;AACb,MAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,GAAI,KAAK,CAAC,CAAA;AACpC,MAAA,OAAO,EAAE,GAAG,CAAA,CAAE,WAAA,IAAe,CAAA,EAAG,CAAA,CAAE,UAAS,EAAE;AAAA,IAC/C,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,CAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,OAAO,OAAO,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,eAAe,OAAA,KAAY,OAAA,GAAU,IAAI,OAAA,GAAU,cAAA,CAAe,UAAU,CAAA,GAAI,EAAA;AAC/F,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,GAAU,OAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,GAAA,GACJ,GAAG,aAAA,CAAc,aAAA,GAAgB,WAAW,mBAAmB,CAAA,IAC/D,EAAA,CAAG,aAAA,CAAc,0BAA0B,CAAA;AAC7C,IAAA,IAAI,KAAM,GAAA,CAAoB,MAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,CAAgB,OAAA,IAAW,CAAC,QAAQ,OAAA,EAAS;AAClD,IAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,IAAA,MAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,aAAA,CAAc,aAAA,GAAgB,WAAW,IAAI,CAAA;AACzE,IAAA,IAAI,KAAM,GAAA,CAAoB,MAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,SAAS,UAAU,SAAA,EAAmB;AACpC,IAAA,MAAMA,IAAAA,GAAM,GAAA,CAAO,QAAA,EAAU,SAAS,CAAA;AACtC,IAAA,MAAM,CAAA,GAAI,MAASA,IAAG,CAAA;AACtB,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,WAAA,CAAYA,IAAG,CAAA;AACf,IAAA,IAAI,MAAA,cAAoBA,IAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,CAAA;AACvE,IAAA,MAAM,MAAM,CAAA,CAAE,WAAA,EAAY,GAAI,EAAA,GAAK,EAAE,QAAA,EAAS;AAC9C,IAAA,MAAM,IAAA,GAAO,SAAS,MAAA,GAAS,CAAA,CAAA;AAC/B,IAAA,IAAI,GAAA,GAAM,KAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAA,CAAE,WAAA,EAAY,EAAG,CAAA,EAAG,CAAA,CAAE,QAAA,EAAS,EAAG,CAAA;AAAA,SAAA,IACvD,MAAM,IAAA,EAAM;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAA,CAAE,WAAA,EAAY,EAAG,CAAA,CAAE,QAAA,EAAS,IAAK,MAAA,GAAS,CAAA,CAAA,EAAI,CAAC,CAAA;AACrE,MAAA,OAAA,CAAQ,EAAE,GAAG,IAAA,CAAK,WAAA,IAAe,CAAA,EAAG,IAAA,CAAK,QAAA,EAAS,EAAG,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,SAAS,cAAc,CAAA,EAAwC;AAC7D,IAAA,MAAM,IAAI,CAAA,CAAE,GAAA;AACZ,IAAA,IAAI,CAAA,KAAM,WAAA,EAAa,SAAA,CAAU,EAAE,CAAA;AAAA,SAAA,IAC1B,CAAA,KAAM,YAAA,EAAc,SAAA,CAAU,CAAC,CAAA;AAAA,SAAA,IAC/B,CAAA,KAAM,SAAA,EAAW,SAAA,CAAU,EAAE,CAAA;AAAA,SAAA,IAC7B,CAAA,KAAM,WAAA,EAAa,SAAA,CAAU,CAAC,CAAA;AAAA,SAAA,IAC9B,MAAM,QAAA,EAAU;AACvB,MAAA,GAAA,CAAI,EAAE,CAAA;AACN,MAAA;AAAA,IACF,CAAA,MAAA,IAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,GAAA,CAAI,CAAC,CAAA;AACL,MAAA;AAAA,IACF,WAAW,CAAA,KAAM,OAAA,IAAW,CAAA,KAAM,GAAA,UAAa,QAAQ,CAAA;AAAA,SAAA,IAC9C,CAAA,KAAM,YAAY,MAAA,EAAQ;AACjC,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,CAAA,MAAO;AACP,IAAA,CAAA,CAAE,cAAA,EAAe;AAAA,EACnB;AAEA,EAAA,MAAM,WAAW,KAAA,EAAS;AAC1B,EAAA,SAAS,SAAA,CAAU,GAAS,SAAA,EAAmB;AAC7C,IAAA,MAAMA,IAAAA,GAAM,IAAO,CAAC,CAAA;AACpB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAS,KAAM,SAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,CAAC,QAAA,CAASA,IAAG,CAAA;AAC9B,IAAA,MAAME,IAAAA,GAAM,IAAO,CAAC,CAAA;AAEpB,IAAA,MAAM,IAAA,GAAO,MAAMF,IAAAA,KAAQ,EAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAMA,IAAAA,KAAQ,EAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,EAAA,IAAM,EAAA,IAAM,EAAA,KAAO,EAAA;AAClC,IAAA,MAAM,OAAA,GAAU,EAAA,IAAM,EAAA,IAAMA,IAAAA,IAAO,MAAMA,IAAAA,IAAO,EAAA;AAEhD,IAAA,MAAM,OAAA,GAAU,WAAA,IAAe,IAAA,IAAQ,EAAA,KAAO,MAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,WAAA,IAAe,IAAA,IAAQ,CAAC,UAAU,EAAA,KAAO,MAAA;AAEzD,IAAA,MAAM,IAAA,GAAO,WAAW,CAAC,MAAA;AACzB,IAAA,MAAM,IAAA,GAAO,IAAA,IAAQ,CAAC,IAAA,IAAQE,IAAAA,KAAQ,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,IAAQ,CAAC,IAAA,IAAQA,IAAAA,KAAQ,CAAA;AAGtC,IAAA,MAAM,OAAA,GAAU,MAAA,KAAW,CAAA,IAAK,CAAC,GAAA;AACjC,IAAA,MAAM,QAAQ,IAAA,IAAQ,OAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAA,IAAQ,CAAC,MAAA,IAAU,OAAA;AAEjC,IAAA,MAAM,GAAA,GAAM,CAAC,UAAU,CAAA;AACvB,IAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAC1B,IAAA,IAAI,OAAA,EAAS,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AACnC,IAAA,IAAA,CAAK,OAAA,IAAW,OAAA,KAAY,OAAA,EAAS,GAAA,CAAI,KAAK,cAAc,CAAA;AAAA,SAAA,IACnD,KAAA,IAAS,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAE1C,IAAA,MAAM,OAAA,GAAU,CAAC,WAAW,CAAA;AAC5B,IAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,iBAAiB,CAAA;AACxC,IAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,iBAAiB,CAAA;AACxC,IAAA,IAAI,CAAC,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,mBAAmB,CAAA;AAC3C,IAAA,IAAI,CAAC,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,mBAAmB,CAAA;AAE3C,IAAA,uBACE,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,UAAA,EAAUF,IAAAA;AAAA,QACV,SAAA,EAAW,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAAA,QACvB,QAAA;AAAA,QACA,QAAA,EAAUA,IAAAA,KAAQ,QAAA,GAAW,CAAA,GAAI,EAAA;AAAA,QACjC,YAAA,EAAY,MAAA,CAAW,CAAA,CAAE,QAAA,EAAU,CAAA,GAAI,GAAA,GAAM,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA,GAAO,CAAA,CAAE,WAAA,EAAY;AAAA,QAChF,eAAA,EAAe,QAAQ,IAAA,IAAQ,MAAA;AAAA,QAC/B,OAAA,EAAS,MAAM,OAAA,CAAQA,IAAG,CAAA;AAAA,QAC1B,cAAA,EAAgB,CAAC,CAAA,KAAM;AACrB,UAAA,WAAA,CAAYA,IAAG,CAAA;AACf,UAAA,IAAI,CAAC,UAAU,CAAC,QAAA,EAAUC,KAAAA,CAAK,KAAA,CAAM,EAAE,aAAa,CAAA;AAAA,eAC/CA,MAAK,KAAA,EAAM;AAAA,QAClB,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,mBAAO,GAAA,CAAC,UAAK,SAAA,EAAW,OAAA,CAAQ,KAAK,GAAG,CAAA,EAAG,aAAA,EAAY,MAAA,EAAO,CAAA,GAAU,IAAA;AAAA,UACxE,KAAA,mBACC,GAAA;AAAA,YAAC,SAAA,CAAU,IAAA;AAAA,YAAV;AAAA,cACC,SAAA,EAAW,UAAA,IAAc,OAAA,GAAU,kBAAA,GAAqB,EAAA,CAAA;AAAA,cACxD,QAAA,EAAS,YAAA;AAAA,cACT,UAAA,EAAY,MAAM,CAAA,CAAE,MAAA;AAAA,cACpB,aAAA,EAAY;AAAA;AAAA,WACb,GACC,IAAA;AAAA,UACH,KAAA,mBACC,GAAA;AAAA,YAAC,SAAA,CAAU,IAAA;AAAA,YAAV;AAAA,cACC,SAAA,EAAW,UAAA,IAAc,OAAA,GAAU,kBAAA,GAAqB,EAAA,CAAA;AAAA,cACxD,QAAA,EAAS,YAAA;AAAA,cACT,UAAA,EAAY,MAAM,CAAA,CAAE,MAAA;AAAA,cACpB,aAAA,EAAY;AAAA;AAAA,WACb,GACC,IAAA;AAAA,8BACH,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,CAAA,CAAE,SAAQ,EAAE,CAAA;AAAA,UACvCD,IAAAA,KAAQ,2BAAW,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAW,aAAA,EAAY,QAAO,CAAA,GAAU;AAAA;AAAA,OAAA;AAAA,MAlCvEA;AAAA,KAmCP;AAAA,EAEJ;AAEA,EAAA,SAAS,WAAA,CAAY,MAAA,EAAgB,QAAA,EAAmB,QAAA,EAAmB;AACzE,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,IAAA,CAAK,CAAA,GAAI,QAAQ,CAAC,CAAA;AAChD,IAAA,MAAM,IAAI,IAAA,CAAK,WAAA,EAAY,EACzB,CAAA,GAAI,KAAK,QAAA,EAAS;AACpB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAC1B,IAAA,MAAM,UAAU,GAAA,CAAO,IAAI,KAAK,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AACxC,IAAA,MAAM,SAAA,GAAY,IAAO,IAAI,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,SAAI,SAAA,EAAW,YAAA,IAAgB,YAAY,CAAC,QAAA,GAAW,uBAAuB,EAAA,CAAA,EAC5E,QAAA,EAAA;AAAA,QAAA,QAAA,mBACC,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,UAAA;AAAA,YACV,YAAA,EAAW,gBAAA;AAAA,YACX,QAAA,EAAU,OAAO,OAAA,GAAU,GAAA;AAAA,YAC3B,OAAA,EAAS,MAAM,GAAA,CAAI,EAAE,CAAA;AAAA,YAErB,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,YAAA,EAAa,MAAK,IAAA,EAAK;AAAA;AAAA,SACpC,GACE,IAAA;AAAA,wBACJ,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,UAAA,MAAA,CAAW,CAAC,CAAA;AAAA,UAAE,GAAA;AAAA,0BAAC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,CAAA,EAAE;AAAA,SAAA,EACjD,CAAA;AAAA,QACC,QAAA,mBACC,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,UAAA;AAAA,YACV,YAAA,EAAW,YAAA;AAAA,YACX,QAAA,EAAU,OAAO,SAAA,GAAY,GAAA;AAAA,YAC7B,OAAA,EAAS,MAAM,GAAA,CAAI,CAAC,CAAA;AAAA,YAEpB,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,aAAA,EAAc,MAAK,IAAA,EAAK;AAAA;AAAA,SACrC,GACE;AAAA,OAAA,EACN,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,eAAY,MAAA,EACnC,QAAA,EAAA,GAAA,CAAQ,GAAA,CAAI,CAAC,sBACZ,GAAA,CAAC,MAAA,EAAA,EAAc,QAAA,EAAA,CAAA,EAAA,EAAJ,CAAM,CAClB,CAAA,EACH,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,WAAA;AAAA,UACV,IAAA,EAAK,MAAA;AAAA,UACL,YAAA,EAAY,MAAA,CAAW,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,UAElC,cAAY,MAAA,IAAU,MAAA;AAAA,UAErB,gBAAM,GAAA,CAAI,CAAC,MAAM,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC;AAAA,SAAA;AAAA,QAH5B,OAAA,GAAU,UAAU,GAAA,GAAM;AAAA;AAIjC,KAAA,EAAA,EAzC6B,MA0C/B,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,EAAA,SAAS,aAAa,CAAA,EAAuB;AAC3C,IAAA,OAAO,SAAS,KAAA,CAAM,KAAA,KAAU,EAAE,KAAA,IAAS,KAAA,CAAM,QAAQ,CAAA,CAAE,GAAA;AAAA,EAC7D;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,KAAA,IAAS,MAAA,KAAW,OAAA,GAAU,aAAA,GAAgB,EAAA,CAAA;AAAA,MACzD,IAAA,EAAK,QAAA;AAAA,MACL,cAAY,KAAA,IAAS,mBAAA;AAAA,MAErB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,cAAA;AAAA,cACV,IAAA,EAAK,OAAA;AAAA,cACL,YAAA,EAAW,cAAA;AAAA,cACX,GAAA,EAAK,UAAA;AAAA,cACL,gBAAgB,WAAA,CAAY,KAAA;AAAA,cAE3B,QAAA,EAAA;AAAA,gBAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZ,GAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAW,aAAA,IAAiB,YAAA,CAAa,CAAC,IAAI,YAAA,GAAe,EAAA,CAAA;AAAA,oBAC7D,gBAAgB,CAAC,CAAA,KAAM,WAAA,CAAY,KAAA,CAAM,EAAE,aAAa,CAAA;AAAA,oBACxD,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,CAAA;AAAA,oBAE3B,QAAA,EAAA,CAAA,CAAE;AAAA,mBAAA;AAAA,kBANE,CAAA,CAAE;AAAA,iBAQV,CAAA;AAAA,gCACD,GAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,kBAAA;AAAA,oBACV,MAAM,WAAA,CAAY,IAAA;AAAA,oBAClB,QAAQ,WAAA,CAAY;AAAA;AAAA;AACtB;AAAA;AAAA,WACF;AAAA,0BACA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,aAAA;AAAA,cACV,GAAA,EAAK,OAAA;AAAA,cACL,SAAA,EAAW,aAAA;AAAA,cACX,gBAAgB,MAAM;AACpB,gBAAA,IAAI,MAAA,cAAoB,MAAM,CAAA;AAC9B,gBAAAC,MAAK,KAAA,EAAM;AAAA,cACb,CAAA;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,MAAA,KAAW,IACR,CAAC,WAAA,CAAY,CAAA,EAAG,IAAA,EAAM,KAAK,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,KAAA,EAAO,IAAI,CAAC,CAAA,GACzD,WAAA,CAAY,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,gCAC7B,GAAA,CAAC,aAAU,SAAA,EAAU,YAAA,EAAa,MAAMA,KAAAA,CAAK,IAAA,EAAM,MAAA,EAAQA,KAAAA,CAAK,MAAA,EAAQ;AAAA;AAAA;AAAA;AAC1E,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,cAAA,IAAkB,EAAA,IAAM,EAAA,GAAK,EAAA,GAAK,WAAA,CAAA,EAChD,QAAA,EAAA,EAAA,IAAM,EAAA,mBACL,IAAA,CAAO,KAAA,CAAA,QAAA,EAAN,EACE,QAAA,EAAA;AAAA,YAAA,YAAA,CAAa,IAAI,EAAE,CAAA;AAAA,YAAG,GAAA;AAAA,4BACvB,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,QAAA,EAAA;AAAA,cAAA,IAAA;AAAA,cACxB,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE,OAAA,CAAQ,EAAA,EAAI,EAAE,CAAA,KAAM,IAAI,KAAA,GAAQ;AAAA,aAAA,EACvD;AAAA,WAAA,EACF,CAAA,GACE,MAAA,GACF,mBAAA,GAEA,mBAAA,EAEJ,CAAA;AAAA,UACC,QAAA,uBAAY,MAAA,EAAA,EAAK,SAAA,EAAU,WAAW,QAAA,EAAA,OAAA,CAAW,QAAQ,GAAE,CAAA,GAAU,IAAA;AAAA,0BACtE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAkB,CAAA;AAAA,0BAClC,GAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,0BAAA,EAA2B,OAAA,EAAS,OAAO,QAAA,EAAA,MAAA,EAE3E;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAuBO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,YAAA,GAAe,IAAA;AAAA,EACf,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,GAAc,mBAAA;AAAA,EACd,QAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY;AACd,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,IAAI,eAAA,CAAgB,KAAA,EAAO,cAAc,QAAQ,CAAA;AAEnE,EAAA,MAAM,SAAS,wBAAA,EAAyB;AACxC,EAAA,MAAM,IAAA,GAAO,SAAS,OAAA,GAAU,SAAA;AAEhC,EAAA,MAAM,OAAA,GAAU,GAAA,IAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA;AAEjF,EAAA,MAAM,OAAA,uBACH,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,yBAAA,EAA0B,UACvD,QAAA,EAAA,OAAA,mBACC,GAAA,CAAC,UAAK,SAAA,EAAU,YAAA,EAAc,mBAAQ,CAAA,mBAEtC,GAAA,CAAC,UAAK,SAAA,EAAU,kBAAA,EAAoB,uBAAY,CAAA,EAEpD,CAAA;AAGF,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,KAAA;AAAA,MACR,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAK,UAAA;AAAA,MACL,SAAA;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA,EAAM,IAAA,KAAS,OAAA,GAAU,QAAA,GAAW,QAAA;AAAA,UACpC,KAAA,EAAM,OAAA;AAAA,UAEL,WAAC,GAAA,qBACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,GAAA;AAAA,cACP,MAAA;AAAA,cACA,OAAO,GAAA,CAAI,KAAA;AAAA,cACX,GAAA;AAAA,cACA,GAAA;AAAA,cACA,QAAA;AAAA,cACA,KAAA;AAAA,cACA,MAAA,EAAQ,SAAS,CAAA,GAAI,CAAA;AAAA,cACrB,MAAA,EAAQ;AAAA;AAAA;AACV;AAAA;AAEJ;AAAA,GACF;AAEJ","file":"chunk-OUBWD6CX.js","sourcesContent":["'use client';\n\n/* DateRangeField - DateField's sibling for { start, end }: a Linear/Notion two-click range; the Overlay switches popoverandsheet by viewport. */\n\nimport * as React from 'react';\nimport { motion } from 'motion/react';\nimport { UIMotion } from '../../tokens/motion-tokens';\nimport { Icon } from '../icon/Icon';\nimport { Overlay } from '../overlay/Overlay';\nimport { FieldShell, useControllable } from './field-shell';\nimport { GlidePill, useGlide } from './glide-pill';\nimport {\n MONTHS as DRP_MONTHS,\n DOW as DRP_DOW,\n pad as drpPad,\n key as drpKey,\n parse as drpParse,\n today as drpToday,\n add as drpAdd,\n col as drpCol,\n grid as drpGrid,\n tzLabel as drpTzLabel,\n} from './date-utils';\n\nconst { useState, useRef, useEffect } = React;\nconst drpMotion = motion;\nconst drpSM = UIMotion;\n\n/** A date range as wall-clock 'YYYY-MM-DD' endpoints, inclusive. */\nexport interface DateRange {\n start: string;\n end: string;\n}\n\ninterface DrpPreset {\n id: string;\n label: string;\n start: string;\n end: string;\n}\n\nfunction drpDisplay(key: string, withYear: boolean): string {\n const d = drpParse(key);\n const mon = DRP_MONTHS[d.getMonth()].slice(0, 3);\n return mon + ' ' + drpPad(d.getDate()) + (withYear ? ', ' + d.getFullYear() : '');\n}\nfunction drpRangeText(start: string, end: string): string {\n const sameYear = drpParse(start).getFullYear() === drpParse(end).getFullYear();\n const curYear = new Date().getFullYear();\n const startYr = !sameYear || drpParse(start).getFullYear() !== curYear;\n const endYr = drpParse(end).getFullYear() !== curYear;\n return drpDisplay(start, startYr) + ' - ' + drpDisplay(end, endYr);\n}\nconst drpDays = (start: string, end: string): number =>\n Math.round((+drpParse(end) - +drpParse(start)) / 86400000) + 1;\n\nfunction drpPresets(): DrpPreset[] {\n const t = drpToday();\n const now = new Date();\n const firstThis = drpKey(new Date(now.getFullYear(), now.getMonth(), 1));\n const firstPrev = drpKey(new Date(now.getFullYear(), now.getMonth() - 1, 1));\n const lastPrev = drpKey(new Date(now.getFullYear(), now.getMonth(), 0));\n const jan1 = drpKey(new Date(now.getFullYear(), 0, 1));\n return [\n { id: 'today', label: 'Today', start: t, end: t },\n { id: 'yest', label: 'Yesterday', start: drpAdd(t, -1), end: drpAdd(t, -1) },\n { id: '7d', label: 'Last 7 days', start: drpAdd(t, -6), end: t },\n { id: '30d', label: 'Last 30 days', start: drpAdd(t, -29), end: t },\n { id: 'mtd', label: 'This month', start: firstThis, end: t },\n { id: 'lastm', label: 'Last month', start: firstPrev, end: lastPrev },\n { id: '90d', label: 'Last 90 days', start: drpAdd(t, -89), end: t },\n { id: 'ytd', label: 'Year to date', start: jan1, end: t },\n ];\n}\n\nfunction useResponsiveOverlayMode(query?: string): boolean {\n const q = query || '(max-width: 640px)';\n const [narrow, setNarrow] = useState(() =>\n typeof matchMedia === 'function' ? matchMedia(q).matches : false,\n );\n useEffect(() => {\n const mq = matchMedia(q);\n const fn = (e: MediaQueryListEvent) => setNarrow(e.matches);\n mq.addEventListener('change', fn);\n setNarrow(mq.matches);\n return () => mq.removeEventListener('change', fn);\n }, [q]);\n return narrow;\n}\n\ninterface DrpPanelProps {\n value: DateRange | null;\n commit: (value: DateRange) => void;\n close: () => void;\n min?: string;\n max?: string;\n timezone?: string;\n label?: string;\n months: number;\n layout: 'popover' | 'sheet';\n}\n\n/* the popover/sheet panel, mounted only while open */\nfunction DrpPanel({\n value,\n commit,\n close,\n min,\n max,\n timezone,\n label,\n months,\n layout,\n}: DrpPanelProps) {\n const seedKey = (value && value.start) || drpToday();\n const seed = drpParse(seedKey);\n const [view, setView] = useState<{ y: number; m: number }>({\n y: seed.getFullYear(),\n m: seed.getMonth(),\n });\n\n /* anchor !== null - a range is being dragged open (awaiting the 2nd pick) */\n const [anchor, setAnchor] = useState<string | null>(null);\n const [hoverKey, setHoverKey] = useState<string | null>(null);\n const [focusKey, setFocusKey] = useState<string>(seedKey);\n\n const daysRef = useRef<HTMLDivElement>(null);\n const presetsRef = useRef<HTMLDivElement>(null);\n const pendingFocusRef = useRef(false);\n\n /* gliding hover pill per zone (see glide-pill); hoverKey drives the preview band, not the pill - the pill idles once an anchor is set. */\n const grid = useGlide(daysRef);\n const presetGlide = useGlide(presetsRef);\n\n const inBounds = (key: string): boolean => (!min || key >= min) && (!max || key <= max);\n\n /* effective lo/hi for PAINT: mid-selection - anchorandhover; else committed */\n let lo: string | null = null,\n hi: string | null = null,\n provisional = false;\n if (anchor) {\n const other = hoverKey || anchor;\n lo = anchor < other ? anchor : other;\n hi = anchor < other ? other : anchor;\n provisional = true;\n } else if (value && value.start && value.end) {\n lo = value.start;\n hi = value.end;\n }\n\n function pickDay(key: string) {\n if (!inBounds(key)) return;\n if (!anchor) {\n setAnchor(key);\n setHoverKey(key);\n } else {\n const start = anchor < key ? anchor : key;\n const end = anchor < key ? key : anchor;\n setAnchor(null);\n setHoverKey(null);\n commit({ start: start, end: end });\n }\n }\n\n function applyPreset(p: DrpPreset) {\n setAnchor(null);\n setHoverKey(null);\n const d = drpParse(p.start);\n setView({ y: d.getFullYear(), m: d.getMonth() });\n setFocusKey(p.start);\n commit({ start: p.start, end: p.end });\n }\n\n function nav(dir: number) {\n setView((v) => {\n const d = new Date(v.y, v.m + dir, 1);\n return { y: d.getFullYear(), m: d.getMonth() };\n });\n }\n\n /* directional month slide via CSS keyframe on a keyed grid remount - Motion animate() fights the layoutId caps; direction from the viewIdx delta, the first mount gets none. */\n const viewIdx = view.y * 12 + view.m;\n const prevViewIdxRef = useRef(viewIdx);\n const navDir = prevViewIdxRef.current === viewIdx ? 0 : viewIdx > prevViewIdxRef.current ? 1 : -1;\n useEffect(() => {\n prevViewIdxRef.current = viewIdx;\n }, [viewIdx]);\n\n /* seed focus into the grid on open (panel portals to <body>) */\n useEffect(() => {\n const el = daysRef.current;\n if (!el) return;\n const btn =\n el.querySelector('[data-key=\"' + focusKey + '\"]:not(:disabled)') ||\n el.querySelector('.dtp__day:not(:disabled)');\n if (btn) (btn as HTMLElement).focus({ preventScroll: true });\n }, []);\n\n useEffect(() => {\n if (!pendingFocusRef.current || !daysRef.current) return;\n pendingFocusRef.current = false;\n const btn = daysRef.current.querySelector('[data-key=\"' + focusKey + '\"]');\n if (btn) (btn as HTMLElement).focus({ preventScroll: true });\n }, [focusKey]);\n\n function moveFocus(deltaDays: number) {\n const key = drpAdd(focusKey, deltaDays);\n const d = drpParse(key);\n pendingFocusRef.current = true;\n setFocusKey(key);\n if (anchor) setHoverKey(key);\n const first = months === 2 ? view.y * 12 + view.m : view.y * 12 + view.m;\n const idx = d.getFullYear() * 12 + d.getMonth();\n const last = first + (months - 1);\n if (idx < first) setView({ y: d.getFullYear(), m: d.getMonth() });\n else if (idx > last) {\n const back = new Date(d.getFullYear(), d.getMonth() - (months - 1), 1);\n setView({ y: back.getFullYear(), m: back.getMonth() });\n }\n }\n function onGridKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n const k = e.key;\n if (k === 'ArrowLeft') moveFocus(-1);\n else if (k === 'ArrowRight') moveFocus(1);\n else if (k === 'ArrowUp') moveFocus(-7);\n else if (k === 'ArrowDown') moveFocus(7);\n else if (k === 'PageUp') {\n nav(-1);\n return;\n } else if (k === 'PageDown') {\n nav(1);\n return;\n } else if (k === 'Enter' || k === ' ') pickDay(focusKey);\n else if (k === 'Escape' && anchor) {\n setAnchor(null);\n setHoverKey(null);\n } else return;\n e.preventDefault();\n }\n\n const todayKey = drpToday();\n function renderDay(d: Date, viewMonth: number) {\n const key = drpKey(d);\n const out = d.getMonth() !== viewMonth;\n const disabled = !inBounds(key);\n const col = drpCol(d);\n\n const isLo = lo && key === lo;\n const isHi = hi && key === hi;\n const single = lo && hi && lo === hi;\n const inRange = lo && hi && key >= lo && key <= hi;\n /* the provisional (un-committed) end gets the outlined ghost cap; the anchor stays solid. */\n const loGhost = provisional && isLo && lo !== anchor;\n const hiGhost = provisional && isHi && !single && hi !== anchor;\n\n const band = inRange && !single;\n const extL = band && !isLo && col !== 0;\n const extR = band && !isHi && col !== 6;\n\n /* a boundary date shows in two cells (two-month view); the cap is a shared-layoutId node, so render it in exactly one - the in-month cell. */\n const capHere = months === 1 || !out;\n const loCap = isLo && capHere;\n const hiCap = isHi && !single && capHere;\n\n const cls = ['dtp__day'];\n if (out) cls.push('is-out');\n if (inRange) cls.push('is-in-range');\n if ((loGhost || hiGhost) && capHere) cls.push('is-cap-ghost');\n else if (loCap || hiCap) cls.push('is-cap');\n\n const bandCls = ['drp__band'];\n if (extL) bandCls.push('drp__band--extL');\n if (extR) bandCls.push('drp__band--extR');\n if (!extL) bandCls.push('drp__band--roundL');\n if (!extR) bandCls.push('drp__band--roundR');\n\n return (\n <button\n key={key}\n type=\"button\"\n role=\"gridcell\"\n data-key={key}\n className={cls.join(' ')}\n disabled={disabled}\n tabIndex={key === focusKey ? 0 : -1}\n aria-label={DRP_MONTHS[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear()}\n aria-selected={isLo || isHi || undefined}\n onClick={() => pickDay(key)}\n onPointerEnter={(e) => {\n setHoverKey(key);\n if (!anchor && !disabled) grid.enter(e.currentTarget);\n else grid.leave();\n }}\n >\n {band ? <span className={bandCls.join(' ')} aria-hidden=\"true\"></span> : null}\n {loCap ? (\n <drpMotion.span\n className={'drp__cap' + (loGhost ? ' drp__cap--ghost' : '')}\n layoutId=\"drp-cap-lo\"\n transition={drpSM.t.settle}\n aria-hidden=\"true\"\n ></drpMotion.span>\n ) : null}\n {hiCap ? (\n <drpMotion.span\n className={'drp__cap' + (hiGhost ? ' drp__cap--ghost' : '')}\n layoutId=\"drp-cap-hi\"\n transition={drpSM.t.settle}\n aria-hidden=\"true\"\n ></drpMotion.span>\n ) : null}\n <span className=\"dtp__num\">{d.getDate()}</span>\n {key === todayKey ? <span className=\"dtp__dot\" aria-hidden=\"true\"></span> : null}\n </button>\n );\n }\n\n function renderMonth(offset: number, withPrev: boolean, withNext: boolean) {\n const base = new Date(view.y, view.m + offset, 1);\n const y = base.getFullYear(),\n m = base.getMonth();\n const cells = drpGrid(y, m);\n const prevEnd = drpKey(new Date(y, m, 0));\n const nextStart = drpKey(new Date(y, m + 1, 1));\n return (\n <div className=\"dtp__cal\" key={offset}>\n <div className={'drp__mhead' + (withNext && !withPrev ? ' drp__mhead--right' : '')}>\n {withPrev ? (\n <button\n type=\"button\"\n className=\"dtp__nav\"\n aria-label=\"Previous month\"\n disabled={min && prevEnd < min}\n onClick={() => nav(-1)}\n >\n <Icon name=\"caret-left\" size=\"sm\" />\n </button>\n ) : null}\n <span className=\"dtp__month\">\n {DRP_MONTHS[m]} <span className=\"dtp__year\">{y}</span>\n </span>\n {withNext ? (\n <button\n type=\"button\"\n className=\"dtp__nav\"\n aria-label=\"Next month\"\n disabled={max && nextStart > max}\n onClick={() => nav(1)}\n >\n <Icon name=\"caret-right\" size=\"sm\" />\n </button>\n ) : null}\n </div>\n <div className=\"dtp__dow\" aria-hidden=\"true\">\n {DRP_DOW.map((d) => (\n <span key={d}>{d}</span>\n ))}\n </div>\n <div\n className=\"dtp__days\"\n role=\"grid\"\n aria-label={DRP_MONTHS[m] + ' ' + y}\n key={'days-' + viewIdx + '-' + offset}\n data-enter={navDir || undefined}\n >\n {cells.map((d) => renderDay(d, m))}\n </div>\n </div>\n );\n }\n\n const presets = drpPresets();\n function presetActive(p: DrpPreset): boolean {\n return value && value.start === p.start && value.end === p.end;\n }\n\n return (\n <div\n className={'drp' + (layout === 'sheet' ? ' drp--sheet' : '')}\n role=\"dialog\"\n aria-label={label || 'Pick a date range'}\n >\n <div className=\"drp__body\">\n <div\n className=\"drp__presets\"\n role=\"group\"\n aria-label=\"Quick ranges\"\n ref={presetsRef}\n onPointerLeave={presetGlide.leave}\n >\n {presets.map((p) => (\n <button\n key={p.id}\n type=\"button\"\n className={'drp__preset' + (presetActive(p) ? ' is-active' : '')}\n onPointerEnter={(e) => presetGlide.enter(e.currentTarget)}\n onClick={() => applyPreset(p)}\n >\n {p.label}\n </button>\n ))}\n <GlidePill\n className=\"drp__presetGlide\"\n rect={presetGlide.rect}\n active={presetGlide.active}\n />\n </div>\n <div\n className=\"drp__months\"\n ref={daysRef}\n onKeyDown={onGridKeyDown}\n onPointerLeave={() => {\n if (anchor) setHoverKey(anchor);\n grid.leave();\n }}\n >\n {months === 2\n ? [renderMonth(0, true, false), renderMonth(1, false, true)]\n : renderMonth(0, true, true)}\n <GlidePill className=\"dtp__hover\" rect={grid.rect} active={grid.active} />\n </div>\n </div>\n <div className=\"drp__foot\">\n <span className={'drp__readout' + (lo && hi ? '' : ' is-empty')}>\n {lo && hi ? (\n <React.Fragment>\n {drpRangeText(lo, hi)}{' '}\n <span className=\"drp__count\">\n - {drpDays(lo, hi)} {drpDays(lo, hi) === 1 ? 'day' : 'days'}\n </span>\n </React.Fragment>\n ) : anchor ? (\n 'Pick the end date'\n ) : (\n 'Pick a start date'\n )}\n </span>\n {timezone ? <span className=\"drp__tz\">{drpTzLabel(timezone)}</span> : null}\n <span className=\"drp__footSpacer\"></span>\n <button type=\"button\" className=\"btn btn--primary btn--sm\" onClick={close}>\n Done\n </button>\n </div>\n </div>\n );\n}\n\nexport interface DateRangeFieldProps {\n /** Controlled value - both endpoints, or null when empty. */\n value?: DateRange | null;\n defaultValue?: DateRange | null;\n /** Fires only on a COMPLETE range (a lone anchor never commits). */\n onChange?: (value: DateRange) => void;\n label?: string;\n placeholder?: string;\n /** IANA timezone (e.g. 'Europe/Riga') - display context, shown in the footer. */\n timezone?: string;\n /** Earliest pickable date, 'YYYY-MM-DD', inclusive. */\n min?: string;\n /** Latest pickable date, 'YYYY-MM-DD', inclusive. */\n max?: string;\n required?: boolean;\n invalid?: boolean;\n message?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function DateRangeField({\n value,\n defaultValue = null,\n onChange,\n label,\n placeholder = 'Pick a date range',\n timezone,\n min,\n max,\n required = false,\n invalid = false,\n message,\n disabled = false,\n className = '',\n}: DateRangeFieldProps) {\n const [val, commit] = useControllable(value, defaultValue, onChange);\n\n const narrow = useResponsiveOverlayMode();\n const mode = narrow ? 'sheet' : 'popover';\n\n const display = val && val.start && val.end ? drpRangeText(val.start, val.end) : null;\n\n const trigger = (\n <button type=\"button\" className=\"fld__input dtf__trigger\" disabled={disabled}>\n {display ? (\n <span className=\"dtf__value\">{display}</span>\n ) : (\n <span className=\"dtf__placeholder\">{placeholder}</span>\n )}\n </button>\n );\n\n return (\n <FieldShell\n variant=\"dtf\"\n label={label}\n required={required}\n invalid={invalid}\n message={message}\n icon=\"calendar\"\n className={className}\n >\n <Overlay\n trigger={trigger}\n mode={mode}\n side={mode === 'sheet' ? 'bottom' : 'bottom'}\n align=\"start\"\n >\n {(api) => (\n <DrpPanel\n value={val}\n commit={commit}\n close={api.close}\n min={min}\n max={max}\n timezone={timezone}\n label={label}\n months={narrow ? 1 : 2}\n layout={mode}\n />\n )}\n </Overlay>\n </FieldShell>\n );\n}\n"]}
@@ -0,0 +1,96 @@
1
+ 'use client';import { IconSlot } from './chunk-VVPGEAC6.js';
2
+ import { UIMotion } from './chunk-37O2ZXD6.js';
3
+ import * as React from 'react';
4
+ import { motion, AnimatePresence } from 'motion/react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var TagGroupContext = React.createContext(false);
8
+ var TAG_OWN_PROPS = {
9
+ children: 1,
10
+ icon: 1,
11
+ onRemove: 1,
12
+ removeLabel: 1,
13
+ size: 1,
14
+ disabled: 1,
15
+ className: 1
16
+ };
17
+ function tagRestProps(props, own) {
18
+ const rest = {};
19
+ for (const k in props) {
20
+ if (!own[k]) rest[k] = props[k];
21
+ }
22
+ return rest;
23
+ }
24
+ function TagRemoveGlyph() {
25
+ return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M3 3 L9 9 M9 3 L3 9", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) });
26
+ }
27
+ function Tag(props) {
28
+ const {
29
+ children,
30
+ icon = null,
31
+ onRemove = null,
32
+ removeLabel,
33
+ size = "md",
34
+ disabled = false,
35
+ className = ""
36
+ } = props;
37
+ const rest = tagRestProps(props, TAG_OWN_PROPS);
38
+ const grouped = React.useContext(TagGroupContext);
39
+ const classes = ["tag", size === "sm" ? "tag--sm" : "", className].filter(Boolean).join(" ");
40
+ const xLabel = removeLabel || (typeof children === "string" ? "Remove " + children : "Remove");
41
+ const content = /* @__PURE__ */ jsxs(React.Fragment, { children: [
42
+ icon && /* @__PURE__ */ jsx("span", { className: "tag__icon", children: /* @__PURE__ */ jsx(IconSlot, { size: "sm", children: icon }) }),
43
+ /* @__PURE__ */ jsx("span", { className: "tag__label", children }),
44
+ onRemove && /* @__PURE__ */ jsx(
45
+ "button",
46
+ {
47
+ type: "button",
48
+ className: "tag__remove",
49
+ "aria-label": xLabel,
50
+ disabled,
51
+ onClick: onRemove,
52
+ children: /* @__PURE__ */ jsx(TagRemoveGlyph, {})
53
+ }
54
+ )
55
+ ] });
56
+ if (!grouped) {
57
+ return /* @__PURE__ */ jsx("span", { className: classes, "data-disabled": disabled ? "true" : void 0, ...rest, children: content });
58
+ }
59
+ const { t } = UIMotion;
60
+ return /* @__PURE__ */ jsx(
61
+ motion.span,
62
+ {
63
+ layout: true,
64
+ className: classes,
65
+ "data-disabled": disabled ? "true" : void 0,
66
+ initial: { opacity: 0, scale: 0.9 },
67
+ animate: { opacity: 1, scale: 1, transition: t.enter },
68
+ exit: { opacity: 0, scale: 0.9, transition: t.exit },
69
+ transition: t.layout,
70
+ ...rest,
71
+ children: content
72
+ }
73
+ );
74
+ }
75
+ function TagGroup(props) {
76
+ const { label, className = "", children } = props;
77
+ const rest = tagRestProps(props, {
78
+ label: 1,
79
+ className: 1,
80
+ children: 1
81
+ });
82
+ return /* @__PURE__ */ jsx(
83
+ "div",
84
+ {
85
+ className: ["tag-group", className].filter(Boolean).join(" "),
86
+ role: "group",
87
+ "aria-label": label,
88
+ ...rest,
89
+ children: /* @__PURE__ */ jsx(TagGroupContext.Provider, { value: true, children: /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children }) })
90
+ }
91
+ );
92
+ }
93
+
94
+ export { Tag, TagGroup };
95
+ //# sourceMappingURL=chunk-PFNXVBLU.js.map
96
+ //# sourceMappingURL=chunk-PFNXVBLU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tag/Tag.tsx"],"names":[],"mappings":"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","file":"chunk-PFNXVBLU.js","sourcesContent":["'use client';\n\n/* Tag (+ TagGroup) - removable/editable label; stateless, the parent owns the list. */\n\nimport * as React from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { UIMotion } from '../../tokens/motion-tokens';\nimport { IconSlot } from '../icon/IconSlot';\n\n/** Tag - the removable, editable label (stateless; the parent owns the list). */\nexport interface TagProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\n /** The label. */\n children: React.ReactNode;\n /** Your own icon node, sized small and tinted to the tag's text. */\n icon?: React.ReactNode | null;\n /** Presence adds the remove button; called on click - remove the item yourself. */\n onRemove?: (() => void) | null;\n /** Accessible label for the remove button. Defaults to \"Remove {label}\" for string labels. */\n removeLabel?: string;\n /** 'md' = 28px (default) - 'sm' = 24px for dense rows. */\n size?: 'md' | 'sm';\n disabled?: boolean;\n className?: string;\n}\n\n/** TagGroup - wrapping flex row + removal/insertion choreography. */\nexport interface TagGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Accessible name for the group (role=\"group\"). */\n label?: string;\n children?: React.ReactNode;\n className?: string;\n}\n\nconst TagGroupContext = React.createContext(false);\n\n/* GOTCHA (buildless pages): split props manually, not object-rest. */\nconst TAG_OWN_PROPS: Record<string, number> = {\n children: 1,\n icon: 1,\n onRemove: 1,\n removeLabel: 1,\n size: 1,\n disabled: 1,\n className: 1,\n};\nfunction tagRestProps(props: Record<string, unknown>, own: Record<string, number>) {\n const rest: Record<string, unknown> = {};\n for (const k in props) {\n if (!own[k]) rest[k] = props[k];\n }\n return rest;\n}\n\n/* The remove glyph - drawn inline (path-level, per section D) so it can wind up on hover. */\nfunction TagRemoveGlyph() {\n return (\n <svg viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 3 L9 9 M9 3 L3 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function Tag(props: TagProps) {\n const {\n children,\n icon = null,\n onRemove = null,\n removeLabel,\n size = 'md',\n disabled = false,\n className = '',\n } = props;\n const rest = tagRestProps(props as unknown as Record<string, unknown>, TAG_OWN_PROPS);\n const grouped = React.useContext(TagGroupContext);\n const classes = ['tag', size === 'sm' ? 'tag--sm' : '', className].filter(Boolean).join(' ');\n\n const xLabel = removeLabel || (typeof children === 'string' ? 'Remove ' + children : 'Remove');\n\n const content = (\n <React.Fragment>\n {icon && (\n <span className=\"tag__icon\">\n <IconSlot size=\"sm\">{icon}</IconSlot>\n </span>\n )}\n <span className=\"tag__label\">{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className=\"tag__remove\"\n aria-label={xLabel}\n disabled={disabled}\n onClick={onRemove}\n >\n <TagRemoveGlyph />\n </button>\n )}\n </React.Fragment>\n );\n\n if (!grouped) {\n return (\n <span className={classes} data-disabled={disabled ? 'true' : undefined} {...rest}>\n {content}\n </span>\n );\n }\n\n const { t } = UIMotion;\n return (\n <motion.span\n layout\n className={classes}\n data-disabled={disabled ? 'true' : undefined}\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1, transition: t.enter }}\n exit={{ opacity: 0, scale: 0.9, transition: t.exit }}\n transition={t.layout}\n {...rest}\n >\n {content}\n </motion.span>\n );\n}\n\nexport function TagGroup(props: TagGroupProps) {\n const { label, className = '', children } = props;\n const rest = tagRestProps(props as unknown as Record<string, unknown>, {\n label: 1,\n className: 1,\n children: 1,\n });\n return (\n <div\n className={['tag-group', className].filter(Boolean).join(' ')}\n role=\"group\"\n aria-label={label}\n {...rest}\n >\n <TagGroupContext.Provider value={true}>\n <AnimatePresence initial={false}>{children}</AnimatePresence>\n </TagGroupContext.Provider>\n </div>\n );\n}\n"]}