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,310 @@
|
|
|
1
|
+
'use client';import { UIToast } from './chunk-PUPZ4HME.js';
|
|
2
|
+
import { Icon } from './chunk-KBWNUUWM.js';
|
|
3
|
+
import { UIMotion } from './chunk-37O2ZXD6.js';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { createPortal } from 'react-dom';
|
|
6
|
+
import { createRoot } from 'react-dom/client';
|
|
7
|
+
import { AnimatePresence, useMotionValue, motion, animate } from 'motion/react';
|
|
8
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var SM = UIMotion;
|
|
11
|
+
var store = UIToast;
|
|
12
|
+
var { useRef, useEffect, useLayoutEffect, useState, useSyncExternalStore } = React;
|
|
13
|
+
var VISIBLE = 3;
|
|
14
|
+
var COLLAPSE_GRACE = 140;
|
|
15
|
+
var SWIPE_X = 64;
|
|
16
|
+
var SWIPE_V = 480;
|
|
17
|
+
var GAP = 0;
|
|
18
|
+
function stackGap() {
|
|
19
|
+
if (GAP) return GAP;
|
|
20
|
+
const cs = getComputedStyle(document.documentElement);
|
|
21
|
+
const raw = cs.getPropertyValue("--space-3").trim();
|
|
22
|
+
const n = parseFloat(raw) || 0;
|
|
23
|
+
GAP = (raw.endsWith("rem") ? n * (parseFloat(cs.fontSize) || 16) : n) || 12;
|
|
24
|
+
return GAP;
|
|
25
|
+
}
|
|
26
|
+
var TONE_ICON = {
|
|
27
|
+
success: "check-circle",
|
|
28
|
+
error: "warning-circle",
|
|
29
|
+
warning: "warning",
|
|
30
|
+
info: "info"
|
|
31
|
+
};
|
|
32
|
+
function useToneGesture(tone, ref, x) {
|
|
33
|
+
const prevTone = useRef(null);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
const prev = prevTone.current;
|
|
36
|
+
prevTone.current = tone;
|
|
37
|
+
if (tone === prev) return;
|
|
38
|
+
if (tone === "success") {
|
|
39
|
+
const el = ref.current;
|
|
40
|
+
el.classList.remove("glass-glint");
|
|
41
|
+
void el.offsetWidth;
|
|
42
|
+
el.classList.add("glass-glint");
|
|
43
|
+
const id = setTimeout(() => el.classList.remove("glass-glint"), SM.dur.slow * 1e3 + 80);
|
|
44
|
+
return () => clearTimeout(id);
|
|
45
|
+
}
|
|
46
|
+
if (tone === "error") {
|
|
47
|
+
const fall = animate(x, [0, -7, 5, -2, 0], {
|
|
48
|
+
duration: SM.dur.slow,
|
|
49
|
+
ease: SM.ease.standard,
|
|
50
|
+
delay: SM.dur.base
|
|
51
|
+
});
|
|
52
|
+
return () => fall.stop();
|
|
53
|
+
}
|
|
54
|
+
}, [tone]);
|
|
55
|
+
}
|
|
56
|
+
function ToastItem({
|
|
57
|
+
t,
|
|
58
|
+
depth,
|
|
59
|
+
offset,
|
|
60
|
+
hidden,
|
|
61
|
+
behind,
|
|
62
|
+
frameHeight,
|
|
63
|
+
onHeight
|
|
64
|
+
}) {
|
|
65
|
+
const ref = useRef(null);
|
|
66
|
+
const x = useMotionValue(0);
|
|
67
|
+
useToneGesture(t.tone, ref, x);
|
|
68
|
+
useLayoutEffect(() => {
|
|
69
|
+
if (ref.current && ref.current.firstElementChild)
|
|
70
|
+
onHeight(t.id, ref.current.firstElementChild.offsetHeight);
|
|
71
|
+
});
|
|
72
|
+
const swipe = (_e, info) => {
|
|
73
|
+
if (info.offset.x > SWIPE_X || info.velocity.x > SWIPE_V) {
|
|
74
|
+
animate(x, 420, { duration: SM.dur.fast, ease: SM.ease.exit }).then(
|
|
75
|
+
() => store.dismiss(t.id)
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
return /* @__PURE__ */ jsx(
|
|
80
|
+
motion.li,
|
|
81
|
+
{
|
|
82
|
+
ref,
|
|
83
|
+
className: "toast glass",
|
|
84
|
+
"data-tone": t.tone,
|
|
85
|
+
"data-behind": behind ? "" : void 0,
|
|
86
|
+
role: t.tone === "error" ? "alert" : "status",
|
|
87
|
+
"aria-atomic": "true",
|
|
88
|
+
style: { x },
|
|
89
|
+
initial: { opacity: 0, y: 24, scale: 0.97 },
|
|
90
|
+
animate: {
|
|
91
|
+
opacity: hidden ? 0 : 1,
|
|
92
|
+
y: -offset,
|
|
93
|
+
scale: 1 - depth * 0.05,
|
|
94
|
+
/* behind-cards adopt the front card's frame height (content faded) so a short card never drowns behind a tall one */
|
|
95
|
+
height: frameHeight || "auto",
|
|
96
|
+
pointerEvents: hidden ? "none" : "auto"
|
|
97
|
+
},
|
|
98
|
+
exit: { opacity: 0, scale: 0.96, transition: { duration: SM.dur.fast, ease: SM.ease.exit } },
|
|
99
|
+
transition: { y: SM.t.settle, scale: SM.t.settle, height: SM.t.settle, opacity: SM.t.enter },
|
|
100
|
+
drag: t.dismissible ? "x" : false,
|
|
101
|
+
dragConstraints: { left: 0, right: 0 },
|
|
102
|
+
dragElastic: { left: 0.04, right: 0.9 },
|
|
103
|
+
dragMomentum: false,
|
|
104
|
+
onDragEnd: swipe,
|
|
105
|
+
onKeyDown: (e) => {
|
|
106
|
+
if (e.key === "Escape" && t.dismissible) store.dismiss(t.id);
|
|
107
|
+
},
|
|
108
|
+
children: t.node ? /* @__PURE__ */ jsx("div", { className: "toast__custom", children: t.node }) : /* @__PURE__ */ jsx(ToastBody, { t })
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
function ToastBody({ t }) {
|
|
113
|
+
return /* @__PURE__ */ jsxs("div", { className: "toast__inner", children: [
|
|
114
|
+
(t.tone !== "default" || isFinite(t.duration)) && /* @__PURE__ */ jsxs("span", { className: "toast__icon", children: [
|
|
115
|
+
t.tone !== "default" && /* keyed remount (not nested AnimatePresence): old glyph cuts, new springs in */
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
motion.span,
|
|
118
|
+
{
|
|
119
|
+
className: "toast__icon-glyph",
|
|
120
|
+
initial: { scale: 0.5, opacity: 0 },
|
|
121
|
+
animate: { scale: 1, opacity: 1 },
|
|
122
|
+
transition: { scale: SM.t.settle, opacity: SM.t.enter },
|
|
123
|
+
children: t.tone === "loading" ? /* @__PURE__ */ jsx("span", { className: "toast__spinner", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Icon, { name: TONE_ICON[t.tone], weight: "fill" })
|
|
124
|
+
},
|
|
125
|
+
t.tone
|
|
126
|
+
),
|
|
127
|
+
isFinite(t.duration) && /* the ring - keyed to the timer so a restart re-fills it; pathLength=1 makes dashoffset a fraction */
|
|
128
|
+
/* @__PURE__ */ jsxs(
|
|
129
|
+
"svg",
|
|
130
|
+
{
|
|
131
|
+
className: "toast__ring",
|
|
132
|
+
viewBox: "0 0 36 36",
|
|
133
|
+
"aria-hidden": "true",
|
|
134
|
+
children: [
|
|
135
|
+
/* @__PURE__ */ jsx("circle", { className: "toast__ring-track", cx: "18", cy: "18", r: "16.5" }),
|
|
136
|
+
/* @__PURE__ */ jsx(
|
|
137
|
+
"circle",
|
|
138
|
+
{
|
|
139
|
+
className: "toast__ring-arc",
|
|
140
|
+
cx: "18",
|
|
141
|
+
cy: "18",
|
|
142
|
+
r: "16.5",
|
|
143
|
+
pathLength: 1,
|
|
144
|
+
style: { animationDuration: t.duration + "ms" }
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
"ring-" + t.timerKey
|
|
150
|
+
)
|
|
151
|
+
] }),
|
|
152
|
+
/* @__PURE__ */ jsxs(
|
|
153
|
+
motion.div,
|
|
154
|
+
{
|
|
155
|
+
className: "toast__text",
|
|
156
|
+
initial: { opacity: 0 },
|
|
157
|
+
animate: { opacity: 1 },
|
|
158
|
+
transition: SM.t.enter,
|
|
159
|
+
children: [
|
|
160
|
+
/* @__PURE__ */ jsx("p", { className: "toast__message", children: t.message }),
|
|
161
|
+
t.description != null && /* @__PURE__ */ jsx("p", { className: "toast__desc", children: t.description })
|
|
162
|
+
]
|
|
163
|
+
},
|
|
164
|
+
String(t.message) + "-" + String(t.description)
|
|
165
|
+
),
|
|
166
|
+
t.count > 1 && /* @__PURE__ */ jsxs(
|
|
167
|
+
motion.span,
|
|
168
|
+
{
|
|
169
|
+
className: "toast__count",
|
|
170
|
+
initial: { scale: 0.6 },
|
|
171
|
+
animate: { scale: 1 },
|
|
172
|
+
transition: SM.t.settle,
|
|
173
|
+
children: [
|
|
174
|
+
"\xD7",
|
|
175
|
+
t.count
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
t.count
|
|
179
|
+
),
|
|
180
|
+
t.action && /* @__PURE__ */ jsx(
|
|
181
|
+
"button",
|
|
182
|
+
{
|
|
183
|
+
type: "button",
|
|
184
|
+
className: "btn btn--secondary btn--sm toast__action",
|
|
185
|
+
onClick: () => {
|
|
186
|
+
if (t.action.onClick) t.action.onClick();
|
|
187
|
+
store.dismiss(t.id);
|
|
188
|
+
},
|
|
189
|
+
children: t.action.label
|
|
190
|
+
}
|
|
191
|
+
),
|
|
192
|
+
t.dismissible && /* @__PURE__ */ jsx(
|
|
193
|
+
"button",
|
|
194
|
+
{
|
|
195
|
+
type: "button",
|
|
196
|
+
className: "toast__close",
|
|
197
|
+
"aria-label": "Dismiss",
|
|
198
|
+
onClick: () => store.dismiss(t.id),
|
|
199
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "close", size: "sm" })
|
|
200
|
+
}
|
|
201
|
+
)
|
|
202
|
+
] });
|
|
203
|
+
}
|
|
204
|
+
function ToastHost() {
|
|
205
|
+
const { toasts, paused, expanded } = useSyncExternalStore(store.subscribe, store.get);
|
|
206
|
+
const [heights, setHeights] = useState({});
|
|
207
|
+
const collapseTimer = useRef(0);
|
|
208
|
+
const hovering = useRef(false);
|
|
209
|
+
const onHeight = (id, h) => setHeights((prev) => prev[id] === h ? prev : { ...prev, [id]: h });
|
|
210
|
+
const onHold = () => {
|
|
211
|
+
hovering.current = true;
|
|
212
|
+
clearTimeout(collapseTimer.current);
|
|
213
|
+
store.setExpanded(true);
|
|
214
|
+
store.pause();
|
|
215
|
+
};
|
|
216
|
+
const onRelease = (graced) => {
|
|
217
|
+
hovering.current = false;
|
|
218
|
+
clearTimeout(collapseTimer.current);
|
|
219
|
+
collapseTimer.current = setTimeout(
|
|
220
|
+
() => {
|
|
221
|
+
store.setExpanded(false);
|
|
222
|
+
store.resume();
|
|
223
|
+
},
|
|
224
|
+
graced ? COLLAPSE_GRACE : 0
|
|
225
|
+
);
|
|
226
|
+
};
|
|
227
|
+
useEffect(() => {
|
|
228
|
+
const onVis = () => {
|
|
229
|
+
if (document.hidden) store.pause();
|
|
230
|
+
else if (!hovering.current) store.resume();
|
|
231
|
+
};
|
|
232
|
+
document.addEventListener("visibilitychange", onVis);
|
|
233
|
+
return () => document.removeEventListener("visibilitychange", onVis);
|
|
234
|
+
}, []);
|
|
235
|
+
useEffect(() => {
|
|
236
|
+
if (toasts.length === 0) {
|
|
237
|
+
hovering.current = false;
|
|
238
|
+
clearTimeout(collapseTimer.current);
|
|
239
|
+
store.setExpanded(false);
|
|
240
|
+
store.resume();
|
|
241
|
+
}
|
|
242
|
+
}, [toasts.length]);
|
|
243
|
+
const slice = toasts.slice(-6);
|
|
244
|
+
const n = slice.length;
|
|
245
|
+
const frontH = n ? heights[slice[n - 1].id] || 0 : 0;
|
|
246
|
+
const gap = stackGap();
|
|
247
|
+
return createPortal(
|
|
248
|
+
/* @__PURE__ */ jsx(
|
|
249
|
+
"ol",
|
|
250
|
+
{
|
|
251
|
+
className: "toast-viewport" + (paused ? " is-paused" : ""),
|
|
252
|
+
"aria-label": "Notifications",
|
|
253
|
+
onPointerOver: (e) => {
|
|
254
|
+
if (e.pointerType !== "touch") onHold();
|
|
255
|
+
},
|
|
256
|
+
onPointerOut: (e) => {
|
|
257
|
+
if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget)) onRelease(true);
|
|
258
|
+
},
|
|
259
|
+
onFocus: onHold,
|
|
260
|
+
onBlur: (e) => {
|
|
261
|
+
if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget))
|
|
262
|
+
onRelease(false);
|
|
263
|
+
},
|
|
264
|
+
children: /* @__PURE__ */ jsx(AnimatePresence, { children: slice.map((t, i) => {
|
|
265
|
+
const depth = n - 1 - i;
|
|
266
|
+
let offset = depth * gap;
|
|
267
|
+
if (expanded) {
|
|
268
|
+
offset = 0;
|
|
269
|
+
for (let j = i + 1; j < n; j++) offset += (heights[slice[j].id] || 0) + gap;
|
|
270
|
+
}
|
|
271
|
+
return /* @__PURE__ */ jsx(
|
|
272
|
+
ToastItem,
|
|
273
|
+
{
|
|
274
|
+
t,
|
|
275
|
+
depth: expanded ? 0 : depth,
|
|
276
|
+
offset,
|
|
277
|
+
hidden: !expanded && depth >= VISIBLE,
|
|
278
|
+
behind: !expanded && depth > 0,
|
|
279
|
+
frameHeight: !expanded && depth > 0 && frontH ? frontH : null,
|
|
280
|
+
onHeight
|
|
281
|
+
},
|
|
282
|
+
t.id
|
|
283
|
+
);
|
|
284
|
+
}) })
|
|
285
|
+
}
|
|
286
|
+
),
|
|
287
|
+
document.body
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
var hostMounted = false;
|
|
291
|
+
function ensureToastHost() {
|
|
292
|
+
if (hostMounted) return;
|
|
293
|
+
hostMounted = true;
|
|
294
|
+
const el = document.createElement("div");
|
|
295
|
+
el.setAttribute("data-toast-host", "");
|
|
296
|
+
document.body.appendChild(el);
|
|
297
|
+
createRoot(el).render(/* @__PURE__ */ jsx(ToastHost, {}));
|
|
298
|
+
}
|
|
299
|
+
store.host = ensureToastHost;
|
|
300
|
+
if (store.toasts.length) ensureToastHost();
|
|
301
|
+
function Toaster() {
|
|
302
|
+
useEffect(() => {
|
|
303
|
+
ensureToastHost();
|
|
304
|
+
}, []);
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export { Toaster };
|
|
309
|
+
//# sourceMappingURL=chunk-NKGMQL6I.js.map
|
|
310
|
+
//# sourceMappingURL=chunk-NKGMQL6I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/toast/Toast.tsx"],"names":[],"mappings":"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","file":"chunk-NKGMQL6I.js","sourcesContent":["'use client';\n\n/* Toast - the React render layer (queue + clocks live in toast-store.ts). */\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\nimport { motion, AnimatePresence, animate, useMotionValue, type PanInfo } from 'motion/react';\nimport { UIMotion } from '../../tokens/motion-tokens';\nimport { Icon, type IconName } from '../icon/Icon';\nimport { UIToast, type ToastRecord, type ToastTone } from './toast-store';\n\nconst SM = UIMotion;\nconst store = UIToast;\nconst { useRef, useEffect, useLayoutEffect, useState, useSyncExternalStore } = React;\n\nconst VISIBLE = 3;\nconst RENDERED = 6;\nconst COLLAPSE_GRACE = 140;\nconst SWIPE_X = 64;\nconst SWIPE_V = 480;\n\n// expanded gap AND collapsed peek - read lazily (post-stylesheet), once\nlet GAP = 0;\nfunction stackGap() {\n if (GAP) return GAP;\n const cs = getComputedStyle(document.documentElement);\n const raw = cs.getPropertyValue('--space-3').trim();\n const n = parseFloat(raw) || 0;\n GAP = (raw.endsWith('rem') ? n * (parseFloat(cs.fontSize) || 16) : n) || 12;\n return GAP;\n}\n\nconst TONE_ICON: Record<string, IconName> = {\n success: 'check-circle',\n error: 'warning-circle',\n warning: 'warning',\n info: 'info',\n};\n\n/* useToneGesture - success glint, error headshake; the glint class is toggled with a reflow (remove - offsetWidth - add) to restart the one-shot. */\nfunction useToneGesture(\n tone: ToastTone,\n ref: React.RefObject<HTMLElement>,\n x: ReturnType<typeof useMotionValue<number>>,\n) {\n const prevTone = useRef<ToastTone | null>(null);\n useEffect(() => {\n const prev = prevTone.current;\n prevTone.current = tone;\n if (tone === prev) return;\n if (tone === 'success') {\n const el = ref.current;\n el.classList.remove('glass-glint');\n void el.offsetWidth;\n el.classList.add('glass-glint');\n const id = setTimeout(() => el.classList.remove('glass-glint'), SM.dur.slow * 1000 + 80);\n return () => clearTimeout(id);\n }\n if (tone === 'error') {\n const fall = animate(x, [0, -7, 5, -2, 0], {\n duration: SM.dur.slow,\n ease: SM.ease.standard,\n delay: SM.dur.base,\n });\n return () => fall.stop();\n }\n }, [tone]);\n}\n\nfunction ToastItem({\n t,\n depth,\n offset,\n hidden,\n behind,\n frameHeight,\n onHeight,\n}: {\n t: ToastRecord;\n depth: number;\n offset: number;\n hidden: boolean;\n behind: boolean;\n frameHeight: number | null;\n onHeight: (id: string, h: number) => void;\n}) {\n const ref = useRef<HTMLLIElement>(null);\n const x = useMotionValue(0); // swipe travel - ours, so dismissal can finish it\n useToneGesture(t.tone, ref, x);\n\n // report the CONTENT height (firstChild - the li's own height is animated, so it'd read mid-tween)\n useLayoutEffect(() => {\n if (ref.current && ref.current.firstElementChild)\n onHeight(t.id, (ref.current.firstElementChild as HTMLElement).offsetHeight);\n });\n\n const swipe = (_e: PointerEvent | MouseEvent | TouchEvent, info: PanInfo) => {\n if (info.offset.x > SWIPE_X || info.velocity.x > SWIPE_V) {\n // fling out the right edge, THEN remove - the exit fade plays where it landed, no snap-back\n animate(x, 420, { duration: SM.dur.fast, ease: SM.ease.exit }).then(() =>\n store.dismiss(t.id),\n );\n }\n };\n\n return (\n <motion.li\n ref={ref}\n className=\"toast glass\"\n data-tone={t.tone}\n data-behind={behind ? '' : undefined}\n role={t.tone === 'error' ? 'alert' : 'status'}\n aria-atomic=\"true\"\n style={{ x }}\n initial={{ opacity: 0, y: 24, scale: 0.97 }}\n animate={{\n opacity: hidden ? 0 : 1,\n y: -offset,\n scale: 1 - depth * 0.05,\n /* behind-cards adopt the front card's frame height (content faded) so a short card never drowns behind a tall one */\n height: frameHeight || 'auto',\n pointerEvents: hidden ? 'none' : 'auto',\n }}\n exit={{ opacity: 0, scale: 0.96, transition: { duration: SM.dur.fast, ease: SM.ease.exit } }}\n transition={{ y: SM.t.settle, scale: SM.t.settle, height: SM.t.settle, opacity: SM.t.enter }}\n drag={t.dismissible ? 'x' : false}\n dragConstraints={{ left: 0, right: 0 }}\n dragElastic={{ left: 0.04, right: 0.9 }}\n dragMomentum={false}\n onDragEnd={swipe}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && t.dismissible) store.dismiss(t.id);\n }}\n >\n {t.node ? (\n <div className=\"toast__custom\">{t.node as React.ReactNode}</div>\n ) : (\n <ToastBody t={t} />\n )}\n </motion.li>\n );\n}\n\nfunction ToastBody({ t }: { t: ToastRecord }) {\n return (\n <div className=\"toast__inner\">\n {(t.tone !== 'default' || isFinite(t.duration)) && (\n <span className=\"toast__icon\">\n {t.tone !== 'default' && (\n /* keyed remount (not nested AnimatePresence): old glyph cuts, new springs in */\n <motion.span\n key={t.tone}\n className=\"toast__icon-glyph\"\n initial={{ scale: 0.5, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ scale: SM.t.settle, opacity: SM.t.enter }}\n >\n {t.tone === 'loading' ? (\n <span className=\"toast__spinner\" aria-hidden=\"true\"></span>\n ) : (\n <Icon name={TONE_ICON[t.tone]} weight=\"fill\" />\n )}\n </motion.span>\n )}\n {isFinite(t.duration) && (\n /* the ring - keyed to the timer so a restart re-fills it; pathLength=1 makes dashoffset a fraction */\n <svg\n key={'ring-' + t.timerKey}\n className=\"toast__ring\"\n viewBox=\"0 0 36 36\"\n aria-hidden=\"true\"\n >\n <circle className=\"toast__ring-track\" cx=\"18\" cy=\"18\" r=\"16.5\"></circle>\n <circle\n className=\"toast__ring-arc\"\n cx=\"18\"\n cy=\"18\"\n r=\"16.5\"\n pathLength={1}\n style={{ animationDuration: t.duration + 'ms' }}\n ></circle>\n </svg>\n )}\n </span>\n )}\n <motion.div\n key={String(t.message) + '-' + String(t.description)}\n className=\"toast__text\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={SM.t.enter}\n >\n <p className=\"toast__message\">{t.message}</p>\n {t.description != null && <p className=\"toast__desc\">{t.description}</p>}\n </motion.div>\n {t.count > 1 && (\n <motion.span\n key={t.count}\n className=\"toast__count\"\n initial={{ scale: 0.6 }}\n animate={{ scale: 1 }}\n transition={SM.t.settle}\n >\n ×{t.count}\n </motion.span>\n )}\n {t.action && (\n <button\n type=\"button\"\n className=\"btn btn--secondary btn--sm toast__action\"\n onClick={() => {\n if (t.action.onClick) t.action.onClick();\n store.dismiss(t.id);\n }}\n >\n {t.action.label}\n </button>\n )}\n {t.dismissible && (\n <button\n type=\"button\"\n className=\"toast__close\"\n aria-label=\"Dismiss\"\n onClick={() => store.dismiss(t.id)}\n >\n <Icon name=\"close\" size=\"sm\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction ToastHost() {\n const { toasts, paused, expanded } = useSyncExternalStore(store.subscribe, store.get);\n const [heights, setHeights] = useState<Record<string, number>>({});\n const collapseTimer = useRef<ReturnType<typeof setTimeout> | 0>(0);\n const hovering = useRef(false);\n\n const onHeight = (id: string, h: number) =>\n setHeights((prev) => (prev[id] === h ? prev : { ...prev, [id]: h }));\n\n // hold = fan open + freeze clocks; release = graced fold + resume\n const onHold = () => {\n hovering.current = true;\n clearTimeout(collapseTimer.current);\n store.setExpanded(true);\n store.pause();\n };\n const onRelease = (graced: boolean) => {\n hovering.current = false;\n clearTimeout(collapseTimer.current);\n collapseTimer.current = setTimeout(\n () => {\n store.setExpanded(false);\n store.resume();\n },\n graced ? COLLAPSE_GRACE : 0,\n );\n };\n\n // tab hidden - freeze clocks, visible - resume (visibility, not window focus: an embedded preview blurs on outside clicks).\n useEffect(() => {\n const onVis = () => {\n if (document.hidden) store.pause();\n else if (!hovering.current) store.resume();\n };\n document.addEventListener('visibilitychange', onVis);\n return () => document.removeEventListener('visibilitychange', onVis);\n }, []);\n\n // safety net: last card removed under the cursor fires no pointerout, so release here\n useEffect(() => {\n if (toasts.length === 0) {\n hovering.current = false;\n clearTimeout(collapseTimer.current);\n store.setExpanded(false);\n store.resume();\n }\n }, [toasts.length]);\n\n const slice = toasts.slice(-RENDERED);\n const n = slice.length;\n const frontH = n ? heights[slice[n - 1].id] || 0 : 0;\n const gap = stackGap();\n\n return createPortal(\n <ol\n className={'toast-viewport' + (paused ? ' is-paused' : '')}\n aria-label=\"Notifications\"\n onPointerOver={(e) => {\n if (e.pointerType !== 'touch') onHold();\n }}\n onPointerOut={(e) => {\n if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget as Node)) onRelease(true);\n }}\n onFocus={onHold}\n onBlur={(e) => {\n if (!e.relatedTarget || !e.currentTarget.contains(e.relatedTarget as Node))\n onRelease(false);\n }}\n >\n {/* initial stays true - the host mounts with the first toast, so initial={false} would skip its entrance */}\n <AnimatePresence>\n {slice.map((t, i) => {\n const depth = n - 1 - i; // newest = 0, at the front\n let offset = depth * gap; // collapsed: peek per depth\n if (expanded) {\n // expanded: real heights\n offset = 0;\n for (let j = i + 1; j < n; j++) offset += (heights[slice[j].id] || 0) + gap;\n }\n return (\n <ToastItem\n key={t.id}\n t={t}\n depth={expanded ? 0 : depth}\n offset={offset}\n hidden={!expanded && depth >= VISIBLE}\n behind={!expanded && depth > 0}\n frameHeight={!expanded && depth > 0 && frontH ? frontH : null}\n onHeight={onHeight}\n />\n );\n })}\n </AnimatePresence>\n </ol>,\n document.body,\n );\n}\n\nlet hostMounted = false;\nfunction ensureToastHost() {\n if (hostMounted) return;\n hostMounted = true;\n const el = document.createElement('div');\n el.setAttribute('data-toast-host', '');\n document.body.appendChild(el);\n createRoot(el).render(<ToastHost />);\n}\nstore.host = ensureToastHost;\nif (store.toasts.length) ensureToastHost(); // toasts fired before we loaded\n\n/* Toaster - mount once near the app root so this module loads client-side and the lazy host is registered (toast() also auto-mounts). */\nexport function Toaster(): null {\n useEffect(() => {\n ensureToastHost();\n }, []);\n return null;\n}\n"]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
'use client';import { TimeSegments } from './chunk-5DDOOT33.js';
|
|
2
|
+
import { DtpPanel } from './chunk-CV2Q4YXX.js';
|
|
3
|
+
import { MONTHS, pad } from './chunk-UIQGSTBJ.js';
|
|
4
|
+
import { FieldShell } from './chunk-QNC6O3PG.js';
|
|
5
|
+
import { Overlay } from './chunk-QFS52OK5.js';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var { useState, useEffect } = React;
|
|
10
|
+
function dttfDisplayDate(key) {
|
|
11
|
+
const p = key.split("-").map(Number);
|
|
12
|
+
const year = p[0] === (/* @__PURE__ */ new Date()).getFullYear() ? "" : ", " + p[0];
|
|
13
|
+
return MONTHS[p[1] - 1].slice(0, 3) + " " + pad(p[2]) + year;
|
|
14
|
+
}
|
|
15
|
+
function dttfDisplayTime(t, format) {
|
|
16
|
+
if (format !== "12h") return t;
|
|
17
|
+
const p = t.split(":").map(Number);
|
|
18
|
+
const mer = p[0] >= 12 ? "PM" : "AM";
|
|
19
|
+
return (p[0] + 11) % 12 + 1 + ":" + pad(p[1]) + " " + mer;
|
|
20
|
+
}
|
|
21
|
+
function dttfSplit(v) {
|
|
22
|
+
if (!v) return { date: null, time: null };
|
|
23
|
+
const i = v.indexOf("T");
|
|
24
|
+
return i < 0 ? { date: v, time: null } : { date: v.slice(0, i), time: v.slice(i + 1) };
|
|
25
|
+
}
|
|
26
|
+
function DateTimeField({
|
|
27
|
+
value,
|
|
28
|
+
defaultValue = null,
|
|
29
|
+
onChange,
|
|
30
|
+
label,
|
|
31
|
+
placeholder = "Pick date & time",
|
|
32
|
+
timezone,
|
|
33
|
+
min,
|
|
34
|
+
max,
|
|
35
|
+
format = "24h",
|
|
36
|
+
minuteStep = 5,
|
|
37
|
+
required = false,
|
|
38
|
+
invalid = false,
|
|
39
|
+
message,
|
|
40
|
+
disabled = false,
|
|
41
|
+
className = ""
|
|
42
|
+
}) {
|
|
43
|
+
const controlled = value !== void 0;
|
|
44
|
+
const [inner, setInner] = useState(defaultValue);
|
|
45
|
+
const val = controlled ? value : inner;
|
|
46
|
+
const parts = dttfSplit(val);
|
|
47
|
+
const [pendDate, setPendDate] = useState(null);
|
|
48
|
+
const [pendTime, setPendTime] = useState(null);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
setPendDate(null);
|
|
51
|
+
setPendTime(null);
|
|
52
|
+
}, [val]);
|
|
53
|
+
const date = pendDate != null ? pendDate : parts.date;
|
|
54
|
+
const time = pendTime != null ? pendTime : parts.time;
|
|
55
|
+
const minL = dttfSplit(min);
|
|
56
|
+
const maxL = dttfSplit(max);
|
|
57
|
+
const minTime = date && date === minL.date ? minL.time : null;
|
|
58
|
+
const maxTime = date && date === maxL.date ? maxL.time : null;
|
|
59
|
+
function commitIf(d, t) {
|
|
60
|
+
if (!d || !t) return;
|
|
61
|
+
let tt = t;
|
|
62
|
+
if (minL.time && d === minL.date && tt < minL.time) tt = minL.time;
|
|
63
|
+
if (maxL.time && d === maxL.date && tt > maxL.time) tt = maxL.time;
|
|
64
|
+
if (tt !== t) setPendTime(tt);
|
|
65
|
+
const next = d + "T" + tt;
|
|
66
|
+
if (next === val) return;
|
|
67
|
+
if (!controlled) setInner(next);
|
|
68
|
+
if (onChange) onChange(next);
|
|
69
|
+
}
|
|
70
|
+
function handleDate(d) {
|
|
71
|
+
setPendDate(d);
|
|
72
|
+
commitIf(d, time);
|
|
73
|
+
}
|
|
74
|
+
function handleTime(t) {
|
|
75
|
+
setPendTime(t);
|
|
76
|
+
commitIf(date, t);
|
|
77
|
+
}
|
|
78
|
+
const display = date ? dttfDisplayDate(date) + ", " + (time ? dttfDisplayTime(time, format) : "--:--") : null;
|
|
79
|
+
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 }) });
|
|
80
|
+
return /* @__PURE__ */ jsx(
|
|
81
|
+
FieldShell,
|
|
82
|
+
{
|
|
83
|
+
variant: "dtf",
|
|
84
|
+
label,
|
|
85
|
+
required,
|
|
86
|
+
invalid,
|
|
87
|
+
message,
|
|
88
|
+
icon: "calendar",
|
|
89
|
+
className,
|
|
90
|
+
children: /* @__PURE__ */ jsx(Overlay, { trigger, side: "bottom", align: "start", children: (api) => /* @__PURE__ */ jsx(
|
|
91
|
+
DtpPanel,
|
|
92
|
+
{
|
|
93
|
+
val: date,
|
|
94
|
+
commit: handleDate,
|
|
95
|
+
close: api.close,
|
|
96
|
+
min: minL.date,
|
|
97
|
+
max: maxL.date,
|
|
98
|
+
timezone,
|
|
99
|
+
label,
|
|
100
|
+
slot: /* @__PURE__ */ jsxs("div", { className: "dtp__time", children: [
|
|
101
|
+
/* @__PURE__ */ jsx("span", { className: "dtp__timeLabel", children: "Time" }),
|
|
102
|
+
/* @__PURE__ */ jsxs("span", { className: "dtp__timeHint", "aria-hidden": "true", children: [
|
|
103
|
+
/* @__PURE__ */ jsx("kbd", { children: "\u2191" }),
|
|
104
|
+
/* @__PURE__ */ jsx("kbd", { children: "\u2193" })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsx(
|
|
107
|
+
TimeSegments,
|
|
108
|
+
{
|
|
109
|
+
value: time,
|
|
110
|
+
onCommit: handleTime,
|
|
111
|
+
format,
|
|
112
|
+
minuteStep,
|
|
113
|
+
min: minTime,
|
|
114
|
+
max: maxTime,
|
|
115
|
+
ariaLabel: "Time"
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
] })
|
|
119
|
+
}
|
|
120
|
+
) })
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export { DateTimeField };
|
|
126
|
+
//# sourceMappingURL=chunk-NMFQRGLL.js.map
|
|
127
|
+
//# sourceMappingURL=chunk-NMFQRGLL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/date-picker/DateTimeField.tsx"],"names":[],"mappings":"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","file":"chunk-NMFQRGLL.js","sourcesContent":["'use client';\n\n/* DateTimeField - DateField's sibling for 'YYYY-MM-DDTHH:mm': the calendar panel plus the segmented time machine; commits only complete datetimes. */\n\nimport * as React from 'react';\nimport { Overlay } from '../overlay/Overlay';\nimport { FieldShell } from './field-shell';\nimport { TimeSegments } from './time-core';\nimport { DtpPanel } from './DateField';\nimport { MONTHS as DTTF_MONTHS, pad as dttfPad } from './date-utils';\n\nconst { useState, useEffect } = React;\n\ninterface DateTimeParts {\n date: string | null;\n time: string | null;\n}\n\nfunction dttfDisplayDate(key: string): string {\n const p = key.split('-').map(Number);\n const year = p[0] === new Date().getFullYear() ? '' : ', ' + p[0];\n return DTTF_MONTHS[p[1] - 1].slice(0, 3) + ' ' + dttfPad(p[2]) + year;\n}\nfunction dttfDisplayTime(t: string, format?: '24h' | '12h'): string {\n if (format !== '12h') return t;\n const p = t.split(':').map(Number);\n const mer = p[0] >= 12 ? 'PM' : 'AM';\n return ((p[0] + 11) % 12) + 1 + ':' + dttfPad(p[1]) + ' ' + mer;\n}\n/* value: 'YYYY-MM-DDTHH:mm' - parts. Limits may be date-only. */\nfunction dttfSplit(v: string | null | undefined): DateTimeParts {\n if (!v) return { date: null, time: null };\n const i = v.indexOf('T');\n return i < 0 ? { date: v, time: null } : { date: v.slice(0, i), time: v.slice(i + 1) };\n}\n\nexport interface DateTimeFieldProps {\n /** Controlled value, 'YYYY-MM-DDTHH:mm'. */\n value?: string | null;\n defaultValue?: string | null;\n onChange?: (value: string) => void;\n label?: string;\n placeholder?: string;\n /** IANA timezone (e.g. 'Europe/Riga') - display context, shown in the footer. */\n timezone?: string;\n /** Lower bound - 'YYYY-MM-DD' or 'YYYY-MM-DDTHH:mm', inclusive. */\n min?: string;\n /** Upper bound - 'YYYY-MM-DD' or 'YYYY-MM-DDTHH:mm', inclusive. */\n max?: string;\n /** Time display only; storage stays 24h. Default '24h'. */\n format?: '24h' | '12h';\n /** ↑/↓ step granularity in minutes (typing is exact). Default 5. */\n minuteStep?: number;\n required?: boolean;\n invalid?: boolean;\n message?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function DateTimeField({\n value,\n defaultValue = null,\n onChange,\n label,\n placeholder = 'Pick date & time',\n timezone,\n min,\n max,\n format = '24h',\n minuteStep = 5,\n required = false,\n invalid = false,\n message,\n disabled = false,\n className = '',\n}: DateTimeFieldProps) {\n const controlled = value !== undefined;\n const [inner, setInner] = useState<string | null>(defaultValue);\n const val = controlled ? value : inner;\n const parts = dttfSplit(val);\n\n /* incomplete halves wait here; a committed value supersedes them */\n const [pendDate, setPendDate] = useState<string | null>(null);\n const [pendTime, setPendTime] = useState<string | null>(null);\n useEffect(() => {\n setPendDate(null);\n setPendTime(null);\n }, [val]);\n\n const date = pendDate != null ? pendDate : parts.date;\n const time = pendTime != null ? pendTime : parts.time;\n\n const minL = dttfSplit(min);\n const maxL = dttfSplit(max);\n /* time bounds exist only on the boundary date */\n const minTime = date && date === minL.date ? minL.time : null;\n const maxTime = date && date === maxL.date ? maxL.time : null;\n\n function commitIf(d: string | null, t: string | null) {\n if (!d || !t) return;\n let tt = t;\n if (minL.time && d === minL.date && tt < minL.time) tt = minL.time;\n if (maxL.time && d === maxL.date && tt > maxL.time) tt = maxL.time;\n if (tt !== t) setPendTime(tt);\n const next = d + 'T' + tt;\n if (next === val) return;\n if (!controlled) setInner(next);\n if (onChange) onChange(next);\n }\n function handleDate(d: string) {\n setPendDate(d);\n commitIf(d, time);\n }\n function handleTime(t: string) {\n setPendTime(t);\n commitIf(date, t);\n }\n\n const display = date\n ? dttfDisplayDate(date) + ', ' + (time ? dttfDisplayTime(time, format) : '--:--')\n : null;\n\n const trigger = (\n <button type=\"button\" className=\"fld__input dtf__trigger\" disabled={disabled}>\n {display ? (\n <span className=\"dtf__value\">{display}</span>\n ) : (\n <span className=\"dtf__placeholder\">{placeholder}</span>\n )}\n </button>\n );\n\n return (\n <FieldShell\n variant=\"dtf\"\n label={label}\n required={required}\n invalid={invalid}\n message={message}\n icon=\"calendar\"\n className={className}\n >\n <Overlay trigger={trigger} side=\"bottom\" align=\"start\">\n {(api) => (\n <DtpPanel\n val={date}\n commit={handleDate}\n close={api.close}\n min={minL.date}\n max={maxL.date}\n timezone={timezone}\n label={label}\n slot={\n <div className=\"dtp__time\">\n <span className=\"dtp__timeLabel\">Time</span>\n <span className=\"dtp__timeHint\" aria-hidden=\"true\">\n <kbd>↑</kbd>\n <kbd>↓</kbd>\n </span>\n <TimeSegments\n value={time}\n onCommit={handleTime}\n format={format}\n minuteStep={minuteStep}\n min={minTime}\n max={maxTime}\n ariaLabel=\"Time\"\n />\n </div>\n }\n />\n )}\n </Overlay>\n </FieldShell>\n );\n}\n"]}
|