@misael703/ui 1.1.0 → 1.2.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 (41) hide show
  1. package/dist/chunk-IMHLJKYR.mjs +176 -0
  2. package/dist/chunk-IMHLJKYR.mjs.map +1 -0
  3. package/dist/{chunk-Y6CBRW2S.js → chunk-K5S3SV2U.js} +51 -52
  4. package/dist/chunk-K5S3SV2U.js.map +1 -0
  5. package/dist/chunk-N2Y2KWX5.mjs +216 -0
  6. package/dist/chunk-N2Y2KWX5.mjs.map +1 -0
  7. package/dist/{chunk-HU7RYXQK.js → chunk-N7LFCAAY.js} +59 -63
  8. package/dist/chunk-N7LFCAAY.js.map +1 -0
  9. package/dist/{chunk-MPGASTSK.mjs → chunk-OHCS5CYV.mjs} +51 -52
  10. package/dist/chunk-OHCS5CYV.mjs.map +1 -0
  11. package/dist/chunk-V7MK42GX.js +238 -0
  12. package/dist/chunk-V7MK42GX.js.map +1 -0
  13. package/dist/chunk-VR4OXVKE.js +198 -0
  14. package/dist/chunk-VR4OXVKE.js.map +1 -0
  15. package/dist/{chunk-QCVIN2ET.mjs → chunk-YFLVB62R.mjs} +59 -63
  16. package/dist/chunk-YFLVB62R.mjs.map +1 -0
  17. package/dist/components/AdvancedPickers.js +5 -5
  18. package/dist/components/AdvancedPickers.mjs +1 -1
  19. package/dist/components/Menubar.js +5 -2
  20. package/dist/components/Menubar.mjs +4 -1
  21. package/dist/components/NavigationMenu.js +5 -2
  22. package/dist/components/NavigationMenu.mjs +4 -1
  23. package/dist/components/Pickers.js +4 -4
  24. package/dist/components/Pickers.mjs +1 -1
  25. package/dist/index.js +13 -13
  26. package/dist/index.mjs +4 -4
  27. package/dist/styles.css +1 -1
  28. package/dist/tokens.css +1 -1
  29. package/package.json +1 -1
  30. package/dist/chunk-HU7RYXQK.js.map +0 -1
  31. package/dist/chunk-JDOXRLZW.js +0 -138
  32. package/dist/chunk-JDOXRLZW.js.map +0 -1
  33. package/dist/chunk-MPGASTSK.mjs.map +0 -1
  34. package/dist/chunk-OCE4ODTM.mjs +0 -116
  35. package/dist/chunk-OCE4ODTM.mjs.map +0 -1
  36. package/dist/chunk-QCVIN2ET.mjs.map +0 -1
  37. package/dist/chunk-QI6TVWWF.js +0 -121
  38. package/dist/chunk-QI6TVWWF.js.map +0 -1
  39. package/dist/chunk-Y6CBRW2S.js.map +0 -1
  40. package/dist/chunk-YBOTLQ3G.mjs +0 -99
  41. package/dist/chunk-YBOTLQ3G.mjs.map +0 -1
