@misael703/ui 1.0.1 → 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.
- package/dist/chunk-2S6JJYN7.js +209 -0
- package/dist/chunk-2S6JJYN7.js.map +1 -0
- package/dist/{chunk-GDFYAUHT.mjs → chunk-3N4IBCLW.mjs} +11 -29
- package/dist/chunk-3N4IBCLW.mjs.map +1 -0
- package/dist/{chunk-TB6EHWRF.mjs → chunk-3OVWAAGP.mjs} +3 -3
- package/dist/{chunk-TB6EHWRF.mjs.map → chunk-3OVWAAGP.mjs.map} +1 -1
- package/dist/chunk-427NHGTX.js +4 -0
- package/dist/chunk-427NHGTX.js.map +1 -0
- package/dist/chunk-6P2TKRTL.mjs +45 -0
- package/dist/chunk-6P2TKRTL.mjs.map +1 -0
- package/dist/chunk-6RVCYULF.mjs +78 -0
- package/dist/chunk-6RVCYULF.mjs.map +1 -0
- package/dist/chunk-BVQRDAR7.mjs +3 -0
- package/dist/chunk-BVQRDAR7.mjs.map +1 -0
- package/dist/{chunk-TXKFCVCN.mjs → chunk-C35GKQJO.mjs} +3 -3
- package/dist/{chunk-TXKFCVCN.mjs.map → chunk-C35GKQJO.mjs.map} +1 -1
- package/dist/chunk-DPMUWQHL.js +95 -0
- package/dist/chunk-DPMUWQHL.js.map +1 -0
- package/dist/chunk-GIOMV3J7.js +48 -0
- package/dist/chunk-GIOMV3J7.js.map +1 -0
- package/dist/chunk-GLYGO7WX.js +13 -0
- package/dist/chunk-GLYGO7WX.js.map +1 -0
- package/dist/chunk-H3PRT76O.mjs +73 -0
- package/dist/chunk-H3PRT76O.mjs.map +1 -0
- package/dist/{chunk-Z4GRQHIG.mjs → chunk-IEJXZ67E.mjs} +3 -3
- package/dist/{chunk-Z4GRQHIG.mjs.map → chunk-IEJXZ67E.mjs.map} +1 -1
- package/dist/chunk-IMHLJKYR.mjs +176 -0
- package/dist/chunk-IMHLJKYR.mjs.map +1 -0
- package/dist/{chunk-EJJDJJEM.js → chunk-K5S3SV2U.js} +108 -106
- package/dist/chunk-K5S3SV2U.js.map +1 -0
- package/dist/{chunk-ADIKHOEG.js → chunk-KOIRRZRD.js} +72 -6
- package/dist/chunk-KOIRRZRD.js.map +1 -0
- package/dist/{chunk-ZXSSOEIM.js → chunk-LXNHGGAK.js} +4 -4
- package/dist/{chunk-ZXSSOEIM.js.map → chunk-LXNHGGAK.js.map} +1 -1
- package/dist/{chunk-HI3JT6SI.mjs → chunk-MM7VE7YN.mjs} +72 -6
- package/dist/chunk-MM7VE7YN.mjs.map +1 -0
- package/dist/chunk-MUL2FKYF.js +100 -0
- package/dist/chunk-MUL2FKYF.js.map +1 -0
- package/dist/chunk-N2Y2KWX5.mjs +216 -0
- package/dist/chunk-N2Y2KWX5.mjs.map +1 -0
- package/dist/{chunk-CVXS7IHA.js → chunk-N7LFCAAY.js} +112 -113
- package/dist/chunk-N7LFCAAY.js.map +1 -0
- package/dist/chunk-OCLBAGNF.mjs +184 -0
- package/dist/chunk-OCLBAGNF.mjs.map +1 -0
- package/dist/{chunk-QSCJ2CER.mjs → chunk-OHCS5CYV.mjs} +108 -106
- package/dist/chunk-OHCS5CYV.mjs.map +1 -0
- package/dist/{chunk-LUXTZOTJ.js → chunk-OHMFYAB2.js} +4 -4
- package/dist/{chunk-LUXTZOTJ.js.map → chunk-OHMFYAB2.js.map} +1 -1
- package/dist/{chunk-T4R2LSRL.js → chunk-PROKTOL7.js} +3 -2
- package/dist/chunk-PROKTOL7.js.map +1 -0
- package/dist/{chunk-3UHX7ITQ.mjs → chunk-QI4JT3V3.mjs} +29 -34
- package/dist/chunk-QI4JT3V3.mjs.map +1 -0
- package/dist/{chunk-Z3FAKG3E.mjs → chunk-QW2CSXPH.mjs} +3 -2
- package/dist/chunk-QW2CSXPH.mjs.map +1 -0
- package/dist/chunk-QX5GGPV5.mjs +11 -0
- package/dist/chunk-QX5GGPV5.mjs.map +1 -0
- package/dist/{chunk-2RVSLQEA.mjs → chunk-R76SJURE.mjs} +3 -3
- package/dist/{chunk-2RVSLQEA.mjs.map → chunk-R76SJURE.mjs.map} +1 -1
- package/dist/{chunk-E2XOUDAH.js → chunk-REL2RZTI.js} +14 -32
- package/dist/chunk-REL2RZTI.js.map +1 -0
- package/dist/{chunk-R76YER7O.js → chunk-TBAKKSAN.js} +4 -4
- package/dist/{chunk-R76YER7O.js.map → chunk-TBAKKSAN.js.map} +1 -1
- package/dist/chunk-V7MK42GX.js +238 -0
- package/dist/chunk-V7MK42GX.js.map +1 -0
- package/dist/chunk-VR4OXVKE.js +198 -0
- package/dist/chunk-VR4OXVKE.js.map +1 -0
- package/dist/chunk-WLDQP4KD.mjs +75 -0
- package/dist/chunk-WLDQP4KD.mjs.map +1 -0
- package/dist/{chunk-W6YOBPL5.js → chunk-WVN5JJVV.js} +27 -40
- package/dist/chunk-WVN5JJVV.js.map +1 -0
- package/dist/chunk-XMLBKK7X.js +67 -0
- package/dist/chunk-XMLBKK7X.js.map +1 -0
- package/dist/chunk-XXUSZD5I.mjs +26 -0
- package/dist/chunk-XXUSZD5I.mjs.map +1 -0
- package/dist/{chunk-IIYQO6BL.js → chunk-YAORRBMU.js} +29 -34
- package/dist/chunk-YAORRBMU.js.map +1 -0
- package/dist/{chunk-AAQ7KUZH.mjs → chunk-YFLVB62R.mjs} +112 -113
- package/dist/chunk-YFLVB62R.mjs.map +1 -0
- package/dist/{chunk-UIKCTWKG.js → chunk-YRACSKAT.js} +4 -4
- package/dist/{chunk-UIKCTWKG.js.map → chunk-YRACSKAT.js.map} +1 -1
- package/dist/components/AdvancedPickers.js +8 -5
- package/dist/components/AdvancedPickers.mjs +4 -1
- package/dist/components/AppShell.js +3 -3
- package/dist/components/AppShell.mjs +1 -1
- package/dist/components/Comments.js +8 -5
- package/dist/components/Comments.mjs +5 -2
- package/dist/components/Commerce.js +14 -13
- package/dist/components/Commerce.mjs +3 -2
- package/dist/components/ContextMenu.js +5 -2
- package/dist/components/ContextMenu.mjs +4 -1
- package/dist/components/Display2.js +8 -5
- package/dist/components/Display2.mjs +4 -1
- package/dist/components/Display3.js +11 -8
- package/dist/components/Display3.mjs +5 -2
- package/dist/components/Editing.js +8 -7
- package/dist/components/Editing.mjs +3 -2
- package/dist/components/HoverCard.js +4 -2
- package/dist/components/HoverCard.mjs +3 -1
- package/dist/components/Layout.js +20 -18
- package/dist/components/Layout.mjs +3 -1
- package/dist/components/Menubar.js +5 -2
- package/dist/components/Menubar.mjs +4 -1
- package/dist/components/NavigationMenu.js +5 -2
- package/dist/components/NavigationMenu.mjs +4 -1
- package/dist/components/Overlay.js +4 -3
- package/dist/components/Overlay.mjs +2 -1
- package/dist/components/Pickers.js +7 -4
- package/dist/components/Pickers.mjs +4 -1
- package/dist/components/Popover.js +5 -2
- package/dist/components/Popover.mjs +4 -1
- package/dist/components/Portal.d.mts +30 -0
- package/dist/components/Portal.d.ts +30 -0
- package/dist/components/Portal.js +12 -0
- package/dist/components/Portal.js.map +1 -0
- package/dist/components/Portal.mjs +3 -0
- package/dist/components/Portal.mjs.map +1 -0
- package/dist/hooks/index.d.mts +4 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.js +23 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +6 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/hooks/useDelayedUnmount.d.mts +22 -0
- package/dist/hooks/useDelayedUnmount.d.ts +22 -0
- package/dist/hooks/useDelayedUnmount.js +12 -0
- package/dist/hooks/useDelayedUnmount.js.map +1 -0
- package/dist/hooks/useDelayedUnmount.mjs +3 -0
- package/dist/hooks/useDelayedUnmount.mjs.map +1 -0
- package/dist/hooks/useDismiss.d.mts +23 -0
- package/dist/hooks/useDismiss.d.ts +23 -0
- package/dist/hooks/useDismiss.js +12 -0
- package/dist/hooks/useDismiss.js.map +1 -0
- package/dist/hooks/useDismiss.mjs +3 -0
- package/dist/hooks/useDismiss.mjs.map +1 -0
- package/dist/hooks/usePopoverPosition.d.mts +50 -0
- package/dist/hooks/usePopoverPosition.d.ts +50 -0
- package/dist/hooks/usePopoverPosition.js +12 -0
- package/dist/hooks/usePopoverPosition.js.map +1 -0
- package/dist/hooks/usePopoverPosition.mjs +3 -0
- package/dist/hooks/usePopoverPosition.mjs.map +1 -0
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +95 -78
- package/dist/index.mjs +21 -16
- package/dist/styles.css +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/chunk-3UHX7ITQ.mjs.map +0 -1
- package/dist/chunk-5VMZMDJF.js +0 -145
- package/dist/chunk-5VMZMDJF.js.map +0 -1
- package/dist/chunk-7AKN7FDA.mjs +0 -103
- package/dist/chunk-7AKN7FDA.mjs.map +0 -1
- package/dist/chunk-AAQ7KUZH.mjs.map +0 -1
- package/dist/chunk-ADIKHOEG.js.map +0 -1
- package/dist/chunk-CVXS7IHA.js.map +0 -1
- package/dist/chunk-E2XOUDAH.js.map +0 -1
- package/dist/chunk-EJJDJJEM.js.map +0 -1
- package/dist/chunk-GDFYAUHT.mjs.map +0 -1
- package/dist/chunk-HI3JT6SI.mjs.map +0 -1
- package/dist/chunk-HPFJ2A24.js +0 -125
- package/dist/chunk-HPFJ2A24.js.map +0 -1
- package/dist/chunk-IIYQO6BL.js.map +0 -1
- package/dist/chunk-JDOXRLZW.js +0 -138
- package/dist/chunk-JDOXRLZW.js.map +0 -1
- package/dist/chunk-NLCKWF3Y.mjs +0 -88
- package/dist/chunk-NLCKWF3Y.mjs.map +0 -1
- package/dist/chunk-NUURPO3J.mjs +0 -120
- package/dist/chunk-NUURPO3J.mjs.map +0 -1
- package/dist/chunk-OCE4ODTM.mjs +0 -116
- package/dist/chunk-OCE4ODTM.mjs.map +0 -1
- package/dist/chunk-QI6TVWWF.js +0 -121
- package/dist/chunk-QI6TVWWF.js.map +0 -1
- package/dist/chunk-QSCJ2CER.mjs.map +0 -1
- package/dist/chunk-T4R2LSRL.js.map +0 -1
- package/dist/chunk-W6YOBPL5.js.map +0 -1
- package/dist/chunk-YBOTLQ3G.mjs +0 -99
- package/dist/chunk-YBOTLQ3G.mjs.map +0 -1
- package/dist/chunk-Z3FAKG3E.mjs.map +0 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { useDismiss } from './chunk-6P2TKRTL.mjs';
|
|
2
|
+
import { usePopoverPosition } from './chunk-H3PRT76O.mjs';
|
|
3
|
+
import { Portal } from './chunk-QX5GGPV5.mjs';
|
|
4
|
+
import { ChevronUp, ChevronDown } from './chunk-CIBJKJV3.mjs';
|
|
5
|
+
import { cx } from './chunk-IEPCH3JB.mjs';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
function initials(name) {
|
|
10
|
+
if (name.startsWith("+")) return name;
|
|
11
|
+
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
12
|
+
if (parts.length === 0) return "?";
|
|
13
|
+
if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();
|
|
14
|
+
return parts.slice(0, 2).map((p) => p[0]?.toUpperCase() ?? "").join("");
|
|
15
|
+
}
|
|
16
|
+
function Avatar({ src, alt, name, size = 32, shape = "circle", status, className, style, ...rest }) {
|
|
17
|
+
return /* @__PURE__ */ jsxs(
|
|
18
|
+
"span",
|
|
19
|
+
{
|
|
20
|
+
className: cx("avatar", `avatar--${shape}`, className),
|
|
21
|
+
style: { width: size, height: size, fontSize: size * 0.42, ...style },
|
|
22
|
+
...rest,
|
|
23
|
+
children: [
|
|
24
|
+
src ? /* @__PURE__ */ jsx("img", { src, alt: alt ?? name ?? "" }) : /* @__PURE__ */ jsx("span", { className: "avatar__initials", children: name ? initials(name) : "?" }),
|
|
25
|
+
status && /* @__PURE__ */ jsx("span", { className: cx("avatar__status", `avatar__status--${status}`), "aria-label": status })
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
function AvatarGroup({ children, max = 4, size = 32, className }) {
|
|
31
|
+
const arr = React.Children.toArray(children);
|
|
32
|
+
const shown = arr.slice(0, max);
|
|
33
|
+
const overflow = arr.length - shown.length;
|
|
34
|
+
return /* @__PURE__ */ jsxs("div", { className: cx("avatar-group", className), children: [
|
|
35
|
+
shown.map((c, i) => /* @__PURE__ */ jsx("span", { style: { marginLeft: i === 0 ? 0 : -size * 0.3, zIndex: shown.length - i }, children: c }, i)),
|
|
36
|
+
overflow > 0 && /* @__PURE__ */ jsx(Avatar, { name: `+${overflow}`, size, className: "avatar--overflow" })
|
|
37
|
+
] });
|
|
38
|
+
}
|
|
39
|
+
function Menu({ trigger, items, align = "start", className }) {
|
|
40
|
+
const [open, setOpen] = React.useState(false);
|
|
41
|
+
const [active, setActive] = React.useState(0);
|
|
42
|
+
const wrapRef = React.useRef(null);
|
|
43
|
+
const panelRef = React.useRef(null);
|
|
44
|
+
const itemRefs = React.useRef([]);
|
|
45
|
+
const enabledIdx = items.map((it, i) => "type" in it ? -1 : it.disabled ? -1 : i).filter((i) => i >= 0);
|
|
46
|
+
const pos = usePopoverPosition(wrapRef, panelRef, {
|
|
47
|
+
open,
|
|
48
|
+
side: "bottom",
|
|
49
|
+
align,
|
|
50
|
+
offset: 6
|
|
51
|
+
});
|
|
52
|
+
const focusTrigger = React.useCallback(() => {
|
|
53
|
+
wrapRef.current?.querySelector('[aria-haspopup="menu"]')?.focus();
|
|
54
|
+
}, []);
|
|
55
|
+
useDismiss({
|
|
56
|
+
open,
|
|
57
|
+
onDismiss: () => setOpen(false),
|
|
58
|
+
refs: [wrapRef, panelRef],
|
|
59
|
+
closeOnEscape: false
|
|
60
|
+
});
|
|
61
|
+
React.useEffect(() => {
|
|
62
|
+
if (open) setActive(0);
|
|
63
|
+
}, [open]);
|
|
64
|
+
React.useEffect(() => {
|
|
65
|
+
if (!open) return;
|
|
66
|
+
const realIdx = enabledIdx[active];
|
|
67
|
+
if (realIdx != null) itemRefs.current[realIdx]?.focus();
|
|
68
|
+
}, [open, active, enabledIdx]);
|
|
69
|
+
const select = (i) => {
|
|
70
|
+
const it = items[i];
|
|
71
|
+
if (!it || "type" in it || it.disabled) return;
|
|
72
|
+
it.onSelect?.();
|
|
73
|
+
setOpen(false);
|
|
74
|
+
focusTrigger();
|
|
75
|
+
};
|
|
76
|
+
const onPanelKeyDown = (e) => {
|
|
77
|
+
if (e.key === "Escape") {
|
|
78
|
+
e.preventDefault();
|
|
79
|
+
setOpen(false);
|
|
80
|
+
focusTrigger();
|
|
81
|
+
} else if (e.key === "Tab") {
|
|
82
|
+
setOpen(false);
|
|
83
|
+
} else if (e.key === "ArrowDown") {
|
|
84
|
+
e.preventDefault();
|
|
85
|
+
setActive((a) => Math.min(a + 1, enabledIdx.length - 1));
|
|
86
|
+
} else if (e.key === "ArrowUp") {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
setActive((a) => Math.max(a - 1, 0));
|
|
89
|
+
} else if (e.key === "Home") {
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
setActive(0);
|
|
92
|
+
} else if (e.key === "End") {
|
|
93
|
+
e.preventDefault();
|
|
94
|
+
setActive(Math.max(enabledIdx.length - 1, 0));
|
|
95
|
+
} else if (e.key === "Enter" || e.key === " ") {
|
|
96
|
+
e.preventDefault();
|
|
97
|
+
const realIdx = enabledIdx[active];
|
|
98
|
+
if (realIdx != null) select(realIdx);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const triggerEl = React.cloneElement(trigger, {
|
|
102
|
+
onClick: (e) => {
|
|
103
|
+
trigger.props.onClick?.(e);
|
|
104
|
+
setOpen((o) => !o);
|
|
105
|
+
},
|
|
106
|
+
onKeyDown: (e) => {
|
|
107
|
+
trigger.props.onKeyDown?.(e);
|
|
108
|
+
if (e.key === "ArrowDown" || e.key === "Enter" || e.key === " ") {
|
|
109
|
+
e.preventDefault();
|
|
110
|
+
setOpen(true);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"aria-haspopup": "menu",
|
|
114
|
+
"aria-expanded": open
|
|
115
|
+
});
|
|
116
|
+
return /* @__PURE__ */ jsxs("span", { ref: wrapRef, className: cx("menu", className), style: { display: "inline-block" }, children: [
|
|
117
|
+
triggerEl,
|
|
118
|
+
open && /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(
|
|
119
|
+
"div",
|
|
120
|
+
{
|
|
121
|
+
ref: panelRef,
|
|
122
|
+
role: "menu",
|
|
123
|
+
className: "menu__panel",
|
|
124
|
+
onKeyDown: onPanelKeyDown,
|
|
125
|
+
style: {
|
|
126
|
+
position: "absolute",
|
|
127
|
+
top: pos.top,
|
|
128
|
+
left: pos.left,
|
|
129
|
+
visibility: pos.ready ? "visible" : "hidden"
|
|
130
|
+
},
|
|
131
|
+
children: items.map((it, i) => {
|
|
132
|
+
if ("type" in it && it.type === "separator") return /* @__PURE__ */ jsx("div", { className: "menu__sep", role: "separator" }, i);
|
|
133
|
+
if ("type" in it && it.type === "label") return /* @__PURE__ */ jsx("div", { className: "menu__label", children: it.label }, i);
|
|
134
|
+
const item = it;
|
|
135
|
+
const isActive = enabledIdx[active] === i;
|
|
136
|
+
return /* @__PURE__ */ jsxs(
|
|
137
|
+
"button",
|
|
138
|
+
{
|
|
139
|
+
ref: (el) => {
|
|
140
|
+
itemRefs.current[i] = el;
|
|
141
|
+
},
|
|
142
|
+
type: "button",
|
|
143
|
+
role: "menuitem",
|
|
144
|
+
tabIndex: isActive ? 0 : -1,
|
|
145
|
+
disabled: item.disabled,
|
|
146
|
+
className: cx("menu__item", isActive && "is-active", item.destructive && "is-destructive"),
|
|
147
|
+
onMouseEnter: () => setActive(enabledIdx.indexOf(i)),
|
|
148
|
+
onClick: () => select(i),
|
|
149
|
+
children: [
|
|
150
|
+
item.icon && /* @__PURE__ */ jsx("span", { className: "menu__icon", "aria-hidden": "true", children: item.icon }),
|
|
151
|
+
/* @__PURE__ */ jsxs("span", { className: "menu__body", children: [
|
|
152
|
+
/* @__PURE__ */ jsxs("span", { className: "menu__label-row", children: [
|
|
153
|
+
/* @__PURE__ */ jsx("span", { children: item.label }),
|
|
154
|
+
item.shortcut && /* @__PURE__ */ jsx("kbd", { className: "menu__kbd", children: item.shortcut })
|
|
155
|
+
] }),
|
|
156
|
+
item.description && /* @__PURE__ */ jsx("span", { className: "menu__desc", children: item.description })
|
|
157
|
+
] })
|
|
158
|
+
]
|
|
159
|
+
},
|
|
160
|
+
i
|
|
161
|
+
);
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
) })
|
|
165
|
+
] });
|
|
166
|
+
}
|
|
167
|
+
function Stat({ label, value, hint, trend, align = "start", className }) {
|
|
168
|
+
return /* @__PURE__ */ jsxs("div", { className: cx("stat", `stat--${align}`, className), children: [
|
|
169
|
+
/* @__PURE__ */ jsx("span", { className: "stat__label", children: label }),
|
|
170
|
+
/* @__PURE__ */ jsx("span", { className: "stat__value", children: value }),
|
|
171
|
+
(hint || trend) && /* @__PURE__ */ jsxs("span", { className: "stat__foot", children: [
|
|
172
|
+
trend && /* @__PURE__ */ jsxs("span", { className: cx("stat__trend", `stat__trend--${trend.dir}`), children: [
|
|
173
|
+
trend.dir === "up" ? /* @__PURE__ */ jsx(ChevronUp, { size: 12 }) : trend.dir === "down" ? /* @__PURE__ */ jsx(ChevronDown, { size: 12 }) : "\u2013",
|
|
174
|
+
" ",
|
|
175
|
+
trend.value
|
|
176
|
+
] }),
|
|
177
|
+
hint && /* @__PURE__ */ jsx("span", { className: "stat__hint", children: hint })
|
|
178
|
+
] })
|
|
179
|
+
] });
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export { Avatar, AvatarGroup, Menu, Stat };
|
|
183
|
+
//# sourceMappingURL=chunk-OCLBAGNF.mjs.map
|
|
184
|
+
//# sourceMappingURL=chunk-OCLBAGNF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Display2.tsx"],"names":[],"mappings":"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","file":"chunk-OCLBAGNF.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronUp, ChevronDown } from './Icons';\nimport { Portal } from './Portal';\nimport { usePopoverPosition } from '../hooks/usePopoverPosition';\nimport { useDismiss } from '../hooks/useDismiss';\n\n// ---------- Avatar ------------------------------------------------------\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n name?: string; // for initials fallback\n size?: 24 | 32 | 40 | 48 | 64;\n shape?: 'circle' | 'square';\n status?: 'online' | 'offline' | 'busy';\n}\n\nfunction initials(name: string) {\n if (name.startsWith('+')) return name;\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return parts.slice(0, 2).map((p) => p[0]?.toUpperCase() ?? '').join('');\n}\n\nexport function Avatar({ src, alt, name, size = 32, shape = 'circle', status, className, style, ...rest }: AvatarProps) {\n return (\n <span\n className={cx('avatar', `avatar--${shape}`, className)}\n style={{ width: size, height: size, fontSize: size * 0.42, ...style }}\n {...rest}\n >\n {src ? (\n <img src={src} alt={alt ?? name ?? ''} />\n ) : (\n <span className=\"avatar__initials\">{name ? initials(name) : '?'}</span>\n )}\n {status && <span className={cx('avatar__status', `avatar__status--${status}`)} aria-label={status} />}\n </span>\n );\n}\n\nexport interface AvatarGroupProps {\n children: React.ReactNode;\n max?: number;\n size?: AvatarProps['size'];\n className?: string;\n}\n\nexport function AvatarGroup({ children, max = 4, size = 32, className }: AvatarGroupProps) {\n const arr = React.Children.toArray(children);\n const shown = arr.slice(0, max);\n const overflow = arr.length - shown.length;\n return (\n <div className={cx('avatar-group', className)}>\n {shown.map((c, i) => <span key={i} style={{ marginLeft: i === 0 ? 0 : -size * 0.3, zIndex: shown.length - i }}>{c}</span>)}\n {overflow > 0 && (\n <Avatar name={`+${overflow}`} size={size} className=\"avatar--overflow\" />\n )}\n </div>\n );\n}\n\n// ---------- Menu (dropdown) accesible -----------------------------------\nexport interface MenuItemProps {\n label: React.ReactNode;\n icon?: React.ReactNode;\n description?: React.ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n destructive?: boolean;\n shortcut?: string;\n}\n\nexport interface MenuProps {\n trigger: React.ReactElement;\n items: Array<MenuItemProps | { type: 'separator' } | { type: 'label'; label: React.ReactNode }>;\n align?: 'start' | 'end';\n className?: string;\n}\n\nexport function Menu({ trigger, items, align = 'start', className }: MenuProps) {\n const [open, setOpen] = React.useState(false);\n const [active, setActive] = React.useState(0);\n const wrapRef = React.useRef<HTMLSpanElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n\n // Positions within `items` that are focusable menu items (no\n // separators/labels/disabled). `active` indexes into this list.\n const enabledIdx = items\n .map((it, i) => ('type' in it ? -1 : it.disabled ? -1 : i))\n .filter((i) => i >= 0);\n\n const pos = usePopoverPosition(wrapRef, panelRef, {\n open,\n side: 'bottom',\n align,\n offset: 6,\n });\n\n const focusTrigger = React.useCallback(() => {\n wrapRef.current?.querySelector<HTMLElement>('[aria-haspopup=\"menu\"]')?.focus();\n }, []);\n\n // Outside-click closes; Escape is handled on the panel so it can also\n // return focus to the trigger (WAI-ARIA menu button pattern).\n useDismiss({\n open,\n onDismiss: () => setOpen(false),\n refs: [wrapRef, panelRef],\n closeOnEscape: false,\n });\n\n React.useEffect(() => {\n if (open) setActive(0);\n }, [open]);\n\n React.useEffect(() => {\n if (!open) return;\n const realIdx = enabledIdx[active];\n if (realIdx != null) itemRefs.current[realIdx]?.focus();\n }, [open, active, enabledIdx]);\n\n const select = (i: number) => {\n const it = items[i];\n if (!it || 'type' in it || it.disabled) return;\n it.onSelect?.();\n setOpen(false);\n focusTrigger();\n };\n\n const onPanelKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setOpen(false);\n focusTrigger();\n } else if (e.key === 'Tab') {\n setOpen(false);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActive((a) => Math.min(a + 1, enabledIdx.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActive((a) => Math.max(a - 1, 0));\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(Math.max(enabledIdx.length - 1, 0));\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n const realIdx = enabledIdx[active];\n if (realIdx != null) select(realIdx);\n }\n };\n\n const triggerEl = React.cloneElement(trigger, {\n onClick: (e: React.MouseEvent) => {\n trigger.props.onClick?.(e);\n setOpen((o) => !o);\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n trigger.props.onKeyDown?.(e);\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n });\n\n return (\n <span ref={wrapRef} className={cx('menu', className)} style={{ display: 'inline-block' }}>\n {triggerEl}\n {open && (\n <Portal>\n <div\n ref={panelRef}\n role=\"menu\"\n className=\"menu__panel\"\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 {items.map((it, i) => {\n if ('type' in it && it.type === 'separator') return <div key={i} className=\"menu__sep\" role=\"separator\" />;\n if ('type' in it && it.type === 'label') return <div key={i} className=\"menu__label\">{it.label}</div>;\n const item = it as MenuItemProps;\n const isActive = enabledIdx[active] === i;\n return (\n <button\n key={i}\n ref={(el) => { itemRefs.current[i] = el; }}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cx('menu__item', isActive && 'is-active', item.destructive && 'is-destructive')}\n onMouseEnter={() => setActive(enabledIdx.indexOf(i))}\n onClick={() => select(i)}\n >\n {item.icon && <span className=\"menu__icon\" aria-hidden=\"true\">{item.icon}</span>}\n <span className=\"menu__body\">\n <span className=\"menu__label-row\">\n <span>{item.label}</span>\n {item.shortcut && <kbd className=\"menu__kbd\">{item.shortcut}</kbd>}\n </span>\n {item.description && <span className=\"menu__desc\">{item.description}</span>}\n </span>\n </button>\n );\n })}\n </div>\n </Portal>\n )}\n </span>\n );\n}\n\n// ---------- Stat / MiniStat ---------------------------------------------\nexport interface StatProps {\n label: React.ReactNode;\n value: React.ReactNode;\n hint?: React.ReactNode;\n trend?: { dir: 'up' | 'down' | 'flat'; value: string };\n align?: 'start' | 'center';\n className?: string;\n}\n\nexport function Stat({ label, value, hint, trend, align = 'start', className }: StatProps) {\n return (\n <div className={cx('stat', `stat--${align}`, className)}>\n <span className=\"stat__label\">{label}</span>\n <span className=\"stat__value\">{value}</span>\n {(hint || trend) && (\n <span className=\"stat__foot\">\n {trend && (\n <span className={cx('stat__trend', `stat__trend--${trend.dir}`)}>\n {trend.dir === 'up' ? <ChevronUp size={12} /> : trend.dir === 'down' ? <ChevronDown size={12} /> : '–'} {trend.value}\n </span>\n )}\n {hint && <span className=\"stat__hint\">{hint}</span>}\n </span>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { resolveDateFormat, formatDate } from './chunk-BCIZLGM3.mjs';
|
|
2
2
|
import { format } from './chunk-KKOJI25C.mjs';
|
|
3
|
+
import { useDismiss } from './chunk-6P2TKRTL.mjs';
|
|
4
|
+
import { usePopoverPosition } from './chunk-H3PRT76O.mjs';
|
|
5
|
+
import { Portal } from './chunk-QX5GGPV5.mjs';
|
|
3
6
|
import { useLocale } from './chunk-ZRFSTYRL.mjs';
|
|
4
7
|
import { X, Check, CalendarIcon, ChevronLeft, ChevronRight, Search } from './chunk-CIBJKJV3.mjs';
|
|
5
8
|
import { cx } from './chunk-IEPCH3JB.mjs';
|
|
6
9
|
import * as React from 'react';
|
|
7
|
-
import { createPortal } from 'react-dom';
|
|
8
10
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
9
11
|
|
|
10
12
|
var dfilter = (o, q) => o.label.toLowerCase().includes(q.toLowerCase());
|
|
@@ -30,7 +32,6 @@ function MultiCombobox({
|
|
|
30
32
|
const wrapRef = React.useRef(null);
|
|
31
33
|
const inputRef = React.useRef(null);
|
|
32
34
|
const listRef = React.useRef(null);
|
|
33
|
-
const [coords, setCoords] = React.useState(null);
|
|
34
35
|
const reactId = React.useId();
|
|
35
36
|
const listboxId = `${id ?? reactId}-listbox`;
|
|
36
37
|
const selSet = React.useMemo(() => new Set(value), [value]);
|
|
@@ -38,21 +39,19 @@ function MultiCombobox({
|
|
|
38
39
|
() => query ? options.filter((o) => filter(o, query)) : options,
|
|
39
40
|
[options, query, filter]
|
|
40
41
|
);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
setCoords({ top: t.bottom + 4 + window.scrollY, left: t.left + window.scrollX, width: t.width });
|
|
55
|
-
}, [open]);
|
|
42
|
+
const pos = usePopoverPosition(wrapRef, listRef, {
|
|
43
|
+
open,
|
|
44
|
+
side: "bottom",
|
|
45
|
+
align: "start",
|
|
46
|
+
offset: 4,
|
|
47
|
+
matchAnchorWidth: true
|
|
48
|
+
});
|
|
49
|
+
useDismiss({
|
|
50
|
+
open,
|
|
51
|
+
onDismiss: () => setOpen(false),
|
|
52
|
+
refs: [wrapRef, listRef],
|
|
53
|
+
closeOnEscape: false
|
|
54
|
+
});
|
|
56
55
|
const toggle = (v) => {
|
|
57
56
|
if (selSet.has(v)) onChange(value.filter((x) => x !== v));
|
|
58
57
|
else onChange([...value, v]);
|
|
@@ -117,45 +116,48 @@ function MultiCombobox({
|
|
|
117
116
|
}
|
|
118
117
|
)
|
|
119
118
|
] }),
|
|
120
|
-
open &&
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
o.description && /* @__PURE__ */ jsx("span", { className: "multicombo__option-desc", children: o.description })
|
|
149
|
-
] })
|
|
150
|
-
]
|
|
119
|
+
open && /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(
|
|
120
|
+
"ul",
|
|
121
|
+
{
|
|
122
|
+
ref: listRef,
|
|
123
|
+
id: listboxId,
|
|
124
|
+
role: "listbox",
|
|
125
|
+
"aria-multiselectable": "true",
|
|
126
|
+
className: cx("multicombo__list", "is-floating"),
|
|
127
|
+
style: {
|
|
128
|
+
position: "absolute",
|
|
129
|
+
top: pos.top,
|
|
130
|
+
left: pos.left,
|
|
131
|
+
width: pos.width,
|
|
132
|
+
visibility: pos.ready ? "visible" : "hidden"
|
|
133
|
+
},
|
|
134
|
+
children: filtered.length === 0 ? /* @__PURE__ */ jsx("li", { className: "multicombo__empty", children: empty }) : filtered.map((o, i) => {
|
|
135
|
+
const checked = selSet.has(o.value);
|
|
136
|
+
return /* @__PURE__ */ jsxs(
|
|
137
|
+
"li",
|
|
138
|
+
{
|
|
139
|
+
role: "option",
|
|
140
|
+
"aria-selected": checked,
|
|
141
|
+
"aria-disabled": o.disabled,
|
|
142
|
+
className: cx("multicombo__option", i === active && "is-active", checked && "is-selected", o.disabled && "is-disabled"),
|
|
143
|
+
onMouseEnter: () => setActive(i),
|
|
144
|
+
onMouseDown: (e) => {
|
|
145
|
+
e.preventDefault();
|
|
146
|
+
if (!o.disabled) toggle(o.value);
|
|
151
147
|
},
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
148
|
+
children: [
|
|
149
|
+
/* @__PURE__ */ jsx("span", { className: cx("multicombo__check", checked && "is-checked"), "aria-hidden": "true", children: checked ? /* @__PURE__ */ jsx(Check, { size: 14 }) : null }),
|
|
150
|
+
/* @__PURE__ */ jsxs("span", { className: "multicombo__option-body", children: [
|
|
151
|
+
/* @__PURE__ */ jsx("span", { className: "multicombo__option-label", children: o.label }),
|
|
152
|
+
o.description && /* @__PURE__ */ jsx("span", { className: "multicombo__option-desc", children: o.description })
|
|
153
|
+
] })
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
String(o.value)
|
|
157
|
+
);
|
|
158
|
+
})
|
|
159
|
+
}
|
|
160
|
+
) })
|
|
159
161
|
] });
|
|
160
162
|
}
|
|
161
163
|
function startOfMonth(d) {
|
|
@@ -197,22 +199,19 @@ function DateRangePicker({
|
|
|
197
199
|
const [hover, setHover] = React.useState(null);
|
|
198
200
|
const wrapRef = React.useRef(null);
|
|
199
201
|
const popoverRef = React.useRef(null);
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
const t = wrapRef.current.getBoundingClientRect();
|
|
214
|
-
setCoords({ top: t.bottom + 6 + window.scrollY, left: t.left + window.scrollX });
|
|
215
|
-
}, [open]);
|
|
202
|
+
const triggerRef = React.useRef(null);
|
|
203
|
+
const pos = usePopoverPosition(wrapRef, popoverRef, {
|
|
204
|
+
open,
|
|
205
|
+
side: "bottom",
|
|
206
|
+
align: "start",
|
|
207
|
+
offset: 6
|
|
208
|
+
});
|
|
209
|
+
useDismiss({
|
|
210
|
+
open,
|
|
211
|
+
onDismiss: () => setOpen(false),
|
|
212
|
+
refs: [wrapRef, popoverRef],
|
|
213
|
+
returnFocusRef: triggerRef
|
|
214
|
+
});
|
|
216
215
|
const monthGrid0 = React.useMemo(() => buildMonthGrid(view, 0), [view]);
|
|
217
216
|
const monthGrid1 = React.useMemo(() => buildMonthGrid(view, 1), [view]);
|
|
218
217
|
const isDisabled = (d) => minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()) || maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());
|
|
@@ -270,6 +269,7 @@ function DateRangePicker({
|
|
|
270
269
|
/* @__PURE__ */ jsxs(
|
|
271
270
|
"button",
|
|
272
271
|
{
|
|
272
|
+
ref: triggerRef,
|
|
273
273
|
id,
|
|
274
274
|
type: "button",
|
|
275
275
|
className: "daterange__trigger",
|
|
@@ -283,40 +283,42 @@ function DateRangePicker({
|
|
|
283
283
|
]
|
|
284
284
|
}
|
|
285
285
|
),
|
|
286
|
-
open &&
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
/* @__PURE__ */
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
286
|
+
open && /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsxs(
|
|
287
|
+
"div",
|
|
288
|
+
{
|
|
289
|
+
ref: popoverRef,
|
|
290
|
+
className: cx("daterange__popover", "is-floating"),
|
|
291
|
+
role: "dialog",
|
|
292
|
+
onMouseLeave: () => setHover(null),
|
|
293
|
+
style: {
|
|
294
|
+
position: "absolute",
|
|
295
|
+
top: pos.top,
|
|
296
|
+
left: pos.left,
|
|
297
|
+
visibility: pos.ready ? "visible" : "hidden"
|
|
298
|
+
},
|
|
299
|
+
children: [
|
|
300
|
+
presets && presets.length > 0 && /* @__PURE__ */ jsx("ul", { className: "daterange__presets", children: presets.map((p, i) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("button", { type: "button", onClick: () => {
|
|
301
|
+
onChange(p.range());
|
|
302
|
+
setOpen(false);
|
|
303
|
+
}, children: p.label }) }, i)) }),
|
|
304
|
+
/* @__PURE__ */ jsxs("div", { className: "daterange__panes", children: [
|
|
305
|
+
/* @__PURE__ */ jsxs("div", { className: "daterange__nav", children: [
|
|
306
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => setView((v) => addMonths(v, -1)), "aria-label": locale["calendar.prevMonth"], children: /* @__PURE__ */ jsx(ChevronLeft, { size: 16 }) }),
|
|
307
|
+
/* @__PURE__ */ jsx("span", {}),
|
|
308
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => setView((v) => addMonths(v, 1)), "aria-label": locale["calendar.nextMonth"], children: /* @__PURE__ */ jsx(ChevronRight, { size: 16 }) })
|
|
309
|
+
] }),
|
|
310
|
+
/* @__PURE__ */ jsxs("div", { className: "daterange__months", children: [
|
|
311
|
+
renderMonth(0),
|
|
312
|
+
renderMonth(1)
|
|
313
|
+
] }),
|
|
314
|
+
/* @__PURE__ */ jsxs("div", { className: "daterange__actions", children: [
|
|
315
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "daterange__clear", onClick: () => onChange({ from: null, to: null }), children: locale["common.clear"] }),
|
|
316
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "daterange__apply", onClick: () => setOpen(false), disabled: !value.from || !value.to, children: locale["common.apply"] })
|
|
314
317
|
] })
|
|
315
|
-
]
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
)
|
|
318
|
+
] })
|
|
319
|
+
]
|
|
320
|
+
}
|
|
321
|
+
) })
|
|
320
322
|
] });
|
|
321
323
|
}
|
|
322
324
|
function matchesHotkey(e, hk) {
|
|
@@ -476,5 +478,5 @@ function useCommandPalette({ hotkey = "mod+k" } = {}) {
|
|
|
476
478
|
}
|
|
477
479
|
|
|
478
480
|
export { CommandPalette, DateRangePicker, MultiCombobox, useCommandPalette };
|
|
479
|
-
//# sourceMappingURL=chunk-
|
|
480
|
-
//# sourceMappingURL=chunk-
|
|
481
|
+
//# sourceMappingURL=chunk-OHCS5CYV.mjs.map
|
|
482
|
+
//# sourceMappingURL=chunk-OHCS5CYV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/AdvancedPickers.tsx"],"names":["format"],"mappings":"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","file":"chunk-OHCS5CYV.mjs","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"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk2S6JJYN7_js = require('./chunk-2S6JJYN7.js');
|
|
4
4
|
var chunkTEQ67JKX_js = require('./chunk-TEQ67JKX.js');
|
|
5
5
|
var chunkRQOTH7I7_js = require('./chunk-RQOTH7I7.js');
|
|
6
6
|
var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
|
|
@@ -30,7 +30,7 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
|
30
30
|
function UserCell({ name, meta, avatarSrc, avatarAlt, size = 32, className, ...rest }) {
|
|
31
31
|
const initialsName = typeof name === "string" ? name : void 0;
|
|
32
32
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkPASF6T4H_js.cx("user-cell", className), ...rest, children: [
|
|
33
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
33
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk2S6JJYN7_js.Avatar, { src: avatarSrc, alt: avatarAlt, name: initialsName, size }),
|
|
34
34
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "user-cell__body", children: [
|
|
35
35
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "user-cell__name", children: name }),
|
|
36
36
|
meta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "user-cell__meta", children: meta })
|
|
@@ -200,5 +200,5 @@ exports.Timeline = Timeline;
|
|
|
200
200
|
exports.TimelineItem = TimelineItem;
|
|
201
201
|
exports.Tree = Tree;
|
|
202
202
|
exports.UserCell = UserCell;
|
|
203
|
-
//# sourceMappingURL=chunk-
|
|
204
|
-
//# sourceMappingURL=chunk-
|
|
203
|
+
//# sourceMappingURL=chunk-OHMFYAB2.js.map
|
|
204
|
+
//# sourceMappingURL=chunk-OHMFYAB2.js.map
|