@misael703/ui 1.59.1 → 1.61.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 (154) hide show
  1. package/dist/{chunk-G4OOD6AR.mjs → chunk-2UW2K5MV.mjs} +3 -3
  2. package/dist/{chunk-G4OOD6AR.mjs.map → chunk-2UW2K5MV.mjs.map} +1 -1
  3. package/dist/{chunk-S3DEFKS5.js → chunk-324O7B3R.js} +5 -5
  4. package/dist/{chunk-S3DEFKS5.js.map → chunk-324O7B3R.js.map} +1 -1
  5. package/dist/{chunk-XF445GS6.js → chunk-3N24QPRP.js} +12 -12
  6. package/dist/{chunk-XF445GS6.js.map → chunk-3N24QPRP.js.map} +1 -1
  7. package/dist/{chunk-4G6NENVM.js → chunk-3RB4OZTJ.js} +160 -31
  8. package/dist/chunk-3RB4OZTJ.js.map +1 -0
  9. package/dist/{chunk-T2DNEJR3.mjs → chunk-4Z5GFOIU.mjs} +4 -4
  10. package/dist/{chunk-T2DNEJR3.mjs.map → chunk-4Z5GFOIU.mjs.map} +1 -1
  11. package/dist/{chunk-3IZYL42M.js → chunk-53MN366Q.js} +8 -8
  12. package/dist/{chunk-3IZYL42M.js.map → chunk-53MN366Q.js.map} +1 -1
  13. package/dist/{chunk-ESU5UMEK.mjs → chunk-5C7LUIBN.mjs} +4 -4
  14. package/dist/{chunk-ESU5UMEK.mjs.map → chunk-5C7LUIBN.mjs.map} +1 -1
  15. package/dist/{chunk-J2HHAZHV.mjs → chunk-5G3DVB5B.mjs} +5 -5
  16. package/dist/{chunk-J2HHAZHV.mjs.map → chunk-5G3DVB5B.mjs.map} +1 -1
  17. package/dist/{chunk-VMTN5C6F.mjs → chunk-67SCO4BO.mjs} +4 -4
  18. package/dist/{chunk-VMTN5C6F.mjs.map → chunk-67SCO4BO.mjs.map} +1 -1
  19. package/dist/{chunk-DN4KVUJF.mjs → chunk-6IXP5UIY.mjs} +3 -3
  20. package/dist/{chunk-DN4KVUJF.mjs.map → chunk-6IXP5UIY.mjs.map} +1 -1
  21. package/dist/{chunk-6JXGCU7F.mjs → chunk-6UYKIUQB.mjs} +4 -4
  22. package/dist/{chunk-6JXGCU7F.mjs.map → chunk-6UYKIUQB.mjs.map} +1 -1
  23. package/dist/{chunk-3PYU6OHQ.js → chunk-7AJAQJOX.js} +10 -10
  24. package/dist/{chunk-3PYU6OHQ.js.map → chunk-7AJAQJOX.js.map} +1 -1
  25. package/dist/{chunk-YHB3BPZR.js → chunk-7CA4IMXM.js} +4 -4
  26. package/dist/{chunk-YHB3BPZR.js.map → chunk-7CA4IMXM.js.map} +1 -1
  27. package/dist/{chunk-G3V4UOZW.js → chunk-AB52PRTH.js} +2 -2
  28. package/dist/{chunk-G3V4UOZW.js.map → chunk-AB52PRTH.js.map} +1 -1
  29. package/dist/{chunk-RZQIZZKH.mjs → chunk-CEDAYY2N.mjs} +4 -4
  30. package/dist/{chunk-RZQIZZKH.mjs.map → chunk-CEDAYY2N.mjs.map} +1 -1
  31. package/dist/{chunk-QHI4S5PM.mjs → chunk-DAITXFG3.mjs} +4 -4
  32. package/dist/{chunk-QHI4S5PM.mjs.map → chunk-DAITXFG3.mjs.map} +1 -1
  33. package/dist/{chunk-DOAGIAIQ.js → chunk-DF4CKUI6.js} +7 -7
  34. package/dist/{chunk-DOAGIAIQ.js.map → chunk-DF4CKUI6.js.map} +1 -1
  35. package/dist/{chunk-A42WMR4M.js → chunk-DKOAATV2.js} +5 -2
  36. package/dist/chunk-DKOAATV2.js.map +1 -0
  37. package/dist/{chunk-XJHK3RH5.mjs → chunk-DLPTIVZB.mjs} +3 -3
  38. package/dist/{chunk-XJHK3RH5.mjs.map → chunk-DLPTIVZB.mjs.map} +1 -1
  39. package/dist/{chunk-PKUOZT75.js → chunk-DYYMUXKH.js} +7 -7
  40. package/dist/{chunk-PKUOZT75.js.map → chunk-DYYMUXKH.js.map} +1 -1
  41. package/dist/{chunk-HKHGODQE.js → chunk-E6BTT4I7.js} +10 -10
  42. package/dist/{chunk-HKHGODQE.js.map → chunk-E6BTT4I7.js.map} +1 -1
  43. package/dist/{chunk-2TKTMFVC.mjs → chunk-EFX3FU6B.mjs} +4 -4
  44. package/dist/{chunk-2TKTMFVC.mjs.map → chunk-EFX3FU6B.mjs.map} +1 -1
  45. package/dist/{chunk-LYT27EIM.js → chunk-EHTHHF2P.js} +6 -6
  46. package/dist/{chunk-LYT27EIM.js.map → chunk-EHTHHF2P.js.map} +1 -1
  47. package/dist/{chunk-6OBFBETV.mjs → chunk-GNI5MH36.mjs} +4 -4
  48. package/dist/{chunk-6OBFBETV.mjs.map → chunk-GNI5MH36.mjs.map} +1 -1
  49. package/dist/{chunk-SCUHLOET.mjs → chunk-HGS3ATU2.mjs} +8 -8
  50. package/dist/chunk-HGS3ATU2.mjs.map +1 -0
  51. package/dist/{chunk-F237OMT6.js → chunk-HYB7EXRB.js} +11 -11
  52. package/dist/{chunk-F237OMT6.js.map → chunk-HYB7EXRB.js.map} +1 -1
  53. package/dist/{chunk-VGA7UT6T.mjs → chunk-IGNKSI2E.mjs} +2 -2
  54. package/dist/{chunk-VGA7UT6T.mjs.map → chunk-IGNKSI2E.mjs.map} +1 -1
  55. package/dist/{chunk-RFWSMP7Q.js → chunk-IH7U4FJT.js} +6 -6
  56. package/dist/{chunk-RFWSMP7Q.js.map → chunk-IH7U4FJT.js.map} +1 -1
  57. package/dist/{chunk-Q4WPZJUS.mjs → chunk-JXRAMV3H.mjs} +149 -20
  58. package/dist/chunk-JXRAMV3H.mjs.map +1 -0
  59. package/dist/{chunk-AECVFYGP.mjs → chunk-LMJW566R.mjs} +3 -3
  60. package/dist/{chunk-AECVFYGP.mjs.map → chunk-LMJW566R.mjs.map} +1 -1
  61. package/dist/{chunk-MSDFMVIF.js → chunk-M7QZCHMM.js} +5 -5
  62. package/dist/{chunk-MSDFMVIF.js.map → chunk-M7QZCHMM.js.map} +1 -1
  63. package/dist/{chunk-MVJITG75.js → chunk-MUXOT5KS.js} +16 -2
  64. package/dist/chunk-MUXOT5KS.js.map +1 -0
  65. package/dist/{chunk-T46LLZHX.js → chunk-NUTHJQYH.js} +13 -13
  66. package/dist/{chunk-T46LLZHX.js.map → chunk-NUTHJQYH.js.map} +1 -1
  67. package/dist/{chunk-4QHE5H36.mjs → chunk-ODE2ROR2.mjs} +16 -3
  68. package/dist/chunk-ODE2ROR2.mjs.map +1 -0
  69. package/dist/{chunk-KYYRQNY7.mjs → chunk-OOIRRKJ7.mjs} +5 -2
  70. package/dist/chunk-OOIRRKJ7.mjs.map +1 -0
  71. package/dist/{chunk-O3KM5SQB.mjs → chunk-ORTQGS7I.mjs} +5 -5
  72. package/dist/{chunk-O3KM5SQB.mjs.map → chunk-ORTQGS7I.mjs.map} +1 -1
  73. package/dist/{chunk-5OZ6QIFC.mjs → chunk-QWQSOJFP.mjs} +3 -3
  74. package/dist/{chunk-5OZ6QIFC.mjs.map → chunk-QWQSOJFP.mjs.map} +1 -1
  75. package/dist/{chunk-ZXHOBEQM.js → chunk-RPNLDCRV.js} +6 -6
  76. package/dist/{chunk-ZXHOBEQM.js.map → chunk-RPNLDCRV.js.map} +1 -1
  77. package/dist/{chunk-J2PQFMR5.js → chunk-SA7NCLEK.js} +7 -7
  78. package/dist/{chunk-J2PQFMR5.js.map → chunk-SA7NCLEK.js.map} +1 -1
  79. package/dist/{chunk-VLTIVWKF.mjs → chunk-SB7XXXWS.mjs} +4 -4
  80. package/dist/{chunk-VLTIVWKF.mjs.map → chunk-SB7XXXWS.mjs.map} +1 -1
  81. package/dist/{chunk-SHIQMHQP.js → chunk-UROEA7L4.js} +8 -8
  82. package/dist/{chunk-SHIQMHQP.js.map → chunk-UROEA7L4.js.map} +1 -1
  83. package/dist/{chunk-KY6OH2IK.js → chunk-UW5DUEXJ.js} +4 -4
  84. package/dist/{chunk-KY6OH2IK.js.map → chunk-UW5DUEXJ.js.map} +1 -1
  85. package/dist/{chunk-S3MMU3LW.js → chunk-VFZ7VMU2.js} +24 -24
  86. package/dist/chunk-VFZ7VMU2.js.map +1 -0
  87. package/dist/{chunk-JZZHOJWY.mjs → chunk-YBJ7NFFW.mjs} +4 -4
  88. package/dist/{chunk-JZZHOJWY.mjs.map → chunk-YBJ7NFFW.mjs.map} +1 -1
  89. package/dist/components/AdvancedPickers.d.mts +14 -1
  90. package/dist/components/AdvancedPickers.d.ts +14 -1
  91. package/dist/components/AdvancedPickers.js +8 -8
  92. package/dist/components/AdvancedPickers.mjs +4 -4
  93. package/dist/components/AppShell.js +4 -4
  94. package/dist/components/AppShell.mjs +2 -2
  95. package/dist/components/Comments.js +6 -6
  96. package/dist/components/Comments.mjs +3 -3
  97. package/dist/components/Commerce.js +15 -15
  98. package/dist/components/Commerce.mjs +4 -4
  99. package/dist/components/DataTable.js +11 -11
  100. package/dist/components/DataTable.mjs +4 -4
  101. package/dist/components/Display.js +13 -13
  102. package/dist/components/Display.mjs +2 -2
  103. package/dist/components/Display3.js +9 -9
  104. package/dist/components/Display3.mjs +3 -3
  105. package/dist/components/Editing.js +9 -9
  106. package/dist/components/Editing.mjs +3 -3
  107. package/dist/components/Filters.js +9 -9
  108. package/dist/components/Filters.mjs +3 -3
  109. package/dist/components/Gallery.js +5 -5
  110. package/dist/components/Gallery.mjs +3 -3
  111. package/dist/components/Inputs.js +7 -7
  112. package/dist/components/Inputs.mjs +3 -3
  113. package/dist/components/InputsExtra.js +12 -12
  114. package/dist/components/InputsExtra.mjs +3 -3
  115. package/dist/components/Notifications.js +4 -4
  116. package/dist/components/Notifications.mjs +3 -3
  117. package/dist/components/Overlay.js +4 -4
  118. package/dist/components/Overlay.mjs +2 -2
  119. package/dist/components/Permissions.js +4 -4
  120. package/dist/components/Permissions.mjs +3 -3
  121. package/dist/components/Pickers.js +9 -9
  122. package/dist/components/Pickers.mjs +4 -4
  123. package/dist/components/TimeAgo.js +6 -6
  124. package/dist/components/TimeAgo.mjs +4 -4
  125. package/dist/components/Toast.js +4 -4
  126. package/dist/components/Toast.mjs +2 -2
  127. package/dist/index.d.mts +2 -2
  128. package/dist/index.d.ts +2 -2
  129. package/dist/index.js +131 -127
  130. package/dist/index.mjs +22 -22
  131. package/dist/locale/index.d.mts +2 -2
  132. package/dist/locale/index.d.ts +2 -2
  133. package/dist/locale/index.js +6 -6
  134. package/dist/locale/index.mjs +2 -2
  135. package/dist/{messages-B3tPolS2.d.ts → messages-Cd8MBbpL.d.mts} +3 -0
  136. package/dist/{messages-B3tPolS2.d.mts → messages-Cd8MBbpL.d.ts} +3 -0
  137. package/dist/styles.css +1 -1
  138. package/dist/utils/dateFormat.d.mts +17 -1
  139. package/dist/utils/dateFormat.d.ts +17 -1
  140. package/dist/utils/dateFormat.js +18 -14
  141. package/dist/utils/dateFormat.mjs +1 -1
  142. package/dist/utils/smartTime.d.mts +1 -1
  143. package/dist/utils/smartTime.d.ts +1 -1
  144. package/dist/utils/smartTime.js +6 -6
  145. package/dist/utils/smartTime.mjs +2 -2
  146. package/package.json +1 -1
  147. package/dist/chunk-4G6NENVM.js.map +0 -1
  148. package/dist/chunk-4QHE5H36.mjs.map +0 -1
  149. package/dist/chunk-A42WMR4M.js.map +0 -1
  150. package/dist/chunk-KYYRQNY7.mjs.map +0 -1
  151. package/dist/chunk-MVJITG75.js.map +0 -1
  152. package/dist/chunk-Q4WPZJUS.mjs.map +0 -1
  153. package/dist/chunk-S3MMU3LW.js.map +0 -1
  154. package/dist/chunk-SCUHLOET.mjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkMVJITG75_js = require('./chunk-MVJITG75.js');
5
- var chunkG3V4UOZW_js = require('./chunk-G3V4UOZW.js');
4
+ var chunkMUXOT5KS_js = require('./chunk-MUXOT5KS.js');
5
+ var chunkAB52PRTH_js = require('./chunk-AB52PRTH.js');
6
6
  var chunkWAGWB35Q_js = require('./chunk-WAGWB35Q.js');
7
- var chunkA42WMR4M_js = require('./chunk-A42WMR4M.js');
7
+ var chunkDKOAATV2_js = require('./chunk-DKOAATV2.js');
8
8
  var chunkXMLBKK7X_js = require('./chunk-XMLBKK7X.js');
9
9
  var chunkCRKYET66_js = require('./chunk-CRKYET66.js');
10
10
  var chunkC4AKMVDZ_js = require('./chunk-C4AKMVDZ.js');