@@ -0,0 +1,176 @@
1
+ import { useDismiss } from './chunk-6P2TKRTL.mjs';
2
+ import { usePopoverPosition } from './chunk-H3PRT76O.mjs';
3
+ import { Portal } from './chunk-QX5GGPV5.mjs';
4
+ import { ChevronDown } from './chunk-CIBJKJV3.mjs';
5
+ import { cx } from './chunk-IEPCH3JB.mjs';
6
+ import * as React from 'react';
7
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
+
9
+ function NavigationMenu({ items, className, ariaLabel = "Navegaci\xF3n principal", linkAs, rootLinkAs }) {
10
+ const [openId, setOpenId] = React.useState(null);
11
+ const focusOnOpen = React.useRef(false);
12
+ const rootRef = React.useRef(null);
13
+ const panelRef = React.useRef(null);
14
+ const anchorRef = React.useRef(null);
15
+ const triggerRefs = React.useRef({});
16
+ const open = openId !== null;
17
+ const pos = usePopoverPosition(anchorRef, panelRef, {
18
+ open,
19
+ side: "bottom",
20
+ align: "start",
21
+ offset: 8
22
+ });
23
+ useDismiss({
24
+ open,
25
+ onDismiss: () => setOpenId(null),
26
+ refs: [rootRef, panelRef],
27
+ closeOnEscape: false
28
+ });
29
+ const closeAndFocusTrigger = () => {
30
+ const id = openId;
31
+ setOpenId(null);
32
+ if (id) triggerRefs.current[id]?.focus();
33
+ };
34
+ const panelLinks = () => Array.from(panelRef.current?.querySelectorAll(".nav-menu__link") ?? []);
35
+ const focusLinkAt = (index) => {
36
+ const links = panelLinks();
37
+ if (links.length === 0) return;
38
+ const wrapped = (index % links.length + links.length) % links.length;
39
+ links[wrapped]?.focus();
40
+ };
41
+ React.useEffect(() => {
42
+ if (open && focusOnOpen.current) {
43
+ focusOnOpen.current = false;
44
+ focusLinkAt(0);
45
+ }
46
+ }, [open]);
47
+ const onPanelKeyDown = (e) => {
48
+ const links = panelLinks();
49
+ const current = links.indexOf(document.activeElement);
50
+ if (e.key === "Escape") {
51
+ e.preventDefault();
52
+ closeAndFocusTrigger();
53
+ } else if (e.key === "Tab") {
54
+ setOpenId(null);
55
+ } else if (e.key === "ArrowDown") {
56
+ e.preventDefault();
57
+ focusLinkAt(current + 1);
58
+ } else if (e.key === "ArrowUp") {
59
+ e.preventDefault();
60
+ focusLinkAt(current - 1);
61
+ } else if (e.key === "Home") {
62
+ e.preventDefault();
63
+ focusLinkAt(0);
64
+ } else if (e.key === "End") {
65
+ e.preventDefault();
66
+ focusLinkAt(links.length - 1);
67
+ }
68
+ };
69
+ return /* @__PURE__ */ jsx("nav", { ref: rootRef, "aria-label": ariaLabel, className: cx("nav-menu", className), children: /* @__PURE__ */ jsx("ul", { className: "nav-menu__list", children: items.map((item) => {
70
+ const hasChildren = !!item.links?.length;
71
+ const isOpen = openId === item.id;
72
+ const triggerCls = cx("nav-menu__trigger", isOpen && "is-open");
73
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
74
+ /* @__PURE__ */ jsx("span", { children: item.label }),
75
+ hasChildren && /* @__PURE__ */ jsx(ChevronDown, { size: 14, className: "nav-menu__chevron" })
76
+ ] });
77
+ return /* @__PURE__ */ jsxs("li", { className: "nav-menu__item", children: [
78
+ hasChildren ? /* @__PURE__ */ jsx(
79
+ "button",
80
+ {
81
+ type: "button",
82
+ ref: (el) => {
83
+ triggerRefs.current[item.id] = el;
84
+ },
85
+ className: triggerCls,
86
+ "aria-expanded": isOpen,
87
+ "aria-haspopup": "menu",
88
+ onClick: (e) => {
89
+ if (isOpen) {
90
+ setOpenId(null);
91
+ return;
92
+ }
93
+ anchorRef.current = e.currentTarget;
94
+ focusOnOpen.current = false;
95
+ setOpenId(item.id);
96
+ },
97
+ onMouseEnter: (e) => {
98
+ if (!openId) return;
99
+ anchorRef.current = e.currentTarget;
100
+ focusOnOpen.current = false;
101
+ setOpenId(item.id);
102
+ },
103
+ onKeyDown: (e) => {
104
+ if (e.key === "ArrowDown" || e.key === "Enter" || e.key === " ") {
105
+ e.preventDefault();
106
+ if (isOpen) {
107
+ focusLinkAt(0);
108
+ return;
109
+ }
110
+ anchorRef.current = e.currentTarget;
111
+ focusOnOpen.current = true;
112
+ setOpenId(item.id);
113
+ } else if (e.key === "Escape" && isOpen) {
114
+ e.preventDefault();
115
+ setOpenId(null);
116
+ }
117
+ },
118
+ children: content
119
+ }
120
+ ) : rootLinkAs && item.href ? rootLinkAs(item, content, triggerCls) : /* @__PURE__ */ jsx("a", { className: triggerCls, href: item.href, children: content }),
121
+ hasChildren && isOpen && /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsxs(
122
+ "div",
123
+ {
124
+ ref: panelRef,
125
+ className: "nav-menu__panel",
126
+ role: "menu",
127
+ "aria-label": typeof item.label === "string" ? item.label : void 0,
128
+ onKeyDown: onPanelKeyDown,
129
+ style: {
130
+ position: "absolute",
131
+ top: pos.top,
132
+ left: pos.left,
133
+ visibility: pos.ready ? "visible" : "hidden"
134
+ },
135
+ children: [
136
+ item.featured && /* @__PURE__ */ jsxs("div", { className: "nav-menu__featured", children: [
137
+ /* @__PURE__ */ jsx("strong", { children: item.featured.label }),
138
+ item.featured.description && /* @__PURE__ */ jsx("p", { children: item.featured.description })
139
+ ] }),
140
+ /* @__PURE__ */ jsx("ul", { className: "nav-menu__sublist", children: item.links.map((link) => {
141
+ const linkCls = "nav-menu__link";
142
+ const linkContent = /* @__PURE__ */ jsxs(Fragment, { children: [
143
+ link.icon && /* @__PURE__ */ jsx("span", { className: "nav-menu__link-icon", children: link.icon }),
144
+ /* @__PURE__ */ jsxs("span", { className: "nav-menu__link-body", children: [
145
+ /* @__PURE__ */ jsx("span", { className: "nav-menu__link-label", children: link.label }),
146
+ link.description && /* @__PURE__ */ jsx("span", { className: "nav-menu__link-desc", children: link.description })
147
+ ] })
148
+ ] });
149
+ return /* @__PURE__ */ jsx("li", { role: "none", children: linkAs ? linkAs(link, linkContent, linkCls) : /* @__PURE__ */ jsx(
150
+ "a",
151
+ {
152
+ role: "menuitem",
153
+ tabIndex: -1,
154
+ className: linkCls,
155
+ href: link.href,
156
+ onClick: (e) => {
157
+ if (link.onClick) {
158
+ e.preventDefault();
159
+ link.onClick();
160
+ }
161
+ closeAndFocusTrigger();
162
+ },
163
+ children: linkContent
164
+ }
165
+ ) }, link.id);
166
+ }) })
167
+ ]
168
+ }
169
+ ) })
170
+ ] }, item.id);
171
+ }) }) });
172
+ }
173
+
174
+ export { NavigationMenu };
175
+ //# sourceMappingURL=chunk-IMHLJKYR.mjs.map
176
+ //# sourceMappingURL=chunk-IMHLJKYR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/NavigationMenu.tsx"],"names":[],"mappings":"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","file":"chunk-IMHLJKYR.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronDown } from './Icons';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\nexport interface NavLink {\n id: string;\n label: React.ReactNode;\n href?: string;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface NavMenuItem {\n id: string;\n label: React.ReactNode;\n href?: string;\n links?: NavLink[];\n featured?: NavLink;\n}\n\nexport interface NavigationMenuProps {\n items: NavMenuItem[];\n className?: string;\n ariaLabel?: string;\n linkAs?: (link: NavLink, content: React.ReactNode, className: string) => React.ReactNode;\n rootLinkAs?: (item: NavMenuItem, content: React.ReactNode, className: string) => React.ReactNode;\n}\n\nexport function NavigationMenu({ items, className, ariaLabel = 'Navegación principal', linkAs, rootLinkAs }: NavigationMenuProps) {\n const [openId, setOpenId] = React.useState<string | null>(null);\n // When the panel was opened by keyboard we move focus into it; pointer\n // (click/hover) opens leave focus with the user's cursor.\n const focusOnOpen = React.useRef(false);\n const rootRef = React.useRef<HTMLElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n // The currently-open trigger; usePopoverPosition anchors to this and\n // focus returns here on close. One panel is open at a time, so a single\n // anchor ref is correct (see todo.md risk note).\n const anchorRef = React.useRef<HTMLElement | null>(null);\n const triggerRefs = React.useRef<Record<string, HTMLButtonElement | null>>({});\n\n const open = openId !== null;\n\n const pos = usePopoverPosition(anchorRef, panelRef, {\n open,\n side: 'bottom',\n align: 'start',\n offset: 8,\n });\n\n // Outside-click closes; Escape is handled on the panel so it can also\n // return focus to the trigger (WAI-ARIA disclosure/menu pattern).\n useDismiss({\n open,\n onDismiss: () => setOpenId(null),\n refs: [rootRef, panelRef],\n closeOnEscape: false,\n });\n\n const closeAndFocusTrigger = () => {\n const id = openId;\n setOpenId(null);\n if (id) triggerRefs.current[id]?.focus();\n };\n\n // `.nav-menu__link` is applied to every link node (default <a> and the\n // `linkAs` render-prop alike), so querying by class manages focus\n // uniformly regardless of how the consumer renders links.\n const panelLinks = (): HTMLElement[] =>\n Array.from(panelRef.current?.querySelectorAll<HTMLElement>('.nav-menu__link') ?? []);\n\n const focusLinkAt = (index: number) => {\n const links = panelLinks();\n if (links.length === 0) return;\n const wrapped = ((index % links.length) + links.length) % links.length;\n links[wrapped]?.focus();\n };\n\n React.useEffect(() => {\n if (open && focusOnOpen.current) {\n focusOnOpen.current = false;\n focusLinkAt(0);\n }\n }, [open]);\n\n const onPanelKeyDown = (e: React.KeyboardEvent) => {\n const links = panelLinks();\n const current = links.indexOf(document.activeElement as HTMLElement);\n if (e.key === 'Escape') {\n e.preventDefault();\n closeAndFocusTrigger();\n } else if (e.key === 'Tab') {\n setOpenId(null);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n focusLinkAt(current + 1);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n focusLinkAt(current - 1);\n } else if (e.key === 'Home') {\n e.preventDefault();\n focusLinkAt(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n focusLinkAt(links.length - 1);\n }\n };\n\n return (\n <nav ref={rootRef} aria-label={ariaLabel} className={cx('nav-menu', className)}>\n <ul className=\"nav-menu__list\">\n {items.map((item) => {\n const hasChildren = !!item.links?.length;\n const isOpen = openId === item.id;\n const triggerCls = cx('nav-menu__trigger', isOpen && 'is-open');\n const content = (\n <>\n <span>{item.label}</span>\n {hasChildren && <ChevronDown size={14} className=\"nav-menu__chevron\" />}\n </>\n );\n\n return (\n <li key={item.id} className=\"nav-menu__item\">\n {hasChildren ? (\n <button\n type=\"button\"\n ref={(el) => { triggerRefs.current[item.id] = el; }}\n className={triggerCls}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n onClick={(e) => {\n if (isOpen) { setOpenId(null); return; }\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setOpenId(item.id);\n }}\n onMouseEnter={(e) => {\n if (!openId) return;\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = false;\n setOpenId(item.id);\n }}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (isOpen) { focusLinkAt(0); return; }\n anchorRef.current = e.currentTarget;\n focusOnOpen.current = true;\n setOpenId(item.id);\n } else if (e.key === 'Escape' && isOpen) {\n e.preventDefault();\n setOpenId(null);\n }\n }}\n >\n {content}\n </button>\n ) : rootLinkAs && item.href ? (\n rootLinkAs(item, content, triggerCls)\n ) : (\n <a className={triggerCls} href={item.href}>\n {content}\n </a>\n )}\n {hasChildren && isOpen && (\n <Portal>\n <div\n ref={panelRef}\n className=\"nav-menu__panel\"\n role=\"menu\"\n aria-label={typeof item.label === 'string' ? item.label : undefined}\n onKeyDown={onPanelKeyDown}\n style={{\n position: 'absolute',\n top: pos.top,\n left: pos.left,\n visibility: pos.ready ? 'visible' : 'hidden',\n }}\n >\n {item.featured && (\n <div className=\"nav-menu__featured\">\n <strong>{item.featured.label}</strong>\n {item.featured.description && <p>{item.featured.description}</p>}\n </div>\n )}\n <ul className=\"nav-menu__sublist\">\n {item.links!.map((link) => {\n const linkCls = 'nav-menu__link';\n const linkContent = (\n <>\n {link.icon && <span className=\"nav-menu__link-icon\">{link.icon}</span>}\n <span className=\"nav-menu__link-body\">\n <span className=\"nav-menu__link-label\">{link.label}</span>\n {link.description && <span className=\"nav-menu__link-desc\">{link.description}</span>}\n </span>\n </>\n );\n return (\n <li key={link.id} role=\"none\">\n {linkAs ? (\n linkAs(link, linkContent, linkCls)\n ) : (\n <a\n role=\"menuitem\"\n tabIndex={-1}\n className={linkCls}\n href={link.href}\n onClick={(e) => {\n if (link.onClick) {\n e.preventDefault();\n link.onClick();\n }\n closeAndFocusTrigger();\n }}\n >\n {linkContent}\n </a>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </Portal>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n"]}
@@ -9,7 +9,6 @@ var chunkTEQ67JKX_js = require('./chunk-TEQ67JKX.js');
9
9
  var chunkRQOTH7I7_js = require('./chunk-RQOTH7I7.js');
