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.
Files changed (257) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/dist/alert.d.ts +31 -0
  4. package/dist/alert.js +6 -0
  5. package/dist/alert.js.map +1 -0
  6. package/dist/avatar-group.d.ts +13 -0
  7. package/dist/avatar-group.js +3 -0
  8. package/dist/avatar-group.js.map +1 -0
  9. package/dist/avatar.d.ts +25 -0
  10. package/dist/avatar.js +3 -0
  11. package/dist/avatar.js.map +1 -0
  12. package/dist/badge.d.ts +23 -0
  13. package/dist/badge.js +3 -0
  14. package/dist/badge.js.map +1 -0
  15. package/dist/button.d.ts +20 -0
  16. package/dist/button.js +3 -0
  17. package/dist/button.js.map +1 -0
  18. package/dist/checkbox.d.ts +25 -0
  19. package/dist/checkbox.js +3 -0
  20. package/dist/checkbox.js.map +1 -0
  21. package/dist/chunk-2OWHZ4JT.js +36 -0
  22. package/dist/chunk-2OWHZ4JT.js.map +1 -0
  23. package/dist/chunk-34SIXSYL.js +64 -0
  24. package/dist/chunk-34SIXSYL.js.map +1 -0
  25. package/dist/chunk-37O2ZXD6.js +55 -0
  26. package/dist/chunk-37O2ZXD6.js.map +1 -0
  27. package/dist/chunk-4AZL76UJ.js +89 -0
  28. package/dist/chunk-4AZL76UJ.js.map +1 -0
  29. package/dist/chunk-4HSCN5TZ.js +86 -0
  30. package/dist/chunk-4HSCN5TZ.js.map +1 -0
  31. package/dist/chunk-5DDOOT33.js +258 -0
  32. package/dist/chunk-5DDOOT33.js.map +1 -0
  33. package/dist/chunk-5FVHWIMY.js +117 -0
  34. package/dist/chunk-5FVHWIMY.js.map +1 -0
  35. package/dist/chunk-5K6KRJGX.js +147 -0
  36. package/dist/chunk-5K6KRJGX.js.map +1 -0
  37. package/dist/chunk-5PQMQBQC.js +74 -0
  38. package/dist/chunk-5PQMQBQC.js.map +1 -0
  39. package/dist/chunk-7OCTVQ7C.js +95 -0
  40. package/dist/chunk-7OCTVQ7C.js.map +1 -0
  41. package/dist/chunk-7OPMOET7.js +39 -0
  42. package/dist/chunk-7OPMOET7.js.map +1 -0
  43. package/dist/chunk-BXXS7YRC.js +270 -0
  44. package/dist/chunk-BXXS7YRC.js.map +1 -0
  45. package/dist/chunk-CV2Q4YXX.js +272 -0
  46. package/dist/chunk-CV2Q4YXX.js.map +1 -0
  47. package/dist/chunk-EIMMDWIW.js +282 -0
  48. package/dist/chunk-EIMMDWIW.js.map +1 -0
  49. package/dist/chunk-EZ2CWTBE.js +230 -0
  50. package/dist/chunk-EZ2CWTBE.js.map +1 -0
  51. package/dist/chunk-FGHDG3Y4.js +89 -0
  52. package/dist/chunk-FGHDG3Y4.js.map +1 -0
  53. package/dist/chunk-FPP2XLKX.js +127 -0
  54. package/dist/chunk-FPP2XLKX.js.map +1 -0
  55. package/dist/chunk-G6OY35DI.js +295 -0
  56. package/dist/chunk-G6OY35DI.js.map +1 -0
  57. package/dist/chunk-H6KWJNOE.js +65 -0
  58. package/dist/chunk-H6KWJNOE.js.map +1 -0
  59. package/dist/chunk-HGILYGY3.js +45 -0
  60. package/dist/chunk-HGILYGY3.js.map +1 -0
  61. package/dist/chunk-I3BCB4Z5.js +88 -0
  62. package/dist/chunk-I3BCB4Z5.js.map +1 -0
  63. package/dist/chunk-KBWNUUWM.js +582 -0
  64. package/dist/chunk-KBWNUUWM.js.map +1 -0
  65. package/dist/chunk-KN7JFAZ6.js +113 -0
  66. package/dist/chunk-KN7JFAZ6.js.map +1 -0
  67. package/dist/chunk-MEF7PI6U.js +16 -0
  68. package/dist/chunk-MEF7PI6U.js.map +1 -0
  69. package/dist/chunk-NKGMQL6I.js +310 -0
  70. package/dist/chunk-NKGMQL6I.js.map +1 -0
  71. package/dist/chunk-NMFQRGLL.js +127 -0
  72. package/dist/chunk-NMFQRGLL.js.map +1 -0
  73. package/dist/chunk-OUBWD6CX.js +433 -0
  74. package/dist/chunk-OUBWD6CX.js.map +1 -0
  75. package/dist/chunk-PFNXVBLU.js +96 -0
  76. package/dist/chunk-PFNXVBLU.js.map +1 -0
  77. package/dist/chunk-PUPZ4HME.js +165 -0
  78. package/dist/chunk-PUPZ4HME.js.map +1 -0
  79. package/dist/chunk-QFS52OK5.js +690 -0
  80. package/dist/chunk-QFS52OK5.js.map +1 -0
  81. package/dist/chunk-QNC6O3PG.js +45 -0
  82. package/dist/chunk-QNC6O3PG.js.map +1 -0
  83. package/dist/chunk-QUHOXWBK.js +82 -0
  84. package/dist/chunk-QUHOXWBK.js.map +1 -0
  85. package/dist/chunk-UIQGSTBJ.js +106 -0
  86. package/dist/chunk-UIQGSTBJ.js.map +1 -0
  87. package/dist/chunk-UJQKVP6V.js +193 -0
  88. package/dist/chunk-UJQKVP6V.js.map +1 -0
  89. package/dist/chunk-VVPGEAC6.js +11 -0
  90. package/dist/chunk-VVPGEAC6.js.map +1 -0
  91. package/dist/chunk-XA3T5KWA.js +58 -0
  92. package/dist/chunk-XA3T5KWA.js.map +1 -0
  93. package/dist/chunk-YSHJHSJM.js +19 -0
  94. package/dist/chunk-YSHJHSJM.js.map +1 -0
  95. package/dist/chunk-YVHOAVSM.js +182 -0
  96. package/dist/chunk-YVHOAVSM.js.map +1 -0
  97. package/dist/collapse.d.ts +16 -0
  98. package/dist/collapse.js +3 -0
  99. package/dist/collapse.js.map +1 -0
  100. package/dist/count-badge.d.ts +11 -0
  101. package/dist/count-badge.js +4 -0
  102. package/dist/count-badge.js.map +1 -0
  103. package/dist/date-field.d.ts +39 -0
  104. package/dist/date-field.js +8 -0
  105. package/dist/date-field.js.map +1 -0
  106. package/dist/date-range-field.d.ts +30 -0
  107. package/dist/date-range-field.js +8 -0
  108. package/dist/date-range-field.js.map +1 -0
  109. package/dist/datetime-field.d.ts +28 -0
  110. package/dist/datetime-field.js +10 -0
  111. package/dist/datetime-field.js.map +1 -0
  112. package/dist/dialog.d.ts +26 -0
  113. package/dist/dialog.js +7 -0
  114. package/dist/dialog.js.map +1 -0
  115. package/dist/index.d.ts +35 -0
  116. package/dist/index.js +40 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/motion-tokens.d.ts +29 -0
  119. package/dist/motion-tokens.js +3 -0
  120. package/dist/motion-tokens.js.map +1 -0
  121. package/dist/multi-select.d.ts +25 -0
  122. package/dist/multi-select.js +7 -0
  123. package/dist/multi-select.js.map +1 -0
  124. package/dist/number-field.d.ts +24 -0
  125. package/dist/number-field.js +4 -0
  126. package/dist/number-field.js.map +1 -0
  127. package/dist/otp-field.d.ts +20 -0
  128. package/dist/otp-field.js +3 -0
  129. package/dist/otp-field.js.map +1 -0
  130. package/dist/overlay.d.ts +31 -0
  131. package/dist/overlay.js +4 -0
  132. package/dist/overlay.js.map +1 -0
  133. package/dist/pagination.d.ts +24 -0
  134. package/dist/pagination.js +5 -0
  135. package/dist/pagination.js.map +1 -0
  136. package/dist/radio-group.d.ts +46 -0
  137. package/dist/radio-group.js +6 -0
  138. package/dist/radio-group.js.map +1 -0
  139. package/dist/select-core-SAyS-8w0.d.ts +16 -0
  140. package/dist/select.d.ts +27 -0
  141. package/dist/select.js +7 -0
  142. package/dist/select.js.map +1 -0
  143. package/dist/status-badge.d.ts +17 -0
  144. package/dist/status-badge.js +5 -0
  145. package/dist/status-badge.js.map +1 -0
  146. package/dist/table.d.ts +65 -0
  147. package/dist/table.js +5 -0
  148. package/dist/table.js.map +1 -0
  149. package/dist/tabs.d.ts +44 -0
  150. package/dist/tabs.js +5 -0
  151. package/dist/tabs.js.map +1 -0
  152. package/dist/tag.d.ts +28 -0
  153. package/dist/tag.js +5 -0
  154. package/dist/tag.js.map +1 -0
  155. package/dist/text-field.d.ts +30 -0
  156. package/dist/text-field.js +6 -0
  157. package/dist/text-field.js.map +1 -0
  158. package/dist/textarea.d.ts +33 -0
  159. package/dist/textarea.js +5 -0
  160. package/dist/textarea.js.map +1 -0
  161. package/dist/time-field.d.ts +27 -0
  162. package/dist/time-field.js +6 -0
  163. package/dist/time-field.js.map +1 -0
  164. package/dist/toast-store.d.ts +75 -0
  165. package/dist/toast-store.js +3 -0
  166. package/dist/toast-store.js.map +1 -0
  167. package/dist/toast.d.ts +3 -0
  168. package/dist/toast.js +6 -0
  169. package/dist/toast.js.map +1 -0
  170. package/dist/toggle-tag.d.ts +24 -0
  171. package/dist/toggle-tag.js +4 -0
  172. package/dist/toggle-tag.js.map +1 -0
  173. package/dist/toggle.d.ts +21 -0
  174. package/dist/toggle.js +3 -0
  175. package/dist/toggle.js.map +1 -0
  176. package/dist/tooltip.d.ts +27 -0
  177. package/dist/tooltip.js +4 -0
  178. package/dist/tooltip.js.map +1 -0
  179. package/llms.txt +165 -0
  180. package/package.json +205 -0
  181. package/src/components/alert/Alert.tsx +118 -0
  182. package/src/components/alert/alert.css +136 -0
  183. package/src/components/avatar/Avatar.tsx +128 -0
  184. package/src/components/avatar/AvatarGroup.tsx +50 -0
  185. package/src/components/avatar/avatar.css +200 -0
  186. package/src/components/badge/Badge.tsx +66 -0
  187. package/src/components/badge/CountBadge.tsx +46 -0
  188. package/src/components/badge/StatusBadge.tsx +132 -0
  189. package/src/components/badge/badge.css +243 -0
  190. package/src/components/button/Button.tsx +68 -0
  191. package/src/components/button/button.css +222 -0
  192. package/src/components/checkbox/Checkbox.tsx +90 -0
  193. package/src/components/checkbox/checkbox.css +179 -0
  194. package/src/components/date-picker/DateField.tsx +362 -0
  195. package/src/components/date-picker/DateRangeField.tsx +533 -0
  196. package/src/components/date-picker/DateTimeField.tsx +177 -0
  197. package/src/components/date-picker/TimeField.tsx +100 -0
  198. package/src/components/date-picker/date-picker.css +591 -0
  199. package/src/components/date-picker/date-utils.ts +55 -0
  200. package/src/components/date-picker/field-shell.tsx +78 -0
  201. package/src/components/date-picker/glide-pill.tsx +81 -0
  202. package/src/components/date-picker/time-core.tsx +305 -0
  203. package/src/components/dialog/Dialog.tsx +181 -0
  204. package/src/components/dialog/dialog.css +170 -0
  205. package/src/components/glass/glass.css +100 -0
  206. package/src/components/icon/Icon.tsx +76 -0
  207. package/src/components/icon/IconSlot.tsx +11 -0
  208. package/src/components/icon/icon.css +33 -0
  209. package/src/components/input/NumberField.tsx +117 -0
  210. package/src/components/input/OtpField.tsx +118 -0
  211. package/src/components/input/TextField.tsx +123 -0
  212. package/src/components/input/input.css +335 -0
  213. package/src/components/motion/Collapse.tsx +33 -0
  214. package/src/components/motion/collapse.css +41 -0
  215. package/src/components/overlay/Overlay.tsx +239 -0
  216. package/src/components/overlay/overlay-core.tsx +565 -0
  217. package/src/components/overlay/overlay.css +119 -0
  218. package/src/components/overlay/sheet-drag.tsx +146 -0
  219. package/src/components/pagination/Pagination.tsx +140 -0
  220. package/src/components/pagination/pagination.css +48 -0
  221. package/src/components/radio-group/RadioGroup.tsx +182 -0
  222. package/src/components/radio-group/radio-group.css +277 -0
  223. package/src/components/select/MultiSelect.tsx +251 -0
  224. package/src/components/select/Select.tsx +235 -0
  225. package/src/components/select/select-core.tsx +417 -0
  226. package/src/components/select/select.css +386 -0
  227. package/src/components/table/Table.tsx +433 -0
  228. package/src/components/table/table.css +348 -0
  229. package/src/components/tabs/Tabs.tsx +371 -0
  230. package/src/components/tabs/tabs.css +228 -0
  231. package/src/components/tag/Tag.tsx +145 -0
  232. package/src/components/tag/ToggleTag.tsx +125 -0
  233. package/src/components/tag/tag.css +248 -0
  234. package/src/components/textarea/Textarea.tsx +197 -0
  235. package/src/components/textarea/textarea.css +219 -0
  236. package/src/components/toast/Toast.tsx +349 -0
  237. package/src/components/toast/toast-store.ts +266 -0
  238. package/src/components/toast/toast.css +233 -0
  239. package/src/components/toggle/Toggle.tsx +94 -0
  240. package/src/components/toggle/toggle.css +152 -0
  241. package/src/components/tooltip/Tooltip.tsx +365 -0
  242. package/src/components/tooltip/tooltip.css +86 -0
  243. package/src/index.ts +42 -0
  244. package/src/styles.css +39 -0
  245. package/src/tokens/avatar.css +20 -0
  246. package/src/tokens/color.css +56 -0
  247. package/src/tokens/elevation.css +20 -0
  248. package/src/tokens/fonts.css +3 -0
  249. package/src/tokens/glass.css +21 -0
  250. package/src/tokens/icons.css +7 -0
  251. package/src/tokens/layers.css +6 -0
  252. package/src/tokens/motion-tokens.ts +72 -0
  253. package/src/tokens/motion.css +49 -0
  254. package/src/tokens/radius.css +11 -0
  255. package/src/tokens/semantic.css +75 -0
  256. package/src/tokens/spacing.css +26 -0
  257. 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"]}