@@ -46,7 +46,7 @@ function MultiCombobox({
46
46
  id,
47
47
  maxVisibleChips = 3
48
48
  }) {
49
- const locale = chunkA42WMR4M_js.useLocale();
49
+ const locale = chunkDKOAATV2_js.useLocale();
50
50
  const ph = placeholder ?? locale["common.search"];
51
51
  const empty = emptyMessage ?? locale["common.noResults"];
52
52
  const [open, setOpen] = React__namespace.useState(false);
@@ -107,7 +107,7 @@ function MultiCombobox({
107
107
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "multicombo__chips", onClick: () => inputRef.current?.focus(), children: [
108
108
  visible.map((o) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "multicombo__chip", children: [
109
109
  o.label,
110
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", "aria-label": chunkG3V4UOZW_js.format(locale["combobox.remove"], { label: o.label }), onClick: (e) => {
110
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", "aria-label": chunkAB52PRTH_js.format(locale["combobox.remove"], { label: o.label }), onClick: (e) => {
111
111
  e.stopPropagation();
112
112
  toggle(o.value);
113
113
  }, children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.X, { size: 12 }) })
@@ -198,12 +198,15 @@ function DateRangePicker({
198
198
  disabled,
199
199
  className,
200
200
  id,
201
- format: format2 = "auto"
201
+ format: format2 = "auto",
202
+ showInputs = false,
203
+ monthDropdown = false,
204
+ months = 2
202
205
  }) {
203
- const locale = chunkA42WMR4M_js.useLocale();
206
+ const locale = chunkDKOAATV2_js.useLocale();
204
207
  const weekdays = locale["picker.weekdaysShort"];
205
- const months = locale["calendar.months"];
206
- const fmt = chunkMVJITG75_js.resolveDateFormat(format2);
208
+ const monthNames = locale["calendar.months"];
209
+ const fmt = chunkMUXOT5KS_js.resolveDateFormat(format2);
207
210
  const isControlled = value !== void 0;
208
211
  const applyMode = !!onApply;
209
212
  const initial = isControlled ? value : defaultValue ?? EMPTY_RANGE;
@@ -219,8 +222,12 @@ function DateRangePicker({
219
222
  const current = isControlled && !applyMode ? value : draft;
220
223
  const displayed = applyMode ? lastApplied : current;
221
224
  const [open, setOpen] = React__namespace.useState(false);
222
- const [view, setView] = React__namespace.useState(() => chunkMVJITG75_js.startOfMonth(initial.from ?? /* @__PURE__ */ new Date()));
225
+ const [view, setView] = React__namespace.useState(() => chunkMUXOT5KS_js.startOfMonth(initial.from ?? /* @__PURE__ */ new Date()));
223
226
  const [hover, setHover] = React__namespace.useState(null);
227
+ const [fromText, setFromText] = React__namespace.useState("");
228
+ const [toText, setToText] = React__namespace.useState("");
229
+ const [menuOpen, setMenuOpen] = React__namespace.useState(false);
230
+ const [menuYear, setMenuYear] = React__namespace.useState(() => view.getFullYear());
224
231
  const wrapRef = React__namespace.useRef(null);
225
232
  const popoverRef = React__namespace.useRef(null);
226
233
  const triggerRef = React__namespace.useRef(null);
@@ -241,17 +248,48 @@ function DateRangePicker({
241
248
  refs: [wrapRef, popoverRef],
242
249
  returnFocusRef: triggerRef
243
250
  });
244
- const monthGrid0 = React__namespace.useMemo(() => chunkMVJITG75_js.buildMonthGrid(view, 0), [view]);
245
- const monthGrid1 = React__namespace.useMemo(() => chunkMVJITG75_js.buildMonthGrid(view, 1), [view]);
251
+ const monthGrid0 = React__namespace.useMemo(() => chunkMUXOT5KS_js.buildMonthGrid6(view, 0), [view]);
252
+ const monthGrid1 = React__namespace.useMemo(() => chunkMUXOT5KS_js.buildMonthGrid6(view, 1), [view]);
246
253
  const isDisabled = (d) => !!(minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()) || maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()) || isDateDisabled?.(d));
247
254
  const inRange = (d) => {
248
255
  if (!current.from) return false;
249
256
  const end = current.to ?? hover;
250
- if (!end) return chunkMVJITG75_js.isSameDay(d, current.from);
257
+ if (!end) return chunkMUXOT5KS_js.isSameDay(d, current.from);
251
258
  const a = current.from < end ? current.from : end;
252
259
  const b = current.from < end ? end : current.from;
253
260
  return d >= new Date(a.getFullYear(), a.getMonth(), a.getDate()) && d <= new Date(b.getFullYear(), b.getMonth(), b.getDate());
254
261
  };
262
+ const spanBounds = () => {
263
+ if (!current.from) return null;
264
+ const end = current.to ?? hover;
265
+ if (!end) return { a: current.from, b: current.from };
266
+ return current.from <= end ? { a: current.from, b: end } : { a: end, b: current.from };
267
+ };
268
+ const setRange = (next) => {
269
+ if (applyMode) setDraft(next);
270
+ else onChange?.(next);
271
+ };
272
+ const curFrom = current.from?.getTime() ?? 0;
273
+ const curTo = current.to?.getTime() ?? 0;
274
+ React__namespace.useEffect(() => {
275
+ setFromText(current.from ? chunkMUXOT5KS_js.formatDate(current.from, fmt) : "");
276
+ setToText(current.to ? chunkMUXOT5KS_js.formatDate(current.to, fmt) : "");
277
+ }, [curFrom, curTo, fmt]);
278
+ const commitInput = (which, text) => {
279
+ const parsed = chunkMUXOT5KS_js.parseDate(text, fmt);
280
+ if (!parsed || isDisabled(parsed)) {
281
+ if (which === "from") setFromText(current.from ? chunkMUXOT5KS_js.formatDate(current.from, fmt) : "");
282
+ else setToText(current.to ? chunkMUXOT5KS_js.formatDate(current.to, fmt) : "");
283
+ return;
284
+ }
285
+ const next = which === "from" ? current.to && current.to < parsed ? { from: current.to, to: parsed } : { from: parsed, to: current.to } : current.from && parsed < current.from ? { from: parsed, to: current.from } : { from: current.from, to: parsed };
286
+ setRange(next);
287
+ setView(chunkMUXOT5KS_js.startOfMonth(parsed));
288
+ };
289
+ const jumpToMonth = (monthIndex) => {
290
+ setView(new Date(menuYear, monthIndex, 1));
291
+ setMenuOpen(false);
292
+ };
255
293
  const click = (d) => {
256
294
  let next;
257
295
  if (!current.from || current.from && current.to) next = { from: d, to: null };
@@ -285,28 +323,43 @@ function DateRangePicker({
285
323
  onOpenChange?.(true);
286
324
  }
287
325
  };
288
- const label = displayed.from ? displayed.to ? `${chunkMVJITG75_js.formatDate(displayed.from, fmt)} \u2192 ${chunkMVJITG75_js.formatDate(displayed.to, fmt)}` : `${chunkMVJITG75_js.formatDate(displayed.from, fmt)} \u2192 \u2026` : locale["picker.selectRange"];
326
+ const label = displayed.from ? displayed.to ? `${chunkMUXOT5KS_js.formatDate(displayed.from, fmt)} \u2192 ${chunkMUXOT5KS_js.formatDate(displayed.to, fmt)}` : `${chunkMUXOT5KS_js.formatDate(displayed.from, fmt)} \u2192 \u2026` : locale["picker.selectRange"];
289
327
  const renderMonth = (offset) => {
290
328
  const { month: m, cells } = offset === 0 ? monthGrid0 : monthGrid1;
329
+ const bounds = spanBounds();
330
+ const isMultiDay = !!bounds && !chunkMUXOT5KS_js.isSameDay(bounds.a, bounds.b);
291
331
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__month", children: [
292
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__title", children: [
293
- months[m.getMonth()],
332
+ !monthDropdown && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__title", children: [
333
+ monthNames[m.getMonth()],
294
334
  " ",
295
335
  m.getFullYear()
296
336
  ] }),
297
337
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__grid", children: [
298
338
  weekdays.map((w, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "daterange__dow", children: w }, i)),
299
- cells.map((d, i) => {
300
- if (!d) return /* @__PURE__ */ jsxRuntime.jsx("span", {}, `b${i}`);
301
- const sel = current.from && chunkMVJITG75_js.isSameDay(d, current.from) || current.to && chunkMVJITG75_js.isSameDay(d, current.to);
302
- const ir = inRange(d);
303
- const today = chunkMVJITG75_js.isSameDay(d, /* @__PURE__ */ new Date());
339
+ cells.map(({ date: d, outside }, i) => {
340
+ if (outside) return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "daterange__day is-outside", "aria-hidden": "true", children: d.getDate() }, i);
341
+ const sel = current.from && chunkMUXOT5KS_js.isSameDay(d, current.from) || current.to && chunkMUXOT5KS_js.isSameDay(d, current.to);
342
+ const band = inRange(d) && isMultiDay;
343
+ const col = i % 7;
344
+ const leftEnd = band && !!bounds && chunkMUXOT5KS_js.isSameDay(d, bounds.a);
345
+ const rightEnd = band && !!bounds && chunkMUXOT5KS_js.isSameDay(d, bounds.b);
346
+ const bl = !band ? null : leftEnd ? sel ? "mid" : "cap" : col === 0 ? "cap" : "join";
347
+ const br = !band ? null : rightEnd ? sel ? "mid" : "cap" : col === 6 ? "cap" : "join";
348
+ const today = chunkMUXOT5KS_js.isSameDay(d, /* @__PURE__ */ new Date());
304
349
  const off = isDisabled(d);
305
350
  return /* @__PURE__ */ jsxRuntime.jsx(
306
351
  "button",
307
352
  {
308
353
  type: "button",
309
- className: chunkPASF6T4H_js.cx("daterange__day", sel && "is-selected", ir && !sel && "is-range", today && "is-today", off && "is-disabled"),
354
+ className: chunkPASF6T4H_js.cx(
355
+ "daterange__day",
356
+ sel && "is-selected",
357
+ band && "is-band",
358
+ bl && `is-bl-${bl}`,
359
+ br && `is-br-${br}`,
360
+ today && "is-today",
361
+ off && "is-disabled"
362
+ ),
310
363
  disabled: !!off,
311
364
  onMouseEnter: () => setHover(d),
312
365
  onClick: () => click(d),
@@ -318,6 +371,23 @@ function DateRangePicker({
318
371
  ] })
319
372
  ] });
320
373
  };
374
+ const renderMonthMenu = () => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__menu", role: "dialog", "aria-label": locale["daterange.jumpMonth"], children: [
375
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__menu-year", children: [
376
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setMenuYear((y) => y - 1), "aria-label": locale["picker.prevYear"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronLeft, { size: 16 }) }),
377
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: menuYear }),
378
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setMenuYear((y) => y + 1), "aria-label": locale["picker.nextYear"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronRight, { size: 16 }) })
379
+ ] }),
380
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "daterange__menu-grid", children: monthNames.map((name, idx) => /* @__PURE__ */ jsxRuntime.jsx(
381
+ "button",
382
+ {
383
+ type: "button",
384
+ className: chunkPASF6T4H_js.cx("daterange__menu-month", view.getMonth() === idx && view.getFullYear() === menuYear && "is-current"),
385
+ onClick: () => jumpToMonth(idx),
386
+ children: name.slice(0, 3)
387
+ },
388
+ name
389
+ )) })
390
+ ] });
321
391
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: wrapRef, className: chunkPASF6T4H_js.cx("daterange", invalid && "is-invalid", disabled && "is-disabled", className), children: [
322
392
  /* @__PURE__ */ jsxRuntime.jsxs(
323
393
  "button",
@@ -340,7 +410,7 @@ function DateRangePicker({
340
410
  "div",
341
411
  {
342
412
  ref: popoverRef,
343
- className: chunkPASF6T4H_js.cx("daterange__popover", "is-floating"),
413
+ className: chunkPASF6T4H_js.cx("daterange__popover", "is-floating", months === 1 && "daterange__popover--compact"),
344
414
  role: "dialog",
345
415
  onMouseLeave: () => setHover(null),
346
416
  style: {
@@ -352,14 +422,73 @@ function DateRangePicker({
352
422
  children: [
353
423
  presets && presets.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "daterange__presets", children: presets.map((p, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => commit(p.range(), true), children: p.label }) }, i)) }),
354
424
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__panes", children: [
425
+ showInputs && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__inputs", children: [
426
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "daterange__field", children: [
427
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "daterange__field-label", children: locale["daterange.from"] }),
428
+ /* @__PURE__ */ jsxRuntime.jsx(
429
+ "input",
430
+ {
431
+ type: "text",
432
+ className: "daterange__field-input",
433
+ value: fromText,
434
+ placeholder: chunkMUXOT5KS_js.dateFormatPlaceholder(fmt),
435
+ onChange: (e) => setFromText(e.target.value),
436
+ onBlur: (e) => commitInput("from", e.target.value),
437
+ onKeyDown: (e) => {
438
+ if (e.key === "Enter") commitInput("from", e.target.value);
439
+ }
440
+ }
441
+ )
442
+ ] }),
443
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "daterange__field", children: [
444
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "daterange__field-label", children: locale["daterange.to"] }),
445
+ /* @__PURE__ */ jsxRuntime.jsx(
446
+ "input",
447
+ {
448
+ type: "text",
449
+ className: "daterange__field-input",
450
+ value: toText,
451
+ placeholder: chunkMUXOT5KS_js.dateFormatPlaceholder(fmt),
452
+ onChange: (e) => setToText(e.target.value),
453
+ onBlur: (e) => commitInput("to", e.target.value),
454
+ onKeyDown: (e) => {
455
+ if (e.key === "Enter") commitInput("to", e.target.value);
456
+ }
457
+ }
458
+ )
459
+ ] })
460
+ ] }),
355
461
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__nav", children: [
356
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => chunkMVJITG75_js.addMonths(v, -1)), "aria-label": locale["calendar.prevMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronLeft, { size: 16 }) }),
357
- /* @__PURE__ */ jsxRuntime.jsx("span", {}),
358
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => chunkMVJITG75_js.addMonths(v, 1)), "aria-label": locale["calendar.nextMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronRight, { size: 16 }) })
462
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => chunkMUXOT5KS_js.addMonths(v, -1)), "aria-label": locale["calendar.prevMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronLeft, { size: 16 }) }),
463
+ monthDropdown ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__monthjump", children: [
464
+ /* @__PURE__ */ jsxRuntime.jsxs(
465
+ "button",
466
+ {
467
+ type: "button",
468
+ className: "daterange__monthjump-trigger",
469
+ onClick: () => {
470
+ setMenuYear(view.getFullYear());
471
+ setMenuOpen((o) => !o);
472
+ },
473
+ "aria-haspopup": "dialog",
474
+ "aria-expanded": menuOpen,
475
+ children: [
476
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
477
+ monthNames[view.getMonth()],
478
+ " ",
479
+ view.getFullYear()
480
+ ] }),
481
+ /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronDown, { size: 16, "aria-hidden": true })
482
+ ]
483
+ }
484
+ ),
485
+ menuOpen && renderMonthMenu()
486
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
487
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => chunkMUXOT5KS_js.addMonths(v, 1)), "aria-label": locale["calendar.nextMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkC4AKMVDZ_js.ChevronRight, { size: 16 }) })
359
488
  ] }),
360
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__months", children: [
489
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkPASF6T4H_js.cx("daterange__months", months === 1 && "daterange__months--single"), children: [
361
490
  renderMonth(0),
362
- renderMonth(1)
491
+ months === 2 && renderMonth(1)
363
492
  ] }),
364
493
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__actions", children: [
365
494
  /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "daterange__clear", onClick: clear, children: locale["common.clear"] }),