10
10
  var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
11
11
  var React = require('react');
12
- var reactDom = require('react-dom');
13
12
  var jsxRuntime = require('react/jsx-runtime');
14
13
 
15
14
  function _interopNamespace(e) {
@@ -222,22 +221,19 @@ function DateRangePicker({
222
221
  const [hover, setHover] = React__namespace.useState(null);
223
222
  const wrapRef = React__namespace.useRef(null);
224
223
  const popoverRef = React__namespace.useRef(null);
225
- const [coords, setCoords] = React__namespace.useState(null);
226
- React__namespace.useEffect(() => {
227
- const onClick = (e) => {
228
- const target = e.target;
229
- if (wrapRef.current?.contains(target)) return;
230
- if (popoverRef.current?.contains(target)) return;
231
- setOpen(false);
232
- };
233
- document.addEventListener("mousedown", onClick);
234
- return () => document.removeEventListener("mousedown", onClick);
235
- }, []);
236
- React__namespace.useEffect(() => {
237
- if (!open || !wrapRef.current) return;
238
- const t = wrapRef.current.getBoundingClientRect();
239
- setCoords({ top: t.bottom + 6 + window.scrollY, left: t.left + window.scrollX });
240
- }, [open]);
224
+ const triggerRef = React__namespace.useRef(null);
225
+ const pos = chunkDPMUWQHL_js.usePopoverPosition(wrapRef, popoverRef, {
226
+ open,
227
+ side: "bottom",
228
+ align: "start",
229
+ offset: 6
230
+ });
231
+ chunkXMLBKK7X_js.useDismiss({
232
+ open,
233
+ onDismiss: () => setOpen(false),
234
+ refs: [wrapRef, popoverRef],
235
+ returnFocusRef: triggerRef
236
+ });
241
237
  const monthGrid0 = React__namespace.useMemo(() => buildMonthGrid(view, 0), [view]);
242
238
  const monthGrid1 = React__namespace.useMemo(() => buildMonthGrid(view, 1), [view]);
243
239
  const isDisabled = (d) => minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()) || maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());
@@ -295,6 +291,7 @@ function DateRangePicker({
295
291
  /* @__PURE__ */ jsxRuntime.jsxs(
296
292
  "button",
297
293
  {
294
+ ref: triggerRef,
298
295
  id,
299
296
  type: "button",
300
297
  className: "daterange__trigger",
@@ -308,40 +305,42 @@ function DateRangePicker({
308
305
  ]
309
306
  }
310
307
  ),
311
- open && typeof document !== "undefined" && reactDom.createPortal(
312
- /* @__PURE__ */ jsxRuntime.jsxs(
313
- "div",
314
- {
315
- ref: popoverRef,
316
- className: "daterange__popover",
317
- role: "dialog",
318
- onMouseLeave: () => setHover(null),
319
- style: coords ? { position: "absolute", top: coords.top, left: coords.left } : { position: "absolute", visibility: "hidden" },
320
- children: [
321
- 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: () => {
322
- onChange(p.range());
323
- setOpen(false);
324
- }, children: p.label }) }, i)) }),
325
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__panes", children: [
326
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__nav", children: [
327
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => addMonths(v, -1)), "aria-label": locale["calendar.prevMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronLeft, { size: 16 }) }),
328
- /* @__PURE__ */ jsxRuntime.jsx("span", {}),
329
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => addMonths(v, 1)), "aria-label": locale["calendar.nextMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronRight, { size: 16 }) })
330
- ] }),
331
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__months", children: [
332
- renderMonth(0),
333
- renderMonth(1)
334
- ] }),
335
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__actions", children: [
336
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "daterange__clear", onClick: () => onChange({ from: null, to: null }), children: locale["common.clear"] }),
337
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "daterange__apply", onClick: () => setOpen(false), disabled: !value.from || !value.to, children: locale["common.apply"] })
338
- ] })
308
+ open && /* @__PURE__ */ jsxRuntime.jsx(chunkGLYGO7WX_js.Portal, { children: /* @__PURE__ */ jsxRuntime.jsxs(
309
+ "div",
310
+ {
311
+ ref: popoverRef,
312
+ className: chunkPASF6T4H_js.cx("daterange__popover", "is-floating"),
313
+ role: "dialog",
314
+ onMouseLeave: () => setHover(null),
315
+ style: {
316
+ position: "absolute",
317
+ top: pos.top,
318
+ left: pos.left,
319
+ visibility: pos.ready ? "visible" : "hidden"
320
+ },
321
+ children: [
322
+ 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: () => {
323
+ onChange(p.range());
324
+ setOpen(false);
325
+ }, children: p.label }) }, i)) }),
326
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__panes", children: [
327
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__nav", children: [
328
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => addMonths(v, -1)), "aria-label": locale["calendar.prevMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronLeft, { size: 16 }) }),
329
+ /* @__PURE__ */ jsxRuntime.jsx("span", {}),
330
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: () => setView((v) => addMonths(v, 1)), "aria-label": locale["calendar.nextMonth"], children: /* @__PURE__ */ jsxRuntime.jsx(chunkRQOTH7I7_js.ChevronRight, { size: 16 }) })
331
+ ] }),
332
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__months", children: [
333
+ renderMonth(0),
334
+ renderMonth(1)
335
+ ] }),
336
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "daterange__actions", children: [
337
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "daterange__clear", onClick: () => onChange({ from: null, to: null }), children: locale["common.clear"] }),
338
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "daterange__apply", onClick: () => setOpen(false), disabled: !value.from || !value.to, children: locale["common.apply"] })
339
339
  ] })
