@zyncat/ui 0.8.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 (334) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +133 -0
  3. package/dist/alert.css +132 -0
  4. package/dist/alert.d.ts +46 -0
  5. package/dist/alert.js +80 -0
  6. package/dist/alert.js.map +1 -0
  7. package/dist/avatar-group.d.ts +24 -0
  8. package/dist/avatar-group.js +23 -0
  9. package/dist/avatar-group.js.map +1 -0
  10. package/dist/avatar.css +200 -0
  11. package/dist/avatar.d.ts +35 -0
  12. package/dist/avatar.js +67 -0
  13. package/dist/avatar.js.map +1 -0
  14. package/dist/badge.css +182 -0
  15. package/dist/badge.d.ts +34 -0
  16. package/dist/badge.js +4 -0
  17. package/dist/badge.js.map +1 -0
  18. package/dist/button.css +269 -0
  19. package/dist/button.d.ts +44 -0
  20. package/dist/button.js +4 -0
  21. package/dist/button.js.map +1 -0
  22. package/dist/checkbox.css +177 -0
  23. package/dist/checkbox.d.ts +35 -0
  24. package/dist/checkbox.js +5 -0
  25. package/dist/checkbox.js.map +1 -0
  26. package/dist/chunk-2ERBBFZS.js +12 -0
  27. package/dist/chunk-2ERBBFZS.js.map +1 -0
  28. package/dist/chunk-2HORSLXJ.js +191 -0
  29. package/dist/chunk-2HORSLXJ.js.map +1 -0
  30. package/dist/chunk-36WVAQKL.js +40 -0
  31. package/dist/chunk-36WVAQKL.js.map +1 -0
  32. package/dist/chunk-3SBCBYB7.js +575 -0
  33. package/dist/chunk-3SBCBYB7.js.map +1 -0
  34. package/dist/chunk-4R2GQO43.js +125 -0
  35. package/dist/chunk-4R2GQO43.js.map +1 -0
  36. package/dist/chunk-64UU4LGU.js +258 -0
  37. package/dist/chunk-64UU4LGU.js.map +1 -0
  38. package/dist/chunk-7SZCJ7WI.js +35 -0
  39. package/dist/chunk-7SZCJ7WI.js.map +1 -0
  40. package/dist/chunk-BIDVNLJO.js +38 -0
  41. package/dist/chunk-BIDVNLJO.js.map +1 -0
  42. package/dist/chunk-CONSWNIV.js +17 -0
  43. package/dist/chunk-CONSWNIV.js.map +1 -0
  44. package/dist/chunk-EQ32F2QJ.js +75 -0
  45. package/dist/chunk-EQ32F2QJ.js.map +1 -0
  46. package/dist/chunk-GY7JOPUQ.js +111 -0
  47. package/dist/chunk-GY7JOPUQ.js.map +1 -0
  48. package/dist/chunk-I4XQ4PV2.js +30 -0
  49. package/dist/chunk-I4XQ4PV2.js.map +1 -0
  50. package/dist/chunk-JSKXZMLH.js +67 -0
  51. package/dist/chunk-JSKXZMLH.js.map +1 -0
  52. package/dist/chunk-L3Q3VDIW.js +295 -0
  53. package/dist/chunk-L3Q3VDIW.js.map +1 -0
  54. package/dist/chunk-LDC3RIYA.js +62 -0
  55. package/dist/chunk-LDC3RIYA.js.map +1 -0
  56. package/dist/chunk-MKIQFK7S.js +43 -0
  57. package/dist/chunk-MKIQFK7S.js.map +1 -0
  58. package/dist/chunk-MMRIQNEN.js +20 -0
  59. package/dist/chunk-MMRIQNEN.js.map +1 -0
  60. package/dist/chunk-MXOPCFWR.js +59 -0
  61. package/dist/chunk-MXOPCFWR.js.map +1 -0
  62. package/dist/chunk-NEF5XAHG.js +17 -0
  63. package/dist/chunk-NEF5XAHG.js.map +1 -0
  64. package/dist/chunk-NNXJCLTV.js +22 -0
  65. package/dist/chunk-NNXJCLTV.js.map +1 -0
  66. package/dist/chunk-O4N2OBTR.js +94 -0
  67. package/dist/chunk-O4N2OBTR.js.map +1 -0
  68. package/dist/chunk-PMECHR3A.js +38 -0
  69. package/dist/chunk-PMECHR3A.js.map +1 -0
  70. package/dist/chunk-QDK66S4G.js +44 -0
  71. package/dist/chunk-QDK66S4G.js.map +1 -0
  72. package/dist/chunk-QGNC7LH5.js +8 -0
  73. package/dist/chunk-QGNC7LH5.js.map +1 -0
  74. package/dist/chunk-QMSJZCK3.js +398 -0
  75. package/dist/chunk-QMSJZCK3.js.map +1 -0
  76. package/dist/chunk-S5ZTZANS.js +57 -0
  77. package/dist/chunk-S5ZTZANS.js.map +1 -0
  78. package/dist/chunk-S7B34VGN.js +14 -0
  79. package/dist/chunk-S7B34VGN.js.map +1 -0
  80. package/dist/chunk-TCUCYFT7.js +25 -0
  81. package/dist/chunk-TCUCYFT7.js.map +1 -0
  82. package/dist/chunk-TYHR4VNM.js +193 -0
  83. package/dist/chunk-TYHR4VNM.js.map +1 -0
  84. package/dist/chunk-U5QQZC3U.js +56 -0
  85. package/dist/chunk-U5QQZC3U.js.map +1 -0
  86. package/dist/chunk-UE63OOVG.js +13 -0
  87. package/dist/chunk-UE63OOVG.js.map +1 -0
  88. package/dist/chunk-VTJTGVZZ.js +22 -0
  89. package/dist/chunk-VTJTGVZZ.js.map +1 -0
  90. package/dist/chunk-W3SHPKSB.js +49 -0
  91. package/dist/chunk-W3SHPKSB.js.map +1 -0
  92. package/dist/chunk-XZAEIQDR.js +188 -0
  93. package/dist/chunk-XZAEIQDR.js.map +1 -0
  94. package/dist/chunk-YGGCQNNU.js +92 -0
  95. package/dist/chunk-YGGCQNNU.js.map +1 -0
  96. package/dist/collapse.css +88 -0
  97. package/dist/collapse.d.ts +46 -0
  98. package/dist/collapse.js +5 -0
  99. package/dist/collapse.js.map +1 -0
  100. package/dist/count-badge.d.ts +13 -0
  101. package/dist/count-badge.js +13 -0
  102. package/dist/count-badge.js.map +1 -0
  103. package/dist/date-field.d.ts +25 -0
  104. package/dist/date-field.js +87 -0
  105. package/dist/date-field.js.map +1 -0
  106. package/dist/date-picker.css +595 -0
  107. package/dist/date-range-field.d.ts +33 -0
  108. package/dist/date-range-field.js +404 -0
  109. package/dist/date-range-field.js.map +1 -0
  110. package/dist/datetime-field.d.ts +29 -0
  111. package/dist/datetime-field.js +155 -0
  112. package/dist/datetime-field.js.map +1 -0
  113. package/dist/dialog.css +180 -0
  114. package/dist/dialog.d.ts +42 -0
  115. package/dist/dialog.js +128 -0
  116. package/dist/dialog.js.map +1 -0
  117. package/dist/dom-props-C0jrllBw.d.ts +5 -0
  118. package/dist/field-chrome-CMPOQSLs.d.ts +28 -0
  119. package/dist/field-shell-Cuda-feL.d.ts +24 -0
  120. package/dist/glide.d.ts +15 -0
  121. package/dist/glide.js +5 -0
  122. package/dist/glide.js.map +1 -0
  123. package/dist/icon.css +33 -0
  124. package/dist/input.css +333 -0
  125. package/dist/mcp.js +359 -0
  126. package/dist/motion-devtools.css +265 -0
  127. package/dist/motion-devtools.d.ts +51 -0
  128. package/dist/motion-devtools.js +354 -0
  129. package/dist/motion-devtools.js.map +1 -0
  130. package/dist/motion-scale-Canq4stZ.d.ts +18 -0
  131. package/dist/motion-tokens.d.ts +28 -0
  132. package/dist/motion-tokens.js +3 -0
  133. package/dist/motion-tokens.js.map +1 -0
  134. package/dist/multi-select.d.ts +44 -0
  135. package/dist/multi-select.js +109 -0
  136. package/dist/multi-select.js.map +1 -0
  137. package/dist/number-field.d.ts +36 -0
  138. package/dist/number-field.js +112 -0
  139. package/dist/number-field.js.map +1 -0
  140. package/dist/odometer.css +62 -0
  141. package/dist/otp-field.d.ts +31 -0
  142. package/dist/otp-field.js +98 -0
  143. package/dist/otp-field.js.map +1 -0
  144. package/dist/overlay.css +23 -0
  145. package/dist/pagination.css +43 -0
  146. package/dist/pagination.d.ts +29 -0
  147. package/dist/pagination.js +107 -0
  148. package/dist/pagination.js.map +1 -0
  149. package/dist/popover.css +69 -0
  150. package/dist/popover.d.ts +35 -0
  151. package/dist/popover.js +15 -0
  152. package/dist/popover.js.map +1 -0
  153. package/dist/radio-group.css +300 -0
  154. package/dist/radio-group.d.ts +52 -0
  155. package/dist/radio-group.js +115 -0
  156. package/dist/radio-group.js.map +1 -0
  157. package/dist/select.css +416 -0
  158. package/dist/select.d.ts +49 -0
  159. package/dist/select.js +99 -0
  160. package/dist/select.js.map +1 -0
  161. package/dist/sheet.css +26 -0
  162. package/dist/sheet.d.ts +31 -0
  163. package/dist/sheet.js +14 -0
  164. package/dist/sheet.js.map +1 -0
  165. package/dist/status-badge.d.ts +19 -0
  166. package/dist/status-badge.js +72 -0
  167. package/dist/status-badge.js.map +1 -0
  168. package/dist/table.css +348 -0
  169. package/dist/table.d.ts +75 -0
  170. package/dist/table.js +262 -0
  171. package/dist/table.js.map +1 -0
  172. package/dist/tabs.css +208 -0
  173. package/dist/tabs.d.ts +71 -0
  174. package/dist/tabs.js +181 -0
  175. package/dist/tabs.js.map +1 -0
  176. package/dist/tag.css +248 -0
  177. package/dist/tag.d.ts +52 -0
  178. package/dist/tag.js +72 -0
  179. package/dist/tag.js.map +1 -0
  180. package/dist/text-field.d.ts +28 -0
  181. package/dist/text-field.js +69 -0
  182. package/dist/text-field.js.map +1 -0
  183. package/dist/textarea.css +219 -0
  184. package/dist/textarea.d.ts +38 -0
  185. package/dist/textarea.js +144 -0
  186. package/dist/textarea.js.map +1 -0
  187. package/dist/time-field.d.ts +28 -0
  188. package/dist/time-field.js +66 -0
  189. package/dist/time-field.js.map +1 -0
  190. package/dist/timing-7JA_zQHP.d.ts +27 -0
  191. package/dist/toast-store.d.ts +86 -0
  192. package/dist/toast-store.js +3 -0
  193. package/dist/toast-store.js.map +1 -0
  194. package/dist/toast.css +257 -0
  195. package/dist/toast.d.ts +12 -0
  196. package/dist/toast.js +310 -0
  197. package/dist/toast.js.map +1 -0
  198. package/dist/toggle-tag.d.ts +34 -0
  199. package/dist/toggle-tag.js +57 -0
  200. package/dist/toggle-tag.js.map +1 -0
  201. package/dist/toggle.css +152 -0
  202. package/dist/toggle.d.ts +31 -0
  203. package/dist/toggle.js +75 -0
  204. package/dist/toggle.js.map +1 -0
  205. package/dist/tooltip.css +86 -0
  206. package/dist/tooltip.d.ts +30 -0
  207. package/dist/tooltip.js +268 -0
  208. package/dist/tooltip.js.map +1 -0
  209. package/dist/types-SGMShK7R.d.ts +22 -0
  210. package/llms.txt +196 -0
  211. package/next.d.mts +7 -0
  212. package/next.mjs +59 -0
  213. package/package.json +257 -0
  214. package/src/components/composites/alert/Alert.tsx +141 -0
  215. package/src/components/composites/alert/alert.css +132 -0
  216. package/src/components/composites/date-picker/DateField.tsx +80 -0
  217. package/src/components/composites/date-picker/DateRangeField.tsx +110 -0
  218. package/src/components/composites/date-picker/DateTimeField.tsx +162 -0
  219. package/src/components/composites/date-picker/TimeField.tsx +78 -0
  220. package/src/components/composites/date-picker/calendar-panel.tsx +216 -0
  221. package/src/components/composites/date-picker/date-picker.css +595 -0
  222. package/src/components/composites/date-picker/date-utils.ts +56 -0
  223. package/src/components/composites/date-picker/field-shell.tsx +85 -0
  224. package/src/components/composites/date-picker/range-panel.tsx +363 -0
  225. package/src/components/composites/date-picker/time-core.tsx +290 -0
  226. package/src/components/composites/date-picker/use-day-focus.ts +35 -0
  227. package/src/components/composites/dialog/Dialog.tsx +198 -0
  228. package/src/components/composites/dialog/dialog.css +180 -0
  229. package/src/components/composites/pagination/Pagination.tsx +131 -0
  230. package/src/components/composites/pagination/pagination.css +43 -0
  231. package/src/components/composites/popover/Popover.tsx +141 -0
  232. package/src/components/composites/popover/popover.css +69 -0
  233. package/src/components/composites/select/MultiSelect.tsx +133 -0
  234. package/src/components/composites/select/Select.tsx +122 -0
  235. package/src/components/composites/select/core/index.ts +4 -0
  236. package/src/components/composites/select/core/menu.tsx +100 -0
  237. package/src/components/composites/select/core/panel.tsx +154 -0
  238. package/src/components/composites/select/core/trigger.tsx +74 -0
  239. package/src/components/composites/select/core/types.ts +39 -0
  240. package/src/components/composites/select/core/use-listbox.ts +182 -0
  241. package/src/components/composites/select/select.css +416 -0
  242. package/src/components/composites/sheet/Sheet.tsx +135 -0
  243. package/src/components/composites/sheet/sheet.css +26 -0
  244. package/src/components/composites/sheet/use-sheet-drag.ts +126 -0
  245. package/src/components/composites/table/Table.tsx +377 -0
  246. package/src/components/composites/table/table.css +348 -0
  247. package/src/components/composites/tabs/Tabs.tsx +278 -0
  248. package/src/components/composites/tabs/tabs.css +208 -0
  249. package/src/components/composites/toast/Toast.tsx +380 -0
  250. package/src/components/composites/toast/toast-store.ts +295 -0
  251. package/src/components/composites/toast/toast.css +257 -0
  252. package/src/components/composites/tooltip/Tooltip.tsx +110 -0
  253. package/src/components/composites/tooltip/tooltip-host.tsx +184 -0
  254. package/src/components/composites/tooltip/tooltip-store.ts +81 -0
  255. package/src/components/composites/tooltip/tooltip.css +86 -0
  256. package/src/components/dev/MotionDevtools.tsx +200 -0
  257. package/src/components/dev/motion-devtools.css +265 -0
  258. package/src/components/dev/slowmo-engine.ts +230 -0
  259. package/src/components/internal/glass/glass.css +100 -0
  260. package/src/components/internal/glass/glint.ts +9 -0
  261. package/src/components/internal/hooks/use-controllable.ts +21 -0
  262. package/src/components/internal/hooks/use-scroll-edges.ts +46 -0
  263. package/src/components/internal/icon/Icon.tsx +66 -0
  264. package/src/components/internal/icon/IconSlot.tsx +10 -0
  265. package/src/components/internal/icon/icon.css +33 -0
  266. package/src/components/internal/overlay/focus.ts +68 -0
  267. package/src/components/internal/overlay/layer.tsx +149 -0
  268. package/src/components/internal/overlay/modal.tsx +141 -0
  269. package/src/components/internal/overlay/overlay.css +23 -0
  270. package/src/components/internal/overlay/position.ts +103 -0
  271. package/src/components/internal/utils/cx.ts +3 -0
  272. package/src/components/internal/utils/token-px.ts +8 -0
  273. package/src/components/primitives/avatar/Avatar.tsx +120 -0
  274. package/src/components/primitives/avatar/AvatarGroup.tsx +56 -0
  275. package/src/components/primitives/avatar/avatar.css +200 -0
  276. package/src/components/primitives/badge/Badge.tsx +75 -0
  277. package/src/components/primitives/badge/CountBadge.tsx +20 -0
  278. package/src/components/primitives/badge/StatusBadge.tsx +111 -0
  279. package/src/components/primitives/badge/badge.css +182 -0
  280. package/src/components/primitives/badge/odometer.css +62 -0
  281. package/src/components/primitives/badge/odometer.tsx +36 -0
  282. package/src/components/primitives/button/Button.tsx +102 -0
  283. package/src/components/primitives/button/button.css +269 -0
  284. package/src/components/primitives/checkbox/Checkbox.tsx +76 -0
  285. package/src/components/primitives/checkbox/check-glyph.tsx +28 -0
  286. package/src/components/primitives/checkbox/checkbox.css +177 -0
  287. package/src/components/primitives/collapse/Collapse.tsx +86 -0
  288. package/src/components/primitives/collapse/collapse.css +88 -0
  289. package/src/components/primitives/collapse/collapse.typecheck.tsx +29 -0
  290. package/src/components/primitives/input/NumberField.tsx +139 -0
  291. package/src/components/primitives/input/OtpField.tsx +134 -0
  292. package/src/components/primitives/input/TextField.tsx +110 -0
  293. package/src/components/primitives/input/field-chrome.tsx +83 -0
  294. package/src/components/primitives/input/input.css +333 -0
  295. package/src/components/primitives/radio-group/RadioGroup.tsx +183 -0
  296. package/src/components/primitives/radio-group/radio-group.css +300 -0
  297. package/src/components/primitives/tag/Tag.tsx +143 -0
  298. package/src/components/primitives/tag/ToggleTag.tsx +97 -0
  299. package/src/components/primitives/tag/tag.css +248 -0
  300. package/src/components/primitives/textarea/Textarea.tsx +190 -0
  301. package/src/components/primitives/textarea/textarea.css +219 -0
  302. package/src/components/primitives/toggle/Toggle.tsx +105 -0
  303. package/src/components/primitives/toggle/toggle.css +152 -0
  304. package/src/css.d.ts +1 -0
  305. package/src/dom-props.ts +1 -0
  306. package/src/engine/animate.ts +141 -0
  307. package/src/engine/drag.ts +53 -0
  308. package/src/engine/ease.ts +155 -0
  309. package/src/engine/flip.ts +59 -0
  310. package/src/engine/index.ts +13 -0
  311. package/src/mcp/server.ts +420 -0
  312. package/src/motion/element.tsx +53 -0
  313. package/src/motion/flip.tsx +87 -0
  314. package/src/motion/glide.tsx +47 -0
  315. package/src/motion/motion-timing.ts +33 -0
  316. package/src/motion/presence-context.ts +18 -0
  317. package/src/motion/presence.tsx +91 -0
  318. package/src/motion/timing.ts +49 -0
  319. package/src/motion/use-motion.ts +64 -0
  320. package/src/styles.css +26 -0
  321. package/src/tokens/avatar.css +20 -0
  322. package/src/tokens/color.css +58 -0
  323. package/src/tokens/elevation.css +22 -0
  324. package/src/tokens/fonts.css +3 -0
  325. package/src/tokens/glass.css +20 -0
  326. package/src/tokens/icons.css +7 -0
  327. package/src/tokens/layers.css +6 -0
  328. package/src/tokens/motion-scale.ts +17 -0
  329. package/src/tokens/motion-tokens.ts +92 -0
  330. package/src/tokens/motion.css +49 -0
  331. package/src/tokens/radius.css +11 -0
  332. package/src/tokens/semantic.css +65 -0
  333. package/src/tokens/spacing.css +26 -0
  334. package/src/tokens/typography.css +52 -0