@@ -392,7 +521,7 @@ function CommandPalette({
392
521
  placeholder,
393
522
  emptyMessage
394
523
  }) {
395
- const locale = chunkA42WMR4M_js.useLocale();
524
+ const locale = chunkDKOAATV2_js.useLocale();
396
525
  const ph = placeholder ?? locale["picker.searchCommands"];
397
526
  const empty = emptyMessage ?? locale["common.noResults"];
398
527
  const [query, setQuery] = React__namespace.useState("");
@@ -531,5 +660,5 @@ exports.CommandPalette = CommandPalette;
531
660
  exports.DateRangePicker = DateRangePicker;
532
661
  exports.MultiCombobox = MultiCombobox;
533
662
  exports.useCommandPalette = useCommandPalette;
534
- //# sourceMappingURL=chunk-4G6NENVM.js.map
535
- //# sourceMappingURL=chunk-4G6NENVM.js.map
663
+ //# sourceMappingURL=chunk-3RB4OZTJ.js.map
664
+ //# sourceMappingURL=chunk-3RB4OZTJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AdvancedPickers.tsx"],"names":["useLocale","React","usePopoverPosition","useDismiss","jsxs","cx","format","jsx","X","Portal","Check","resolveDateFormat","startOfMonth","buildMonthGrid6","isSameDay","formatDate","parseDate","ChevronLeft","ChevronRight","CalendarIcon","dateFormatPlaceholder","addMonths","ChevronDown","Search"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAM,OAAA,GAAU,CAAK,CAAA,EAA2B,CAAA,KAC9C,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,CAAA,CAAE,WAAA,EAAa,CAAA;AAEzC,SAAS,aAAA,CAA0B;AAAA,EACxC,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,WAAA;AAAA,EAC1B,YAAA;AAAA,EAAc,MAAA,GAAS,OAAA;AAAA,EACvB,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,EAAA;AAAA,EAAI,eAAA,GAAkB;AACtD,CAAA,EAA0B;AACxB,EAAA,MAAM,SAASA,0BAAA,EAAU;AACzB,EAAA,MAAM,EAAA,GAAK,WAAA,IAAe,MAAA,CAAO,eAAe,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,YAAA,IAAgB,MAAA,CAAO,kBAAkB,CAAA;AACvD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUC,0BAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,0BAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,0BAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAgBA,wBAAuB,IAAI,CAAA;AACjD,EAAA,MAAM,QAAA,GAAiBA,wBAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,OAAA,GAAgBA,wBAAyB,IAAI,CAAA;AACnD,EAAA,MAAM,UAAgBA,gBAAA,CAAA,KAAA,EAAM;AAC5B,EAAA,MAAM,SAAA,GAAY,CAAA,EAAG,EAAA,IAAM,OAAO,CAAA,QAAA,CAAA;AAGlC,EAAA,MAAM,MAAA,GAAeA,yBAAQ,MAAM,IAAI,IAAI,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAE1D,EAAA,MAAM,QAAA,GAAiBA,gBAAA,CAAA,OAAA;AAAA,IACrB,MAAO,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAM,MAAA,CAAO,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,OAAA;AAAA,IACzD,CAAC,OAAA,EAAS,KAAA,EAAO,MAAM;AAAA,GACzB;AAEA,EAAA,MAAM,GAAA,GAAMC,mCAAA,CAAmB,OAAA,EAAS,OAAA,EAAS;AAAA,IAC/C,IAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,gBAAA,EAAkB;AAAA,GACnB,CAAA;AAGD,EAAAC,2BAAA,CAAW;AAAA,IACT,IAAA;AAAA,IACA,SAAA,EAAW,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC9B,IAAA,EAAM,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,IACvB,aAAA,EAAe;AAAA,GAChB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAS;AACvB,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,SACnD,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAA6C;AAC1D,IAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AAAE,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,SAAS,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IAAG,CAAA,MAAA,IAC/G,CAAA,CAAE,GAAA,KAAQ,SAAA,EAAW;AAAE,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IAAG,CAAA,MAAA,IACjF,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC1B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAC3B,MAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,QAAA,EAAU;AAAE,QAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAG,QAAA,QAAA,CAAS,EAAE,CAAA;AAAA,MAAG;AAAA,IAC/D,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAAE,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IAAG,WACxC,CAAA,CAAE,GAAA,KAAQ,eAAe,CAAC,KAAA,IAAS,MAAM,MAAA,EAAQ;AAAE,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAAG;AAAA,EAC5F,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,CAAC,MAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,MAAA,GAAS,OAAA,CAAQ,MAAA;AAEhD,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,SAAA,EAAWC,mBAAA,CAAG,YAAA,EAAc,OAAA,IAAW,YAAA,EAAc,QAAA,IAAY,aAAA,EAAe,SAAS,CAAA,EAC1G,QAAA,EAAA;AAAA,oBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EAAoB,OAAA,EAAS,MAAM,QAAA,CAAS,OAAA,EAAS,OAAM,EACvE,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,qBACZA,eAAA,CAAC,MAAA,EAAA,EAA2B,WAAU,kBAAA,EACnC,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,KAAA;AAAA,uCACF,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,YAAA,EAAYE,wBAAU,MAAA,CAAO,iBAAiB,CAAA,EAAG,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,UAAA,MAAA,CAAO,EAAE,KAAK,CAAA;AAAA,QAAG,CAAA,EAAG,QAAA,kBAAAC,cAAA,CAACC,kBAAA,EAAA,EAAE,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA,OAAA,EAAA,EAF7J,MAAA,CAAO,CAAA,CAAE,KAAK,CAGzB,CACD,CAAA;AAAA,MACA,QAAA,GAAW,CAAA,oBAAKJ,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yCAAA,EAA0C,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE;AAAA,OAAA,EAAS,CAAA;AAAA,sBACtFG,cAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,EAAA;AAAA,UACA,IAAA,EAAK,MAAA;AAAA,UACL,IAAA,EAAK,UAAA;AAAA,UACL,eAAA,EAAe,IAAA;AAAA,UACf,eAAA,EAAe,SAAA;AAAA,UACf,SAAA,EAAU,mBAAA;AAAA,UACV,WAAA,EAAa,aAAA,CAAc,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,EAAA;AAAA,UAC/C,QAAA;AAAA,UACA,KAAA,EAAO,KAAA;AAAA,UACP,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,UAC3B,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,YAAA,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAG,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAG,YAAA,SAAA,CAAU,CAAC,CAAA;AAAA,UAAG,CAAA;AAAA,UAC1E,SAAA,EAAW;AAAA;AAAA;AACb,KAAA,EACF,CAAA;AAAA,IACC,IAAA,mCACEE,uBAAA,EAAA,EACD,QAAA,kBAAAF,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAK,SAAA;AAAA,QACL,sBAAA,EAAqB,MAAA;AAAA,QACrB,SAAA,EAAWF,mBAAA,CAAG,kBAAA,EAAoB,aAAa,CAAA;AAAA,QAC/C,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,UAAA,EAAY,GAAA,CAAI,KAAA,GAAQ,SAAA,GAAY;AAAA,SACtC;AAAA,QAEC,QAAA,EAAA,QAAA,CAAS,MAAA,KAAW,CAAA,mBACnBE,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,KAAA,EAAM,CAAA,GAEzC,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACrB,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AAClC,UAAA,uBACEH,eAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,eAAA,EAAe,OAAA;AAAA,cACf,iBAAe,CAAA,CAAE,QAAA;AAAA,cACjB,SAAA,EAAWC,mBAAA,CAAG,oBAAA,EAAsB,CAAA,KAAM,MAAA,IAAU,aAAa,OAAA,IAAW,aAAA,EAAe,CAAA,CAAE,QAAA,IAAY,aAAa,CAAA;AAAA,cACtH,YAAA,EAAc,MAAM,SAAA,CAAU,CAAC,CAAA;AAAA,cAC/B,WAAA,EAAa,CAAC,CAAA,KAAM;AAAE,gBAAA,CAAA,CAAE,cAAA,EAAe;AAAG,gBAAA,IAAI,CAAC,CAAA,CAAE,QAAA,EAAU,MAAA,CAAO,EAAE,KAAK,CAAA;AAAA,cAAG,CAAA;AAAA,cAE5E,QAAA,EAAA;AAAA,gCAAAE,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWF,mBAAA,CAAG,mBAAA,EAAqB,WAAW,YAAY,CAAA,EAAG,aAAA,EAAY,MAAA,EAAQ,oCAAUE,cAAA,CAACG,sBAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAK,IAAA,EAAK,CAAA;AAAA,gCAC5HN,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,kCAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,kBACnD,EAAE,WAAA,oBAAeA,cAAA,CAAC,UAAK,SAAA,EAAU,yBAAA,EAA2B,YAAE,WAAA,EAAY;AAAA,iBAAA,EAC7E;AAAA;AAAA,aAAA;AAAA,YAZK,MAAA,CAAO,EAAE,KAAK;AAAA,WAarB;AAAA,QAEJ,CAAC;AAAA;AAAA,KAEL,EACA;AAAA,GAAA,EAEJ,CAAA;AAEJ;AA2DA,IAAM,WAAA,GAAyB,EAAE,IAAA,EAAM,IAAA,EAAM,IAAI,IAAA,EAAK;AAE/C,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,YAAA;AAAA,EAAc,OAAA;AAAA,EAAS,YAAA;AAAA,EACxC,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,cAAA;AAAA,EAAgB,OAAA;AAAA,EAClC,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,EAAA;AAAA,EAAI,QAAAD,OAAAA,GAAS,MAAA;AAAA,EAC3C,UAAA,GAAa,KAAA;AAAA,EAAO,aAAA,GAAgB,KAAA;AAAA,EAAO,MAAA,GAAS;AACtD,CAAA,EAAyB;AACvB,EAAA,MAAM,SAASN,0BAAA,EAAU;AACzB,EAAA,MAAM,QAAA,GAAW,OAAO,sBAAsB,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,OAAO,iBAAiB,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAMW,mCAAkBL,OAAM,CAAA;AACpC,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,OAAA;AACpB,EAAA,MAAM,OAAA,GAAU,YAAA,GAAgB,KAAA,GAAuB,YAAA,IAAgB,WAAA;AACvE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUL,0BAAoB,OAAO,CAAA;AAC3D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAUA,0BAAoB,OAAO,CAAA;AAEvE,EAAA,MAAM,KAAA,GAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ,IAAK,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,KAAA,EAAO,EAAA,EAAI,OAAA,EAAQ,IAAK,CAAA;AACpC,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,QAAA,CAAS,KAAkB,CAAA;AAC3B,IAAA,cAAA,CAAe,KAAkB,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,YAAA,EAAc,KAAA,EAAO,GAAG,CAAC,CAAA;AAG7B,EAAA,MAAM,OAAA,GAAqB,YAAA,IAAgB,CAAC,SAAA,GAAa,KAAA,GAAsB,KAAA;AAG/E,EAAA,MAAM,SAAA,GAAuB,YAAY,WAAA,GAAc,OAAA;AACvD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUA,gBAAA,CAAA,QAAA,CAAS,MAAMW,6BAAA,CAAa,OAAA,CAAQ,IAAA,oBAAQ,IAAI,IAAA,EAAM,CAAC,CAAA;AACrF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUX,0BAAsB,IAAI,CAAA;AAG1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,0BAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,0BAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,0BAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAUA,0BAAS,MAAM,IAAA,CAAK,aAAa,CAAA;AACvE,EAAA,MAAM,OAAA,GAAgBA,wBAAuB,IAAI,CAAA;AACjD,EAAA,MAAM,UAAA,GAAmBA,wBAAuB,IAAI,CAAA;AACpD,EAAA,MAAM,UAAA,GAAmBA,wBAA0B,IAAI,CAAA;AAKvD,EAAA,MAAM,GAAA,GAAMC,mCAAA,CAAmB,OAAA,EAAS,UAAA,EAAY;AAAA,IAClD,IAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,kBAAA,GAA2BD,6BAAY,MAAM;AACjD,IAAA,IAAI,SAAA,WAAoB,WAAW,CAAA;AACnC,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,YAAA,GAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,SAAA,EAAW,WAAA,EAAa,YAAY,CAAC,CAAA;AAEzC,EAAAE,2BAAA,CAAW;AAAA,IACT,IAAA;AAAA,IACA,SAAA,EAAW,kBAAA;AAAA,IACX,IAAA,EAAM,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,IAC1B,cAAA,EAAgB;AAAA,GACjB,CAAA;AAKD,EAAA,MAAM,UAAA,GAAmBF,yBAAQ,MAAMY,gCAAA,CAAgB,MAAM,CAAC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACvE,EAAA,MAAM,UAAA,GAAmBZ,yBAAQ,MAAMY,gCAAA,CAAgB,MAAM,CAAC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAEvE,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAClB,CAAC,EACE,OAAA,IAAW,CAAA,GAAI,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAY,EAAG,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,OAAA,EAAS,CAAA,IACpF,OAAA,IAAW,CAAA,GAAI,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAY,EAAG,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,OAAA,EAAS,CAAA,IACrF,iBAAiB,CAAC,CAAA,CAAA;AAGtB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAY;AAC3B,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAM,OAAO,KAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,QAAQ,EAAA,IAAM,KAAA;AAC1B,IAAA,IAAI,CAAC,GAAA,EAAK,OAAOC,0BAAA,CAAU,CAAA,EAAG,QAAQ,IAAI,CAAA;AAC1C,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,IAAA,GAAO,GAAA,GAAM,QAAQ,IAAA,GAAO,GAAA;AAC9C,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,IAAA,GAAO,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAA;AAC7C,IAAA,OAAO,CAAA,IAAK,IAAI,IAAA,CAAK,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,QAAA,EAAS,EAAG,CAAA,CAAE,OAAA,EAAS,KACxD,CAAA,IAAK,IAAI,IAAA,CAAK,CAAA,CAAE,WAAA,EAAY,EAAG,EAAE,QAAA,EAAS,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,EACjE,CAAA;AAKA,EAAA,MAAM,aAAa,MAAmC;AACpD,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAM,OAAO,IAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,QAAQ,EAAA,IAAM,KAAA;AAC1B,IAAA,IAAI,CAAC,KAAK,OAAO,EAAE,GAAG,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAK;AACpD,IAAA,OAAO,OAAA,CAAQ,IAAA,IAAQ,GAAA,GAAM,EAAE,GAAG,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,GAAA,KAAQ,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,QAAQ,IAAA,EAAK;AAAA,EACvF,CAAA;AAGA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAoB;AACpC,IAAA,IAAI,SAAA,WAAoB,IAAI,CAAA;AAAA,oBACZ,IAAI,CAAA;AAAA,EACtB,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,EAAM,OAAA,EAAQ,IAAK,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,EAAA,EAAI,OAAA,EAAQ,IAAK,CAAA;AACvC,EAAMb,2BAAU,MAAM;AACpB,IAAA,WAAA,CAAY,QAAQ,IAAA,GAAOc,2BAAA,CAAW,QAAQ,IAAA,EAAM,GAAG,IAAI,EAAE,CAAA;AAC7D,IAAA,SAAA,CAAU,QAAQ,EAAA,GAAKA,2BAAA,CAAW,QAAQ,EAAA,EAAI,GAAG,IAAI,EAAE,CAAA;AAAA,EAEzD,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,GAAG,CAAC,CAAA;AAExB,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAsB,IAAA,KAAiB;AAC1D,IAAA,MAAM,MAAA,GAASC,0BAAA,CAAU,IAAA,EAAM,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,MAAA,IAAU,UAAA,CAAW,MAAM,CAAA,EAAG;AAEjC,MAAA,IAAI,KAAA,KAAU,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,GAAOD,4BAAW,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,GAAI,EAAE,CAAA;AAAA,WAC9E,SAAA,CAAU,QAAQ,EAAA,GAAKA,2BAAA,CAAW,QAAQ,EAAA,EAAI,GAAG,IAAI,EAAE,CAAA;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAkB,KAAA,KAAU,MAAA,GAC7B,OAAA,CAAQ,EAAA,IAAM,QAAQ,EAAA,GAAK,MAAA,GAAS,EAAE,IAAA,EAAM,QAAQ,EAAA,EAAI,EAAA,EAAI,QAAO,GAAI,EAAE,MAAM,MAAA,EAAQ,EAAA,EAAI,OAAA,CAAQ,EAAA,KACnG,OAAA,CAAQ,IAAA,IAAQ,SAAS,OAAA,CAAQ,IAAA,GAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,OAAA,CAAQ,MAAK,GAAI,EAAE,MAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,MAAA,EAAO;AACnH,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQH,6BAAA,CAAa,MAAM,CAAC,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,UAAA,KAAuB;AAC1C,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,CAAC,CAAC,CAAA;AACzC,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAY;AACzB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,IAAS,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,EAAA,EAAK,IAAA,GAAO,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,IAAA,EAAK;AAAA,SACzE;AACH,MAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,MAAA,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,IAAA,EAAK,GAAI,EAAE,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE;AAAA,IAC1D;AACA,IAAA,IAAI,SAAA,WAAoB,IAAI,CAAA;AAAA,oBACZ,IAAI,CAAA;AAAA,EACtB,CAAA;AAKA,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAiB,UAAA,GAAa,KAAA,KAAU;AACtD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAS,IAAI,CAAA;AACb,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI,YAAA,aAAyB,IAAI,CAAA;AAAA,IACnC,WAAW,UAAA,EAAY;AACrB,MAAA,QAAA,GAAW,IAAI,CAAA;AAAA,IACjB;AACA,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,YAAA,GAAe,KAAK,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAKlB,IAAA,IAAI,SAAA,SAAkB,WAAW,CAAA;AAAA,oBACjB,WAAW,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,MAAM,kBAAA,EAAmB;AAAA,SACxB;AAAE,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAG,MAAA,YAAA,GAAe,IAAI,CAAA;AAAA,IAAG;AAAA,EAC9C,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,GACpB,SAAA,CAAU,EAAA,GACR,CAAA,EAAGG,2BAAA,CAAW,SAAA,CAAU,IAAA,EAAM,GAAG,CAAC,CAAA,QAAA,EAAMA,2BAAA,CAAW,UAAU,EAAA,EAAI,GAAG,CAAC,CAAA,CAAA,GACrE,CAAA,EAAGA,2BAAA,CAAW,SAAA,CAAU,IAAA,EAAM,GAAG,CAAC,CAAA,cAAA,CAAA,GACpC,MAAA,CAAO,oBAAoB,CAAA;AAE/B,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KAAmB;AACtC,IAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,OAAM,GAAI,MAAA,KAAW,IAAI,UAAA,GAAa,UAAA;AACxD,IAAA,MAAM,SAAS,UAAA,EAAW;AAG1B,IAAA,MAAM,UAAA,GAAa,CAAC,CAAC,MAAA,IAAU,CAACD,0BAAA,CAAU,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA;AAC5D,IAAA,uBACEV,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAEZ,QAAA,EAAA;AAAA,MAAA,CAAC,aAAA,oBAAiBA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA;AAAA,QAAA,UAAA,CAAW,CAAA,CAAE,UAAU,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,EAAE,WAAA;AAAY,OAAA,EAAE,CAAA;AAAA,sBACjGA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAAMG,cAAA,CAAC,UAAa,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,CAAA,EAAA,EAA/B,CAAiC,CAAO,CAAA;AAAA,QAC1E,KAAA,CAAM,IAAI,CAAC,EAAE,MAAM,CAAA,EAAG,OAAA,IAAW,CAAA,KAAM;AAGtC,UAAA,IAAI,OAAA,EAAS,uBAAOA,cAAA,CAAC,MAAA,EAAA,EAAa,SAAA,EAAU,2BAAA,EAA4B,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,CAAA,CAAE,OAAA,EAAQ,EAAA,EAAvE,CAAyE,CAAA;AACxG,UAAA,MAAM,GAAA,GAAO,OAAA,CAAQ,IAAA,IAAQO,0BAAA,CAAU,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,IAAO,OAAA,CAAQ,EAAA,IAAMA,0BAAA,CAAU,CAAA,EAAG,QAAQ,EAAE,CAAA;AAClG,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,UAAA;AAG3B,UAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,UAAA,MAAM,OAAA,GAAU,QAAQ,CAAC,CAAC,UAAUA,0BAAA,CAAU,CAAA,EAAG,OAAO,CAAC,CAAA;AACzD,UAAA,MAAM,QAAA,GAAW,QAAQ,CAAC,CAAC,UAAUA,0BAAA,CAAU,CAAA,EAAG,OAAO,CAAC,CAAA;AAK1D,UAAA,MAAM,EAAA,GAAK,CAAC,IAAA,GAAO,IAAA,GAAO,OAAA,GAAW,MAAM,KAAA,GAAQ,KAAA,GAAU,GAAA,KAAQ,CAAA,GAAI,KAAA,GAAQ,MAAA;AACjF,UAAA,MAAM,EAAA,GAAK,CAAC,IAAA,GAAO,IAAA,GAAO,QAAA,GAAY,MAAM,KAAA,GAAQ,KAAA,GAAU,GAAA,KAAQ,CAAA,GAAI,KAAA,GAAQ,MAAA;AAClF,UAAA,MAAM,KAAA,GAAQA,0BAAA,CAAU,CAAA,kBAAG,IAAI,MAAM,CAAA;AACrC,UAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AACxB,UAAA,uBACEP,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAWF,mBAAA;AAAA,gBACT,gBAAA;AAAA,gBACA,GAAA,IAAO,aAAA;AAAA,gBACP,IAAA,IAAQ,SAAA;AAAA,gBACR,EAAA,IAAM,SAAS,EAAE,CAAA,CAAA;AAAA,gBACjB,EAAA,IAAM,SAAS,EAAE,CAAA,CAAA;AAAA,gBACjB,KAAA,IAAS,UAAA;AAAA,gBACT,GAAA,IAAO;AAAA,eACT;AAAA,cACA,QAAA,EAAU,CAAC,CAAC,GAAA;AAAA,cACZ,YAAA,EAAc,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,cAC9B,OAAA,EAAS,MAAM,KAAA,CAAM,CAAC,CAAA;AAAA,cACtB,YAAE,OAAA;AAAQ,aAAA;AAAA,YAdL;AAAA,WAcO;AAAA,QAElB,CAAC;AAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ,CAAA;AAIA,EAAA,MAAM,eAAA,GAAkB,sBACtBD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,IAAA,EAAK,QAAA,EAAS,YAAA,EAAY,MAAA,CAAO,qBAAqB,CAAA,EACrF,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAG,cAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,EAAG,YAAA,EAAY,OAAO,iBAAiB,CAAA,EAAG,yCAACU,4BAAA,EAAA,EAAY,IAAA,EAAM,IAAI,CAAA,EAAE,CAAA;AAAA,sBAChIV,cAAA,CAAC,UAAM,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,sBAChBA,cAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,EAAG,YAAA,EAAY,OAAO,iBAAiB,CAAA,EAAG,yCAACW,6BAAA,EAAA,EAAa,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA,KAAA,EACnI,CAAA;AAAA,oBACAX,cAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EACZ,qBAAW,GAAA,CAAI,CAAC,MAAM,GAAA,qBACrBA,cAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QAEL,SAAA,EAAWF,mBAAA,CAAG,uBAAA,EAAyB,IAAA,CAAK,QAAA,EAAS,KAAM,GAAA,IAAO,IAAA,CAAK,WAAA,EAAY,KAAM,QAAA,IAAY,YAAY,CAAA;AAAA,QACjH,OAAA,EAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAAA,QAC9B,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA,OAAA;AAAA,MAHV;AAAA,KAIR,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,SAAA,EAAWC,mBAAA,CAAG,WAAA,EAAa,OAAA,IAAW,YAAA,EAAc,QAAA,IAAY,aAAA,EAAe,SAAS,CAAA,EACzG,QAAA,EAAA;AAAA,oBAAAD,eAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,EAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,oBAAA;AAAA,QACV,QAAA;AAAA,QACA,OAAA,EAAS,UAAA;AAAA,QACT,eAAA,EAAc,QAAA;AAAA,QACd,eAAA,EAAe,IAAA;AAAA,QAEf,QAAA,EAAA;AAAA,0BAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iBAAA,EAAkB,aAAA,EAAY,QAAO,QAAA,kBAAAA,cAAA,CAACY,6BAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE,CAAA;AAAA,0BAC/EZ,cAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KACf;AAAA,IACC,IAAA,mCACEE,uBAAA,EAAA,EACD,QAAA,kBAAAL,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,WAAWC,mBAAA,CAAG,oBAAA,EAAsB,aAAA,EAAe,MAAA,KAAW,KAAK,6BAA6B,CAAA;AAAA,QAChG,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAc,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,QACjC,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,UAAA,EAAY,GAAA,CAAI,KAAA,GAAQ,SAAA,GAAY;AAAA,SACtC;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAC3BE,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,oCACd,IAAA,EAAA,EACC,QAAA,kBAAAA,cAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,MAAA,CAAO,EAAE,KAAA,EAAM,EAAG,IAAI,CAAA,EAAI,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA,EAAA,EADhE,CAET,CACD,CAAA,EACH,CAAA;AAAA,0BAEFH,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,YAAA,UAAA,oBACCA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAA,CAAC,OAAA,EAAA,EAAM,WAAU,kBAAA,EACf,QAAA,EAAA;AAAA,gCAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,MAAA,CAAO,gBAAgB,CAAA,EAAE,CAAA;AAAA,gCACnEA,cAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,MAAA;AAAA,oBACL,SAAA,EAAU,wBAAA;AAAA,oBACV,KAAA,EAAO,QAAA;AAAA,oBACP,WAAA,EAAaa,uCAAsB,GAAG,CAAA;AAAA,oBACtC,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBAC3C,QAAQ,CAAC,CAAA,KAAM,YAAY,MAAA,EAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBACjD,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,sBAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,cAAqB,MAAA,EAAS,CAAA,CAAE,OAA4B,KAAK,CAAA;AAAA,oBAAG;AAAA;AAAA;AACxG,eAAA,EACF,CAAA;AAAA,8BACAhB,eAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,kBAAA,EACf,QAAA,EAAA;AAAA,gCAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,MAAA,CAAO,cAAc,CAAA,EAAE,CAAA;AAAA,gCACjEA,cAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,MAAA;AAAA,oBACL,SAAA,EAAU,wBAAA;AAAA,oBACV,KAAA,EAAO,MAAA;AAAA,oBACP,WAAA,EAAaa,uCAAsB,GAAG,CAAA;AAAA,oBACtC,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBACzC,QAAQ,CAAC,CAAA,KAAM,YAAY,IAAA,EAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBAC/C,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,sBAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,cAAqB,IAAA,EAAO,CAAA,CAAE,OAA4B,KAAK,CAAA;AAAA,oBAAG;AAAA;AAAA;AACtG,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BAEFhB,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,8BAAAG,cAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,MAAMc,0BAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,EAAG,cAAY,MAAA,CAAO,oBAAoB,GAAG,QAAA,kBAAAd,cAAA,CAACU,4BAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE,CAAA;AAAA,cACzI,aAAA,mBACCb,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,eAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,8BAAA;AAAA,oBACV,SAAS,MAAM;AAAE,sBAAA,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA;AAAG,sBAAA,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,oBAAG,CAAA;AAAA,oBAC1E,eAAA,EAAc,QAAA;AAAA,oBACd,eAAA,EAAe,QAAA;AAAA,oBAEf,QAAA,EAAA;AAAA,sCAAAA,eAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,wBAAA,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,wBAAE,GAAA;AAAA,wBAAE,KAAK,WAAA;AAAY,uBAAA,EAAE,CAAA;AAAA,sCACxDG,cAAA,CAACe,4BAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI,eAAW,IAAA,EAAC;AAAA;AAAA;AAAA,iBACrC;AAAA,gBACC,YAAY,eAAA;AAAgB,eAAA,EAC/B,CAAA,kCAEC,MAAA,EAAA,EAAK,CAAA;AAAA,8BAERf,cAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAMc,0BAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,cAAY,MAAA,CAAO,oBAAoB,GAAG,QAAA,kBAAAd,cAAA,CAACW,6BAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE;AAAA,aAAA,EAC5I,CAAA;AAAA,4BACAd,eAAA,CAAC,SAAI,SAAA,EAAWC,mBAAA,CAAG,qBAAqB,MAAA,KAAW,CAAA,IAAK,2BAA2B,CAAA,EAChF,QAAA,EAAA;AAAA,cAAA,WAAA,CAAY,CAAC,CAAA;AAAA,cACb,MAAA,KAAW,CAAA,IAAK,WAAA,CAAY,CAAC;AAAA,aAAA,EAChC,CAAA;AAAA,4BACAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,8BAAAG,cAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,oBAAmB,OAAA,EAAS,KAAA,EAAQ,QAAA,EAAA,MAAA,CAAO,cAAc,CAAA,EAAE,CAAA;AAAA,8BAC3FA,cAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,MAAA,CAAO,OAAO,GAAG,QAAA,EAAU,CAAC,QAAQ,IAAA,IAAQ,CAAC,QAAQ,EAAA,EAAK,QAAA,EAAA,MAAA,CAAO,cAAc,CAAA,EAAE;AAAA,aAAA,EACrJ;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KACF,EACA;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAuBA,SAAS,aAAA,CAAc,GAAkB,EAAA,EAAY;AACnD,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC9B,EAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,KAAK,OAAO,KAAA;AACxC,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,MAAM,KAAA,IAAS,EAAE,EAAE,OAAA,IAAW,CAAA,CAAE,UAAU,OAAO,KAAA;AACrD,IAAA,IAAI,CAAA,KAAM,MAAA,IAAU,CAAC,CAAA,CAAE,SAAS,OAAO,KAAA;AACvC,IAAA,IAAI,CAAA,KAAM,MAAA,IAAU,CAAC,CAAA,CAAE,SAAS,OAAO,KAAA;AACvC,IAAA,IAAI,CAAA,KAAM,OAAA,IAAW,CAAC,CAAA,CAAE,UAAU,OAAO,KAAA;AACzC,IAAA,IAAI,CAAA,KAAM,KAAA,IAAS,CAAC,CAAA,CAAE,QAAQ,OAAO,KAAA;AAAA,EACvC;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EAAM,OAAA;AAAA,EAAS,KAAA;AAAA,EACf,WAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,SAASP,0BAAA,EAAU;AACzB,EAAA,MAAM,EAAA,GAAK,WAAA,IAAe,MAAA,CAAO,uBAAuB,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,YAAA,IAAgB,MAAA,CAAO,kBAAkB,CAAA;AACvD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUC,0BAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,0BAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAiBA,wBAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,OAAA,GAAgBA,wBAAyB,IAAI,CAAA;AAEnD,EAAA,MAAM,QAAA,GAAiBA,yBAAQ,MAAM;AACnC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,IAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,IAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,EAAA,KAAO;AAC1B,MAAA,MAAM,MAAM,CAAC,EAAA,CAAG,KAAA,EAAO,EAAA,CAAG,aAAa,EAAA,CAAG,KAAA,EAAO,GAAI,EAAA,CAAG,YAAY,EAAG,EAAE,IAAA,CAAK,GAAG,EAAE,WAAA,EAAY;AAC/F,MAAA,OAAO,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAGjB,EAAA,MAAM,OAAA,GAAgBA,yBAAQ,MAAM;AAClC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,GAAA,uBAAU,GAAA,EAA2B;AAC3C,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,CAAA,GAAI,GAAG,KAAA,IAAS,EAAA;AACtB,MAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAG,QAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAAG;AAClD,MAAA,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,EAAE,OAAO,GAAA,EAAI;AAAA,EACtB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,IAAA,GAAO,QAAA;AAEb,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,CAAS,EAAE,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA;AACzB,MAAA,qBAAA,CAAsB,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IACvD;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAMA,2BAAU,MAAM;AAAE,IAAA,SAAA,CAAU,CAAC,CAAA;AAAA,EAAG,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEhD,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,WAAA,IACvB,CAAA,CAAE,QAAQ,WAAA,EAAa;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,SAAA,CAAU,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,KAAK,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAAG,CAAA,MAAA,IACjG,CAAA,CAAE,GAAA,KAAQ,SAAA,EAAW;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAAG,CAAA,MAAA,IACjF,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC1B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,EAAA,GAAK,KAAK,MAAM,CAAA;AACtB,QAAA,IAAI,EAAA,EAAI;AAAE,UAAA,EAAA,CAAG,KAAA,EAAM;AAAG,UAAA,OAAA,EAAQ;AAAA,QAAG;AAAA,MACnC;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,GAAG,CAAC,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEhC,EAAMA,2BAAU,MAAM;AACpB,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,EAAS,aAAA,CAAc,CAAA,eAAA,EAAkB,MAAM,CAAA,EAAA,CAAI,CAAA;AACtE,IAAA,EAAA,EAAI,cAAA,CAAe,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,uBACEM,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,MAAK,QAAA,EAAS,YAAA,EAAW,MAAA,EAAO,YAAA,EAAY,MAAA,CAAO,uBAAuB,CAAA,EAAG,WAAA,EAAa,CAAC,CAAA,KAAM;AAAE,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe,OAAA,EAAQ;AAAA,EAAG,CAAA,EAC7K,QAAA,kBAAAH,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EACb,QAAA,EAAA;AAAA,sBAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,WAAU,YAAA,EAAa,aAAA,EAAY,QAAO,QAAA,kBAAAA,cAAA,CAACgB,uBAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE,CAAA;AAAA,sBACpEhB,cAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,aAAA;AAAA,UACV,KAAA,EAAO,KAAA;AAAA,UACP,WAAA,EAAa,EAAA;AAAA,UACb,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,OAC1C;AAAA,sBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,QAAA,EAAA,KAAA,EAAG;AAAA,KAAA,EAChC,CAAA;AAAA,oCACC,IAAA,EAAA,EAAG,GAAA,EAAK,SAAS,SAAA,EAAU,YAAA,EAAa,MAAK,SAAA,EAC3C,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,WAAW,CAAA,oBAAKA,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACxD,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBAClBH,eAAA,CAAOH,2BAAN,EACE,QAAA,EAAA;AAAA,QAAA,CAAA,mCAAM,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EAAc,aAAA,EAAY,QAAQ,QAAA,EAAA,CAAA,EAAE,CAAA;AAAA,QACvD,QAAQ,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,CAAG,GAAA,CAAI,CAAC,EAAA,KAAO;AAC/B,UAAA,GAAA,EAAA;AACA,UAAA,MAAM,CAAA,GAAI,GAAA;AACV,UAAA,uBACEG,eAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,iBAAe,CAAA,KAAM,MAAA;AAAA,cACrB,cAAA,EAAc,CAAA;AAAA,cACd,SAAA,EAAWC,mBAAA,CAAG,YAAA,EAAc,CAAA,KAAM,UAAU,WAAW,CAAA;AAAA,cACvD,YAAA,EAAc,MAAM,SAAA,CAAU,CAAC,CAAA;AAAA,cAC/B,WAAA,EAAa,CAAC,CAAA,KAAM;AAAE,gBAAA,CAAA,CAAE,cAAA,EAAe;AAAG,gBAAA,EAAA,CAAG,KAAA,EAAM;AAAG,gBAAA,OAAA,EAAQ;AAAA,cAAG,CAAA;AAAA,cAEhE,QAAA,EAAA;AAAA,gBAAA,EAAA,CAAG,IAAA,mCAAS,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAkB,aAAA,EAAY,MAAA,EAAQ,aAAG,IAAA,EAAK,CAAA;AAAA,gCAC1ED,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACd,QAAA,EAAA;AAAA,kCAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,EAAA,CAAG,KAAA,EAAM,CAAA;AAAA,kBAC5C,GAAG,WAAA,oBAAeA,cAAA,CAAC,UAAK,SAAA,EAAU,iBAAA,EAAmB,aAAG,WAAA,EAAY;AAAA,iBAAA,EACvE,CAAA;AAAA,gBACC,GAAG,QAAA,oBAAYA,cAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EAAa,aAAG,QAAA,EAAS;AAAA;AAAA,aAAA;AAAA,YAbnD,EAAA,CAAG;AAAA,WAcV;AAAA,QAEJ,CAAC;AAAA,OAAA,EAAA,EAvBkB,CAAA,IAAK,QAwB1B,CACD;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAMO,SAAS,kBAAkB,EAAE,MAAA,GAAS,OAAA,EAAQ,GAA8B,EAAC,EAAG;AACrF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUN,0BAAS,KAAK,CAAA;AAC5C,EAAMA,2BAAU,MAAM;AACpB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,aAAA,CAAc,CAAA,EAAG,MAAM,CAAA,EAAG;AAC5B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,MAAA,EAAQ,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,EAAE;AACxF","file":"chunk-3RB4OZTJ.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { CalendarIcon, ChevronLeft, ChevronRight, ChevronDown, X, Check, Search } from './Icons';\nimport { resolveDateFormat, formatDate, parseDate, dateFormatPlaceholder, startOfMonth, addMonths, isSameDay, buildMonthGrid6, type DateFormat } from '../utils/dateFormat';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { format as formatMsg } from '../locale/messages';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\n// ---------- MultiCombobox -----------------------------------------------\nexport interface MultiComboboxOption<T = string> {\n value: T;\n label: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface MultiComboboxProps<T = string> {\n value: T[];\n onChange: (v: T[]) => void;\n options: MultiComboboxOption<T>[];\n placeholder?: string;\n emptyMessage?: string;\n filter?: (option: MultiComboboxOption<T>, query: string) => boolean;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n maxVisibleChips?: number;\n}\n\nconst dfilter = <T,>(o: MultiComboboxOption<T>, q: string) =>\n o.label.toLowerCase().includes(q.toLowerCase());\n\nexport function MultiCombobox<T = string>({\n value, onChange, options, placeholder,\n emptyMessage, filter = dfilter,\n invalid, disabled, className, id, maxVisibleChips = 3,\n}: MultiComboboxProps<T>) {\n const locale = useLocale();\n const ph = placeholder ?? locale['common.search'];\n const empty = emptyMessage ?? locale['common.noResults'];\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState('');\n const [active, setActive] = React.useState(0);\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLUListElement>(null);\n const reactId = React.useId();\n const listboxId = `${id ?? reactId}-listbox`;\n // Build the lookup Set once per `value` change, not on every keystroke or\n // hover-driven re-render.\n const selSet = React.useMemo(() => new Set(value), [value]);\n\n const filtered = React.useMemo(\n () => (query ? options.filter((o) => filter(o, query)) : options),\n [options, query, filter]\n );\n\n const pos = usePopoverPosition(wrapRef, listRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 4,\n matchAnchorWidth: true,\n });\n\n // Escape is handled by the input's onKeyDown; only outside-click here.\n useDismiss({\n open,\n onDismiss: () => setOpen(false),\n refs: [wrapRef, listRef],\n closeOnEscape: false,\n });\n\n const toggle = (v: T) => {\n if (selSet.has(v)) onChange(value.filter((x) => x !== v));\n else onChange([...value, v]);\n };\n\n const onKey = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') { e.preventDefault(); setOpen(true); setActive((a) => Math.min(filtered.length - 1, a + 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setActive((a) => Math.max(0, a - 1)); }\n else if (e.key === 'Enter') {\n e.preventDefault();\n const opt = filtered[active];\n if (opt && !opt.disabled) { toggle(opt.value); setQuery(''); }\n } else if (e.key === 'Escape') { setOpen(false); }\n else if (e.key === 'Backspace' && !query && value.length) { onChange(value.slice(0, -1)); }\n };\n\n const selectedItems = options.filter((o) => selSet.has(o.value));\n const visible = selectedItems.slice(0, maxVisibleChips);\n const overflow = selectedItems.length - visible.length;\n\n return (\n <div ref={wrapRef} className={cx('multicombo', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n <div className=\"multicombo__chips\" onClick={() => inputRef.current?.focus()}>\n {visible.map((o) => (\n <span key={String(o.value)} className=\"multicombo__chip\">\n {o.label}\n <button type=\"button\" aria-label={formatMsg(locale['combobox.remove'], { label: o.label })} onClick={(e) => { e.stopPropagation(); toggle(o.value); }}><X size={12} /></button>\n </span>\n ))}\n {overflow > 0 && <span className=\"multicombo__chip multicombo__chip--more\">+{overflow}</span>}\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n className=\"multicombo__input\"\n placeholder={selectedItems.length === 0 ? ph : ''}\n disabled={disabled}\n value={query}\n onFocus={() => setOpen(true)}\n onChange={(e) => { setQuery(e.target.value); setOpen(true); setActive(0); }}\n onKeyDown={onKey}\n />\n </div>\n {open && (\n <Portal>\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n className={cx('multicombo__list', 'is-floating')}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n width: pos.width,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {filtered.length === 0 ? (\n <li className=\"multicombo__empty\">{empty}</li>\n ) : (\n filtered.map((o, i) => {\n const checked = selSet.has(o.value);\n return (\n <li\n key={String(o.value)}\n role=\"option\"\n aria-selected={checked}\n aria-disabled={o.disabled}\n className={cx('multicombo__option', i === active && 'is-active', checked && 'is-selected', o.disabled && 'is-disabled')}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => { e.preventDefault(); if (!o.disabled) toggle(o.value); }}\n >\n <span className={cx('multicombo__check', checked && 'is-checked')} aria-hidden=\"true\">{checked ? <Check size={14} /> : null}</span>\n <span className=\"multicombo__option-body\">\n <span className=\"multicombo__option-label\">{o.label}</span>\n {o.description && <span className=\"multicombo__option-desc\">{o.description}</span>}\n </span>\n </li>\n );\n })\n )}\n </ul>\n </Portal>\n )}\n </div>\n );\n}\n\n// ---------- DateRangePicker --------------------------------------------\nexport interface DateRange { from: Date | null; to: Date | null }\n\nexport interface DateRangePickerProps {\n /** Controlled value. Omit to make the picker uncontrolled (see `defaultValue`). */\n value?: DateRange;\n /**\n * In legacy mode, fires on every day click. In apply mode (when `onApply` is\n * provided), fires only at apply time so a controlled `value` can stay in sync.\n */\n onChange?: (v: DateRange) => void;\n /** Initial value when uncontrolled. Ignored if `value` is provided. */\n defaultValue?: DateRange;\n /**\n * Opt-in: enables apply mode. Day clicks only mutate an internal draft; the\n * consumer is notified when the user confirms (button \"Apply\" or a preset).\n * Closing the popover without applying reverts the draft to the last applied\n * value. Useful when each commit triggers a server-side query.\n */\n onApply?: (v: DateRange) => void;\n /** Fires on open/close transitions. */\n onOpenChange?: (open: boolean) => void;\n minDate?: Date;\n maxDate?: Date;\n /**\n * Disable arbitrary days (holidays, blackout dates, specific weekdays). A\n * day for which this returns `true` renders disabled — greyed, not\n * focusable, not clickable. Composes with `minDate`/`maxDate`. A range\n * endpoint can never land on a disabled day; a disabled day that falls\n * inside an otherwise-valid span stays greyed but is included visually\n * (the span is allowed). E.g. disable Sundays: `d => d.getDay() === 0`.\n */\n isDateDisabled?: (date: Date) => boolean;\n presets?: Array<{ label: string; range: () => DateRange }>;\n invalid?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n /**\n * Display format. Default `'auto'` derives from `configureBrand().locale`.\n */\n format?: DateFormat;\n /**\n * Report-grade: show editable \"Desde\"/\"Hasta\" text inputs above the calendar\n * so the user can type an exact range. Off by default — a simple filter is\n * usually fine with presets + clicking.\n */\n showInputs?: boolean;\n /**\n * Report-grade: replace the static month title with a \"MMMM de YYYY ▾\" button\n * that opens a month/year jump menu (instead of clicking the arrows N times).\n */\n monthDropdown?: boolean;\n /** Number of month panels. Default `2`; `1` is the compact single-month layout. */\n months?: 1 | 2;\n}\n\nconst EMPTY_RANGE: DateRange = { from: null, to: null };\n\nexport function DateRangePicker({\n value, onChange, defaultValue, onApply, onOpenChange,\n minDate, maxDate, isDateDisabled, presets,\n invalid, disabled, className, id, format = 'auto',\n showInputs = false, monthDropdown = false, months = 2,\n}: DateRangePickerProps) {\n const locale = useLocale();\n const weekdays = locale['picker.weekdaysShort'];\n const monthNames = locale['calendar.months'];\n const fmt = resolveDateFormat(format);\n const isControlled = value !== undefined;\n const applyMode = !!onApply;\n const initial = isControlled ? (value as DateRange) : (defaultValue ?? EMPTY_RANGE);\n const [draft, setDraft] = React.useState<DateRange>(initial);\n const [lastApplied, setLastApplied] = React.useState<DateRange>(initial);\n // Resync draft/lastApplied when controlled `value` changes externally.\n const vFrom = value?.from?.getTime() ?? 0;\n const vTo = value?.to?.getTime() ?? 0;\n React.useEffect(() => {\n if (!isControlled) return;\n setDraft(value as DateRange);\n setLastApplied(value as DateRange);\n }, [isControlled, vFrom, vTo]);\n // Legacy-controlled (no `onApply`) keeps prior semantics: `value` drives render\n // directly. Otherwise the draft is truth.\n const current: DateRange = isControlled && !applyMode ? (value as DateRange) : draft;\n // The trigger label shows the last-committed range in apply mode; in legacy it\n // tracks `current` (so live edits stay reflected, as before).\n const displayed: DateRange = applyMode ? lastApplied : current;\n const [open, setOpen] = React.useState(false);\n const [view, setView] = React.useState(() => startOfMonth(initial.from ?? new Date()));\n const [hover, setHover] = React.useState<Date | null>(null);\n // Editable-inputs (showInputs) mirror the current range; the month-jump menu\n // (monthDropdown) tracks a year while the user browses it.\n const [fromText, setFromText] = React.useState('');\n const [toText, setToText] = React.useState('');\n const [menuOpen, setMenuOpen] = React.useState(false);\n const [menuYear, setMenuYear] = React.useState(() => view.getFullYear());\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const popoverRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n // Portaled to body (escapes overflow ancestors) with flip/clamp and\n // scroll/resize reposition; Escape and outside-click return focus to the\n // trigger (a11y) — same primitive as MultiCombobox above.\n const pos = usePopoverPosition(wrapRef, popoverRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 6,\n });\n\n const closeWithoutCommit = React.useCallback(() => {\n if (applyMode) setDraft(lastApplied);\n setOpen(false);\n onOpenChange?.(false);\n }, [applyMode, lastApplied, onOpenChange]);\n\n useDismiss({\n open,\n onDismiss: closeWithoutCommit,\n refs: [wrapRef, popoverRef],\n returnFocusRef: triggerRef,\n });\n\n // Each panel renders ~42 Date cells. Without memoization, every\n // setHover() triggered a full rebuild of both panels' grids on every\n // mouse movement over the calendar. Memo keyed on `view` only.\n const monthGrid0 = React.useMemo(() => buildMonthGrid6(view, 0), [view]);\n const monthGrid1 = React.useMemo(() => buildMonthGrid6(view, 1), [view]);\n\n const isDisabled = (d: Date) =>\n !!(\n (minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) ||\n (maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate())) ||\n isDateDisabled?.(d)\n );\n\n const inRange = (d: Date) => {\n if (!current.from) return false;\n const end = current.to ?? hover;\n if (!end) return isSameDay(d, current.from);\n const a = current.from < end ? current.from : end;\n const b = current.from < end ? end : current.from;\n return d >= new Date(a.getFullYear(), a.getMonth(), a.getDate()) &&\n d <= new Date(b.getFullYear(), b.getMonth(), b.getDate());\n };\n\n // Ordered span ends (handles hover-preview when `to` is still null). Drives the\n // continuous-band rounding: a cell rounds left at `a`/week-start, right at\n // `b`/week-end.\n const spanBounds = (): { a: Date; b: Date } | null => {\n if (!current.from) return null;\n const end = current.to ?? hover;\n if (!end) return { a: current.from, b: current.from };\n return current.from <= end ? { a: current.from, b: end } : { a: end, b: current.from };\n };\n\n // Apply a new range honoring apply/legacy mode (same split as a day click).\n const setRange = (next: DateRange) => {\n if (applyMode) setDraft(next);\n else onChange?.(next);\n };\n\n // Keep the editable inputs in sync with the current range.\n const curFrom = current.from?.getTime() ?? 0;\n const curTo = current.to?.getTime() ?? 0;\n React.useEffect(() => {\n setFromText(current.from ? formatDate(current.from, fmt) : '');\n setToText(current.to ? formatDate(current.to, fmt) : '');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [curFrom, curTo, fmt]);\n\n const commitInput = (which: 'from' | 'to', text: string) => {\n const parsed = parseDate(text, fmt);\n if (!parsed || isDisabled(parsed)) {\n // Revert the field to the current value's formatted form.\n if (which === 'from') setFromText(current.from ? formatDate(current.from, fmt) : '');\n else setToText(current.to ? formatDate(current.to, fmt) : '');\n return;\n }\n const next: DateRange = which === 'from'\n ? (current.to && current.to < parsed ? { from: current.to, to: parsed } : { from: parsed, to: current.to })\n : (current.from && parsed < current.from ? { from: parsed, to: current.from } : { from: current.from, to: parsed });\n setRange(next);\n setView(startOfMonth(parsed));\n };\n\n const jumpToMonth = (monthIndex: number) => {\n setView(new Date(menuYear, monthIndex, 1));\n setMenuOpen(false);\n };\n\n const click = (d: Date) => {\n let next: DateRange;\n if (!current.from || (current.from && current.to)) next = { from: d, to: null };\n else {\n const from = current.from;\n next = d < from ? { from: d, to: from } : { from, to: d };\n }\n if (applyMode) setDraft(next);\n else onChange?.(next);\n };\n\n // Commits a range and closes. In apply mode this fires `onApply` (and `onChange`\n // when controlled, to keep `value` in sync). In legacy mode, only preset commits\n // propagate via `onChange`; the bare \"Apply\" button stays close-only as before.\n const commit = (next: DateRange, fromPreset = false) => {\n if (applyMode) {\n onApply!(next);\n setLastApplied(next);\n setDraft(next);\n if (isControlled) onChange?.(next);\n } else if (fromPreset) {\n onChange?.(next);\n }\n setOpen(false);\n onOpenChange?.(false);\n };\n\n const clear = () => {\n // \"Limpiar\" resetea el FILTRO, no solo el draft: en apply mode commitea el\n // rango vacío (dispara onApply + cierra). Antes solo reseteaba el draft y,\n // como \"Aplicar\" exige from+to, el estado limpio nunca se podía aplicar →\n // no se podía volver a \"sin filtro\".\n if (applyMode) commit(EMPTY_RANGE);\n else onChange?.(EMPTY_RANGE);\n };\n\n const toggleOpen = () => {\n if (open) closeWithoutCommit();\n else { setOpen(true); onOpenChange?.(true); }\n };\n\n const label = displayed.from\n ? displayed.to\n ? `${formatDate(displayed.from, fmt)} → ${formatDate(displayed.to, fmt)}`\n : `${formatDate(displayed.from, fmt)} → …`\n : locale['picker.selectRange'];\n\n const renderMonth = (offset: number) => {\n const { month: m, cells } = offset === 0 ? monthGrid0 : monthGrid1;\n const bounds = spanBounds();\n // Only paint the band for a real (multi-day) span; a lone endpoint shows\n // just its circle.\n const isMultiDay = !!bounds && !isSameDay(bounds.a, bounds.b);\n return (\n <div className=\"daterange__month\">\n {/* The dropdown owns the month label when enabled; otherwise a static title. */}\n {!monthDropdown && <div className=\"daterange__title\">{monthNames[m.getMonth()]} {m.getFullYear()}</div>}\n <div className=\"daterange__grid\">\n {weekdays.map((w, i) => <span key={i} className=\"daterange__dow\">{w}</span>)}\n {cells.map(({ date: d, outside }, i) => {\n // Adjacent-month days: greyed, non-interactive context (keeps the grid\n // at a fixed 6 rows so the height never jumps).\n if (outside) return <span key={i} className=\"daterange__day is-outside\" aria-hidden=\"true\">{d.getDate()}</span>;\n const sel = (current.from && isSameDay(d, current.from)) || (current.to && isSameDay(d, current.to));\n const band = inRange(d) && isMultiDay;\n // Column 0 = Monday, 6 = Sunday (the 7 weekday headers offset by a\n // multiple of 7, so `i % 7` is the column).\n const col = i % 7;\n const leftEnd = band && !!bounds && isSameDay(d, bounds.a);\n const rightEnd = band && !!bounds && isSameDay(d, bounds.b);\n // The band emerges from an endpoint *circle* as a half-cell (so it\n // meets the circle at its center, not with a stray cap on the outer\n // side); a hover end (no circle) caps full. Interior cells bridge the\n // gap and round only at row edges.\n const bl = !band ? null : leftEnd ? (sel ? 'mid' : 'cap') : (col === 0 ? 'cap' : 'join');\n const br = !band ? null : rightEnd ? (sel ? 'mid' : 'cap') : (col === 6 ? 'cap' : 'join');\n const today = isSameDay(d, new Date());\n const off = isDisabled(d);\n return (\n <button\n key={i}\n type=\"button\"\n className={cx(\n 'daterange__day',\n sel && 'is-selected',\n band && 'is-band',\n bl && `is-bl-${bl}`,\n br && `is-br-${br}`,\n today && 'is-today',\n off && 'is-disabled',\n )}\n disabled={!!off}\n onMouseEnter={() => setHover(d)}\n onClick={() => click(d)}\n >{d.getDate()}</button>\n );\n })}\n </div>\n </div>\n );\n };\n\n // Month/year jump menu (monthDropdown). Inline (not a Portal) — it lives inside\n // the already-portaled popover and is dismissed by selecting a month.\n const renderMonthMenu = () => (\n <div className=\"daterange__menu\" role=\"dialog\" aria-label={locale['daterange.jumpMonth']}>\n <div className=\"daterange__menu-year\">\n <button type=\"button\" onClick={() => setMenuYear((y) => y - 1)} aria-label={locale['picker.prevYear']}><ChevronLeft size={16} /></button>\n <span>{menuYear}</span>\n <button type=\"button\" onClick={() => setMenuYear((y) => y + 1)} aria-label={locale['picker.nextYear']}><ChevronRight size={16} /></button>\n </div>\n <div className=\"daterange__menu-grid\">\n {monthNames.map((name, idx) => (\n <button\n type=\"button\"\n key={name}\n className={cx('daterange__menu-month', view.getMonth() === idx && view.getFullYear() === menuYear && 'is-current')}\n onClick={() => jumpToMonth(idx)}\n >{name.slice(0, 3)}</button>\n ))}\n </div>\n </div>\n );\n\n return (\n <div ref={wrapRef} className={cx('daterange', invalid && 'is-invalid', disabled && 'is-disabled', className)}>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n className=\"daterange__trigger\"\n disabled={disabled}\n onClick={toggleOpen}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n <span className=\"daterange__icon\" aria-hidden=\"true\"><CalendarIcon size={16} /></span>\n <span>{label}</span>\n </button>\n {open && (\n <Portal>\n <div\n ref={popoverRef}\n className={cx('daterange__popover', 'is-floating', months === 1 && 'daterange__popover--compact')}\n role=\"dialog\"\n onMouseLeave={() => setHover(null)}\n style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {presets && presets.length > 0 && (\n <ul className=\"daterange__presets\">\n {presets.map((p, i) => (\n <li key={i}>\n <button type=\"button\" onClick={() => commit(p.range(), true)}>{p.label}</button>\n </li>\n ))}\n </ul>\n )}\n <div className=\"daterange__panes\">\n {showInputs && (\n <div className=\"daterange__inputs\">\n <label className=\"daterange__field\">\n <span className=\"daterange__field-label\">{locale['daterange.from']}</span>\n <input\n type=\"text\"\n className=\"daterange__field-input\"\n value={fromText}\n placeholder={dateFormatPlaceholder(fmt)}\n onChange={(e) => setFromText(e.target.value)}\n onBlur={(e) => commitInput('from', e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commitInput('from', (e.target as HTMLInputElement).value); }}\n />\n </label>\n <label className=\"daterange__field\">\n <span className=\"daterange__field-label\">{locale['daterange.to']}</span>\n <input\n type=\"text\"\n className=\"daterange__field-input\"\n value={toText}\n placeholder={dateFormatPlaceholder(fmt)}\n onChange={(e) => setToText(e.target.value)}\n onBlur={(e) => commitInput('to', e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') commitInput('to', (e.target as HTMLInputElement).value); }}\n />\n </label>\n </div>\n )}\n <div className=\"daterange__nav\">\n <button type=\"button\" onClick={() => setView((v) => addMonths(v, -1))} aria-label={locale['calendar.prevMonth']}><ChevronLeft size={16} /></button>\n {monthDropdown ? (\n <div className=\"daterange__monthjump\">\n <button\n type=\"button\"\n className=\"daterange__monthjump-trigger\"\n onClick={() => { setMenuYear(view.getFullYear()); setMenuOpen((o) => !o); }}\n aria-haspopup=\"dialog\"\n aria-expanded={menuOpen}\n >\n <span>{monthNames[view.getMonth()]} {view.getFullYear()}</span>\n <ChevronDown size={16} aria-hidden />\n </button>\n {menuOpen && renderMonthMenu()}\n </div>\n ) : (\n <span />\n )}\n <button type=\"button\" onClick={() => setView((v) => addMonths(v, 1))} aria-label={locale['calendar.nextMonth']}><ChevronRight size={16} /></button>\n </div>\n <div className={cx('daterange__months', months === 1 && 'daterange__months--single')}>\n {renderMonth(0)}\n {months === 2 && renderMonth(1)}\n </div>\n <div className=\"daterange__actions\">\n <button type=\"button\" className=\"daterange__clear\" onClick={clear}>{locale['common.clear']}</button>\n <button type=\"button\" className=\"daterange__apply\" onClick={() => commit(current)} disabled={!current.from || !current.to}>{locale['common.apply']}</button>\n </div>\n </div>\n </div>\n </Portal>\n )}\n </div>\n );\n}\n\n// ---------- Command Palette (⌘K) ----------------------------------------\nexport interface CommandItem {\n id: string;\n label: string;\n description?: string;\n group?: string;\n icon?: React.ReactNode;\n shortcut?: string;\n keywords?: string[];\n onRun: () => void;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onClose: () => void;\n items: CommandItem[];\n placeholder?: string;\n emptyMessage?: string;\n hotkey?: string; // 'mod+k'\n}\n\nfunction matchesHotkey(e: KeyboardEvent, hk: string) {\n const parts = hk.toLowerCase().split('+');\n const key = parts[parts.length - 1];\n const mods = parts.slice(0, -1);\n if (e.key.toLowerCase() !== key) return false;\n for (const m of mods) {\n if (m === 'mod' && !(e.metaKey || e.ctrlKey)) return false;\n if (m === 'ctrl' && !e.ctrlKey) return false;\n if (m === 'meta' && !e.metaKey) return false;\n if (m === 'shift' && !e.shiftKey) return false;\n if (m === 'alt' && !e.altKey) return false;\n }\n return true;\n}\n\nexport function CommandPalette({\n open, onClose, items,\n placeholder,\n emptyMessage,\n}: CommandPaletteProps) {\n const locale = useLocale();\n const ph = placeholder ?? locale['picker.searchCommands'];\n const empty = emptyMessage ?? locale['common.noResults'];\n const [query, setQuery] = React.useState('');\n const [active, setActive] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLUListElement>(null);\n\n const filtered = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((it) => {\n const hay = [it.label, it.description, it.group, ...(it.keywords ?? [])].join(' ').toLowerCase();\n return hay.includes(q);\n });\n }, [items, query]);\n\n // group preserve order\n const grouped = React.useMemo(() => {\n const order: string[] = [];\n const map = new Map<string, CommandItem[]>();\n for (const it of filtered) {\n const g = it.group ?? '';\n if (!map.has(g)) { map.set(g, []); order.push(g); }\n map.get(g)!.push(it);\n }\n return { order, map };\n }, [filtered]);\n\n const flat = filtered;\n\n React.useEffect(() => {\n if (open) {\n setQuery(''); setActive(0);\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [open]);\n\n React.useEffect(() => { setActive(0); }, [query]);\n\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n else if (e.key === 'ArrowDown') { e.preventDefault(); setActive((a) => Math.min(flat.length - 1, a + 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setActive((a) => Math.max(0, a - 1)); }\n else if (e.key === 'Enter') {\n e.preventDefault();\n const it = flat[active];\n if (it) { it.onRun(); onClose(); }\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, flat, active, onClose]);\n\n React.useEffect(() => {\n const el = listRef.current?.querySelector(`[data-cmd-idx=\"${active}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [active]);\n\n if (!open) return null;\n let idx = -1;\n return (\n <div className=\"cmdk__overlay\" role=\"dialog\" aria-modal=\"true\" aria-label={locale['picker.commandPalette']} onMouseDown={(e) => { if (e.target === e.currentTarget) onClose(); }}>\n <div className=\"cmdk__panel\">\n <div className=\"cmdk__searchbar\">\n <span className=\"cmdk__icon\" aria-hidden=\"true\"><Search size={16} /></span>\n <input\n ref={inputRef}\n className=\"cmdk__input\"\n value={query}\n placeholder={ph}\n onChange={(e) => setQuery(e.target.value)}\n />\n <kbd className=\"cmdk__esc\">Esc</kbd>\n </div>\n <ul ref={listRef} className=\"cmdk__list\" role=\"listbox\">\n {flat.length === 0 && <li className=\"cmdk__empty\">{empty}</li>}\n {grouped.order.map((g) => (\n <React.Fragment key={g || '__none'}>\n {g && <li className=\"cmdk__group\" aria-hidden=\"true\">{g}</li>}\n {grouped.map.get(g)!.map((it) => {\n idx++;\n const i = idx;\n return (\n <li\n key={it.id}\n role=\"option\"\n aria-selected={i === active}\n data-cmd-idx={i}\n className={cx('cmdk__item', i === active && 'is-active')}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => { e.preventDefault(); it.onRun(); onClose(); }}\n >\n {it.icon && <span className=\"cmdk__item-icon\" aria-hidden=\"true\">{it.icon}</span>}\n <span className=\"cmdk__item-body\">\n <span className=\"cmdk__item-label\">{it.label}</span>\n {it.description && <span className=\"cmdk__item-desc\">{it.description}</span>}\n </span>\n {it.shortcut && <kbd className=\"cmdk__kbd\">{it.shortcut}</kbd>}\n </li>\n );\n })}\n </React.Fragment>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\nexport interface UseCommandPaletteOptions {\n hotkey?: string; // default 'mod+k'\n}\n\nexport function useCommandPalette({ hotkey = 'mod+k' }: UseCommandPaletteOptions = {}) {\n const [open, setOpen] = React.useState(false);\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (matchesHotkey(e, hotkey)) {\n e.preventDefault();\n setOpen((o) => !o);\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [hotkey]);\n return { open, setOpen, close: () => setOpen(false), toggle: () => setOpen((o) => !o) };\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { Avatar } from './chunk-DH3IXJRJ.mjs';
3
- import { startOfMonth, addMonths, isSameDay } from './chunk-4QHE5H36.mjs';
4
- import { useLocale } from './chunk-KYYRQNY7.mjs';
3
+ import { startOfMonth, addMonths, isSameDay } from './chunk-ODE2ROR2.mjs';
4
+ import { useLocale } from './chunk-OOIRRKJ7.mjs';
5
5
  import { ChevronDown, ChevronRight } from './chunk-BJGMROKL.mjs';
6
6
  import { cx } from './chunk-IEPCH3JB.mjs';
7
7
  import * as React from 'react';
@@ -328,5 +328,5 @@ function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, cl
328
328
  }