340
- ]
341
- }
342
- ),
343
- document.body
344
- )
340
+ ] })
341
+ ]
342
+ }
343
+ ) })
345
344
  ] });
346
345
  }
347
346
  function matchesHotkey(e, hk) {
@@ -504,5 +503,5 @@ exports.CommandPalette = CommandPalette;
504
503
  exports.DateRangePicker = DateRangePicker;
505
504
  exports.MultiCombobox = MultiCombobox;
506
505
  exports.useCommandPalette = useCommandPalette;
507
- //# sourceMappingURL=chunk-Y6CBRW2S.js.map
508
- //# sourceMappingURL=chunk-Y6CBRW2S.js.map
506
+ //# sourceMappingURL=chunk-K5S3SV2U.js.map
507
+ //# sourceMappingURL=chunk-K5S3SV2U.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","formatDate","CalendarIcon","ChevronLeft","ChevronRight","Search"],"mappings":"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","file":"chunk-K5S3SV2U.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { CalendarIcon, ChevronLeft, ChevronRight, X, Check, Search } from './Icons';\nimport { resolveDateFormat, formatDate, 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: 'absolute',\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 --------------------------------------------\nfunction startOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth(), 1); }\nfunction addMonths(d: Date, n: number) { return new Date(d.getFullYear(), d.getMonth() + n, 1); }\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\nfunction buildMonthGrid(view: Date, offset: number) {\n const m = addMonths(view, offset);\n const startDow = (m.getDay() + 6) % 7;\n const days = new Date(m.getFullYear(), m.getMonth() + 1, 0).getDate();\n const cells: (Date | null)[] = [];\n for (let i = 0; i < startDow; i++) cells.push(null);\n for (let d = 1; d <= days; d++) cells.push(new Date(m.getFullYear(), m.getMonth(), d));\n return { m, cells };\n}\nexport interface DateRange { from: Date | null; to: Date | null }\n\nexport interface DateRangePickerProps {\n value: DateRange;\n onChange: (v: DateRange) => void;\n minDate?: Date;\n maxDate?: Date;\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\nexport function DateRangePicker({\n value, onChange, minDate, maxDate, presets,\n invalid, disabled, className, id, format = 'auto',\n}: DateRangePickerProps) {\n const locale = useLocale();\n const weekdays = locale['picker.weekdaysShort'];\n const months = locale['calendar.months'];\n const fmt = resolveDateFormat(format);\n const [open, setOpen] = React.useState(false);\n const [view, setView] = React.useState(() => startOfMonth(value.from ?? new Date()));\n const [hover, setHover] = React.useState<Date | null>(null);\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 useDismiss({\n open,\n onDismiss: () => setOpen(false),\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(() => buildMonthGrid(view, 0), [view]);\n const monthGrid1 = React.useMemo(() => buildMonthGrid(view, 1), [view]);\n\n const isDisabled = (d: Date) =>\n (minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) ||\n (maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()));\n\n const inRange = (d: Date) => {\n if (!value.from) return false;\n const end = value.to ?? hover;\n if (!end) return isSameDay(d, value.from);\n const a = value.from < end ? value.from : end;\n const b = value.from < end ? end : value.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 const click = (d: Date) => {\n if (!value.from || (value.from && value.to)) {\n onChange({ from: d, to: null });\n } else {\n const from = value.from;\n if (d < from) onChange({ from: d, to: from });\n else onChange({ from, to: d });\n }\n };\n\n const label = value.from\n ? value.to\n ? `${formatDate(value.from, fmt)} → ${formatDate(value.to, fmt)}`\n : `${formatDate(value.from, fmt)} → …`\n : locale['picker.selectRange'];\n\n const renderMonth = (offset: number) => {\n const { m, cells } = offset === 0 ? monthGrid0 : monthGrid1;\n return (\n <div className=\"daterange__month\">\n <div className=\"daterange__title\">{months[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((d, i) => {\n if (!d) return <span key={`b${i}`} />;\n const sel = (value.from && isSameDay(d, value.from)) || (value.to && isSameDay(d, value.to));\n const ir = inRange(d);\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('daterange__day', sel && 'is-selected', ir && !sel && 'is-range', today && 'is-today', off && 'is-disabled')}\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 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={() => setOpen((o) => !o)}\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')}\n role=\"dialog\"\n onMouseLeave={() => setHover(null)}\n style={{\n position: 'absolute',\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={() => { onChange(p.range()); setOpen(false); }}>{p.label}</button>\n </li>\n ))}\n </ul>\n )}\n <div className=\"daterange__panes\">\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 <span />\n <button type=\"button\" onClick={() => setView((v) => addMonths(v, 1))} aria-label={locale['calendar.nextMonth']}><ChevronRight size={16} /></button>\n </div>\n <div className=\"daterange__months\">\n {renderMonth(0)}\n {renderMonth(1)}\n </div>\n <div className=\"daterange__actions\">\n <button type=\"button\" className=\"daterange__clear\" onClick={() => onChange({ from: null, to: null })}>{locale['common.clear']}</button>\n <button type=\"button\" className=\"daterange__apply\" onClick={() => setOpen(false)} disabled={!value.from || !value.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"]}