@@ -0,0 +1,188 @@
1
+ 'use client';import { ModalShell } from './chunk-4R2GQO43.js';
2
+ import { ovCloneTrigger, OverlayPortal } from './chunk-GY7JOPUQ.js';
3
+ import { resolveMotionTiming } from './chunk-NEF5XAHG.js';
4
+ import { Presence } from './chunk-MXOPCFWR.js';
5
+ import { animate, startDrag } from './chunk-L3Q3VDIW.js';
6
+ import { useControllable } from './chunk-MMRIQNEN.js';
7
+ import { UIMotion } from './chunk-S5ZTZANS.js';
8
+ import './sheet.css';
9
+ import { useRef, useId, Fragment, useEffect } from 'react';
10
+ import { jsxs, jsx } from 'react/jsx-runtime';
11
+
12
+ var SM = UIMotion;
13
+ var DISMISS_RATIO = 0.4;
14
+ var DISMISS_VELOCITY = 500;
15
+ var INTENT_PX = 4;
16
+ var STRETCH_MAX = 0.06;
17
+ function findScrollable(node, stop) {
18
+ let el = node instanceof Element ? node : null;
19
+ while (el && el !== stop) {
20
+ const s = getComputedStyle(el);
21
+ if (/(auto|scroll)/.test(s.overflowY + s.overflowX) && (el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth))
22
+ return el;
23
+ el = el.parentElement;
24
+ }
25
+ return null;
26
+ }
27
+ function sheetScrim(panel) {
28
+ return panel?.parentElement?.querySelector(".overlay-scrim") ?? null;
29
+ }
30
+ function sheetSpan(panel, side) {
31
+ return side === "bottom" ? panel.offsetHeight : panel.offsetWidth;
32
+ }
33
+ function useSheetDrag({
34
+ side,
35
+ panelRef,
36
+ enabled,
37
+ requestClose
38
+ }) {
39
+ const axis = side === "bottom" ? "y" : "x";
40
+ const savedUserSelect = useRef(null);
41
+ function suspendSelection() {
42
+ const sel = window.getSelection();
43
+ if (sel) sel.removeAllRanges();
44
+ savedUserSelect.current = document.body.style.userSelect;
45
+ document.body.style.userSelect = "none";
46
+ }
47
+ function restoreSelection() {
48
+ if (savedUserSelect.current === null) return;
49
+ document.body.style.userSelect = savedUserSelect.current;
50
+ savedUserSelect.current = null;
51
+ }
52
+ useEffect(() => restoreSelection, []);
53
+ function paint(el, travel, stretch) {
54
+ const span = sheetSpan(el, side);
55
+ el.style.translate = axis === "y" ? `0px ${travel}px` : `${travel}px 0px`;
56
+ el.style.scale = axis === "y" ? `1 ${stretch}` : `${stretch} 1`;
57
+ const scrim = sheetScrim(el);
58
+ if (scrim) scrim.style.opacity = String(1 - Math.min(Math.max(travel / span, 0), 1));
59
+ }
60
+ function onPointerDown(e) {
61
+ if (e.button !== 0) return;
62
+ const startX = e.clientX, startY = e.clientY;
63
+ const scrollable = findScrollable(e.target, panelRef.current);
64
+ const onMove = (ev) => {
65
+ const dx = ev.clientX - startX, dy = ev.clientY - startY;
66
+ if (Math.max(Math.abs(dx), Math.abs(dy)) < INTENT_PX) return;
67
+ cleanup();
68
+ const along = axis === "y" ? dy : dx;
69
+ const cross = axis === "y" ? dx : dy;
70
+ if (Math.abs(along) <= Math.abs(cross)) return;
71
+ if (scrollable) {
72
+ if (along < 0) return;
73
+ if (axis === "y" ? scrollable.scrollTop > 0 : scrollable.scrollLeft > 0) return;
74
+ }
75
+ suspendSelection();
76
+ startDrag(ev, { onMove: onDrag, onEnd: onDragEnd });
77
+ };
78
+ const cleanup = () => {
79
+ window.removeEventListener("pointermove", onMove);
80
+ window.removeEventListener("pointerup", cleanup);
81
+ window.removeEventListener("pointercancel", cleanup);
82
+ };
83
+ window.addEventListener("pointermove", onMove);
84
+ window.addEventListener("pointerup", cleanup);
85
+ window.addEventListener("pointercancel", cleanup);
86
+ }
87
+ function onDrag(info) {
88
+ const el = panelRef.current;
89
+ if (!el) return;
90
+ const o = info.offset[axis];
91
+ const span = sheetSpan(el, side);
92
+ paint(el, Math.max(o, 0), o < 0 ? 1 + Math.min(-o / span, 1) * STRETCH_MAX : 1);
93
+ }
94
+ function onDragEnd(info) {
95
+ restoreSelection();
96
+ const el = panelRef.current;
97
+ if (!el) return;
98
+ const span = sheetSpan(el, side);
99
+ if (info.offset[axis] > span * DISMISS_RATIO || info.velocity[axis] > DISMISS_VELOCITY) {
100
+ requestClose();
101
+ return;
102
+ }
103
+ animate(el, { x: [0], y: [0], scale: [[1, 1]], timing: SM.t.settle });
104
+ const scrim = sheetScrim(el);
105
+ if (scrim) animate(scrim, { opacity: [1], timing: SM.t.settle });
106
+ }
107
+ return enabled ? { onPointerDown } : {};
108
+ }
109
+ var SHEET_TIMING = {
110
+ open: { duration: "slow", ease: "entrance" },
111
+ close: { duration: "base", ease: "exit" }
112
+ };
113
+ function sheetSlide(slot, side, at) {
114
+ const frames = at.map((ratio) => ratio * sheetSpan(slot, side));
115
+ return side === "bottom" ? { y: frames } : { x: frames };
116
+ }
117
+ function SheetShell({
118
+ side,
119
+ panelId,
120
+ dismissible,
121
+ requestClose,
122
+ htmlProps,
123
+ animate: animate2,
124
+ exit,
125
+ children
126
+ }) {
127
+ const panelRef = useRef(null);
128
+ const dragProps = useSheetDrag({ side, panelRef, enabled: dismissible, requestClose });
129
+ return /* @__PURE__ */ jsx(
130
+ ModalShell,
131
+ {
132
+ animate: animate2,
133
+ exit,
134
+ layerClass: "overlay-layer--sheet-" + side,
135
+ panelClass: "overlay-panel--sheet-" + side,
136
+ panelId,
137
+ dismissible,
138
+ requestClose,
139
+ panelRef,
140
+ panelProps: { ...htmlProps, ...dragProps },
141
+ children
142
+ }
143
+ );
144
+ }
145
+ function Sheet({
146
+ open: controlledOpen,
147
+ defaultOpen = false,
148
+ onOpenChange,
149
+ trigger = null,
150
+ side = "right",
151
+ dismissible = true,
152
+ id,
153
+ htmlProps,
154
+ animation,
155
+ children
156
+ }) {
157
+ const [open, setOpen] = useControllable(controlledOpen, defaultOpen, onOpenChange);
158
+ const triggerRef = useRef(null);
159
+ const autoId = useId();
160
+ const panelId = id || "sheet-" + autoId;
161
+ const close = () => setOpen(false);
162
+ const timings = resolveMotionTiming(animation, SHEET_TIMING);
163
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
164
+ ovCloneTrigger(trigger, { open, onPress: () => setOpen(true), panelId, haspopup: "dialog", triggerRef }),
165
+ /* @__PURE__ */ jsx(OverlayPortal, { children: /* @__PURE__ */ jsx(Presence, { children: open && /* @__PURE__ */ jsx(
166
+ SheetShell,
167
+ {
168
+ animate: (slot) => {
169
+ const play = animate(slot, { ...sheetSlide(slot, side, [1, 0]), timing: timings.open });
170
+ play.finished.then(() => play.stop());
171
+ return play;
172
+ },
173
+ exit: (slot) => animate(slot, { ...sheetSlide(slot, side, [1]), timing: timings.close }),
174
+ side,
175
+ panelId,
176
+ dismissible,
177
+ requestClose: close,
178
+ htmlProps,
179
+ children
180
+ },
181
+ "sheet"
182
+ ) }) })
183
+ ] });
184
+ }
185
+
186
+ export { Sheet };
187
+ //# sourceMappingURL=chunk-XZAEIQDR.js.map
188
+ //# sourceMappingURL=chunk-XZAEIQDR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/composites/sheet/use-sheet-drag.ts","../src/components/composites/sheet/Sheet.tsx"],"names":["animate","useRef"],"mappings":"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","file":"chunk-XZAEIQDR.js","sourcesContent":["'use client';\n\nimport { useEffect, useRef, type PointerEvent as ReactPointerEvent, type RefObject } from 'react';\nimport { animate, startDrag, type PanInfo } from '../../../engine';\nimport { UIMotion } from '../../../tokens/motion-tokens';\n\nconst SM = UIMotion;\n\nconst DISMISS_RATIO = 0.4;\nconst DISMISS_VELOCITY = 500;\nconst INTENT_PX = 4;\nconst STRETCH_MAX = 0.06;\n\nfunction findScrollable(node: EventTarget | null, stop: HTMLElement | null): HTMLElement | null {\n let el = node instanceof Element ? node : null;\n while (el && el !== stop) {\n const s = getComputedStyle(el);\n if (\n /(auto|scroll)/.test(s.overflowY + s.overflowX) &&\n (el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth)\n )\n return el as HTMLElement;\n el = el.parentElement;\n }\n return null;\n}\n\nfunction sheetScrim(panel: HTMLElement | null): HTMLElement | null {\n return panel?.parentElement?.querySelector<HTMLElement>('.overlay-scrim') ?? null;\n}\n\nexport function sheetSpan(panel: HTMLElement, side: 'right' | 'bottom'): number {\n return side === 'bottom' ? panel.offsetHeight : panel.offsetWidth;\n}\n\nexport function useSheetDrag({\n side,\n panelRef,\n enabled,\n requestClose,\n}: {\n side: 'right' | 'bottom';\n panelRef: RefObject<HTMLElement>;\n enabled: boolean;\n requestClose: () => void;\n}) {\n const axis = side === 'bottom' ? 'y' : 'x';\n const savedUserSelect = useRef<string | null>(null);\n\n function suspendSelection() {\n const sel = window.getSelection();\n if (sel) sel.removeAllRanges();\n savedUserSelect.current = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n }\n function restoreSelection() {\n if (savedUserSelect.current === null) return;\n document.body.style.userSelect = savedUserSelect.current;\n savedUserSelect.current = null;\n }\n useEffect(() => restoreSelection, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function paint(el: HTMLElement, travel: number, stretch: number) {\n const span = sheetSpan(el, side);\n el.style.translate = axis === 'y' ? `0px ${travel}px` : `${travel}px 0px`;\n el.style.scale = axis === 'y' ? `1 ${stretch}` : `${stretch} 1`;\n const scrim = sheetScrim(el);\n if (scrim) scrim.style.opacity = String(1 - Math.min(Math.max(travel / span, 0), 1));\n }\n\n function onPointerDown(e: ReactPointerEvent) {\n if (e.button !== 0) return;\n const startX = e.clientX,\n startY = e.clientY;\n const scrollable = findScrollable(e.target, panelRef.current);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX,\n dy = ev.clientY - startY;\n if (Math.max(Math.abs(dx), Math.abs(dy)) < INTENT_PX) return;\n cleanup();\n const along = axis === 'y' ? dy : dx;\n const cross = axis === 'y' ? dx : dy;\n if (Math.abs(along) <= Math.abs(cross)) return;\n if (scrollable) {\n if (along < 0) return;\n if (axis === 'y' ? scrollable.scrollTop > 0 : scrollable.scrollLeft > 0) return;\n }\n suspendSelection();\n startDrag(ev, { onMove: onDrag, onEnd: onDragEnd });\n };\n\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', cleanup);\n window.removeEventListener('pointercancel', cleanup);\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', cleanup);\n window.addEventListener('pointercancel', cleanup);\n }\n\n function onDrag(info: PanInfo) {\n const el = panelRef.current;\n if (!el) return;\n const o = info.offset[axis];\n const span = sheetSpan(el, side);\n paint(el, Math.max(o, 0), o < 0 ? 1 + Math.min(-o / span, 1) * STRETCH_MAX : 1);\n }\n\n function onDragEnd(info: PanInfo) {\n restoreSelection();\n const el = panelRef.current;\n if (!el) return;\n const span = sheetSpan(el, side);\n if (info.offset[axis] > span * DISMISS_RATIO || info.velocity[axis] > DISMISS_VELOCITY) {\n requestClose();\n return;\n }\n animate(el, { x: [0], y: [0], scale: [[1, 1]], timing: SM.t.settle });\n const scrim = sheetScrim(el);\n if (scrim) animate(scrim, { opacity: [1], timing: SM.t.settle });\n }\n\n return enabled ? { onPointerDown } : {};\n}\n","'use client';\n\nimport './sheet.css';\nimport { Fragment, useId, useRef, type HTMLAttributes, type ReactElement, type ReactNode } from 'react';\nimport { animate, type Layer } from '../../../engine';\nimport { Presence } from '../../../motion/presence';\nimport type { MotionSpecs } from '../../../motion/use-motion';\nimport { resolveMotionTiming } from '../../../motion/motion-timing';\nimport type { DisableableAnimation } from '../../../motion/timing';\nimport { useControllable } from '../../internal/hooks/use-controllable';\nimport { ovCloneTrigger, OverlayPortal } from '../../internal/overlay/layer';\nimport { ModalShell } from '../../internal/overlay/modal';\nimport { useSheetDrag, sheetSpan } from './use-sheet-drag';\nimport type { DataAttributes } from '../../../dom-props';\n\nconst SHEET_TIMING = {\n open: { duration: 'slow', ease: 'entrance' },\n close: { duration: 'base', ease: 'exit' },\n} as const;\n\nexport interface SheetProps {\n /** Controlled open state. Omit to stay uncontrolled. */\n open?: boolean;\n /** Initial state when uncontrolled. Default false. */\n defaultOpen?: boolean;\n /** Fires whenever the open state changes. Pair with `open` for controlled use. */\n onOpenChange?: (open: boolean) => void;\n\n /** Cloned to open the sheet on click. */\n trigger?: ReactElement | null;\n\n /** Edge the sheet slides in from. Default 'right'. */\n side?: 'right' | 'bottom';\n\n /** Scrim/Esc dismissal + drag-to-edge. Default true. */\n dismissible?: boolean;\n\n /** Base id for the panel; drives the trigger's `aria-controls`. Auto-generated when omitted. */\n id?: string;\n /** Standard attributes (className, style, data-*, ...) forwarded to the sheet panel. */\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n /** Open/close timing - motion tokens only, or `null` to disable. @default open 'slow'/'entrance', close 'base'/'exit' */\n animation?: DisableableAnimation;\n /** The ENTIRE surface - paint AND semantics. Drive dismissal with `open`/`onOpenChange`. */\n children: ReactNode;\n}\n\nfunction sheetSlide(slot: HTMLElement, side: 'right' | 'bottom', at: number[]): Layer {\n const frames = at.map((ratio) => ratio * sheetSpan(slot, side));\n return side === 'bottom' ? { y: frames } : { x: frames };\n}\n\nfunction SheetShell({\n side,\n panelId,\n dismissible,\n requestClose,\n htmlProps,\n animate,\n exit,\n children,\n}: {\n side: 'right' | 'bottom';\n panelId: string;\n dismissible: boolean;\n requestClose: () => void;\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n children: ReactNode;\n} & MotionSpecs) {\n const panelRef = useRef<HTMLElement>(null);\n const dragProps = useSheetDrag({ side, panelRef, enabled: dismissible, requestClose });\n return (\n <ModalShell\n animate={animate}\n exit={exit}\n layerClass={'overlay-layer--sheet-' + side}\n panelClass={'overlay-panel--sheet-' + side}\n panelId={panelId}\n dismissible={dismissible}\n requestClose={requestClose}\n panelRef={panelRef}\n panelProps={{ ...htmlProps, ...dragProps }}\n >\n {children}\n </ModalShell>\n );\n}\n\nexport function Sheet({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n trigger = null,\n side = 'right',\n dismissible = true,\n id,\n htmlProps,\n animation,\n children,\n}: SheetProps) {\n const [open, setOpen] = useControllable(controlledOpen, defaultOpen, onOpenChange);\n const triggerRef = useRef<HTMLElement>(null);\n const autoId = useId();\n const panelId = id || 'sheet-' + autoId;\n const close = () => setOpen(false);\n const timings = resolveMotionTiming(animation, SHEET_TIMING);\n\n return (\n <Fragment>\n {ovCloneTrigger(trigger, { open, onPress: () => setOpen(true), panelId, haspopup: 'dialog', triggerRef })}\n <OverlayPortal>\n <Presence>\n {open && (\n <SheetShell\n key=\"sheet\"\n animate={(slot) => {\n const play = animate(slot, { ...sheetSlide(slot, side, [1, 0]), timing: timings.open });\n play.finished.then(() => play.stop());\n return play;\n }}\n exit={(slot) => animate(slot, { ...sheetSlide(slot, side, [1]), timing: timings.close })}\n side={side}\n panelId={panelId}\n dismissible={dismissible}\n requestClose={close}\n htmlProps={htmlProps}\n >\n {children}\n </SheetShell>\n )}\n </Presence>\n </OverlayPortal>\n </Fragment>\n );\n}\n"]}
@@ -0,0 +1,92 @@
1
+ 'use client';import { FieldLabel, FieldMessage } from './chunk-I4XQ4PV2.js';
2
+ import { Icon } from './chunk-3SBCBYB7.js';
3
+ import { cx } from './chunk-QGNC7LH5.js';
4
+ import './date-picker.css';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ function FieldShell({
8
+ variant,
9
+ label,
10
+ required,
11
+ invalid,
12
+ message,
13
+ icon,
14
+ className,
15
+ htmlProps,
16
+ children
17
+ }) {
18
+ const cls = cx("fld", variant, "fld--has-lead", invalid && "is-error", className, htmlProps?.className);
19
+ return /* @__PURE__ */ jsxs("div", { ...htmlProps, className: cls, children: [
20
+ /* @__PURE__ */ jsx(FieldLabel, { label, required }),
21
+ /* @__PURE__ */ jsxs("div", { className: "fld__control", children: [
22
+ children,
23
+ /* @__PURE__ */ jsx("span", { className: "fld__icon fld__icon--lead", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Icon, { name: icon, size: "md" }) })
24
+ ] }),
25
+ /* @__PURE__ */ jsx(FieldMessage, { message: message ? /* @__PURE__ */ jsx("span", { children: message }) : null })
26
+ ] });
27
+ }
28
+ function FieldTrigger({
29
+ display,
30
+ placeholder,
31
+ disabled,
32
+ ...rest
33
+ }) {
34
+ return /* @__PURE__ */ jsx("button", { type: "button", className: "fld__input dtf__trigger", disabled, ...rest, children: display ? /* @__PURE__ */ jsx("span", { className: "dtf__value", children: display }) : /* @__PURE__ */ jsx("span", { className: "dtf__placeholder", children: placeholder }) });
35
+ }
36
+
37
+ // src/components/composites/date-picker/date-utils.ts
38
+ var MONTHS = [
39
+ "January",
40
+ "February",
41
+ "March",
42
+ "April",
43
+ "May",
44
+ "June",
45
+ "July",
46
+ "August",
47
+ "September",
48
+ "October",
49
+ "November",
50
+ "December"
51
+ ];
52
+ var DOW = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
53
+ var pad = (n) => String(n).padStart(2, "0");
54
+ var toKey = (d) => d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate());
55
+ function parse(k) {
56
+ const p = k.split("-").map(Number);
57
+ return new Date(p[0], p[1] - 1, p[2]);
58
+ }
59
+ var today = () => toKey(/* @__PURE__ */ new Date());
60
+ var add = (k, days) => {
61
+ const d = parse(k);
62
+ d.setDate(d.getDate() + days);
63
+ return toKey(d);
64
+ };
65
+ var col = (d) => (d.getDay() + 6) % 7;
66
+ var within = (k, min, max) => (!min || k >= min) && (!max || k <= max);
67
+ function displayDay(k) {
68
+ if (!k) return null;
69
+ const d = parse(k);
70
+ const year = d.getFullYear() === (/* @__PURE__ */ new Date()).getFullYear() ? "" : ", " + d.getFullYear();
71
+ return MONTHS[d.getMonth()].slice(0, 3) + " " + pad(d.getDate()) + year;
72
+ }
73
+ function grid(y, m) {
74
+ const lead = (new Date(y, m, 1).getDay() + 6) % 7;
75
+ const days = [];
76
+ for (let i = 0; i < 42; i++) days.push(new Date(y, m, 1 - lead + i));
77
+ return days;
78
+ }
79
+ function tzLabel(tz, dateKey) {
80
+ try {
81
+ const at = dateKey ? parse(dateKey) : /* @__PURE__ */ new Date();
82
+ const parts = new Intl.DateTimeFormat("en-US", { timeZone: tz, timeZoneName: "shortOffset" }).formatToParts(at);
83
+ const name = parts.find((p) => p.type === "timeZoneName");
84
+ return tz.replace(/_/g, " ") + (name ? " - " + name.value : "");
85
+ } catch (_e) {
86
+ return tz;
87
+ }
88
+ }
89
+
90
+ export { DOW, FieldShell, FieldTrigger, MONTHS, add, col, displayDay, grid, pad, parse, toKey, today, tzLabel, within };
91
+ //# sourceMappingURL=chunk-YGGCQNNU.js.map
92
+ //# sourceMappingURL=chunk-YGGCQNNU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/composites/date-picker/field-shell.tsx","../src/components/composites/date-picker/date-utils.ts"],"names":[],"mappings":"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","file":"chunk-YGGCQNNU.js","sourcesContent":["'use client';\n\nimport './date-picker.css';\nimport type { ButtonHTMLAttributes, HTMLAttributes, ReactNode, Ref } from 'react';\nimport { Icon, type IconName } from '../../internal/icon/Icon';\nimport { FieldLabel, FieldMessage } from '../../primitives/input/field-chrome';\nimport type { DisableableAnimation } from '../../../motion/timing';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nexport interface DateFieldBaseProps {\n /** Field label rendered above the trigger. */\n label?: string;\n /** Asterisk on the label. @default false */\n required?: boolean;\n /** Danger border + message color (.fld is-error). @default false */\n invalid?: boolean;\n /** Helper / error text under the field. */\n message?: string;\n /** Disable the field. @default false */\n disabled?: boolean;\n /** Extra class on the field shell root. */\n className?: string;\n /** Standard <div> attributes (style, data-*, aria-*, ...) forwarded to the field shell root. */\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n /** Popover open/close timing - motion tokens only, or `null` to disable. (Not used by TimeField, which is inline.) */\n animation?: DisableableAnimation;\n}\n\nexport interface FieldShellProps {\n variant: string;\n label?: string;\n required?: boolean;\n invalid?: boolean;\n message?: ReactNode;\n icon: IconName;\n className?: string;\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n children?: ReactNode;\n}\n\nexport function FieldShell({\n variant,\n label,\n required,\n invalid,\n message,\n icon,\n className,\n htmlProps,\n children,\n}: FieldShellProps) {\n const cls = cx('fld', variant, 'fld--has-lead', invalid && 'is-error', className, htmlProps?.className);\n return (\n <div {...htmlProps} className={cls}>\n <FieldLabel label={label} required={required} />\n <div className=\"fld__control\">\n {children}\n <span className=\"fld__icon fld__icon--lead\" aria-hidden=\"true\">\n <Icon name={icon} size=\"md\" />\n </span>\n </div>\n <FieldMessage message={message ? <span>{message}</span> : null} />\n </div>\n );\n}\n\nexport function FieldTrigger({\n display,\n placeholder,\n disabled,\n ...rest\n}: { display: string | null; placeholder: string; disabled?: boolean } & ButtonHTMLAttributes<HTMLButtonElement> & {\n ref?: Ref<HTMLButtonElement>;\n }) {\n return (\n <button type=\"button\" className=\"fld__input dtf__trigger\" disabled={disabled} {...rest}>\n {display ? (\n <span className=\"dtf__value\">{display}</span>\n ) : (\n <span className=\"dtf__placeholder\">{placeholder}</span>\n )}\n </button>\n );\n}\n","export const MONTHS: string[] = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\nexport const DOW: string[] = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\nexport const pad = (n: number): string => String(n).padStart(2, '0');\nexport const toKey = (d: Date): string => d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate());\nexport function parse(k: string): Date {\n const p = k.split('-').map(Number);\n return new Date(p[0], p[1] - 1, p[2]);\n}\nexport const today = (): string => toKey(new Date());\nexport const add = (k: string, days: number): string => {\n const d = parse(k);\n d.setDate(d.getDate() + days);\n return toKey(d);\n};\nexport const col = (d: Date): number => (d.getDay() + 6) % 7;\n\nexport const within = (k: string, min?: string, max?: string): boolean => (!min || k >= min) && (!max || k <= max);\n\nexport function displayDay(k: string | null): string | null {\n if (!k) return null;\n const d = parse(k);\n const year = d.getFullYear() === new Date().getFullYear() ? '' : ', ' + d.getFullYear();\n return MONTHS[d.getMonth()].slice(0, 3) + ' ' + pad(d.getDate()) + year;\n}\n\nexport function grid(y: number, m: number): Date[] {\n const lead = (new Date(y, m, 1).getDay() + 6) % 7;\n const days: Date[] = [];\n for (let i = 0; i < 42; i++) days.push(new Date(y, m, 1 - lead + i));\n return days;\n}\n\nexport function tzLabel(tz: string, dateKey?: string): string {\n try {\n const at = dateKey ? parse(dateKey) : new Date();\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: tz, timeZoneName: 'shortOffset' }).formatToParts(at);\n const name = parts.find((p) => p.type === 'timeZoneName');\n return tz.replace(/_/g, ' ') + (name ? ' - ' + name.value : '');\n } catch (_e) {\n return tz;\n }\n}\n"]}
@@ -0,0 +1,88 @@
1
+ /* Collapse - animates open/closed via a grid track interpolating 0fr and 1fr (never `auto`).
2
+
3
+ Closed content leaves the page semantics, not just the paint: the root turns
4
+ visibility:hidden, dropping children out of the tab order, the accessibility tree and
5
+ hit-testing. The flip is directional by construction. Closing lists visibility with a
6
+ delay equal to the size duration, so removal lands only after the exit finishes and
7
+ nothing pops. Opening omits visibility from its transition list entirely, so content is
8
+ focusable the same frame it opens, before the entrance runs. The delay rides the duration
9
+ tokens, so the global reduced-motion collapse (~1ms) applies to it as well. The open state
10
+ deliberately declares no `visibility: visible` - it inherits instead, so a Collapse nested
11
+ inside a closed ancestor cannot poke a focusable hole through it. */
12
+
13
+ /* Timing overrides - set inline by Collapse.tsx from the token-typed duration/ease props.
14
+ Registered non-inheriting so one Collapse's timing can never leak into a Collapse nested
15
+ inside it; where unset they resolve invalid and the var() fallbacks supply the defaults. */
16
+ @property --collapse-dur-open {
17
+ syntax: '*';
18
+ inherits: false;
19
+ }
20
+ @property --collapse-dur-close {
21
+ syntax: '*';
22
+ inherits: false;
23
+ }
24
+ @property --collapse-ease-open {
25
+ syntax: '*';
26
+ inherits: false;
27
+ }
28
+ @property --collapse-ease-close {
29
+ syntax: '*';
30
+ inherits: false;
31
+ }
32
+
33
+ .collapse {
34
+ display: grid;
35
+ grid-template-rows: 0fr;
36
+ transition:
37
+ grid-template-rows var(--collapse-dur-close, var(--duration-slow)) var(--collapse-ease-close, var(--ease-entrance)),
38
+ grid-template-columns var(--collapse-dur-close, var(--duration-slow))
39
+ var(--collapse-ease-close, var(--ease-entrance)),
40
+ visibility 0s linear var(--collapse-dur-close, var(--duration-slow));
41
+ }
42
+ .collapse[data-open='false'] {
43
+ visibility: hidden;
44
+ }
45
+ .collapse[data-open='true'] {
46
+ grid-template-rows: 1fr;
47
+ transition:
48
+ grid-template-rows var(--collapse-dur-open, var(--duration-slow)) var(--collapse-ease-open, var(--ease-entrance)),
49
+ grid-template-columns var(--collapse-dur-open, var(--duration-slow)) var(--collapse-ease-open, var(--ease-entrance));
50
+ }
51
+
52
+ .collapse[data-axis='width'] {
53
+ grid-template-rows: 1fr;
54
+ grid-template-columns: 0fr;
55
+ }
56
+ .collapse[data-axis='width'][data-open='true'] {
57
+ grid-template-columns: 1fr;
58
+ }
59
+
60
+ /* min-size:0 is what lets the grid track collapse to 0. */
61
+ .collapse__inner {
62
+ overflow: hidden;
63
+ min-height: 0;
64
+ min-width: 0;
65
+ }
66
+
67
+ .collapse--fade .collapse__inner {
68
+ opacity: 0;
69
+ transition: opacity var(--collapse-dur-close, var(--duration-base)) var(--collapse-ease-close, var(--ease-standard));
70
+ }
71
+ .collapse--fade[data-open='true'] .collapse__inner {
72
+ opacity: 1;
73
+ /* fade in slightly after the size opens */
74
+ transition: opacity var(--collapse-dur-open, var(--duration-slow)) var(--collapse-ease-open, var(--ease-entrance))
75
+ 60ms;
76
+ }
77
+
78
+ @media (prefers-reduced-motion: reduce) {
79
+ .collapse,
80
+ .collapse--fade .collapse__inner {
81
+ transition-duration: 1ms;
82
+ }
83
+ /* drop the fade-in stagger so content is visible immediately; the visibility delay needs
84
+ no override - it rides the duration tokens, which this media query collapses to 1ms */
85
+ .collapse--fade .collapse__inner {
86
+ transition-delay: 0ms;
87
+ }
88
+ }
@@ -0,0 +1,46 @@
1
+ import { JSX, CSSProperties, ReactNode, HTMLAttributes } from 'react';
2
+ import { D as DataAttributes } from './dom-props-C0jrllBw.js';
3
+ import { D as DurationToken, E as EaseToken } from './motion-scale-Canq4stZ.js';
4
+ import { T as TimingProps, D as DisableableAnimation, A as AnimationTiming, a as DirectionalToken } from './timing-7JA_zQHP.js';
5
+
6
+ /** Motion-scale duration tokens - the only values Collapse timing accepts. */
7
+ type CollapseDuration = DurationToken;
8
+ /** Motion-scale ease tokens - the only values Collapse timing accepts. */
9
+ type CollapseEase = EaseToken;
10
+ /** One token for both directions, or split per direction; an omitted direction keeps its default. */
11
+ type CollapseTiming<Token extends string> = DirectionalToken<Token>;
12
+ /** Grouped `{ duration, ease }` timing for the size/fade transition. */
13
+ type CollapseAnimation = AnimationTiming;
14
+ interface CollapseOwnProps extends TimingProps {
15
+ /** Open/closed state. Closed content is also removed from the tab order, the accessibility
16
+ * tree and hit-testing once the exit transition completes; reopening restores it before
17
+ * the entrance runs. */
18
+ open?: boolean;
19
+ /** Axis to animate. @default 'height' */
20
+ axis?: 'height' | 'width';
21
+ /** Also cross-fade contents while resizing; follows `duration` / `ease`. */
22
+ fade?: boolean;
23
+ /** Class applied to the inner measured wrapper - the clipping element (overflow: hidden).
24
+ * Content whose focus ring sits flush to its edge needs padding there, or the ring clips. */
25
+ innerClassName?: string;
26
+ /** Size (and fade) transition timing - motion tokens only, each field one token or
27
+ * `{ open, close }`, e.g. `{ duration: { close: 'fast' }, ease: { close: 'exit' } }`.
28
+ * `null` disables the transition (open/close snap instantly).
29
+ * @default duration 'slow' + ease 'entrance' (fade-out: 'base' + 'standard') */
30
+ animation?: DisableableAnimation;
31
+ /** Tag to render as. @default 'div' */
32
+ as?: keyof JSX.IntrinsicElements;
33
+ /** Extra class(es) merged onto the root. */
34
+ className?: string;
35
+ /** Inline styles merged onto the root (composed with the timing custom properties). */
36
+ style?: CSSProperties;
37
+ /** The collapsing content. */
38
+ children?: ReactNode;
39
+ }
40
+ interface CollapseProps extends CollapseOwnProps {
41
+ /** Standard <div> attributes (aria-*, data-*, ...) forwarded to the root. */
42
+ htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, keyof CollapseOwnProps> & DataAttributes;
43
+ }
44
+ declare function Collapse({ open, axis, fade, animation, className, innerClassName, style, children, as: As, htmlProps, }: CollapseProps): JSX.Element;
45
+
46
+ export { Collapse, type CollapseAnimation, type CollapseDuration, type CollapseEase, type CollapseProps, type CollapseTiming };
@@ -0,0 +1,5 @@
1
+ 'use client';export { Collapse } from './chunk-7SZCJ7WI.js';
2
+ import './chunk-VTJTGVZZ.js';
3
+ import './chunk-QGNC7LH5.js';
4
+ //# sourceMappingURL=collapse.js.map
5
+ //# sourceMappingURL=collapse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"collapse.js"}
@@ -0,0 +1,13 @@
1
+ import * as react from 'react';
2
+ import { BadgeProps } from './badge.js';
3
+ import './dom-props-C0jrllBw.js';
4
+
5
+ interface CountBadgeProps extends Omit<BadgeProps, 'children'> {
6
+ /** The chip content - stringified; in `roll` mode each digit becomes an odometer column. */
7
+ value: string | number;
8
+ /** Odometer: digits roll vertically on change. */
9
+ roll?: boolean;
10
+ }
11
+ declare function CountBadge({ value, tone, roll, ...rest }: CountBadgeProps): react.JSX.Element;
12
+
13
+ export { CountBadge, type CountBadgeProps };
@@ -0,0 +1,13 @@
1
+ 'use client';import { Odometer } from './chunk-CONSWNIV.js';
2
+ import { Badge } from './chunk-PMECHR3A.js';
3
+ import './chunk-QGNC7LH5.js';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function CountBadge({ value, tone = "neutral", roll = false, ...rest }) {
7
+ const str = String(value);
8
+ return /* @__PURE__ */ jsx(Badge, { tone, ...rest, children: roll ? /* @__PURE__ */ jsx(Odometer, { value: str }) : str });
9
+ }
10
+
11
+ export { CountBadge };
12
+ //# sourceMappingURL=count-badge.js.map
13
+ //# sourceMappingURL=count-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/badge/CountBadge.tsx"],"names":[],"mappings":";;;;;AAYO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,GAAO,WAAW,IAAA,GAAO,KAAA,EAAO,GAAG,IAAA,EAAK,EAAoB;AAC9F,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAa,GAAG,IAAA,EACpB,QAAA,EAAA,IAAA,mBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,GAAA,EAAK,CAAA,GAAK,GAAA,EACrC,CAAA;AAEJ","file":"count-badge.js","sourcesContent":["'use client';\n\nimport { Badge, type BadgeProps } from './Badge';\nimport { Odometer } from './odometer';\n\nexport interface CountBadgeProps extends Omit<BadgeProps, 'children'> {\n /** The chip content - stringified; in `roll` mode each digit becomes an odometer column. */\n value: string | number;\n /** Odometer: digits roll vertically on change. */\n roll?: boolean;\n}\n\nexport function CountBadge({ value, tone = 'neutral', roll = false, ...rest }: CountBadgeProps) {\n const str = String(value);\n return (\n <Badge tone={tone} {...rest}>\n {roll ? <Odometer value={str} /> : str}\n </Badge>\n );\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import * as react from 'react';
2
+ import { D as DateFieldBaseProps } from './field-shell-Cuda-feL.js';
3
+ import './timing-7JA_zQHP.js';
4
+ import './motion-scale-Canq4stZ.js';
5
+ import './dom-props-C0jrllBw.js';
6
+
7
+ interface DateFieldProps extends DateFieldBaseProps {
8
+ /** Controlled value, 'YYYY-MM-DD'. */
9
+ value?: string | null;
10
+ /** Uncontrolled initial value, 'YYYY-MM-DD'. Use instead of `value`. @default null */
11
+ defaultValue?: string | null;
12
+ /** Fires on each day pick (commit is live), with the picked 'YYYY-MM-DD'. */
13
+ onChange?: (value: string) => void;
14
+ /** Trigger text shown when no date is picked. @default 'Pick a date' */
15
+ placeholder?: string;
16
+ /** IANA timezone name (e.g. 'Europe/Riga') - display context only, shown with its GMT offset in the footer. */
17
+ timezone?: string;
18
+ /** Earliest pickable date, 'YYYY-MM-DD', inclusive. */
19
+ min?: string;
20
+ /** Latest pickable date, 'YYYY-MM-DD', inclusive. */
21
+ max?: string;
22
+ }
23
+ declare function DateField({ value, defaultValue, onChange, label, placeholder, timezone, min, max, required, invalid, message, disabled, className, htmlProps, animation, }: DateFieldProps): react.JSX.Element;
24
+
25
+ export { DateField, type DateFieldProps };
@@ -0,0 +1,87 @@
1
+ 'use client';import { DtpPanel } from './chunk-2HORSLXJ.js';
2
+ import './chunk-TCUCYFT7.js';
3
+ import { FieldTrigger, displayDay, FieldShell } from './chunk-YGGCQNNU.js';
4
+ import { Popover } from './chunk-O4N2OBTR.js';
5
+ import './chunk-EQ32F2QJ.js';
6
+ import './chunk-LDC3RIYA.js';
7
+ import './chunk-GY7JOPUQ.js';
8
+ import './chunk-UE63OOVG.js';
9
+ import './chunk-MKIQFK7S.js';
10
+ import './chunk-NEF5XAHG.js';
11
+ import './chunk-MXOPCFWR.js';
12
+ import './chunk-W3SHPKSB.js';
13
+ import './chunk-JSKXZMLH.js';
14
+ import './chunk-L3Q3VDIW.js';
15
+ import './chunk-I4XQ4PV2.js';
16
+ import './chunk-3SBCBYB7.js';
17
+ import { useControllable } from './chunk-MMRIQNEN.js';
18
+ import './chunk-S5ZTZANS.js';
19
+ import './chunk-U5QQZC3U.js';
20
+ import './chunk-7SZCJ7WI.js';
21
+ import './chunk-VTJTGVZZ.js';
22
+ import './chunk-QGNC7LH5.js';
23
+ import './date-picker.css';
24
+ import { useState } from 'react';
25
+ import { jsx } from 'react/jsx-runtime';
26
+
27
+ function DateField({
28
+ value,
29
+ defaultValue = null,
30
+ onChange,
31
+ label,
32
+ placeholder = "Pick a date",
33
+ timezone,
34
+ min,
35
+ max,
36
+ required = false,
37
+ invalid = false,
38
+ message,
39
+ disabled = false,
40
+ className = "",
41
+ htmlProps,
42
+ animation
43
+ }) {
44
+ const [val, commit] = useControllable(value, defaultValue, onChange);
45
+ const [pickerOpen, setPickerOpen] = useState(false);
46
+ const trigger = /* @__PURE__ */ jsx(FieldTrigger, { display: displayDay(val), placeholder, disabled });
47
+ return /* @__PURE__ */ jsx(
48
+ FieldShell,
49
+ {
50
+ variant: "dtf",
51
+ label,
52
+ required,
53
+ invalid,
54
+ message,
55
+ icon: "calendar",
56
+ className,
57
+ htmlProps,
58
+ children: /* @__PURE__ */ jsx(
59
+ Popover,
60
+ {
61
+ trigger,
62
+ side: "bottom",
63
+ align: "start",
64
+ animation,
65
+ open: pickerOpen,
66
+ onOpenChange: setPickerOpen,
67
+ children: /* @__PURE__ */ jsx(
68
+ DtpPanel,
69
+ {
70
+ val,
71
+ commit,
72
+ close: () => setPickerOpen(false),
73
+ min,
74
+ max,
75
+ timezone,
76
+ label
77
+ }
78
+ )
79
+ }
80
+ )
81
+ }
82
+ );
83
+ }
84
+
85
+ export { DateField };
86
+ //# sourceMappingURL=date-field.js.map
87
+ //# sourceMappingURL=date-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/composites/date-picker/DateField.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2BO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,YAAA,GAAe,IAAA;AAAA,EACf,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,GAAc,aAAA;AAAA,EACd,QAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,EAAA;AAAA,EACZ,SAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,IAAI,eAAA,CAAgB,KAAA,EAAO,cAAc,QAAQ,CAAA;AACnE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,OAAA,uBAAW,YAAA,EAAA,EAAa,OAAA,EAAS,WAAW,GAAG,CAAA,EAAG,aAA0B,QAAA,EAAoB,CAAA;AAEtG,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,KAAA;AAAA,MACR,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAK,UAAA;AAAA,MACL,SAAA;AAAA,MACA,SAAA;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAM,OAAA;AAAA,UACN,SAAA;AAAA,UACA,IAAA,EAAM,UAAA;AAAA,UACN,YAAA,EAAc,aAAA;AAAA,UAEd,QAAA,kBAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,MAAA;AAAA,cACA,KAAA,EAAO,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,cAChC,GAAA;AAAA,cACA,GAAA;AAAA,cACA,QAAA;AAAA,cACA;AAAA;AAAA;AACF;AAAA;AACF;AAAA,GACF;AAEJ","file":"date-field.js","sourcesContent":["'use client';\n\nimport './date-picker.css';\nimport { useState } from 'react';\nimport { Popover } from '../popover/Popover';\nimport { FieldShell, FieldTrigger, type DateFieldBaseProps } from './field-shell';\nimport { useControllable } from '../../internal/hooks/use-controllable';\nimport { DtpPanel } from './calendar-panel';\nimport { displayDay } from './date-utils';\n\nexport interface DateFieldProps extends DateFieldBaseProps {\n /** Controlled value, 'YYYY-MM-DD'. */\n value?: string | null;\n /** Uncontrolled initial value, 'YYYY-MM-DD'. Use instead of `value`. @default null */\n defaultValue?: string | null;\n /** Fires on each day pick (commit is live), with the picked 'YYYY-MM-DD'. */\n onChange?: (value: string) => void;\n /** Trigger text shown when no date is picked. @default 'Pick a date' */\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}\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 htmlProps,\n animation,\n}: DateFieldProps) {\n const [val, commit] = useControllable(value, defaultValue, onChange);\n const [pickerOpen, setPickerOpen] = useState(false);\n const trigger = <FieldTrigger display={displayDay(val)} placeholder={placeholder} disabled={disabled} />;\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 htmlProps={htmlProps}\n >\n <Popover\n trigger={trigger}\n side=\"bottom\"\n align=\"start\"\n animation={animation}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n >\n <DtpPanel\n val={val}\n commit={commit}\n close={() => setPickerOpen(false)}\n min={min}\n max={max}\n timezone={timezone}\n label={label}\n />\n </Popover>\n </FieldShell>\n );\n}\n"]}