premium-ds 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/dist/alert.d.ts +31 -0
- package/dist/alert.js +6 -0
- package/dist/alert.js.map +1 -0
- package/dist/avatar-group.d.ts +13 -0
- package/dist/avatar-group.js +3 -0
- package/dist/avatar-group.js.map +1 -0
- package/dist/avatar.d.ts +25 -0
- package/dist/avatar.js +3 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.d.ts +23 -0
- package/dist/badge.js +3 -0
- package/dist/badge.js.map +1 -0
- package/dist/button.d.ts +20 -0
- package/dist/button.js +3 -0
- package/dist/button.js.map +1 -0
- package/dist/checkbox.d.ts +25 -0
- package/dist/checkbox.js +3 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-2OWHZ4JT.js +36 -0
- package/dist/chunk-2OWHZ4JT.js.map +1 -0
- package/dist/chunk-34SIXSYL.js +64 -0
- package/dist/chunk-34SIXSYL.js.map +1 -0
- package/dist/chunk-37O2ZXD6.js +55 -0
- package/dist/chunk-37O2ZXD6.js.map +1 -0
- package/dist/chunk-4AZL76UJ.js +89 -0
- package/dist/chunk-4AZL76UJ.js.map +1 -0
- package/dist/chunk-4HSCN5TZ.js +86 -0
- package/dist/chunk-4HSCN5TZ.js.map +1 -0
- package/dist/chunk-5DDOOT33.js +258 -0
- package/dist/chunk-5DDOOT33.js.map +1 -0
- package/dist/chunk-5FVHWIMY.js +117 -0
- package/dist/chunk-5FVHWIMY.js.map +1 -0
- package/dist/chunk-5K6KRJGX.js +147 -0
- package/dist/chunk-5K6KRJGX.js.map +1 -0
- package/dist/chunk-5PQMQBQC.js +74 -0
- package/dist/chunk-5PQMQBQC.js.map +1 -0
- package/dist/chunk-7OCTVQ7C.js +95 -0
- package/dist/chunk-7OCTVQ7C.js.map +1 -0
- package/dist/chunk-7OPMOET7.js +39 -0
- package/dist/chunk-7OPMOET7.js.map +1 -0
- package/dist/chunk-BXXS7YRC.js +270 -0
- package/dist/chunk-BXXS7YRC.js.map +1 -0
- package/dist/chunk-CV2Q4YXX.js +272 -0
- package/dist/chunk-CV2Q4YXX.js.map +1 -0
- package/dist/chunk-EIMMDWIW.js +282 -0
- package/dist/chunk-EIMMDWIW.js.map +1 -0
- package/dist/chunk-EZ2CWTBE.js +230 -0
- package/dist/chunk-EZ2CWTBE.js.map +1 -0
- package/dist/chunk-FGHDG3Y4.js +89 -0
- package/dist/chunk-FGHDG3Y4.js.map +1 -0
- package/dist/chunk-FPP2XLKX.js +127 -0
- package/dist/chunk-FPP2XLKX.js.map +1 -0
- package/dist/chunk-G6OY35DI.js +295 -0
- package/dist/chunk-G6OY35DI.js.map +1 -0
- package/dist/chunk-H6KWJNOE.js +65 -0
- package/dist/chunk-H6KWJNOE.js.map +1 -0
- package/dist/chunk-HGILYGY3.js +45 -0
- package/dist/chunk-HGILYGY3.js.map +1 -0
- package/dist/chunk-I3BCB4Z5.js +88 -0
- package/dist/chunk-I3BCB4Z5.js.map +1 -0
- package/dist/chunk-KBWNUUWM.js +582 -0
- package/dist/chunk-KBWNUUWM.js.map +1 -0
- package/dist/chunk-KN7JFAZ6.js +113 -0
- package/dist/chunk-KN7JFAZ6.js.map +1 -0
- package/dist/chunk-MEF7PI6U.js +16 -0
- package/dist/chunk-MEF7PI6U.js.map +1 -0
- package/dist/chunk-NKGMQL6I.js +310 -0
- package/dist/chunk-NKGMQL6I.js.map +1 -0
- package/dist/chunk-NMFQRGLL.js +127 -0
- package/dist/chunk-NMFQRGLL.js.map +1 -0
- package/dist/chunk-OUBWD6CX.js +433 -0
- package/dist/chunk-OUBWD6CX.js.map +1 -0
- package/dist/chunk-PFNXVBLU.js +96 -0
- package/dist/chunk-PFNXVBLU.js.map +1 -0
- package/dist/chunk-PUPZ4HME.js +165 -0
- package/dist/chunk-PUPZ4HME.js.map +1 -0
- package/dist/chunk-QFS52OK5.js +690 -0
- package/dist/chunk-QFS52OK5.js.map +1 -0
- package/dist/chunk-QNC6O3PG.js +45 -0
- package/dist/chunk-QNC6O3PG.js.map +1 -0
- package/dist/chunk-QUHOXWBK.js +82 -0
- package/dist/chunk-QUHOXWBK.js.map +1 -0
- package/dist/chunk-UIQGSTBJ.js +106 -0
- package/dist/chunk-UIQGSTBJ.js.map +1 -0
- package/dist/chunk-UJQKVP6V.js +193 -0
- package/dist/chunk-UJQKVP6V.js.map +1 -0
- package/dist/chunk-VVPGEAC6.js +11 -0
- package/dist/chunk-VVPGEAC6.js.map +1 -0
- package/dist/chunk-XA3T5KWA.js +58 -0
- package/dist/chunk-XA3T5KWA.js.map +1 -0
- package/dist/chunk-YSHJHSJM.js +19 -0
- package/dist/chunk-YSHJHSJM.js.map +1 -0
- package/dist/chunk-YVHOAVSM.js +182 -0
- package/dist/chunk-YVHOAVSM.js.map +1 -0
- package/dist/collapse.d.ts +16 -0
- package/dist/collapse.js +3 -0
- package/dist/collapse.js.map +1 -0
- package/dist/count-badge.d.ts +11 -0
- package/dist/count-badge.js +4 -0
- package/dist/count-badge.js.map +1 -0
- package/dist/date-field.d.ts +39 -0
- package/dist/date-field.js +8 -0
- package/dist/date-field.js.map +1 -0
- package/dist/date-range-field.d.ts +30 -0
- package/dist/date-range-field.js +8 -0
- package/dist/date-range-field.js.map +1 -0
- package/dist/datetime-field.d.ts +28 -0
- package/dist/datetime-field.js +10 -0
- package/dist/datetime-field.js.map +1 -0
- package/dist/dialog.d.ts +26 -0
- package/dist/dialog.js +7 -0
- package/dist/dialog.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/motion-tokens.d.ts +29 -0
- package/dist/motion-tokens.js +3 -0
- package/dist/motion-tokens.js.map +1 -0
- package/dist/multi-select.d.ts +25 -0
- package/dist/multi-select.js +7 -0
- package/dist/multi-select.js.map +1 -0
- package/dist/number-field.d.ts +24 -0
- package/dist/number-field.js +4 -0
- package/dist/number-field.js.map +1 -0
- package/dist/otp-field.d.ts +20 -0
- package/dist/otp-field.js +3 -0
- package/dist/otp-field.js.map +1 -0
- package/dist/overlay.d.ts +31 -0
- package/dist/overlay.js +4 -0
- package/dist/overlay.js.map +1 -0
- package/dist/pagination.d.ts +24 -0
- package/dist/pagination.js +5 -0
- package/dist/pagination.js.map +1 -0
- package/dist/radio-group.d.ts +46 -0
- package/dist/radio-group.js +6 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/select-core-SAyS-8w0.d.ts +16 -0
- package/dist/select.d.ts +27 -0
- package/dist/select.js +7 -0
- package/dist/select.js.map +1 -0
- package/dist/status-badge.d.ts +17 -0
- package/dist/status-badge.js +5 -0
- package/dist/status-badge.js.map +1 -0
- package/dist/table.d.ts +65 -0
- package/dist/table.js +5 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.d.ts +44 -0
- package/dist/tabs.js +5 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tag.d.ts +28 -0
- package/dist/tag.js +5 -0
- package/dist/tag.js.map +1 -0
- package/dist/text-field.d.ts +30 -0
- package/dist/text-field.js +6 -0
- package/dist/text-field.js.map +1 -0
- package/dist/textarea.d.ts +33 -0
- package/dist/textarea.js +5 -0
- package/dist/textarea.js.map +1 -0
- package/dist/time-field.d.ts +27 -0
- package/dist/time-field.js +6 -0
- package/dist/time-field.js.map +1 -0
- package/dist/toast-store.d.ts +75 -0
- package/dist/toast-store.js +3 -0
- package/dist/toast-store.js.map +1 -0
- package/dist/toast.d.ts +3 -0
- package/dist/toast.js +6 -0
- package/dist/toast.js.map +1 -0
- package/dist/toggle-tag.d.ts +24 -0
- package/dist/toggle-tag.js +4 -0
- package/dist/toggle-tag.js.map +1 -0
- package/dist/toggle.d.ts +21 -0
- package/dist/toggle.js +3 -0
- package/dist/toggle.js.map +1 -0
- package/dist/tooltip.d.ts +27 -0
- package/dist/tooltip.js +4 -0
- package/dist/tooltip.js.map +1 -0
- package/llms.txt +165 -0
- package/package.json +205 -0
- package/src/components/alert/Alert.tsx +118 -0
- package/src/components/alert/alert.css +136 -0
- package/src/components/avatar/Avatar.tsx +128 -0
- package/src/components/avatar/AvatarGroup.tsx +50 -0
- package/src/components/avatar/avatar.css +200 -0
- package/src/components/badge/Badge.tsx +66 -0
- package/src/components/badge/CountBadge.tsx +46 -0
- package/src/components/badge/StatusBadge.tsx +132 -0
- package/src/components/badge/badge.css +243 -0
- package/src/components/button/Button.tsx +68 -0
- package/src/components/button/button.css +222 -0
- package/src/components/checkbox/Checkbox.tsx +90 -0
- package/src/components/checkbox/checkbox.css +179 -0
- package/src/components/date-picker/DateField.tsx +362 -0
- package/src/components/date-picker/DateRangeField.tsx +533 -0
- package/src/components/date-picker/DateTimeField.tsx +177 -0
- package/src/components/date-picker/TimeField.tsx +100 -0
- package/src/components/date-picker/date-picker.css +591 -0
- package/src/components/date-picker/date-utils.ts +55 -0
- package/src/components/date-picker/field-shell.tsx +78 -0
- package/src/components/date-picker/glide-pill.tsx +81 -0
- package/src/components/date-picker/time-core.tsx +305 -0
- package/src/components/dialog/Dialog.tsx +181 -0
- package/src/components/dialog/dialog.css +170 -0
- package/src/components/glass/glass.css +100 -0
- package/src/components/icon/Icon.tsx +76 -0
- package/src/components/icon/IconSlot.tsx +11 -0
- package/src/components/icon/icon.css +33 -0
- package/src/components/input/NumberField.tsx +117 -0
- package/src/components/input/OtpField.tsx +118 -0
- package/src/components/input/TextField.tsx +123 -0
- package/src/components/input/input.css +335 -0
- package/src/components/motion/Collapse.tsx +33 -0
- package/src/components/motion/collapse.css +41 -0
- package/src/components/overlay/Overlay.tsx +239 -0
- package/src/components/overlay/overlay-core.tsx +565 -0
- package/src/components/overlay/overlay.css +119 -0
- package/src/components/overlay/sheet-drag.tsx +146 -0
- package/src/components/pagination/Pagination.tsx +140 -0
- package/src/components/pagination/pagination.css +48 -0
- package/src/components/radio-group/RadioGroup.tsx +182 -0
- package/src/components/radio-group/radio-group.css +277 -0
- package/src/components/select/MultiSelect.tsx +251 -0
- package/src/components/select/Select.tsx +235 -0
- package/src/components/select/select-core.tsx +417 -0
- package/src/components/select/select.css +386 -0
- package/src/components/table/Table.tsx +433 -0
- package/src/components/table/table.css +348 -0
- package/src/components/tabs/Tabs.tsx +371 -0
- package/src/components/tabs/tabs.css +228 -0
- package/src/components/tag/Tag.tsx +145 -0
- package/src/components/tag/ToggleTag.tsx +125 -0
- package/src/components/tag/tag.css +248 -0
- package/src/components/textarea/Textarea.tsx +197 -0
- package/src/components/textarea/textarea.css +219 -0
- package/src/components/toast/Toast.tsx +349 -0
- package/src/components/toast/toast-store.ts +266 -0
- package/src/components/toast/toast.css +233 -0
- package/src/components/toggle/Toggle.tsx +94 -0
- package/src/components/toggle/toggle.css +152 -0
- package/src/components/tooltip/Tooltip.tsx +365 -0
- package/src/components/tooltip/tooltip.css +86 -0
- package/src/index.ts +42 -0
- package/src/styles.css +39 -0
- package/src/tokens/avatar.css +20 -0
- package/src/tokens/color.css +56 -0
- package/src/tokens/elevation.css +20 -0
- package/src/tokens/fonts.css +3 -0
- package/src/tokens/glass.css +21 -0
- package/src/tokens/icons.css +7 -0
- package/src/tokens/layers.css +6 -0
- package/src/tokens/motion-tokens.ts +72 -0
- package/src/tokens/motion.css +49 -0
- package/src/tokens/radius.css +11 -0
- package/src/tokens/semantic.css +75 -0
- package/src/tokens/spacing.css +26 -0
- package/src/tokens/typography.css +54 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
'use client';import { UIMotion } from './chunk-37O2ZXD6.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import * as ReactDOM from 'react-dom';
|
|
4
|
+
import { createRoot } from 'react-dom/client';
|
|
5
|
+
import { AnimatePresence, motion } from 'motion/react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var SM = UIMotion;
|
|
9
|
+
var { useRef, useEffect, useLayoutEffect, useState, useId, useSyncExternalStore } = React;
|
|
10
|
+
var OPEN_DELAY = 350;
|
|
11
|
+
var CLOSE_GRACE = 140;
|
|
12
|
+
var WARM_WINDOW = 300;
|
|
13
|
+
var TIP_GAP = typeof document !== "undefined" ? parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--space-2")) || 8 : 8;
|
|
14
|
+
var store = {
|
|
15
|
+
active: null,
|
|
16
|
+
closeTimer: 0,
|
|
17
|
+
warmUntil: 0,
|
|
18
|
+
listeners: /* @__PURE__ */ new Set(),
|
|
19
|
+
get: () => store.active,
|
|
20
|
+
subscribe(l) {
|
|
21
|
+
store.listeners.add(l);
|
|
22
|
+
return () => store.listeners.delete(l);
|
|
23
|
+
},
|
|
24
|
+
emit() {
|
|
25
|
+
store.listeners.forEach((l) => l());
|
|
26
|
+
},
|
|
27
|
+
isWarm: () => store.active !== null || performance.now() < store.warmUntil,
|
|
28
|
+
open(payload) {
|
|
29
|
+
clearTimeout(store.closeTimer);
|
|
30
|
+
store.active = payload;
|
|
31
|
+
store.emit();
|
|
32
|
+
},
|
|
33
|
+
close(id, grace = CLOSE_GRACE) {
|
|
34
|
+
clearTimeout(store.closeTimer);
|
|
35
|
+
store.closeTimer = setTimeout(() => {
|
|
36
|
+
if (store.active && store.active.id === id) store.closeNow();
|
|
37
|
+
}, grace);
|
|
38
|
+
},
|
|
39
|
+
closeNow() {
|
|
40
|
+
clearTimeout(store.closeTimer);
|
|
41
|
+
if (!store.active) return;
|
|
42
|
+
store.warmUntil = performance.now() + WARM_WINDOW;
|
|
43
|
+
store.active = null;
|
|
44
|
+
store.emit();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
function targetBox(size, t, want) {
|
|
48
|
+
const vw = window.innerWidth, vh = window.innerHeight, M = TIP_GAP;
|
|
49
|
+
let p = want;
|
|
50
|
+
if (p === "top" && t.top - size.h - TIP_GAP < M) p = "bottom";
|
|
51
|
+
else if (p === "bottom" && t.bottom + size.h + TIP_GAP > vh - M) p = "top";
|
|
52
|
+
else if (p === "left" && t.left - size.w - TIP_GAP < M) p = "right";
|
|
53
|
+
else if (p === "right" && t.right + size.w + TIP_GAP > vw - M) p = "left";
|
|
54
|
+
let x, y;
|
|
55
|
+
if (p === "top") {
|
|
56
|
+
x = t.left + t.width / 2 - size.w / 2;
|
|
57
|
+
y = t.top - size.h - TIP_GAP;
|
|
58
|
+
} else if (p === "bottom") {
|
|
59
|
+
x = t.left + t.width / 2 - size.w / 2;
|
|
60
|
+
y = t.bottom + TIP_GAP;
|
|
61
|
+
} else if (p === "left") {
|
|
62
|
+
x = t.left - size.w - TIP_GAP;
|
|
63
|
+
y = t.top + t.height / 2 - size.h / 2;
|
|
64
|
+
} else {
|
|
65
|
+
x = t.right + TIP_GAP;
|
|
66
|
+
y = t.top + t.height / 2 - size.h / 2;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
x: Math.round(Math.min(Math.max(x, M), vw - size.w - M)),
|
|
70
|
+
y: Math.round(Math.min(Math.max(y, M), vh - size.h - M)),
|
|
71
|
+
w: size.w,
|
|
72
|
+
h: size.h,
|
|
73
|
+
placement: p
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
var fromEdge = (p) => ({
|
|
77
|
+
// enter/exit offset toward the trigger
|
|
78
|
+
x: p === "left" ? 4 : p === "right" ? -4 : 0,
|
|
79
|
+
y: p === "top" ? 4 : p === "bottom" ? -4 : 0
|
|
80
|
+
});
|
|
81
|
+
function Body({ a, width }) {
|
|
82
|
+
return /* @__PURE__ */ jsx("span", { className: "tooltip__body", style: width ? { width } : void 0, children: a.shortcut ? /* @__PURE__ */ jsxs("span", { className: "tooltip__row", children: [
|
|
83
|
+
/* @__PURE__ */ jsx("span", { children: a.content }),
|
|
84
|
+
/* @__PURE__ */ jsx("kbd", { className: "tooltip__shortcut", children: a.shortcut })
|
|
85
|
+
] }) : a.content });
|
|
86
|
+
}
|
|
87
|
+
function TooltipHost() {
|
|
88
|
+
const active = useSyncExternalStore(store.subscribe, store.get);
|
|
89
|
+
const measureRef = useRef(null);
|
|
90
|
+
const [box, setBox] = useState(null);
|
|
91
|
+
useLayoutEffect(() => {
|
|
92
|
+
if (!active) {
|
|
93
|
+
setBox(null);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const r = measureRef.current.getBoundingClientRect();
|
|
97
|
+
const b = measureRef.current.firstChild.getBoundingClientRect();
|
|
98
|
+
setBox({
|
|
99
|
+
...targetBox(
|
|
100
|
+
{ w: Math.ceil(r.width), h: Math.ceil(r.height) },
|
|
101
|
+
active.rect(),
|
|
102
|
+
active.placement
|
|
103
|
+
),
|
|
104
|
+
bodyW: Math.ceil(b.width)
|
|
105
|
+
});
|
|
106
|
+
}, [active]);
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (!active) return void 0;
|
|
109
|
+
const onKey = (e) => {
|
|
110
|
+
if (e.key === "Escape") store.closeNow();
|
|
111
|
+
};
|
|
112
|
+
const onScroll = () => store.closeNow();
|
|
113
|
+
document.addEventListener("keydown", onKey);
|
|
114
|
+
window.addEventListener("scroll", onScroll, true);
|
|
115
|
+
return () => {
|
|
116
|
+
document.removeEventListener("keydown", onKey);
|
|
117
|
+
window.removeEventListener("scroll", onScroll, true);
|
|
118
|
+
};
|
|
119
|
+
}, [active]);
|
|
120
|
+
const off = box ? fromEdge(box.placement) : { x: 0, y: 0 };
|
|
121
|
+
return ReactDOM.createPortal(
|
|
122
|
+
/* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
123
|
+
active && /* @__PURE__ */ jsx("div", { className: "tooltip tooltip--measure", ref: measureRef, "aria-hidden": "true", children: /* @__PURE__ */ jsx(Body, { a: active }) }),
|
|
124
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: active && box && /* @__PURE__ */ jsx(
|
|
125
|
+
motion.div,
|
|
126
|
+
{
|
|
127
|
+
className: "tooltip",
|
|
128
|
+
id: "scheduly-tooltip",
|
|
129
|
+
role: "tooltip",
|
|
130
|
+
"data-placement": box.placement,
|
|
131
|
+
initial: {
|
|
132
|
+
x: box.x + off.x,
|
|
133
|
+
y: box.y + off.y,
|
|
134
|
+
width: box.w,
|
|
135
|
+
height: box.h,
|
|
136
|
+
opacity: 0,
|
|
137
|
+
scale: 0.96
|
|
138
|
+
},
|
|
139
|
+
animate: { x: box.x, y: box.y, width: box.w, height: box.h, opacity: 1, scale: 1 },
|
|
140
|
+
exit: {
|
|
141
|
+
x: box.x + off.x,
|
|
142
|
+
y: box.y + off.y,
|
|
143
|
+
opacity: 0,
|
|
144
|
+
scale: 0.96,
|
|
145
|
+
transition: { duration: SM.dur.fast, ease: SM.ease.exit }
|
|
146
|
+
},
|
|
147
|
+
transition: {
|
|
148
|
+
x: SM.t.layout,
|
|
149
|
+
y: SM.t.layout,
|
|
150
|
+
width: SM.t.layout,
|
|
151
|
+
height: SM.t.layout,
|
|
152
|
+
opacity: SM.t.enter,
|
|
153
|
+
scale: SM.t.enter
|
|
154
|
+
},
|
|
155
|
+
children: /* @__PURE__ */ jsx(
|
|
156
|
+
motion.span,
|
|
157
|
+
{
|
|
158
|
+
initial: { opacity: 0 },
|
|
159
|
+
animate: { opacity: 1, transition: SM.t.enter },
|
|
160
|
+
children: /* @__PURE__ */ jsx(Body, { a: active, width: box.bodyW })
|
|
161
|
+
},
|
|
162
|
+
active.id
|
|
163
|
+
)
|
|
164
|
+
},
|
|
165
|
+
"tip"
|
|
166
|
+
) })
|
|
167
|
+
] }),
|
|
168
|
+
document.body
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
var hostMounted = false;
|
|
172
|
+
function ensureHost() {
|
|
173
|
+
if (hostMounted) return;
|
|
174
|
+
hostMounted = true;
|
|
175
|
+
const el = document.createElement("div");
|
|
176
|
+
el.setAttribute("data-tooltip-host", "");
|
|
177
|
+
document.body.appendChild(el);
|
|
178
|
+
createRoot(el).render(/* @__PURE__ */ jsx(TooltipHost, {}));
|
|
179
|
+
}
|
|
180
|
+
var chain = (theirs, mine) => (e) => {
|
|
181
|
+
if (theirs) theirs(e);
|
|
182
|
+
mine(e);
|
|
183
|
+
};
|
|
184
|
+
function Tooltip({
|
|
185
|
+
content,
|
|
186
|
+
shortcut = null,
|
|
187
|
+
placement = "top",
|
|
188
|
+
disabled = false,
|
|
189
|
+
openDelay = OPEN_DELAY,
|
|
190
|
+
closeDelay = CLOSE_GRACE,
|
|
191
|
+
asChild = false,
|
|
192
|
+
id,
|
|
193
|
+
children
|
|
194
|
+
}) {
|
|
195
|
+
const triggerRef = useRef(null);
|
|
196
|
+
const wrapRef = useRef(null);
|
|
197
|
+
const openTimer = useRef(0);
|
|
198
|
+
const myId = id || "tip-" + useId();
|
|
199
|
+
const anchorEl = () => asChild ? triggerRef.current : wrapRef.current?.firstElementChild ?? null;
|
|
200
|
+
useEffect(
|
|
201
|
+
() => () => {
|
|
202
|
+
clearTimeout(openTimer.current);
|
|
203
|
+
store.close(myId, 0);
|
|
204
|
+
},
|
|
205
|
+
[]
|
|
206
|
+
);
|
|
207
|
+
function show(immediate) {
|
|
208
|
+
if (disabled) return;
|
|
209
|
+
ensureHost();
|
|
210
|
+
clearTimeout(openTimer.current);
|
|
211
|
+
const el = anchorEl();
|
|
212
|
+
if (!el) return;
|
|
213
|
+
el.setAttribute("aria-describedby", "scheduly-tooltip");
|
|
214
|
+
const open = () => store.open({
|
|
215
|
+
id: myId,
|
|
216
|
+
content,
|
|
217
|
+
shortcut,
|
|
218
|
+
placement,
|
|
219
|
+
rect: () => anchorEl().getBoundingClientRect()
|
|
220
|
+
});
|
|
221
|
+
if (immediate || store.isWarm()) open();
|
|
222
|
+
else openTimer.current = setTimeout(open, openDelay);
|
|
223
|
+
}
|
|
224
|
+
function hide() {
|
|
225
|
+
clearTimeout(openTimer.current);
|
|
226
|
+
const el = anchorEl();
|
|
227
|
+
if (el) el.removeAttribute("aria-describedby");
|
|
228
|
+
store.close(myId, closeDelay);
|
|
229
|
+
}
|
|
230
|
+
const onEnter = (e) => {
|
|
231
|
+
if (e.pointerType !== "touch") show(false);
|
|
232
|
+
};
|
|
233
|
+
const onFocusIn = (e) => {
|
|
234
|
+
if (e.target.matches(":focus-visible")) show(true);
|
|
235
|
+
};
|
|
236
|
+
if (!asChild) {
|
|
237
|
+
return /* @__PURE__ */ jsx(
|
|
238
|
+
"span",
|
|
239
|
+
{
|
|
240
|
+
ref: wrapRef,
|
|
241
|
+
className: "tooltip-anchor",
|
|
242
|
+
onPointerEnter: onEnter,
|
|
243
|
+
onPointerLeave: hide,
|
|
244
|
+
onPointerDown: hide,
|
|
245
|
+
onFocus: onFocusIn,
|
|
246
|
+
onBlur: hide,
|
|
247
|
+
children
|
|
248
|
+
}
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
const child = React.Children.only(children);
|
|
252
|
+
const childRef = child.ref;
|
|
253
|
+
const childProps = child.props;
|
|
254
|
+
return React.cloneElement(child, {
|
|
255
|
+
ref: (node) => {
|
|
256
|
+
triggerRef.current = node;
|
|
257
|
+
if (typeof childRef === "function") childRef(node);
|
|
258
|
+
else if (childRef && typeof childRef === "object") childRef.current = node;
|
|
259
|
+
},
|
|
260
|
+
onPointerEnter: chain(childProps.onPointerEnter, onEnter),
|
|
261
|
+
onPointerLeave: chain(childProps.onPointerLeave, hide),
|
|
262
|
+
onPointerDown: chain(childProps.onPointerDown, hide),
|
|
263
|
+
onFocus: chain(childProps.onFocus, onFocusIn),
|
|
264
|
+
onBlur: chain(childProps.onBlur, hide)
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export { Tooltip, TooltipHost };
|
|
269
|
+
//# sourceMappingURL=chunk-BXXS7YRC.js.map
|
|
270
|
+
//# sourceMappingURL=chunk-BXXS7YRC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/tooltip/Tooltip.tsx"],"names":[],"mappings":"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","file":"chunk-BXXS7YRC.js","sourcesContent":["'use client';\n\n/* Tooltip - a transient, non-interactive hint on hover/focus (one shared bubble). */\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { createRoot } from 'react-dom/client';\nimport { motion, AnimatePresence } from 'motion/react';\nimport type { ReactElement, ReactNode } from 'react';\nimport { UIMotion } from '../../tokens/motion-tokens';\n\nconst SM = UIMotion;\nconst { useRef, useEffect, useLayoutEffect, useState, useId, useSyncExternalStore } = React;\n\ntype Placement = 'top' | 'bottom' | 'left' | 'right';\n\ninterface ActivePayload {\n id: string;\n content: ReactNode;\n shortcut?: string | null;\n placement: Placement;\n rect: () => DOMRect;\n}\n\ninterface Size {\n w: number;\n h: number;\n}\ninterface TargetBox extends Size {\n x: number;\n y: number;\n placement: Placement;\n}\ninterface RenderedBox extends TargetBox {\n bodyW: number;\n}\n\nconst OPEN_DELAY = 350;\nconst CLOSE_GRACE = 140;\nconst WARM_WINDOW = 300;\n\nconst TIP_GAP =\n typeof document !== 'undefined'\n ? parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--space-2')) || 8\n : 8;\n\n/* Store - what's showing, where; triggers write, the host renders. */\nconst store = {\n active: null as ActivePayload | null,\n closeTimer: 0 as ReturnType<typeof setTimeout> | 0,\n warmUntil: 0,\n listeners: new Set<() => void>(),\n get: () => store.active,\n subscribe(l: () => void) {\n store.listeners.add(l);\n return () => store.listeners.delete(l);\n },\n emit() {\n store.listeners.forEach((l) => l());\n },\n isWarm: () => store.active !== null || performance.now() < store.warmUntil,\n open(payload: ActivePayload) {\n clearTimeout(store.closeTimer);\n store.active = payload;\n store.emit();\n },\n close(id: string, grace = CLOSE_GRACE) {\n // graced; only the owning trigger can close\n clearTimeout(store.closeTimer);\n store.closeTimer = setTimeout(() => {\n if (store.active && store.active.id === id) store.closeNow();\n }, grace);\n },\n closeNow() {\n clearTimeout(store.closeTimer);\n if (!store.active) return;\n store.warmUntil = performance.now() + WARM_WINDOW;\n store.active = null;\n store.emit();\n },\n};\n\n/* Target box from the trigger rect + the measured content size; flips + clamps. */\nfunction targetBox(size: Size, t: DOMRect, want: Placement): TargetBox {\n const vw = window.innerWidth,\n vh = window.innerHeight,\n M = TIP_GAP;\n let p = want;\n if (p === 'top' && t.top - size.h - TIP_GAP < M) p = 'bottom';\n else if (p === 'bottom' && t.bottom + size.h + TIP_GAP > vh - M) p = 'top';\n else if (p === 'left' && t.left - size.w - TIP_GAP < M) p = 'right';\n else if (p === 'right' && t.right + size.w + TIP_GAP > vw - M) p = 'left';\n let x, y;\n if (p === 'top') {\n x = t.left + t.width / 2 - size.w / 2;\n y = t.top - size.h - TIP_GAP;\n } else if (p === 'bottom') {\n x = t.left + t.width / 2 - size.w / 2;\n y = t.bottom + TIP_GAP;\n } else if (p === 'left') {\n x = t.left - size.w - TIP_GAP;\n y = t.top + t.height / 2 - size.h / 2;\n } else {\n x = t.right + TIP_GAP;\n y = t.top + t.height / 2 - size.h / 2;\n }\n return {\n x: Math.round(Math.min(Math.max(x, M), vw - size.w - M)),\n y: Math.round(Math.min(Math.max(y, M), vh - size.h - M)),\n w: size.w,\n h: size.h,\n placement: p,\n };\n}\n\nconst fromEdge = (p: Placement) => ({\n // enter/exit offset toward the trigger\n x: p === 'left' ? 4 : p === 'right' ? -4 : 0,\n y: p === 'top' ? 4 : p === 'bottom' ? -4 : 0,\n});\n\nfunction Body({ a, width }: { a: ActivePayload; width?: number }) {\n return (\n <span className=\"tooltip__body\" style={width ? { width } : undefined}>\n {a.shortcut ? (\n <span className=\"tooltip__row\">\n <span>{a.content}</span>\n <kbd className=\"tooltip__shortcut\">{a.shortcut}</kbd>\n </span>\n ) : (\n a.content\n )}\n </span>\n );\n}\n\n/* Host - the one bubble + its hidden measuring twin. */\nfunction TooltipHost() {\n const active = useSyncExternalStore(store.subscribe, store.get);\n const measureRef = useRef<HTMLDivElement>(null);\n const [box, setBox] = useState<RenderedBox | null>(null);\n\n // Measure the clone before paint: box = its border box; bodyW locks the live body's wrapping to the clone's.\n useLayoutEffect(() => {\n if (!active) {\n setBox(null);\n return;\n }\n const r = measureRef.current.getBoundingClientRect();\n const b = (measureRef.current.firstChild as HTMLElement).getBoundingClientRect();\n setBox({\n ...targetBox(\n { w: Math.ceil(r.width), h: Math.ceil(r.height) },\n active.rect(),\n active.placement,\n ),\n bodyW: Math.ceil(b.width),\n });\n }, [active]);\n\n // Esc or any scroll dismisses (a stale hint is worse than none)\n useEffect(() => {\n if (!active) return undefined;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') store.closeNow();\n };\n const onScroll = () => store.closeNow();\n document.addEventListener('keydown', onKey);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('scroll', onScroll, true);\n };\n }, [active]);\n\n const off = box ? fromEdge(box.placement) : { x: 0, y: 0 };\n\n return ReactDOM.createPortal(\n <React.Fragment>\n {active && (\n <div className=\"tooltip tooltip--measure\" ref={measureRef} aria-hidden=\"true\">\n <Body a={active} />\n </div>\n )}\n <AnimatePresence>\n {active && box && (\n <motion.div\n key=\"tip\"\n className=\"tooltip\"\n id=\"scheduly-tooltip\"\n role=\"tooltip\"\n data-placement={box.placement}\n initial={{\n x: box.x + off.x,\n y: box.y + off.y,\n width: box.w,\n height: box.h,\n opacity: 0,\n scale: 0.96,\n }}\n animate={{ x: box.x, y: box.y, width: box.w, height: box.h, opacity: 1, scale: 1 }}\n exit={{\n x: box.x + off.x,\n y: box.y + off.y,\n opacity: 0,\n scale: 0.96,\n transition: { duration: SM.dur.fast, ease: SM.ease.exit },\n }}\n transition={{\n x: SM.t.layout,\n y: SM.t.layout,\n width: SM.t.layout,\n height: SM.t.layout,\n opacity: SM.t.enter,\n scale: SM.t.enter,\n }}\n >\n {/* one node keyed by trigger: old cuts, new fades in while the box travels (fixed width keeps wrapping stable) */}\n <motion.span\n key={active.id}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, transition: SM.t.enter }}\n >\n <Body a={active} width={box.bodyW} />\n </motion.span>\n </motion.div>\n )}\n </AnimatePresence>\n </React.Fragment>,\n document.body,\n );\n}\n\n// Mount the host exactly once, lazily, in its own root.\nlet hostMounted = false;\nfunction ensureHost() {\n if (hostMounted) return;\n hostMounted = true;\n const el = document.createElement('div');\n el.setAttribute('data-tooltip-host', '');\n document.body.appendChild(el);\n createRoot(el).render(<TooltipHost />);\n}\n\nconst chain = (theirs: ((e: any) => void) | undefined, mine: (e: any) => void) => (e: any) => {\n if (theirs) theirs(e);\n mine(e);\n};\n\n/* Trigger - reports to the store; default wraps the child in a display:contents anchor (any element, no ref), asChild clones instead. */\nexport interface TooltipProps {\n /** The hint - a string or small node; never interactive content. */\n content: ReactNode;\n /** Optional keyboard hint, rendered as mono metadata (\"⌘↩\", \"S\"). */\n shortcut?: string | null;\n /** Preferred side; flips automatically when out of viewport room. */\n placement?: Placement;\n /** Suppress the tooltip entirely (trigger renders untouched). */\n disabled?: boolean;\n /** ms before a cold hover shows; warm hovers + focus are instant. Default 350. */\n openDelay?: number;\n /** ms the bubble lingers after leaving (bridges moving to a neighbour). Default 140. */\n closeDelay?: number;\n /** Skip the wrapper - clone the child and merge handlers + ref onto it (child must take a ref). Default false. */\n asChild?: boolean;\n id?: string;\n /** Exactly one element; any element works by default, asChild requires one that accepts a ref. */\n children: ReactElement;\n}\n\nfunction Tooltip({\n content,\n shortcut = null,\n placement = 'top',\n disabled = false,\n openDelay = OPEN_DELAY,\n closeDelay = CLOSE_GRACE,\n asChild = false,\n id,\n children,\n}: TooltipProps) {\n const triggerRef = useRef<HTMLElement | null>(null);\n const wrapRef = useRef<HTMLSpanElement | null>(null);\n const openTimer = useRef<ReturnType<typeof setTimeout> | 0>(0);\n const myId = id || 'tip-' + useId();\n\n // The element we anchor to + set aria-describedby on (clone, or the wrapper's child).\n const anchorEl = (): HTMLElement | null =>\n asChild ? triggerRef.current : ((wrapRef.current?.firstElementChild as HTMLElement) ?? null);\n\n useEffect(\n () => () => {\n clearTimeout(openTimer.current);\n store.close(myId, 0);\n },\n [],\n ); // eslint-disable-line react-hooks/exhaustive-deps\n\n function show(immediate: boolean) {\n if (disabled) return;\n ensureHost();\n clearTimeout(openTimer.current);\n const el = anchorEl();\n if (!el) return;\n el.setAttribute('aria-describedby', 'scheduly-tooltip');\n const open = () =>\n store.open({\n id: myId,\n content,\n shortcut,\n placement,\n rect: () => anchorEl()!.getBoundingClientRect(),\n });\n if (immediate || store.isWarm()) open();\n else openTimer.current = setTimeout(open, openDelay);\n }\n function hide() {\n clearTimeout(openTimer.current);\n const el = anchorEl();\n if (el) el.removeAttribute('aria-describedby');\n store.close(myId, closeDelay);\n }\n\n const onEnter = (e: React.PointerEvent) => {\n if (e.pointerType !== 'touch') show(false);\n };\n const onFocusIn = (e: React.FocusEvent) => {\n if ((e.target as HTMLElement).matches(':focus-visible')) show(true);\n };\n\n // Default: a display:contents wrapper carries the listeners + rect; the child needs no ref.\n if (!asChild) {\n return (\n <span\n ref={wrapRef}\n className=\"tooltip-anchor\"\n onPointerEnter={onEnter}\n onPointerLeave={hide}\n onPointerDown={hide}\n onFocus={onFocusIn}\n onBlur={hide}\n >\n {children}\n </span>\n );\n }\n\n // asChild: clone the child, merging our handlers + ref (a press dismisses: activating != hinting).\n const child = React.Children.only(children) as ReactElement & { ref?: any };\n const childRef = child.ref;\n const childProps = child.props as any;\n return React.cloneElement(child, {\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof childRef === 'function') childRef(node);\n else if (childRef && typeof childRef === 'object') childRef.current = node;\n },\n onPointerEnter: chain(childProps.onPointerEnter, onEnter),\n onPointerLeave: chain(childProps.onPointerLeave, hide),\n onPointerDown: chain(childProps.onPointerDown, hide),\n onFocus: chain(childProps.onFocus, onFocusIn),\n onBlur: chain(childProps.onBlur, hide),\n } as any);\n}\n\nexport { Tooltip, TooltipHost };\n"]}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
'use client';import { parse, today, useGlide, grid, key, MONTHS, DOW, GlidePill, tzLabel, pad } from './chunk-UIQGSTBJ.js';
|
|
2
|
+
import { useControllable, FieldShell } from './chunk-QNC6O3PG.js';
|
|
3
|
+
import { Overlay } from './chunk-QFS52OK5.js';
|
|
4
|
+
import { Icon } from './chunk-KBWNUUWM.js';
|
|
5
|
+
import { UIMotion } from './chunk-37O2ZXD6.js';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { motion, animate } from 'motion/react';
|
|
8
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var { useState, useRef, useEffect, useId } = React;
|
|
11
|
+
var dtfMotion = motion;
|
|
12
|
+
var dtfAnimate = animate;
|
|
13
|
+
var dtfSM = UIMotion;
|
|
14
|
+
function dtfDisplay(key2) {
|
|
15
|
+
if (!key2) return null;
|
|
16
|
+
const d = parse(key2);
|
|
17
|
+
const mon = MONTHS[d.getMonth()].slice(0, 3);
|
|
18
|
+
const year = d.getFullYear() === (/* @__PURE__ */ new Date()).getFullYear() ? "" : ", " + d.getFullYear();
|
|
19
|
+
return mon + " " + pad(d.getDate()) + year;
|
|
20
|
+
}
|
|
21
|
+
function DtpPanel({ val, commit, min, max, timezone, label, close, slot }) {
|
|
22
|
+
const seed = val ? parse(val) : /* @__PURE__ */ new Date();
|
|
23
|
+
const [view, setView] = useState({
|
|
24
|
+
y: seed.getFullYear(),
|
|
25
|
+
m: seed.getMonth()
|
|
26
|
+
});
|
|
27
|
+
const [focusKey, setFocusKey] = useState(val || today());
|
|
28
|
+
const daysRef = useRef(null);
|
|
29
|
+
const prevViewRef = useRef(null);
|
|
30
|
+
const pendingFocusRef = useRef(false);
|
|
31
|
+
const uid = useId();
|
|
32
|
+
const pillId = "dtp-pill-" + uid;
|
|
33
|
+
const glide = useGlide(daysRef);
|
|
34
|
+
const inRange = (key2) => (!min || key2 >= min) && (!max || key2 <= max);
|
|
35
|
+
function pickDay(key2) {
|
|
36
|
+
if (!inRange(key2)) return;
|
|
37
|
+
pendingFocusRef.current = true;
|
|
38
|
+
setFocusKey(key2);
|
|
39
|
+
const d = parse(key2);
|
|
40
|
+
goToMonth(d.getFullYear(), d.getMonth());
|
|
41
|
+
commit(key2);
|
|
42
|
+
}
|
|
43
|
+
function goToMonth(y, m) {
|
|
44
|
+
setView((v) => v.y === y && v.m === m ? v : { y, m });
|
|
45
|
+
}
|
|
46
|
+
function nav(dir) {
|
|
47
|
+
const d = new Date(view.y, view.m + dir, 1);
|
|
48
|
+
goToMonth(d.getFullYear(), d.getMonth());
|
|
49
|
+
}
|
|
50
|
+
const dtfNow = /* @__PURE__ */ new Date();
|
|
51
|
+
const viewIsCurrent = view.y === dtfNow.getFullYear() && view.m === dtfNow.getMonth();
|
|
52
|
+
function goToToday() {
|
|
53
|
+
const key2 = today();
|
|
54
|
+
const d = parse(key2);
|
|
55
|
+
pendingFocusRef.current = true;
|
|
56
|
+
setFocusKey(key2);
|
|
57
|
+
goToMonth(d.getFullYear(), d.getMonth());
|
|
58
|
+
}
|
|
59
|
+
const viewIdx = view.y * 12 + view.m;
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
const prev = prevViewRef.current;
|
|
62
|
+
prevViewRef.current = viewIdx;
|
|
63
|
+
const el = daysRef.current;
|
|
64
|
+
if (prev == null || prev === viewIdx || !el) return;
|
|
65
|
+
const dir = viewIdx > prev ? 1 : -1;
|
|
66
|
+
dtfAnimate(
|
|
67
|
+
el,
|
|
68
|
+
{ x: [dir * 16, 0], opacity: [0, 1] },
|
|
69
|
+
{ duration: dtfSM.t.enter.duration, ease: dtfSM.t.enter.ease }
|
|
70
|
+
);
|
|
71
|
+
}, [viewIdx]);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
const el = daysRef.current;
|
|
74
|
+
if (!el) return;
|
|
75
|
+
const btn = el.querySelector('[tabindex="0"]:not(:disabled)') || el.querySelector(".dtp__day:not(:disabled)");
|
|
76
|
+
if (btn) btn.focus({ preventScroll: true });
|
|
77
|
+
}, []);
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (!pendingFocusRef.current || !daysRef.current) return;
|
|
80
|
+
pendingFocusRef.current = false;
|
|
81
|
+
const btn = daysRef.current.querySelector('[data-key="' + focusKey + '"]');
|
|
82
|
+
if (btn) btn.focus({ preventScroll: true });
|
|
83
|
+
}, [focusKey, viewIdx]);
|
|
84
|
+
function moveFocus(deltaDays, deltaMonths) {
|
|
85
|
+
const d = parse(focusKey);
|
|
86
|
+
if (deltaMonths) d.setMonth(d.getMonth() + deltaMonths);
|
|
87
|
+
if (deltaDays) d.setDate(d.getDate() + deltaDays);
|
|
88
|
+
const key2 = key(d);
|
|
89
|
+
pendingFocusRef.current = true;
|
|
90
|
+
setFocusKey(key2);
|
|
91
|
+
goToMonth(d.getFullYear(), d.getMonth());
|
|
92
|
+
}
|
|
93
|
+
function onGridKeyDown(e) {
|
|
94
|
+
const k = e.key;
|
|
95
|
+
if (k === "ArrowLeft") moveFocus(-1, 0);
|
|
96
|
+
else if (k === "ArrowRight") moveFocus(1, 0);
|
|
97
|
+
else if (k === "ArrowUp") moveFocus(-7, 0);
|
|
98
|
+
else if (k === "ArrowDown") moveFocus(7, 0);
|
|
99
|
+
else if (k === "PageUp") moveFocus(0, -1);
|
|
100
|
+
else if (k === "PageDown") moveFocus(0, 1);
|
|
101
|
+
else if (k === "Home") moveFocus(-((parse(focusKey).getDay() + 6) % 7), 0);
|
|
102
|
+
else if (k === "End") moveFocus(6 - (parse(focusKey).getDay() + 6) % 7, 0);
|
|
103
|
+
else if (k === "Enter" || k === " ") pickDay(focusKey);
|
|
104
|
+
else return;
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
}
|
|
107
|
+
const days = grid(view.y, view.m);
|
|
108
|
+
const todayKey = today();
|
|
109
|
+
const selKey = val || null;
|
|
110
|
+
const gridKeys = days.map(key);
|
|
111
|
+
const tabKey = gridKeys.indexOf(focusKey) >= 0 ? focusKey : selKey && gridKeys.indexOf(selKey) >= 0 ? selKey : gridKeys.indexOf(todayKey) >= 0 ? todayKey : key(new Date(view.y, view.m, 1));
|
|
112
|
+
const prevEnd = key(new Date(view.y, view.m, 0));
|
|
113
|
+
const nextStart = key(new Date(view.y, view.m + 1, 1));
|
|
114
|
+
const canPrev = !min || prevEnd >= min;
|
|
115
|
+
const canNext = !max || nextStart <= max;
|
|
116
|
+
const weeks = [];
|
|
117
|
+
for (let w = 0; w < 6; w++) weeks.push(days.slice(w * 7, w * 7 + 7));
|
|
118
|
+
return /* @__PURE__ */ jsxs("div", { className: "dtp", role: "dialog", "aria-label": label || "Pick a date", children: [
|
|
119
|
+
/* @__PURE__ */ jsxs("div", { className: "dtp__cal", children: [
|
|
120
|
+
/* @__PURE__ */ jsxs("div", { className: "dtp__head", children: [
|
|
121
|
+
/* @__PURE__ */ jsxs("span", { className: "dtp__month", "aria-live": "polite", children: [
|
|
122
|
+
MONTHS[view.m],
|
|
123
|
+
" ",
|
|
124
|
+
/* @__PURE__ */ jsx("span", { className: "dtp__year", children: view.y })
|
|
125
|
+
] }),
|
|
126
|
+
/* @__PURE__ */ jsxs("div", { className: "dtp__navs", children: [
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
"button",
|
|
129
|
+
{
|
|
130
|
+
type: "button",
|
|
131
|
+
className: "dtp__nav",
|
|
132
|
+
"aria-label": "Previous month",
|
|
133
|
+
disabled: !canPrev,
|
|
134
|
+
onClick: () => nav(-1),
|
|
135
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "caret-left", size: "sm" })
|
|
136
|
+
}
|
|
137
|
+
),
|
|
138
|
+
/* @__PURE__ */ jsx(
|
|
139
|
+
"button",
|
|
140
|
+
{
|
|
141
|
+
type: "button",
|
|
142
|
+
className: "dtp__nav",
|
|
143
|
+
"aria-label": "Go to today",
|
|
144
|
+
disabled: viewIsCurrent,
|
|
145
|
+
onClick: goToToday,
|
|
146
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "calendar-dot", size: "sm" })
|
|
147
|
+
}
|
|
148
|
+
),
|
|
149
|
+
/* @__PURE__ */ jsx(
|
|
150
|
+
"button",
|
|
151
|
+
{
|
|
152
|
+
type: "button",
|
|
153
|
+
className: "dtp__nav",
|
|
154
|
+
"aria-label": "Next month",
|
|
155
|
+
disabled: !canNext,
|
|
156
|
+
onClick: () => nav(1),
|
|
157
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "caret-right", size: "sm" })
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
] })
|
|
161
|
+
] }),
|
|
162
|
+
/* @__PURE__ */ jsx("div", { className: "dtp__dow", "aria-hidden": "true", children: DOW.map((d) => /* @__PURE__ */ jsx("span", { children: d }, d)) }),
|
|
163
|
+
/* @__PURE__ */ jsxs(
|
|
164
|
+
"div",
|
|
165
|
+
{
|
|
166
|
+
className: "dtp__days",
|
|
167
|
+
ref: daysRef,
|
|
168
|
+
role: "grid",
|
|
169
|
+
"aria-label": "Calendar",
|
|
170
|
+
onKeyDown: onGridKeyDown,
|
|
171
|
+
onPointerLeave: glide.leave,
|
|
172
|
+
children: [
|
|
173
|
+
weeks.map((week, wi) => /* @__PURE__ */ jsx("div", { role: "row", className: "dtp__row", children: week.map((d) => {
|
|
174
|
+
const key2 = key(d);
|
|
175
|
+
const out = d.getMonth() !== view.m;
|
|
176
|
+
const sel = key2 === selKey;
|
|
177
|
+
const cls = [
|
|
178
|
+
"dtp__day",
|
|
179
|
+
out ? "is-out" : "",
|
|
180
|
+
sel ? "is-selected" : "",
|
|
181
|
+
key2 === todayKey ? "is-today" : ""
|
|
182
|
+
].filter(Boolean).join(" ");
|
|
183
|
+
return /* @__PURE__ */ jsxs(
|
|
184
|
+
"button",
|
|
185
|
+
{
|
|
186
|
+
type: "button",
|
|
187
|
+
role: "gridcell",
|
|
188
|
+
"data-key": key2,
|
|
189
|
+
className: cls,
|
|
190
|
+
disabled: !inRange(key2),
|
|
191
|
+
tabIndex: key2 === tabKey ? 0 : -1,
|
|
192
|
+
"aria-selected": sel || void 0,
|
|
193
|
+
"aria-label": MONTHS[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear(),
|
|
194
|
+
onClick: () => pickDay(key2),
|
|
195
|
+
onPointerEnter: (e) => glide.enter(e.currentTarget),
|
|
196
|
+
children: [
|
|
197
|
+
sel ? /* @__PURE__ */ jsx(
|
|
198
|
+
dtfMotion.span,
|
|
199
|
+
{
|
|
200
|
+
className: "dtp__pill",
|
|
201
|
+
layoutId: pillId,
|
|
202
|
+
transition: dtfSM.t.settle,
|
|
203
|
+
"aria-hidden": "true"
|
|
204
|
+
}
|
|
205
|
+
) : null,
|
|
206
|
+
/* @__PURE__ */ jsx("span", { className: "dtp__num", children: d.getDate() }),
|
|
207
|
+
key2 === todayKey ? /* @__PURE__ */ jsx("span", { className: "dtp__dot", "aria-hidden": "true" }) : null
|
|
208
|
+
]
|
|
209
|
+
},
|
|
210
|
+
key2
|
|
211
|
+
);
|
|
212
|
+
}) }, wi)),
|
|
213
|
+
/* @__PURE__ */ jsx(GlidePill, { className: "dtp__hover", rect: glide.rect, active: glide.active })
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
)
|
|
217
|
+
] }),
|
|
218
|
+
slot || null,
|
|
219
|
+
/* @__PURE__ */ jsxs("div", { className: "dtp__foot", children: [
|
|
220
|
+
timezone ? /* @__PURE__ */ jsx("span", { className: "dtp__tz", children: tzLabel(timezone, selKey) }) : null,
|
|
221
|
+
/* @__PURE__ */ jsx("span", { className: "dtp__footSpacer" }),
|
|
222
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "btn btn--primary btn--sm", onClick: close, children: "Done" })
|
|
223
|
+
] })
|
|
224
|
+
] });
|
|
225
|
+
}
|
|
226
|
+
function DateField({
|
|
227
|
+
value,
|
|
228
|
+
defaultValue = null,
|
|
229
|
+
onChange,
|
|
230
|
+
label,
|
|
231
|
+
placeholder = "Pick a date",
|
|
232
|
+
timezone,
|
|
233
|
+
min,
|
|
234
|
+
max,
|
|
235
|
+
required = false,
|
|
236
|
+
invalid = false,
|
|
237
|
+
message,
|
|
238
|
+
disabled = false,
|
|
239
|
+
className = ""
|
|
240
|
+
}) {
|
|
241
|
+
const [val, commit] = useControllable(value, defaultValue, onChange);
|
|
242
|
+
const display = dtfDisplay(val);
|
|
243
|
+
const trigger = /* @__PURE__ */ jsx("button", { type: "button", className: "fld__input dtf__trigger", disabled, children: display ? /* @__PURE__ */ jsx("span", { className: "dtf__value", children: display }) : /* @__PURE__ */ jsx("span", { className: "dtf__placeholder", children: placeholder }) });
|
|
244
|
+
return /* @__PURE__ */ jsx(
|
|
245
|
+
FieldShell,
|
|
246
|
+
{
|
|
247
|
+
variant: "dtf",
|
|
248
|
+
label,
|
|
249
|
+
required,
|
|
250
|
+
invalid,
|
|
251
|
+
message,
|
|
252
|
+
icon: "calendar",
|
|
253
|
+
className,
|
|
254
|
+
children: /* @__PURE__ */ jsx(Overlay, { trigger, side: "bottom", align: "start", children: (api) => /* @__PURE__ */ jsx(
|
|
255
|
+
DtpPanel,
|
|
256
|
+
{
|
|
257
|
+
val,
|
|
258
|
+
commit,
|
|
259
|
+
close: api.close,
|
|
260
|
+
min,
|
|
261
|
+
max,
|
|
262
|
+
timezone,
|
|
263
|
+
label
|
|
264
|
+
}
|
|
265
|
+
) })
|
|
266
|
+
}
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export { DateField, DtpPanel };
|
|
271
|
+
//# sourceMappingURL=chunk-CV2Q4YXX.js.map
|
|
272
|
+
//# sourceMappingURL=chunk-CV2Q4YXX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/date-picker/DateField.tsx"],"names":["key"],"mappings":"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","file":"chunk-CV2Q4YXX.js","sourcesContent":["'use client';\n\n/* DateField - opinionated single-date picker: a .fld trigger opens a month-calendar popover, commit is live on day pick. */\n\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport { motion, animate } from 'motion/react';\nimport { UIMotion } from '../../tokens/motion-tokens';\nimport { Icon } from '../icon/Icon';\nimport { Overlay } from '../overlay/Overlay';\nimport { FieldShell, useControllable } from './field-shell';\nimport { GlidePill, useGlide } from './glide-pill';\nimport {\n MONTHS as DTF_MONTHS,\n DOW as DTF_DOW,\n pad as dtfPad,\n key as dtfKey,\n parse as dtfParse,\n today as dtfToday,\n grid as dtfGrid,\n tzLabel as dtfTzLabel,\n} from './date-utils';\n\nconst { useState, useRef, useEffect, useId } = React;\nconst dtfMotion = motion;\nconst dtfAnimate = animate;\nconst dtfSM = UIMotion;\n\n/* 'Jun 12' (year only when it isn't the current one) */\nfunction dtfDisplay(key: string | null): string | null {\n if (!key) return null;\n const d = dtfParse(key);\n const mon = DTF_MONTHS[d.getMonth()].slice(0, 3);\n const year = d.getFullYear() === new Date().getFullYear() ? '' : ', ' + d.getFullYear();\n return mon + ' ' + dtfPad(d.getDate()) + year;\n}\n\nexport interface DtpPanelProps {\n val: string | null;\n commit: (key: string) => void;\n min?: string;\n max?: string;\n timezone?: string;\n label?: string;\n close: () => void;\n slot?: ReactNode;\n}\n\n/* the popover panel, mounted only while open - owns view + roving focus, so each open starts at the picked month. */\nexport function DtpPanel({ val, commit, min, max, timezone, label, close, slot }: DtpPanelProps) {\n const seed = val ? dtfParse(val) : new Date();\n const [view, setView] = useState<{ y: number; m: number }>({\n y: seed.getFullYear(),\n m: seed.getMonth(),\n });\n const [focusKey, setFocusKey] = useState<string>(val || dtfToday());\n\n const daysRef = useRef<HTMLDivElement>(null);\n const prevViewRef = useRef<number | null>(null);\n const pendingFocusRef = useRef(false);\n const uid = useId();\n const pillId = 'dtp-pill-' + uid;\n\n /* gliding hover: one persistent pill that travels to the hovered cell (see glide-pill). */\n const glide = useGlide(daysRef);\n\n const inRange = (key: string): boolean => (!min || key >= min) && (!max || key <= max);\n\n function pickDay(key: string) {\n if (!inRange(key)) return;\n pendingFocusRef.current = true;\n setFocusKey(key);\n const d = dtfParse(key);\n goToMonth(d.getFullYear(), d.getMonth());\n commit(key);\n }\n\n function goToMonth(y: number, m: number) {\n setView((v) => (v.y === y && v.m === m ? v : { y: y, m: m }));\n }\n function nav(dir: number) {\n const d = new Date(view.y, view.m + dir, 1);\n goToMonth(d.getFullYear(), d.getMonth());\n }\n /* today-jump is navigation, not commit: slides home + focuses today; disabled while viewing the current month. */\n const dtfNow = new Date();\n const viewIsCurrent = view.y === dtfNow.getFullYear() && view.m === dtfNow.getMonth();\n function goToToday() {\n const key = dtfToday();\n const d = dtfParse(key);\n pendingFocusRef.current = true;\n setFocusKey(key);\n goToMonth(d.getFullYear(), d.getMonth());\n }\n const viewIdx = view.y * 12 + view.m;\n useEffect(() => {\n const prev = prevViewRef.current;\n prevViewRef.current = viewIdx;\n const el = daysRef.current;\n if (prev == null || prev === viewIdx || !el) return;\n const dir = viewIdx > prev ? 1 : -1;\n dtfAnimate(\n el,\n { x: [dir * 16, 0], opacity: [0, 1] },\n { duration: dtfSM.t.enter.duration, ease: dtfSM.t.enter.ease },\n );\n }, [viewIdx]);\n\n /* seed focus into the grid on open - the panel portals to <body>, unreachable from the trigger otherwise. */\n useEffect(() => {\n const el = daysRef.current;\n if (!el) return;\n const btn =\n el.querySelector('[tabindex=\"0\"]:not(:disabled)') ||\n el.querySelector('.dtp__day:not(:disabled)');\n if (btn) (btn as HTMLElement).focus({ preventScroll: true });\n }, []);\n\n /* focus follows keyboard travel across month boundaries */\n useEffect(() => {\n if (!pendingFocusRef.current || !daysRef.current) return;\n pendingFocusRef.current = false;\n const btn = daysRef.current.querySelector('[data-key=\"' + focusKey + '\"]');\n if (btn) (btn as HTMLElement).focus({ preventScroll: true });\n }, [focusKey, viewIdx]);\n\n function moveFocus(deltaDays: number, deltaMonths: number) {\n const d = dtfParse(focusKey);\n if (deltaMonths) d.setMonth(d.getMonth() + deltaMonths);\n if (deltaDays) d.setDate(d.getDate() + deltaDays);\n const key = dtfKey(d);\n pendingFocusRef.current = true;\n setFocusKey(key);\n goToMonth(d.getFullYear(), d.getMonth());\n }\n function onGridKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n const k = e.key;\n if (k === 'ArrowLeft') moveFocus(-1, 0);\n else if (k === 'ArrowRight') moveFocus(1, 0);\n else if (k === 'ArrowUp') moveFocus(-7, 0);\n else if (k === 'ArrowDown') moveFocus(7, 0);\n else if (k === 'PageUp') moveFocus(0, -1);\n else if (k === 'PageDown') moveFocus(0, 1);\n else if (k === 'Home') moveFocus(-((dtfParse(focusKey).getDay() + 6) % 7), 0);\n else if (k === 'End') moveFocus(6 - ((dtfParse(focusKey).getDay() + 6) % 7), 0);\n else if (k === 'Enter' || k === ' ') pickDay(focusKey);\n else return;\n e.preventDefault();\n }\n\n const days = dtfGrid(view.y, view.m);\n const todayKey = dtfToday();\n const selKey = val || null;\n const gridKeys = days.map(dtfKey);\n const tabKey =\n gridKeys.indexOf(focusKey) >= 0\n ? focusKey\n : selKey && gridKeys.indexOf(selKey) >= 0\n ? selKey\n : gridKeys.indexOf(todayKey) >= 0\n ? todayKey\n : dtfKey(new Date(view.y, view.m, 1));\n\n const prevEnd = dtfKey(new Date(view.y, view.m, 0));\n const nextStart = dtfKey(new Date(view.y, view.m + 1, 1));\n const canPrev = !min || prevEnd >= min;\n const canNext = !max || nextStart <= max;\n\n const weeks: Date[][] = [];\n for (let w = 0; w < 6; w++) weeks.push(days.slice(w * 7, w * 7 + 7));\n\n return (\n <div className=\"dtp\" role=\"dialog\" aria-label={label || 'Pick a date'}>\n <div className=\"dtp__cal\">\n <div className=\"dtp__head\">\n <span className=\"dtp__month\" aria-live=\"polite\">\n {DTF_MONTHS[view.m]} <span className=\"dtp__year\">{view.y}</span>\n </span>\n <div className=\"dtp__navs\">\n <button\n type=\"button\"\n className=\"dtp__nav\"\n aria-label=\"Previous month\"\n disabled={!canPrev}\n onClick={() => nav(-1)}\n >\n <Icon name=\"caret-left\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n className=\"dtp__nav\"\n aria-label=\"Go to today\"\n disabled={viewIsCurrent}\n onClick={goToToday}\n >\n <Icon name=\"calendar-dot\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n className=\"dtp__nav\"\n aria-label=\"Next month\"\n disabled={!canNext}\n onClick={() => nav(1)}\n >\n <Icon name=\"caret-right\" size=\"sm\" />\n </button>\n </div>\n </div>\n <div className=\"dtp__dow\" aria-hidden=\"true\">\n {DTF_DOW.map((d) => (\n <span key={d}>{d}</span>\n ))}\n </div>\n <div\n className=\"dtp__days\"\n ref={daysRef}\n role=\"grid\"\n aria-label=\"Calendar\"\n onKeyDown={onGridKeyDown}\n onPointerLeave={glide.leave}\n >\n {weeks.map((week, wi) => (\n <div key={wi} role=\"row\" className=\"dtp__row\">\n {week.map((d) => {\n const key = dtfKey(d);\n const out = d.getMonth() !== view.m;\n const sel = key === selKey;\n const cls = [\n 'dtp__day',\n out ? 'is-out' : '',\n sel ? 'is-selected' : '',\n key === todayKey ? 'is-today' : '',\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <button\n key={key}\n type=\"button\"\n role=\"gridcell\"\n data-key={key}\n className={cls}\n disabled={!inRange(key)}\n tabIndex={key === tabKey ? 0 : -1}\n aria-selected={sel || undefined}\n aria-label={\n DTF_MONTHS[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear()\n }\n onClick={() => pickDay(key)}\n onPointerEnter={(e) => glide.enter(e.currentTarget)}\n >\n {sel ? (\n <dtfMotion.span\n className=\"dtp__pill\"\n layoutId={pillId}\n transition={dtfSM.t.settle}\n aria-hidden=\"true\"\n ></dtfMotion.span>\n ) : null}\n <span className=\"dtp__num\">{d.getDate()}</span>\n {key === todayKey ? (\n <span className=\"dtp__dot\" aria-hidden=\"true\"></span>\n ) : null}\n </button>\n );\n })}\n </div>\n ))}\n <GlidePill className=\"dtp__hover\" rect={glide.rect} active={glide.active} />\n </div>\n </div>\n\n {slot || null}\n\n <div className=\"dtp__foot\">\n {timezone ? <span className=\"dtp__tz\">{dtfTzLabel(timezone, selKey)}</span> : null}\n <span className=\"dtp__footSpacer\"></span>\n <button type=\"button\" className=\"btn btn--primary btn--sm\" onClick={close}>\n Done\n </button>\n </div>\n </div>\n );\n}\n\nexport interface DateFieldProps {\n /** Controlled value, 'YYYY-MM-DD'. */\n value?: string | null;\n defaultValue?: string | null;\n onChange?: (value: string) => void;\n label?: string;\n placeholder?: string;\n /** IANA timezone name (e.g. 'Europe/Riga') - display context only, shown with its GMT offset in the footer. */\n timezone?: string;\n /** Earliest pickable date, 'YYYY-MM-DD', inclusive. */\n min?: string;\n /** Latest pickable date, 'YYYY-MM-DD', inclusive. */\n max?: string;\n /** Asterisk on the label. */\n required?: boolean;\n /** Danger border + message color (.fld is-error). */\n invalid?: boolean;\n /** Helper / error text under the field. */\n message?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function DateField({\n value,\n defaultValue = null,\n onChange,\n label,\n placeholder = 'Pick a date',\n timezone,\n min,\n max,\n required = false,\n invalid = false,\n message,\n disabled = false,\n className = '',\n}: DateFieldProps) {\n const [val, commit] = useControllable(value, defaultValue, onChange);\n const display = dtfDisplay(val);\n\n const trigger = (\n <button type=\"button\" className=\"fld__input dtf__trigger\" disabled={disabled}>\n {display ? (\n <span className=\"dtf__value\">{display}</span>\n ) : (\n <span className=\"dtf__placeholder\">{placeholder}</span>\n )}\n </button>\n );\n\n return (\n <FieldShell\n variant=\"dtf\"\n label={label}\n required={required}\n invalid={invalid}\n message={message}\n icon=\"calendar\"\n className={className}\n >\n <Overlay trigger={trigger} side=\"bottom\" align=\"start\">\n {(api) => (\n <DtpPanel\n val={val}\n commit={commit}\n close={api.close}\n min={min}\n max={max}\n timezone={timezone}\n label={label}\n />\n )}\n </Overlay>\n </FieldShell>\n );\n}\n"]}
|