329
329
 
330
330
  export { Calendar, StatusIndicator, Timeline, TimelineItem, Tree, UserCell };
331
- //# sourceMappingURL=chunk-T2DNEJR3.mjs.map
332
- //# sourceMappingURL=chunk-T2DNEJR3.mjs.map
331
+ //# sourceMappingURL=chunk-4Z5GFOIU.mjs.map
332
+ //# sourceMappingURL=chunk-4Z5GFOIU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Display3.tsx"],"names":["Timeline"],"mappings":"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","file":"chunk-T2DNEJR3.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Avatar } from './Display2';\nimport { ChevronRight, ChevronDown } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { startOfMonth, addMonths, isSameDay } from '../utils/dateFormat';\n\n// ---------- UserCell ----------------------------------------------------\nexport interface UserCellProps extends React.HTMLAttributes<HTMLDivElement> {\n name: React.ReactNode;\n meta?: React.ReactNode; // role / email / etc.\n avatarSrc?: string;\n avatarAlt?: string;\n size?: 24 | 32 | 40 | 48;\n}\n\nexport function UserCell({ name, meta, avatarSrc, avatarAlt, size = 32, className, ...rest }: UserCellProps) {\n const initialsName = typeof name === 'string' ? name : undefined;\n return (\n <div className={cx('user-cell', className)} {...rest}>\n <Avatar src={avatarSrc} alt={avatarAlt} name={initialsName} size={size} />\n <div className=\"user-cell__body\">\n <div className=\"user-cell__name\">{name}</div>\n {meta && <div className=\"user-cell__meta\">{meta}</div>}\n </div>\n </div>\n );\n}\n\n// ---------- StatusIndicator (pulsing dot) ------------------------------\nexport type StatusTone = 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport interface StatusIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: StatusTone;\n pulse?: boolean;\n label?: React.ReactNode;\n}\n\nexport function StatusIndicator({ tone = 'success', pulse, label, className, ...rest }: StatusIndicatorProps) {\n return (\n <span className={cx('status-indicator', className)} role=\"status\" {...rest}>\n <span className={cx('status-indicator__dot', `status-indicator__dot--${tone}`, pulse && 'is-pulsing')} aria-hidden=\"true\" />\n {label && <span className=\"status-indicator__label\">{label}</span>}\n </span>\n );\n}\n\n// ---------- Timeline ----------------------------------------------------\nexport type TimelineDensity = 'default' | 'compact';\n\nexport interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {\n /**\n * Visual density (v1.28.0). `compact` shrinks the marker, gap and font\n * sizes for use in cards / list summaries; semantically identical.\n */\n density?: TimelineDensity;\n}\n\nexport const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(\n function Timeline({ className, density = 'default', ...rest }, ref) {\n return <ol ref={ref} className={cx('timeline', density === 'compact' && 'timeline--compact', className)} {...rest} />;\n }\n);\n\n/**\n * Progress state of a Timeline entry (v1.28.0), orthogonal to `tone`.\n * - `done` — completed: filled marker (in `tone` color), solid connector above.\n * - `current` — happening now: ringed/pulsing marker, solid connector above.\n * - `pending` — not started: hollow muted marker, **dashed** connector above.\n *\n * Use it to scan progress on a list of events that grow over time (a despachos\n * order accumulating envíos/retiros until the last marks it complete). Default\n * (state omitted) keeps the 1.x look exactly.\n */\nexport type TimelineState = 'done' | 'current' | 'pending';\n\n/**\n * Visual emphasis for the entry's marker (v1.30.0), orthogonal to `state` and\n * `tone`. Default markers are 24×24 hollow with a tone-colored border, ideal\n * for the operational events that fill a timeline. `milestone` upgrades the\n * marker to 32×32 filled in the `tone` color with a subtle halo — for the\n * \"anchor\" events that the rest of the timeline hangs from (e.g. \"Orden\n * creada\" at the top of an order detail). Without this the hollow markers of\n * the operational events out-shout the anchor, inverting the hierarchy.\n *\n * `milestone` keeps the `state` semantics: a `pending` milestone stays hollow\n * (muted, no halo), preserving \"not yet\" while still occupying the larger\n * anchor slot. A `current` milestone gets the pulse halo (overrides the\n * static one).\n */\nexport type TimelineVariant = 'default' | 'milestone';\n\nexport interface TimelineItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'title'> {\n icon?: React.ReactNode;\n tone?: StatusTone;\n title: React.ReactNode;\n meta?: React.ReactNode;\n /** Progress state (see {@link TimelineState}). Optional. */\n state?: TimelineState;\n /**\n * Trailing slot on the title row, aligned to the right (v1.28.0). Useful for\n * a Badge marking event type (envío / retiro / nota), a timestamp on the\n * right edge, or a small action chip.\n */\n right?: React.ReactNode;\n /** Visual emphasis (see {@link TimelineVariant}). Optional, default unchanged. */\n variant?: TimelineVariant;\n}\n\nexport function TimelineItem({ icon, tone = 'neutral', title, meta, children, state, right, variant, className, ...rest }: TimelineItemProps) {\n return (\n <li\n className={cx(\n 'timeline__item',\n state && `timeline__item--${state}`,\n variant === 'milestone' && 'timeline__item--milestone',\n className,\n )}\n data-state={state}\n {...rest}\n >\n <span\n className={cx(\n 'timeline__marker',\n `timeline__marker--${tone}`,\n variant === 'milestone' && 'timeline__marker--milestone',\n )}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n <div className=\"timeline__body\">\n {right != null ? (\n // Title row wrapper only renders when there's a trailing slot, so\n // the DOM stays byte-identical for existing consumers (back-compat).\n <div className=\"timeline__title-row\">\n <div className=\"timeline__title\">{title}</div>\n <div className=\"timeline__right\">{right}</div>\n </div>\n ) : (\n <div className=\"timeline__title\">{title}</div>\n )}\n {meta && <div className=\"timeline__meta\">{meta}</div>}\n {children && <div className=\"timeline__content\">{children}</div>}\n </div>\n </li>\n );\n}\n\n// ---------- Tree --------------------------------------------------------\nexport interface TreeNodeData {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n children?: TreeNodeData[];\n meta?: React.ReactNode;\n}\n\nexport interface TreeProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n nodes: TreeNodeData[];\n defaultExpanded?: string[];\n selectedId?: string;\n onSelect?: (id: string) => void;\n}\n\nfunction firstNodeId(nodes: TreeNodeData[]): string | undefined {\n return nodes[0]?.id;\n}\n\nexport function Tree({\n nodes,\n defaultExpanded = [],\n selectedId,\n onSelect,\n className,\n onKeyDown,\n ...rest\n}: TreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(new Set(defaultExpanded));\n const [activeId, setActiveId] = React.useState<string | undefined>(undefined);\n const rootRef = React.useRef<HTMLUListElement>(null);\n\n // Roving tabindex: one treeitem is tabbable at a time. Falls back to the\n // selected node, then the first node, so the tree is reachable on first Tab.\n const effectiveActive = activeId ?? selectedId ?? firstNodeId(nodes);\n\n const toggle = React.useCallback((id: string) => {\n setExpanded((curr) => {\n const next = new Set(curr);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const visibleItems = (): HTMLElement[] =>\n Array.from(rootRef.current?.querySelectorAll<HTMLElement>('[role=\"treeitem\"]') ?? []);\n\n const focusItem = (el: HTMLElement | undefined): void => {\n if (!el) return;\n setActiveId(el.dataset.treeId);\n el.focus();\n };\n\n // WAI-ARIA TreeView keyboard model. Focus lives on the treeitem element;\n // querySelectorAll returns items in DOM order, which equals visual order\n // (collapsed branches are not rendered, so they are not navigable).\n const handleKeyDown = (e: React.KeyboardEvent<HTMLUListElement>): void => {\n onKeyDown?.(e);\n const targetEl = (e.target as HTMLElement).closest<HTMLElement>('[role=\"treeitem\"]');\n if (!targetEl || !rootRef.current?.contains(targetEl)) return;\n const list = visibleItems();\n const idx = list.indexOf(targetEl);\n if (idx === -1) return;\n const id = targetEl.dataset.treeId;\n if (!id) return;\n const depth = Number(targetEl.dataset.depth ?? 0);\n const expandedAttr = targetEl.getAttribute('aria-expanded');\n const hasChildren = expandedAttr !== null;\n const isOpen = expandedAttr === 'true';\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusItem(list[Math.min(idx + 1, list.length - 1)]);\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusItem(list[Math.max(idx - 1, 0)]);\n break;\n case 'Home':\n e.preventDefault();\n focusItem(list[0]);\n break;\n case 'End':\n e.preventDefault();\n focusItem(list[list.length - 1]);\n break;\n case 'ArrowRight':\n e.preventDefault();\n if (hasChildren && !isOpen) toggle(id);\n else if (hasChildren && isOpen) focusItem(list[idx + 1]);\n break;\n case 'ArrowLeft':\n e.preventDefault();\n if (hasChildren && isOpen) {\n toggle(id);\n } else {\n for (let i = idx - 1; i >= 0; i--) {\n const candidate = list[i];\n if (candidate && Number(candidate.dataset.depth ?? 0) < depth) {\n focusItem(candidate);\n break;\n }\n }\n }\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n onSelect?.(id);\n break;\n default:\n break;\n }\n };\n\n return (\n <ul\n ref={rootRef}\n role=\"tree\"\n className={cx('tree', className)}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {nodes.map((n) => (\n <TreeNode\n key={n.id}\n node={n}\n depth={0}\n expanded={expanded}\n toggle={toggle}\n selectedId={selectedId}\n activeId={effectiveActive}\n onSelect={onSelect}\n onFocusItem={setActiveId}\n />\n ))}\n </ul>\n );\n}\n\ninterface TreeNodeProps {\n node: TreeNodeData;\n depth: number;\n expanded: Set<string>;\n toggle: (id: string) => void;\n selectedId?: string;\n activeId?: string;\n onSelect?: (id: string) => void;\n onFocusItem: (id: string) => void;\n}\n\nfunction TreeNode({\n node,\n depth,\n expanded,\n toggle,\n selectedId,\n activeId,\n onSelect,\n onFocusItem,\n}: TreeNodeProps) {\n const hasChildren = !!(node.children && node.children.length);\n const isOpen = expanded.has(node.id);\n const isSelected = selectedId === node.id;\n const isActive = activeId === node.id;\n return (\n <li role=\"none\" className=\"tree__node\">\n <div\n role=\"treeitem\"\n data-tree-id={node.id}\n data-depth={depth}\n aria-expanded={hasChildren ? isOpen : undefined}\n aria-selected={isSelected}\n tabIndex={isActive ? 0 : -1}\n className={cx('tree__row', isSelected && 'is-selected')}\n style={{ paddingLeft: `calc(var(--space-2) + var(--space-4) * ${depth})` }}\n onClick={() => {\n onFocusItem(node.id);\n onSelect?.(node.id);\n }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"tree__chev\"\n onClick={(e) => { e.stopPropagation(); toggle(node.id); }}\n >\n {isOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}\n </button>\n ) : (\n <span className=\"tree__chev tree__chev--placeholder\" aria-hidden=\"true\" />\n )}\n {node.icon && <span className=\"tree__icon\" aria-hidden=\"true\">{node.icon}</span>}\n <span className=\"tree__label\">{node.label}</span>\n {node.meta && <span className=\"tree__meta\">{node.meta}</span>}\n </div>\n {hasChildren && isOpen && (\n <ul role=\"group\" className=\"tree__children\">\n {node.children!.map((c) => (\n <TreeNode\n key={c.id}\n node={c}\n depth={depth + 1}\n expanded={expanded}\n toggle={toggle}\n selectedId={selectedId}\n activeId={activeId}\n onSelect={onSelect}\n onFocusItem={onFocusItem}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n// ---------- Calendar (vista mes completa, no picker) -------------------\nexport interface CalendarEvent {\n date: Date;\n label: React.ReactNode;\n tone?: StatusTone;\n onClick?: () => void;\n}\n\nexport interface CalendarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Mes a mostrar. Default: mes actual. */\n month?: Date;\n events?: CalendarEvent[];\n onMonthChange?: (m: Date) => void;\n onDayClick?: (d: Date) => void;\n}\n\nexport function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, className, ...rest }: CalendarProps) {\n const [internalMonth, setInternalMonth] = React.useState(() => startOfMonth(monthProp ?? new Date()));\n const month = monthProp ? startOfMonth(monthProp) : internalMonth;\n const t = useLocale();\n const weekdays = t['calendar.weekdays'];\n const months = t['calendar.months'];\n const setMonth = (m: Date) => {\n if (!monthProp) setInternalMonth(m);\n onMonthChange?.(m);\n };\n\n const today = new Date();\n\n // primer día visible: lunes anterior al primer día del mes\n const firstDay = startOfMonth(month);\n const firstWeekday = (firstDay.getDay() + 6) % 7; // domingo=0 → 6, lunes=1 → 0\n const gridStart = new Date(firstDay);\n gridStart.setDate(firstDay.getDate() - firstWeekday);\n\n const days: Date[] = Array.from({ length: 42 }, (_, i) => {\n const d = new Date(gridStart);\n d.setDate(gridStart.getDate() + i);\n return d;\n });\n\n const eventsByDay = React.useMemo(() => {\n const m = new Map<string, CalendarEvent[]>();\n for (const ev of events) {\n const key = `${ev.date.getFullYear()}-${ev.date.getMonth()}-${ev.date.getDate()}`;\n const list = m.get(key) ?? [];\n list.push(ev);\n m.set(key, list);\n }\n return m;\n }, [events]);\n\n return (\n <div className={cx('calendar', className)} {...rest}>\n <div className=\"calendar__head\">\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.prevMonth']} onClick={() => setMonth(addMonths(month, -1))}>\n <ChevronRight size={16} style={{ transform: 'rotate(180deg)' }} />\n </button>\n <div className=\"calendar__title\">{months[month.getMonth()]} {month.getFullYear()}</div>\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.nextMonth']} onClick={() => setMonth(addMonths(month, 1))}>\n <ChevronRight size={16} />\n </button>\n </div>\n <div className=\"calendar__grid calendar__weekdays\">\n {weekdays.map((w) => <div key={w} className=\"calendar__weekday\">{w}</div>)}\n </div>\n <div className=\"calendar__grid\">\n {days.map((d, i) => {\n const inMonth = d.getMonth() === month.getMonth();\n const isToday = isSameDay(d, today);\n const key = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = eventsByDay.get(key) ?? [];\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('calendar__day', !inMonth && 'is-out', isToday && 'is-today')}\n onClick={() => onDayClick?.(d)}\n >\n <span className=\"calendar__daynum\">{d.getDate()}</span>\n {dayEvents.length > 0 && (\n <div className=\"calendar__events\">\n {dayEvents.slice(0, 2).map((ev, idx) => (\n <span\n key={idx}\n className={cx('calendar__event', `calendar__event--${ev.tone ?? 'neutral'}`)}\n onClick={(e) => { e.stopPropagation(); ev.onClick?.(); }}\n >\n {ev.label}\n </span>\n ))}\n {dayEvents.length > 2 && <span className=\"calendar__more\">+{dayEvents.length - 2}</span>}\n </div>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Display3.tsx"],"names":["Timeline"],"mappings":"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","file":"chunk-4Z5GFOIU.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Avatar } from './Display2';\nimport { ChevronRight, ChevronDown } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { startOfMonth, addMonths, isSameDay } from '../utils/dateFormat';\n\n// ---------- UserCell ----------------------------------------------------\nexport interface UserCellProps extends React.HTMLAttributes<HTMLDivElement> {\n name: React.ReactNode;\n meta?: React.ReactNode; // role / email / etc.\n avatarSrc?: string;\n avatarAlt?: string;\n size?: 24 | 32 | 40 | 48;\n}\n\nexport function UserCell({ name, meta, avatarSrc, avatarAlt, size = 32, className, ...rest }: UserCellProps) {\n const initialsName = typeof name === 'string' ? name : undefined;\n return (\n <div className={cx('user-cell', className)} {...rest}>\n <Avatar src={avatarSrc} alt={avatarAlt} name={initialsName} size={size} />\n <div className=\"user-cell__body\">\n <div className=\"user-cell__name\">{name}</div>\n {meta && <div className=\"user-cell__meta\">{meta}</div>}\n </div>\n </div>\n );\n}\n\n// ---------- StatusIndicator (pulsing dot) ------------------------------\nexport type StatusTone = 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport interface StatusIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: StatusTone;\n pulse?: boolean;\n label?: React.ReactNode;\n}\n\nexport function StatusIndicator({ tone = 'success', pulse, label, className, ...rest }: StatusIndicatorProps) {\n return (\n <span className={cx('status-indicator', className)} role=\"status\" {...rest}>\n <span className={cx('status-indicator__dot', `status-indicator__dot--${tone}`, pulse && 'is-pulsing')} aria-hidden=\"true\" />\n {label && <span className=\"status-indicator__label\">{label}</span>}\n </span>\n );\n}\n\n// ---------- Timeline ----------------------------------------------------\nexport type TimelineDensity = 'default' | 'compact';\n\nexport interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {\n /**\n * Visual density (v1.28.0). `compact` shrinks the marker, gap and font\n * sizes for use in cards / list summaries; semantically identical.\n */\n density?: TimelineDensity;\n}\n\nexport const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(\n function Timeline({ className, density = 'default', ...rest }, ref) {\n return <ol ref={ref} className={cx('timeline', density === 'compact' && 'timeline--compact', className)} {...rest} />;\n }\n);\n\n/**\n * Progress state of a Timeline entry (v1.28.0), orthogonal to `tone`.\n * - `done` — completed: filled marker (in `tone` color), solid connector above.\n * - `current` — happening now: ringed/pulsing marker, solid connector above.\n * - `pending` — not started: hollow muted marker, **dashed** connector above.\n *\n * Use it to scan progress on a list of events that grow over time (a despachos\n * order accumulating envíos/retiros until the last marks it complete). Default\n * (state omitted) keeps the 1.x look exactly.\n */\nexport type TimelineState = 'done' | 'current' | 'pending';\n\n/**\n * Visual emphasis for the entry's marker (v1.30.0), orthogonal to `state` and\n * `tone`. Default markers are 24×24 hollow with a tone-colored border, ideal\n * for the operational events that fill a timeline. `milestone` upgrades the\n * marker to 32×32 filled in the `tone` color with a subtle halo — for the\n * \"anchor\" events that the rest of the timeline hangs from (e.g. \"Orden\n * creada\" at the top of an order detail). Without this the hollow markers of\n * the operational events out-shout the anchor, inverting the hierarchy.\n *\n * `milestone` keeps the `state` semantics: a `pending` milestone stays hollow\n * (muted, no halo), preserving \"not yet\" while still occupying the larger\n * anchor slot. A `current` milestone gets the pulse halo (overrides the\n * static one).\n */\nexport type TimelineVariant = 'default' | 'milestone';\n\nexport interface TimelineItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'title'> {\n icon?: React.ReactNode;\n tone?: StatusTone;\n title: React.ReactNode;\n meta?: React.ReactNode;\n /** Progress state (see {@link TimelineState}). Optional. */\n state?: TimelineState;\n /**\n * Trailing slot on the title row, aligned to the right (v1.28.0). Useful for\n * a Badge marking event type (envío / retiro / nota), a timestamp on the\n * right edge, or a small action chip.\n */\n right?: React.ReactNode;\n /** Visual emphasis (see {@link TimelineVariant}). Optional, default unchanged. */\n variant?: TimelineVariant;\n}\n\nexport function TimelineItem({ icon, tone = 'neutral', title, meta, children, state, right, variant, className, ...rest }: TimelineItemProps) {\n return (\n <li\n className={cx(\n 'timeline__item',\n state && `timeline__item--${state}`,\n variant === 'milestone' && 'timeline__item--milestone',\n className,\n )}\n data-state={state}\n {...rest}\n >\n <span\n className={cx(\n 'timeline__marker',\n `timeline__marker--${tone}`,\n variant === 'milestone' && 'timeline__marker--milestone',\n )}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n <div className=\"timeline__body\">\n {right != null ? (\n // Title row wrapper only renders when there's a trailing slot, so\n // the DOM stays byte-identical for existing consumers (back-compat).\n <div className=\"timeline__title-row\">\n <div className=\"timeline__title\">{title}</div>\n <div className=\"timeline__right\">{right}</div>\n </div>\n ) : (\n <div className=\"timeline__title\">{title}</div>\n )}\n {meta && <div className=\"timeline__meta\">{meta}</div>}\n {children && <div className=\"timeline__content\">{children}</div>}\n </div>\n </li>\n );\n}\n\n// ---------- Tree --------------------------------------------------------\nexport interface TreeNodeData {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n children?: TreeNodeData[];\n meta?: React.ReactNode;\n}\n\nexport interface TreeProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n nodes: TreeNodeData[];\n defaultExpanded?: string[];\n selectedId?: string;\n onSelect?: (id: string) => void;\n}\n\nfunction firstNodeId(nodes: TreeNodeData[]): string | undefined {\n return nodes[0]?.id;\n}\n\nexport function Tree({\n nodes,\n defaultExpanded = [],\n selectedId,\n onSelect,\n className,\n onKeyDown,\n ...rest\n}: TreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(new Set(defaultExpanded));\n const [activeId, setActiveId] = React.useState<string | undefined>(undefined);\n const rootRef = React.useRef<HTMLUListElement>(null);\n\n // Roving tabindex: one treeitem is tabbable at a time. Falls back to the\n // selected node, then the first node, so the tree is reachable on first Tab.\n const effectiveActive = activeId ?? selectedId ?? firstNodeId(nodes);\n\n const toggle = React.useCallback((id: string) => {\n setExpanded((curr) => {\n const next = new Set(curr);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const visibleItems = (): HTMLElement[] =>\n Array.from(rootRef.current?.querySelectorAll<HTMLElement>('[role=\"treeitem\"]') ?? []);\n\n const focusItem = (el: HTMLElement | undefined): void => {\n if (!el) return;\n setActiveId(el.dataset.treeId);\n el.focus();\n };\n\n // WAI-ARIA TreeView keyboard model. Focus lives on the treeitem element;\n // querySelectorAll returns items in DOM order, which equals visual order\n // (collapsed branches are not rendered, so they are not navigable).\n const handleKeyDown = (e: React.KeyboardEvent<HTMLUListElement>): void => {\n onKeyDown?.(e);\n const targetEl = (e.target as HTMLElement).closest<HTMLElement>('[role=\"treeitem\"]');\n if (!targetEl || !rootRef.current?.contains(targetEl)) return;\n const list = visibleItems();\n const idx = list.indexOf(targetEl);\n if (idx === -1) return;\n const id = targetEl.dataset.treeId;\n if (!id) return;\n const depth = Number(targetEl.dataset.depth ?? 0);\n const expandedAttr = targetEl.getAttribute('aria-expanded');\n const hasChildren = expandedAttr !== null;\n const isOpen = expandedAttr === 'true';\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusItem(list[Math.min(idx + 1, list.length - 1)]);\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusItem(list[Math.max(idx - 1, 0)]);\n break;\n case 'Home':\n e.preventDefault();\n focusItem(list[0]);\n break;\n case 'End':\n e.preventDefault();\n focusItem(list[list.length - 1]);\n break;\n case 'ArrowRight':\n e.preventDefault();\n if (hasChildren && !isOpen) toggle(id);\n else if (hasChildren && isOpen) focusItem(list[idx + 1]);\n break;\n case 'ArrowLeft':\n e.preventDefault();\n if (hasChildren && isOpen) {\n toggle(id);\n } else {\n for (let i = idx - 1; i >= 0; i--) {\n const candidate = list[i];\n if (candidate && Number(candidate.dataset.depth ?? 0) < depth) {\n focusItem(candidate);\n break;\n }\n }\n }\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n onSelect?.(id);\n break;\n default:\n break;\n }\n };\n\n return (\n <ul\n ref={rootRef}\n role=\"tree\"\n className={cx('tree', className)}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {nodes.map((n) => (\n <TreeNode\n key={n.id}\n node={n}\n depth={0}\n expanded={expanded}\n toggle={toggle}\n selectedId={selectedId}\n activeId={effectiveActive}\n onSelect={onSelect}\n onFocusItem={setActiveId}\n />\n ))}\n </ul>\n );\n}\n\ninterface TreeNodeProps {\n node: TreeNodeData;\n depth: number;\n expanded: Set<string>;\n toggle: (id: string) => void;\n selectedId?: string;\n activeId?: string;\n onSelect?: (id: string) => void;\n onFocusItem: (id: string) => void;\n}\n\nfunction TreeNode({\n node,\n depth,\n expanded,\n toggle,\n selectedId,\n activeId,\n onSelect,\n onFocusItem,\n}: TreeNodeProps) {\n const hasChildren = !!(node.children && node.children.length);\n const isOpen = expanded.has(node.id);\n const isSelected = selectedId === node.id;\n const isActive = activeId === node.id;\n return (\n <li role=\"none\" className=\"tree__node\">\n <div\n role=\"treeitem\"\n data-tree-id={node.id}\n data-depth={depth}\n aria-expanded={hasChildren ? isOpen : undefined}\n aria-selected={isSelected}\n tabIndex={isActive ? 0 : -1}\n className={cx('tree__row', isSelected && 'is-selected')}\n style={{ paddingLeft: `calc(var(--space-2) + var(--space-4) * ${depth})` }}\n onClick={() => {\n onFocusItem(node.id);\n onSelect?.(node.id);\n }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"tree__chev\"\n onClick={(e) => { e.stopPropagation(); toggle(node.id); }}\n >\n {isOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}\n </button>\n ) : (\n <span className=\"tree__chev tree__chev--placeholder\" aria-hidden=\"true\" />\n )}\n {node.icon && <span className=\"tree__icon\" aria-hidden=\"true\">{node.icon}</span>}\n <span className=\"tree__label\">{node.label}</span>\n {node.meta && <span className=\"tree__meta\">{node.meta}</span>}\n </div>\n {hasChildren && isOpen && (\n <ul role=\"group\" className=\"tree__children\">\n {node.children!.map((c) => (\n <TreeNode\n key={c.id}\n node={c}\n depth={depth + 1}\n expanded={expanded}\n toggle={toggle}\n selectedId={selectedId}\n activeId={activeId}\n onSelect={onSelect}\n onFocusItem={onFocusItem}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n// ---------- Calendar (vista mes completa, no picker) -------------------\nexport interface CalendarEvent {\n date: Date;\n label: React.ReactNode;\n tone?: StatusTone;\n onClick?: () => void;\n}\n\nexport interface CalendarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Mes a mostrar. Default: mes actual. */\n month?: Date;\n events?: CalendarEvent[];\n onMonthChange?: (m: Date) => void;\n onDayClick?: (d: Date) => void;\n}\n\nexport function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, className, ...rest }: CalendarProps) {\n const [internalMonth, setInternalMonth] = React.useState(() => startOfMonth(monthProp ?? new Date()));\n const month = monthProp ? startOfMonth(monthProp) : internalMonth;\n const t = useLocale();\n const weekdays = t['calendar.weekdays'];\n const months = t['calendar.months'];\n const setMonth = (m: Date) => {\n if (!monthProp) setInternalMonth(m);\n onMonthChange?.(m);\n };\n\n const today = new Date();\n\n // primer día visible: lunes anterior al primer día del mes\n const firstDay = startOfMonth(month);\n const firstWeekday = (firstDay.getDay() + 6) % 7; // domingo=0 → 6, lunes=1 → 0\n const gridStart = new Date(firstDay);\n gridStart.setDate(firstDay.getDate() - firstWeekday);\n\n const days: Date[] = Array.from({ length: 42 }, (_, i) => {\n const d = new Date(gridStart);\n d.setDate(gridStart.getDate() + i);\n return d;\n });\n\n const eventsByDay = React.useMemo(() => {\n const m = new Map<string, CalendarEvent[]>();\n for (const ev of events) {\n const key = `${ev.date.getFullYear()}-${ev.date.getMonth()}-${ev.date.getDate()}`;\n const list = m.get(key) ?? [];\n list.push(ev);\n m.set(key, list);\n }\n return m;\n }, [events]);\n\n return (\n <div className={cx('calendar', className)} {...rest}>\n <div className=\"calendar__head\">\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.prevMonth']} onClick={() => setMonth(addMonths(month, -1))}>\n <ChevronRight size={16} style={{ transform: 'rotate(180deg)' }} />\n </button>\n <div className=\"calendar__title\">{months[month.getMonth()]} {month.getFullYear()}</div>\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.nextMonth']} onClick={() => setMonth(addMonths(month, 1))}>\n <ChevronRight size={16} />\n </button>\n </div>\n <div className=\"calendar__grid calendar__weekdays\">\n {weekdays.map((w) => <div key={w} className=\"calendar__weekday\">{w}</div>)}\n </div>\n <div className=\"calendar__grid\">\n {days.map((d, i) => {\n const inMonth = d.getMonth() === month.getMonth();\n const isToday = isSameDay(d, today);\n const key = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = eventsByDay.get(key) ?? [];\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('calendar__day', !inMonth && 'is-out', isToday && 'is-today')}\n onClick={() => onDayClick?.(d)}\n >\n <span className=\"calendar__daynum\">{d.getDate()}</span>\n {dayEvents.length > 0 && (\n <div className=\"calendar__events\">\n {dayEvents.slice(0, 2).map((ev, idx) => (\n <span\n key={idx}\n className={cx('calendar__event', `calendar__event--${ev.tone ?? 'neutral'}`)}\n onClick={(e) => { e.stopPropagation(); ev.onClick?.(); }}\n >\n {ev.label}\n </span>\n ))}\n {dayEvents.length > 2 && <span className=\"calendar__more\">+{dayEvents.length - 2}</span>}\n </div>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"]}