@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 @@
1
+ {"version":3,"sources":["../src/components/composites/date-picker/time-core.tsx"],"names":[],"mappings":"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","file":"chunk-64UU4LGU.js","sourcesContent":["'use client';\n\nimport './date-picker.css';\nimport { useEffect, useRef, useState, type ClipboardEvent, type KeyboardEvent, type RefObject } from 'react';\nimport { cx } from '../../internal/utils/cx';\nimport { pad } from './date-utils';\n\ntype Meridiem = 'AM' | 'PM';\ntype Segment = 'h' | 'm';\ninterface Pending {\n seg: Segment;\n d: number;\n}\n\nexport interface TimeSegmentsProps {\n value?: string | null;\n onCommit?: (value: string) => void;\n format?: '24h' | '12h';\n minuteStep?: number;\n min?: string | null;\n max?: string | null;\n disabled?: boolean;\n ariaLabel?: string;\n className?: string;\n}\n\nexport const disp12 = (h24: number): number => ((h24 + 11) % 12) + 1;\nconst tsgToH24 = (d12: number, mer: Meridiem): number => (d12 % 12) + (mer === 'PM' ? 12 : 0);\n\nfunction tsgFeed(pend: number | null, d: number, hi: number): { val: number; done: boolean } {\n if (pend != null) {\n const n = pend * 10 + d;\n if (n <= hi) return { val: n, done: true };\n }\n return { val: d, done: d * 10 > hi };\n}\n\nexport function TimeSegments({\n value = null,\n onCommit,\n format = '24h',\n minuteStep = 5,\n min = null,\n max = null,\n disabled = false,\n ariaLabel = 'Time',\n className = '',\n}: TimeSegmentsProps) {\n const is12 = format === '12h';\n const seed = value ? value.split(':').map(Number) : [null, null];\n\n const [h, setHState] = useState<number | null>(seed[0]);\n const [m, setMState] = useState<number | null>(seed[1]);\n const [mer, setMer] = useState<Meridiem>(seed[0] != null && seed[0] >= 12 ? 'PM' : 'AM');\n const [pend, setPendState] = useState<Pending | null>(null);\n\n const hLive = useRef<number | null>(seed[0]);\n const mLive = useRef<number | null>(seed[1]);\n const pendLive = useRef<Pending | null>(null);\n const setH = (v: number | null) => {\n hLive.current = v;\n setHState(v);\n };\n const setM = (v: number | null) => {\n mLive.current = v;\n setMState(v);\n };\n const setPend = (v: Pending | null) => {\n pendLive.current = v;\n setPendState(v);\n };\n\n const hRef = useRef<HTMLSpanElement>(null);\n const mRef = useRef<HTMLSpanElement>(null);\n const merRef = useRef<HTMLSpanElement>(null);\n const lastRef = useRef<string | null>(value || null);\n\n useEffect(() => {\n if ((value || null) === lastRef.current) return;\n lastRef.current = value || null;\n const p = value ? value.split(':').map(Number) : [null, null];\n setH(p[0]);\n setM(p[1]);\n if (p[0] != null) setMer(p[0] >= 12 ? 'PM' : 'AM');\n setPend(null);\n }, [value]);\n\n function tryCommit(nh: number | null, nm: number | null) {\n if (nh == null || nm == null) return;\n let t = pad(nh) + ':' + pad(nm);\n if (min && t < min) t = min;\n if (max && t > max) t = max;\n const p = t.split(':').map(Number);\n if (p[0] !== nh) {\n setH(p[0]);\n setMer(p[0] >= 12 ? 'PM' : 'AM');\n setPend(null);\n }\n if (p[1] !== nm) setM(p[1]);\n if (t === lastRef.current) return;\n lastRef.current = t;\n if (onCommit) onCommit(t);\n }\n\n const focusSeg = (r: RefObject<HTMLSpanElement | null>) => {\n if (r.current) r.current.focus();\n };\n\n function onHKey(e: KeyboardEvent<HTMLSpanElement>) {\n const k = e.key;\n if (/^[0-9]$/.test(k)) {\n const pd = pend && pend.seg === 'h' ? pend.d : null;\n const r = tsgFeed(pd, +k, is12 ? 12 : 23);\n const nh = is12 ? tsgToH24(r.val === 0 ? 12 : r.val, mer) : r.val;\n setH(nh);\n if (!is12) setMer(nh >= 12 ? 'PM' : 'AM');\n setPend(r.done ? null : { seg: 'h', d: r.val });\n if (r.done) {\n focusSeg(mRef);\n tryCommit(nh, mLive.current);\n }\n } else if (k === 'ArrowUp' || k === 'ArrowDown') {\n const dir = k === 'ArrowUp' ? 1 : -1;\n const nh = h == null ? new Date().getHours() : (h + dir + 24) % 24;\n setH(nh);\n setMer(nh >= 12 ? 'PM' : 'AM');\n setPend(null);\n tryCommit(nh, mLive.current);\n } else if (k === 'Backspace' || k === 'Delete') {\n setH(null);\n setPend(null);\n } else if (k === 'ArrowRight' || k === ':' || k === ';') {\n focusSeg(mRef);\n } else if (k === 'Tab') {\n return;\n } else if (k.length === 1 && !e.metaKey && !e.ctrlKey) {\n } else return;\n e.preventDefault();\n }\n\n function onMKey(e: KeyboardEvent<HTMLSpanElement>) {\n const k = e.key;\n if (/^[0-9]$/.test(k)) {\n const pd = pend && pend.seg === 'm' ? pend.d : null;\n const r = tsgFeed(pd, +k, 59);\n setM(r.val);\n setPend(r.done ? null : { seg: 'm', d: r.val });\n if (r.done) {\n if (is12) focusSeg(merRef);\n tryCommit(hLive.current, r.val);\n }\n } else if (k === 'ArrowUp' || k === 'ArrowDown') {\n const dir = k === 'ArrowUp' ? 1 : -1;\n let nm;\n if (m == null) {\n nm = (Math.round(new Date().getMinutes() / minuteStep) * minuteStep) % 60;\n } else {\n const next =\n dir > 0 ? (Math.floor(m / minuteStep) + 1) * minuteStep : (Math.ceil(m / minuteStep) - 1) * minuteStep;\n nm = ((next % 60) + 60) % 60;\n }\n setM(nm);\n setPend(null);\n tryCommit(hLive.current, nm);\n } else if (k === 'Backspace' || k === 'Delete') {\n if (m == null && !(pend && pend.seg === 'm')) {\n focusSeg(hRef);\n } else {\n setM(null);\n setPend(null);\n }\n } else if (k === 'ArrowLeft') {\n focusSeg(hRef);\n } else if (k === 'ArrowRight' && is12) {\n focusSeg(merRef);\n } else if (k === 'Tab') {\n return;\n } else if (k.length === 1 && !e.metaKey && !e.ctrlKey) {\n } else return;\n e.preventDefault();\n }\n\n function setMeridiem(next: Meridiem) {\n setMer(next);\n if (h != null) {\n const nh = tsgToH24(disp12(h), next);\n setH(nh);\n tryCommit(nh, mLive.current);\n }\n }\n function onMerKey(e: KeyboardEvent<HTMLSpanElement>) {\n const k = e.key;\n if (k === 'a' || k === 'A') setMeridiem('AM');\n else if (k === 'p' || k === 'P') setMeridiem('PM');\n else if (k === 'ArrowUp' || k === 'ArrowDown') setMeridiem(mer === 'AM' ? 'PM' : 'AM');\n else if (k === 'ArrowLeft') focusSeg(mRef);\n else if (k === 'Tab') {\n return;\n } else if (k.length === 1 && !e.metaKey && !e.ctrlKey) {\n } else return;\n e.preventDefault();\n }\n\n function onPaste(e: ClipboardEvent<HTMLDivElement>) {\n if (disabled) return;\n const txt = (e.clipboardData.getData('text') || '').trim();\n const mt = txt.match(/^(\\d{1,2})[:h.\\s]?(\\d{2})?\\s*([ap])\\.?m?\\.?$/i) || txt.match(/^(\\d{1,2})[:h.\\s]?(\\d{2})?$/);\n if (!mt) return;\n e.preventDefault();\n let hh = +mt[1];\n const mm = mt[2] != null ? +mt[2] : 0;\n if (mt[3]) hh = tsgToH24(hh, /^p/i.test(mt[3]) ? 'PM' : 'AM');\n if (hh > 23 || mm > 59) return;\n setH(hh);\n setM(mm);\n setMer(hh >= 12 ? 'PM' : 'AM');\n setPend(null);\n tryCommit(hh, mm);\n }\n\n const onSegBlur = (seg: Segment) => () => {\n if (pendLive.current && pendLive.current.seg === seg) {\n setPend(null);\n tryCommit(hLive.current, mLive.current);\n }\n };\n\n const hText = pend && pend.seg === 'h' ? pad(pend.d) : h == null ? '--' : pad(is12 ? disp12(h) : h);\n const mText = pend && pend.seg === 'm' ? pad(pend.d) : m == null ? '--' : pad(m);\n\n const segCls = (empty: boolean): string => 'tsg__seg' + (empty ? ' is-empty' : '');\n const tab = disabled ? -1 : 0;\n\n return (\n <div\n className={cx('tsg', disabled && 'is-disabled', className)}\n role=\"group\"\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n onPaste={onPaste}\n >\n <span\n ref={hRef}\n className={segCls(h == null && !(pend && pend.seg === 'h'))}\n role=\"spinbutton\"\n tabIndex={tab}\n aria-label=\"Hours\"\n aria-valuemin={is12 ? 1 : 0}\n aria-valuemax={is12 ? 12 : 23}\n aria-valuenow={h == null ? undefined : is12 ? disp12(h) : h}\n aria-valuetext={h == null ? 'Empty' : hText}\n onKeyDown={disabled ? undefined : onHKey}\n onBlur={onSegBlur('h')}\n >\n {hText}\n </span>\n <span className=\"tsg__sep\" aria-hidden=\"true\">\n :\n </span>\n <span\n ref={mRef}\n className={segCls(m == null && !(pend && pend.seg === 'm'))}\n role=\"spinbutton\"\n tabIndex={tab}\n aria-label=\"Minutes\"\n aria-valuemin={0}\n aria-valuemax={59}\n aria-valuenow={m == null ? undefined : m}\n aria-valuetext={m == null ? 'Empty' : mText}\n onKeyDown={disabled ? undefined : onMKey}\n onBlur={onSegBlur('m')}\n >\n {mText}\n </span>\n {is12 ? (\n <span\n ref={merRef}\n className=\"tsg__seg tsg__seg--mer\"\n role=\"spinbutton\"\n tabIndex={tab}\n aria-label=\"AM or PM\"\n aria-valuetext={mer}\n onKeyDown={disabled ? undefined : onMerKey}\n >\n {mer}\n </span>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,35 @@
1
+ 'use client';import { timingVars } from './chunk-VTJTGVZZ.js';
2
+ import { cx } from './chunk-QGNC7LH5.js';
3
+ import './collapse.css';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function Collapse({
7
+ open = false,
8
+ axis = "height",
9
+ fade = false,
10
+ animation,
11
+ className = "",
12
+ innerClassName = "",
13
+ style,
14
+ children,
15
+ as: As = "div",
16
+ htmlProps
17
+ }) {
18
+ const cls = cx("collapse", fade && "collapse--fade", className);
19
+ const vars = timingVars("collapse", animation);
20
+ return /* @__PURE__ */ jsx(
21
+ "div",
22
+ {
23
+ className: cls,
24
+ "data-open": open ? "true" : "false",
25
+ "data-axis": axis,
26
+ style: vars || style ? { ...style, ...vars } : void 0,
27
+ ...htmlProps,
28
+ children: /* @__PURE__ */ jsx(As, { className: cx("collapse__inner", innerClassName), style: vars, children })
29
+ }
30
+ );
31
+ }
32
+
33
+ export { Collapse };
34
+ //# sourceMappingURL=chunk-7SZCJ7WI.js.map
35
+ //# sourceMappingURL=chunk-7SZCJ7WI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/collapse/Collapse.tsx"],"names":[],"mappings":";;;;;AAwDO,SAAS,QAAA,CAAS;AAAA,EACvB,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,QAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,SAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,cAAA,GAAiB,EAAA;AAAA,EACjB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAI,EAAA,GAAK,KAAA;AAAA,EACT;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,UAAA,EAAY,IAAA,IAAQ,kBAAkB,SAAS,CAAA;AAE9D,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,EAAY,SAAS,CAAA;AAE7C,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,GAAA;AAAA,MACX,WAAA,EAAW,OAAO,MAAA,GAAS,OAAA;AAAA,MAC3B,WAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,QAAQ,KAAA,GAAS,EAAE,GAAG,KAAA,EAAO,GAAG,MAAK,GAAsB,MAAA;AAAA,MACjE,GAAG,SAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,MAAG,SAAA,EAAW,EAAA,CAAG,mBAAmB,cAAc,CAAA,EAAG,KAAA,EAAO,IAAA,EAC1D,QAAA,EACH;AAAA;AAAA,GACF;AAEJ","file":"chunk-7SZCJ7WI.js","sourcesContent":["'use client';\n\nimport './collapse.css';\nimport type { CSSProperties, HTMLAttributes, JSX, ReactNode } from 'react';\nimport type { DataAttributes } from '../../../dom-props';\nimport type { DurationToken, EaseToken } from '../../../tokens/motion-scale';\nimport {\n timingVars,\n type AnimationTiming,\n type DirectionalToken,\n type DisableableAnimation,\n type TimingProps,\n} from '../../../motion/timing';\nimport { cx } from '../../internal/utils/cx';\n\n/** Motion-scale duration tokens - the only values Collapse timing accepts. */\nexport type CollapseDuration = DurationToken;\n/** Motion-scale ease tokens - the only values Collapse timing accepts. */\nexport type CollapseEase = EaseToken;\n/** One token for both directions, or split per direction; an omitted direction keeps its default. */\nexport type CollapseTiming<Token extends string> = DirectionalToken<Token>;\n/** Grouped `{ duration, ease }` timing for the size/fade transition. */\nexport type CollapseAnimation = AnimationTiming;\n\ninterface CollapseOwnProps extends TimingProps {\n /** Open/closed state. Closed content is also removed from the tab order, the accessibility\n * tree and hit-testing once the exit transition completes; reopening restores it before\n * the entrance runs. */\n open?: boolean;\n /** Axis to animate. @default 'height' */\n axis?: 'height' | 'width';\n /** Also cross-fade contents while resizing; follows `duration` / `ease`. */\n fade?: boolean;\n /** Class applied to the inner measured wrapper - the clipping element (overflow: hidden).\n * Content whose focus ring sits flush to its edge needs padding there, or the ring clips. */\n innerClassName?: string;\n /** Size (and fade) transition timing - motion tokens only, each field one token or\n * `{ open, close }`, e.g. `{ duration: { close: 'fast' }, ease: { close: 'exit' } }`.\n * `null` disables the transition (open/close snap instantly).\n * @default duration 'slow' + ease 'entrance' (fade-out: 'base' + 'standard') */\n animation?: DisableableAnimation;\n /** Tag to render as. @default 'div' */\n as?: keyof JSX.IntrinsicElements;\n /** Extra class(es) merged onto the root. */\n className?: string;\n /** Inline styles merged onto the root (composed with the timing custom properties). */\n style?: CSSProperties;\n /** The collapsing content. */\n children?: ReactNode;\n}\n\nexport interface CollapseProps extends CollapseOwnProps {\n /** Standard <div> attributes (aria-*, data-*, ...) forwarded to the root. */\n htmlProps?: Omit<HTMLAttributes<HTMLDivElement>, keyof CollapseOwnProps> & DataAttributes;\n}\n\nexport function Collapse({\n open = false,\n axis = 'height',\n fade = false,\n animation,\n className = '',\n innerClassName = '',\n style,\n children,\n as: As = 'div',\n htmlProps,\n}: CollapseProps) {\n const cls = cx('collapse', fade && 'collapse--fade', className);\n\n const vars = timingVars('collapse', animation);\n\n return (\n <div\n className={cls}\n data-open={open ? 'true' : 'false'}\n data-axis={axis}\n style={vars || style ? ({ ...style, ...vars } as CSSProperties) : undefined}\n {...htmlProps}\n >\n <As className={cx('collapse__inner', innerClassName)} style={vars}>\n {children}\n </As>\n </div>\n );\n}\n"]}
@@ -0,0 +1,38 @@
1
+ 'use client';import { useRef, useCallback, useEffect } from 'react';
2
+
3
+ // src/components/internal/hooks/use-scroll-edges.ts
4
+ function useScrollEdges(ref, onChange, { content = false } = {}) {
5
+ const cb = useRef(onChange);
6
+ cb.current = onChange;
7
+ const sync = useCallback(() => {
8
+ const el = ref.current;
9
+ if (!el) return;
10
+ cb.current(
11
+ {
12
+ top: el.scrollTop > 1,
13
+ bottom: el.scrollTop + el.clientHeight < el.scrollHeight - 1,
14
+ left: el.scrollLeft > 1,
15
+ right: el.scrollLeft + el.clientWidth < el.scrollWidth - 1
16
+ },
17
+ el
18
+ );
19
+ }, [ref]);
20
+ useEffect(() => {
21
+ const el = ref.current;
22
+ if (!el) return void 0;
23
+ sync();
24
+ el.addEventListener("scroll", sync, { passive: true });
25
+ const ro = new ResizeObserver(sync);
26
+ ro.observe(el);
27
+ if (content && el.firstElementChild) ro.observe(el.firstElementChild);
28
+ return () => {
29
+ el.removeEventListener("scroll", sync);
30
+ ro.disconnect();
31
+ };
32
+ }, [sync, content]);
33
+ return sync;
34
+ }
35
+
36
+ export { useScrollEdges };
37
+ //# sourceMappingURL=chunk-BIDVNLJO.js.map
38
+ //# sourceMappingURL=chunk-BIDVNLJO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/internal/hooks/use-scroll-edges.ts"],"names":[],"mappings":";;;AAWO,SAAS,cAAA,CACd,KACA,QAAA,EACA,EAAE,UAAU,KAAA,EAAM,GAA2B,EAAC,EAClC;AACZ,EAAA,MAAM,EAAA,GAAK,OAAO,QAAQ,CAAA;AAC1B,EAAA,EAAA,CAAG,OAAA,GAAU,QAAA;AACb,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,EAAA,CAAG,OAAA;AAAA,MACD;AAAA,QACE,GAAA,EAAK,GAAG,SAAA,GAAY,CAAA;AAAA,QACpB,QAAQ,EAAA,CAAG,SAAA,GAAY,EAAA,CAAG,YAAA,GAAe,GAAG,YAAA,GAAe,CAAA;AAAA,QAC3D,IAAA,EAAM,GAAG,UAAA,GAAa,CAAA;AAAA,QACtB,OAAO,EAAA,CAAG,UAAA,GAAa,EAAA,CAAG,WAAA,GAAc,GAAG,WAAA,GAAc;AAAA,OAC3D;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACR,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAChB,IAAA,IAAA,EAAK;AACL,IAAA,EAAA,CAAG,iBAAiB,QAAA,EAAU,IAAA,EAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AACrD,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,IAAI,CAAA;AAClC,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,IAAI,WAAW,EAAA,CAAG,iBAAA,EAAmB,EAAA,CAAG,OAAA,CAAQ,GAAG,iBAAiB,CAAA;AACpE,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACrC,MAAA,EAAA,CAAG,UAAA,EAAW;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAClB,EAAA,OAAO,IAAA;AACT","file":"chunk-BIDVNLJO.js","sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, type RefObject } from 'react';\n\nexport interface ScrollEdges {\n top: boolean;\n bottom: boolean;\n left: boolean;\n right: boolean;\n}\n\nexport function useScrollEdges(\n ref: RefObject<HTMLElement | null>,\n onChange: (edges: ScrollEdges, el: HTMLElement) => void,\n { content = false }: { content?: boolean } = {},\n): () => void {\n const cb = useRef(onChange);\n cb.current = onChange;\n const sync = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n cb.current(\n {\n top: el.scrollTop > 1,\n bottom: el.scrollTop + el.clientHeight < el.scrollHeight - 1,\n left: el.scrollLeft > 1,\n right: el.scrollLeft + el.clientWidth < el.scrollWidth - 1,\n },\n el,\n );\n }, [ref]);\n useEffect(() => {\n const el = ref.current;\n if (!el) return undefined;\n sync();\n el.addEventListener('scroll', sync, { passive: true });\n const ro = new ResizeObserver(sync);\n ro.observe(el);\n if (content && el.firstElementChild) ro.observe(el.firstElementChild);\n return () => {\n el.removeEventListener('scroll', sync);\n ro.disconnect();\n };\n }, [sync, content]);\n return sync;\n}\n"]}
@@ -0,0 +1,17 @@
1
+ 'use client';import './odometer.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // src/components/primitives/badge/odometer.tsx
5
+ function Digit({ d }) {
6
+ return /* @__PURE__ */ jsx("span", { className: "odo__col", "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: "odo__strip odo__strip--" + d, children: Array.from({ length: 10 }, (_, i) => /* @__PURE__ */ jsx("span", { children: i }, i)) }) });
7
+ }
8
+ function Odometer({ value }) {
9
+ const str = String(value);
10
+ return /* @__PURE__ */ jsx("span", { className: "odo", role: "text", "aria-label": str, children: str.split("").map(
11
+ (ch, i) => /\d/.test(ch) ? /* @__PURE__ */ jsx(Digit, { d: Number(ch) }, i) : /* @__PURE__ */ jsx("span", { className: "odo__fixed", "aria-hidden": "true", children: ch }, i)
12
+ ) });
13
+ }
14
+
15
+ export { Odometer };
16
+ //# sourceMappingURL=chunk-CONSWNIV.js.map
17
+ //# sourceMappingURL=chunk-CONSWNIV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/badge/odometer.tsx"],"names":[],"mappings":";;;;AAIA,SAAS,KAAA,CAAM,EAAE,CAAA,EAAE,EAAkB;AACnC,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,aAAA,EAAY,MAAA,EACrC,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,yBAAA,GAA4B,CAAA,EAC1C,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,qBAC9B,GAAA,CAAC,MAAA,EAAA,EAAc,QAAA,EAAA,CAAA,EAAA,EAAJ,CAAM,CAClB,CAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAMO,SAAS,QAAA,CAAS,EAAE,KAAA,EAAM,EAAkB;AACjD,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,YAAA,EAAY,GAAA,EAC3C,QAAA,EAAA,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA;AAAA,IAAI,CAAC,IAAI,CAAA,KACtB,IAAA,CAAK,KAAK,EAAE,CAAA,mBACV,GAAA,CAAC,KAAA,EAAA,EAAc,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,EAAA,EAAf,CAAkB,oBAE9B,GAAA,CAAC,MAAA,EAAA,EAAa,WAAU,YAAA,EAAa,aAAA,EAAY,MAAA,EAC9C,QAAA,EAAA,EAAA,EAAA,EADQ,CAEX;AAAA,GAEJ,EACF,CAAA;AAEJ","file":"chunk-CONSWNIV.js","sourcesContent":["'use client';\n\nimport './odometer.css';\n\nfunction Digit({ d }: { d: number }) {\n return (\n <span className=\"odo__col\" aria-hidden=\"true\">\n <span className={'odo__strip odo__strip--' + d}>\n {Array.from({ length: 10 }, (_, i) => (\n <span key={i}>{i}</span>\n ))}\n </span>\n </span>\n );\n}\n\nexport interface OdometerProps {\n value: string | number;\n}\n\nexport function Odometer({ value }: OdometerProps) {\n const str = String(value);\n return (\n <span className=\"odo\" role=\"text\" aria-label={str}>\n {str.split('').map((ch, i) =>\n /\\d/.test(ch) ? (\n <Digit key={i} d={Number(ch)} />\n ) : (\n <span key={i} className=\"odo__fixed\" aria-hidden=\"true\">\n {ch}\n </span>\n ),\n )}\n </span>\n );\n}\n"]}
@@ -0,0 +1,75 @@
1
+ 'use client';import { tokenPx } from './chunk-UE63OOVG.js';
2
+ import { useLayoutEffect } from 'react';
3
+
4
+ function useAnchorPosition({ side, align, arrow, triggerRef, panelRef }) {
5
+ useLayoutEffect(() => {
6
+ const place = () => {
7
+ const t = triggerRef.current;
8
+ const p = panelRef.current;
9
+ if (!t || !p) return;
10
+ const r = t.getBoundingClientRect();
11
+ const pw = p.offsetWidth;
12
+ const ph = p.offsetHeight;
13
+ const edge = tokenPx("--space-2");
14
+ const gap = arrow ? tokenPx("--space-2") + 3 : 0;
15
+ const vw = window.innerWidth;
16
+ const vh = window.innerHeight;
17
+ const room = { top: r.top, bottom: vh - r.bottom, left: r.left, right: vw - r.right };
18
+ const opposite = {
19
+ top: "bottom",
20
+ bottom: "top",
21
+ left: "right",
22
+ right: "left"
23
+ };
24
+ const vertical = side === "top" || side === "bottom";
25
+ let s = side;
26
+ if (room[s] < (vertical ? ph : pw) + gap && room[opposite[s]] > room[s]) {
27
+ s = opposite[s];
28
+ }
29
+ let x;
30
+ let y;
31
+ if (vertical) {
32
+ y = s === "top" ? r.top - ph - gap : r.bottom + gap;
33
+ x = align === "start" ? r.left : align === "end" ? r.right - pw : r.left + (r.width - pw) / 2;
34
+ x = Math.min(Math.max(x, edge), vw - pw - edge);
35
+ y = Math.max(Math.min(y, vh - ph - edge), edge);
36
+ } else {
37
+ x = s === "left" ? r.left - pw - gap : r.right + gap;
38
+ y = align === "start" ? r.top : align === "end" ? r.bottom - ph : r.top + (r.height - ph) / 2;
39
+ y = Math.min(Math.max(y, edge), vh - ph - edge);
40
+ x = Math.max(Math.min(x, vw - pw - edge), edge);
41
+ }
42
+ p.style.left = Math.round(x) + "px";
43
+ p.style.top = Math.round(y) + "px";
44
+ p.setAttribute("data-side", s);
45
+ p.setAttribute("data-align", align);
46
+ if (arrow) {
47
+ if (vertical) {
48
+ p.style.setProperty(
49
+ "--overlay-arrow-x",
50
+ Math.round(Math.min(Math.max(r.left + r.width / 2 - x, 12), pw - 12)) + "px"
51
+ );
52
+ } else {
53
+ p.style.setProperty(
54
+ "--overlay-arrow-y",
55
+ Math.round(Math.min(Math.max(r.top + r.height / 2 - y, 12), ph - 12)) + "px"
56
+ );
57
+ }
58
+ }
59
+ };
60
+ place();
61
+ window.addEventListener("scroll", place, true);
62
+ window.addEventListener("resize", place);
63
+ const ro = new ResizeObserver(place);
64
+ ro.observe(panelRef.current);
65
+ return () => {
66
+ window.removeEventListener("scroll", place, true);
67
+ window.removeEventListener("resize", place);
68
+ ro.disconnect();
69
+ };
70
+ }, [side, align, arrow]);
71
+ }
72
+
73
+ export { useAnchorPosition };
74
+ //# sourceMappingURL=chunk-EQ32F2QJ.js.map
75
+ //# sourceMappingURL=chunk-EQ32F2QJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/internal/overlay/position.ts"],"names":[],"mappings":"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","file":"chunk-EQ32F2QJ.js","sourcesContent":["'use client';\n\nimport { useLayoutEffect, type RefObject } from 'react';\nimport { tokenPx } from '../utils/token-px';\n\ninterface UseAnchorPositionProps {\n side: 'top' | 'bottom' | 'left' | 'right';\n align: 'start' | 'center' | 'end';\n arrow: boolean;\n triggerRef: RefObject<HTMLElement>;\n panelRef: RefObject<HTMLElement>;\n}\n\nexport function useAnchorPosition({ side, align, arrow, triggerRef, panelRef }: UseAnchorPositionProps) {\n useLayoutEffect(() => {\n const place = () => {\n const t = triggerRef.current;\n const p = panelRef.current;\n if (!t || !p) return;\n\n const r = t.getBoundingClientRect();\n const pw = p.offsetWidth;\n const ph = p.offsetHeight;\n\n const edge = tokenPx('--space-2');\n\n const gap = arrow ? tokenPx('--space-2') + 3 : 0;\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const room: Record<string, number> = { top: r.top, bottom: vh - r.bottom, left: r.left, right: vw - r.right };\n\n const opposite: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n };\n\n const vertical = side === 'top' || side === 'bottom';\n\n let s = side;\n if (room[s] < (vertical ? ph : pw) + gap && room[opposite[s]] > room[s]) {\n s = opposite[s];\n }\n\n let x: number;\n let y: number;\n\n if (vertical) {\n y = s === 'top' ? r.top - ph - gap : r.bottom + gap;\n\n x = align === 'start' ? r.left : align === 'end' ? r.right - pw : r.left + (r.width - pw) / 2;\n\n x = Math.min(Math.max(x, edge), vw - pw - edge);\n\n y = Math.max(Math.min(y, vh - ph - edge), edge);\n } else {\n x = s === 'left' ? r.left - pw - gap : r.right + gap;\n\n y = align === 'start' ? r.top : align === 'end' ? r.bottom - ph : r.top + (r.height - ph) / 2;\n\n y = Math.min(Math.max(y, edge), vh - ph - edge);\n x = Math.max(Math.min(x, vw - pw - edge), edge);\n }\n\n p.style.left = Math.round(x) + 'px';\n p.style.top = Math.round(y) + 'px';\n\n p.setAttribute('data-side', s);\n p.setAttribute('data-align', align);\n\n if (arrow) {\n if (vertical) {\n p.style.setProperty(\n '--overlay-arrow-x',\n Math.round(Math.min(Math.max(r.left + r.width / 2 - x, 12), pw - 12)) + 'px',\n );\n } else {\n p.style.setProperty(\n '--overlay-arrow-y',\n Math.round(Math.min(Math.max(r.top + r.height / 2 - y, 12), ph - 12)) + 'px',\n );\n }\n }\n };\n\n place();\n\n window.addEventListener('scroll', place, true);\n window.addEventListener('resize', place);\n\n const ro = new ResizeObserver(place);\n ro.observe(panelRef.current!);\n\n return () => {\n window.removeEventListener('scroll', place, true);\n window.removeEventListener('resize', place);\n ro.disconnect();\n };\n }, [side, align, arrow]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n"]}
@@ -0,0 +1,111 @@
1
+ 'use client';import { useRef, useLayoutEffect, useEffect, cloneElement } from 'react';
2
+ import { createPortal } from 'react-dom';
3
+
4
+ // src/components/internal/overlay/layer.tsx
5
+ var ovStack = [];
6
+ function ovOnDocKeyDown(e) {
7
+ if (e.key !== "Escape" || e.defaultPrevented || ovStack.length === 0) return;
8
+ const top = ovStack[ovStack.length - 1];
9
+ if (!top.isDismissible()) return;
10
+ e.preventDefault();
11
+ top.requestClose();
12
+ }
13
+ function ovIsTop(entry) {
14
+ return ovStack[ovStack.length - 1] === entry;
15
+ }
16
+ function ovInOverlayAbove(entry, target) {
17
+ const i = ovStack.indexOf(entry);
18
+ return i >= 0 && ovStack.slice(i + 1).some((e) => e.contains(target));
19
+ }
20
+ function useOverlayEntry({
21
+ nodeRef,
22
+ dismissible,
23
+ requestClose
24
+ }) {
25
+ const ref = useRef(null);
26
+ if (!ref.current) {
27
+ ref.current = {
28
+ contains: (t) => Boolean(nodeRef.current && nodeRef.current.contains(t)),
29
+ isDismissible: () => ref.current._dismissible,
30
+ requestClose: () => ref.current._close()
31
+ };
32
+ }
33
+ ref.current._dismissible = dismissible;
34
+ ref.current._close = requestClose;
35
+ useLayoutEffect(() => {
36
+ const entry = ref.current;
37
+ if (ovStack.length === 0) document.addEventListener("keydown", ovOnDocKeyDown);
38
+ ovStack.push(entry);
39
+ if (nodeRef.current) nodeRef.current.style.zIndex = "calc(var(--layer-overlay) + " + (ovStack.length - 1) + ")";
40
+ return () => {
41
+ const i = ovStack.indexOf(entry);
42
+ if (i >= 0) ovStack.splice(i, 1);
43
+ if (ovStack.length === 0) document.removeEventListener("keydown", ovOnDocKeyDown);
44
+ };
45
+ }, []);
46
+ return ref.current;
47
+ }
48
+ function useOutsidePress({
49
+ entry,
50
+ refs,
51
+ enabled,
52
+ onPress
53
+ }) {
54
+ const latest = useRef(null);
55
+ latest.current = { enabled, onPress };
56
+ useEffect(() => {
57
+ const onDown = (e) => {
58
+ if (!latest.current.enabled) return;
59
+ const t = e.target;
60
+ if (refs.some((r) => r.current && r.current.contains(t))) return;
61
+ if (ovInOverlayAbove(entry, t)) return;
62
+ latest.current.onPress();
63
+ };
64
+ document.addEventListener("pointerdown", onDown, true);
65
+ return () => document.removeEventListener("pointerdown", onDown, true);
66
+ }, []);
67
+ }
68
+ function ovCloneTrigger(trigger, {
69
+ open,
70
+ onPress,
71
+ panelId,
72
+ haspopup,
73
+ triggerRef
74
+ }) {
75
+ if (!trigger) return null;
76
+ const own = trigger.props;
77
+ const ownRef = trigger.ref;
78
+ return cloneElement(trigger, {
79
+ "aria-haspopup": haspopup,
80
+ "aria-expanded": open,
81
+ "aria-controls": open ? panelId : void 0,
82
+ onClick: (...args) => {
83
+ own.onClick?.(...args);
84
+ onPress();
85
+ },
86
+ ref: (node) => {
87
+ triggerRef.current = node;
88
+ if (typeof ownRef === "function") ownRef(node);
89
+ else if (ownRef) ownRef.current = node;
90
+ }
91
+ });
92
+ }
93
+ function OverlayPortal({ children }) {
94
+ const hostRef = useRef(null);
95
+ if (typeof document !== "undefined" && !hostRef.current) {
96
+ hostRef.current = document.createElement("div");
97
+ hostRef.current.setAttribute("data-overlay-root", "");
98
+ }
99
+ useLayoutEffect(() => {
100
+ const el = hostRef.current;
101
+ if (!el) return;
102
+ document.body.appendChild(el);
103
+ return () => el.remove();
104
+ }, []);
105
+ if (!hostRef.current) return null;
106
+ return createPortal(children, hostRef.current);
107
+ }
108
+
109
+ export { OverlayPortal, ovCloneTrigger, ovInOverlayAbove, ovIsTop, useOutsidePress, useOverlayEntry };
110
+ //# sourceMappingURL=chunk-GY7JOPUQ.js.map
111
+ //# sourceMappingURL=chunk-GY7JOPUQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/internal/overlay/layer.tsx"],"names":[],"mappings":"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","file":"chunk-GY7JOPUQ.js","sourcesContent":["'use client';\n\nimport {\n cloneElement,\n useEffect,\n useLayoutEffect,\n useRef,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface OverlayEntry {\n contains: (t: EventTarget | null) => boolean;\n isDismissible: () => boolean;\n requestClose: () => void;\n _dismissible?: boolean;\n _close?: () => void;\n}\n\nconst ovStack: OverlayEntry[] = [];\n\nfunction ovOnDocKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Escape' || e.defaultPrevented || ovStack.length === 0) return;\n const top = ovStack[ovStack.length - 1];\n if (!top.isDismissible()) return;\n e.preventDefault();\n top.requestClose();\n}\n\nfunction ovIsTop(entry: OverlayEntry) {\n return ovStack[ovStack.length - 1] === entry;\n}\n\nfunction ovInOverlayAbove(entry: OverlayEntry, target: EventTarget | null) {\n const i = ovStack.indexOf(entry);\n return i >= 0 && ovStack.slice(i + 1).some((e) => e.contains(target));\n}\n\nfunction useOverlayEntry({\n nodeRef,\n dismissible,\n requestClose,\n}: {\n nodeRef: RefObject<HTMLElement>;\n dismissible: boolean;\n requestClose: () => void;\n}): OverlayEntry {\n const ref = useRef<OverlayEntry>(null);\n if (!ref.current) {\n ref.current = {\n contains: (t) => Boolean(nodeRef.current && nodeRef.current.contains(t as Node)),\n isDismissible: () => ref.current._dismissible,\n requestClose: () => ref.current._close(),\n };\n }\n ref.current._dismissible = dismissible;\n ref.current._close = requestClose;\n\n useLayoutEffect(() => {\n const entry = ref.current;\n if (ovStack.length === 0) document.addEventListener('keydown', ovOnDocKeyDown);\n ovStack.push(entry);\n if (nodeRef.current) nodeRef.current.style.zIndex = 'calc(var(--layer-overlay) + ' + (ovStack.length - 1) + ')';\n return () => {\n const i = ovStack.indexOf(entry);\n if (i >= 0) ovStack.splice(i, 1);\n if (ovStack.length === 0) document.removeEventListener('keydown', ovOnDocKeyDown);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return ref.current;\n}\n\nfunction useOutsidePress({\n entry,\n refs,\n enabled,\n onPress,\n}: {\n entry: OverlayEntry;\n refs: RefObject<HTMLElement>[];\n enabled: boolean;\n onPress: () => void;\n}) {\n const latest = useRef<{ enabled: boolean; onPress: () => void }>(null);\n latest.current = { enabled, onPress };\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (!latest.current.enabled) return;\n const t = e.target;\n if (refs.some((r) => r.current && r.current.contains(t as Node))) return;\n if (ovInOverlayAbove(entry, t)) return;\n latest.current.onPress();\n };\n document.addEventListener('pointerdown', onDown, true);\n return () => document.removeEventListener('pointerdown', onDown, true);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nfunction ovCloneTrigger(\n trigger: ReactElement | null,\n {\n open,\n onPress,\n panelId,\n haspopup,\n triggerRef,\n }: { open: boolean; onPress: () => void; panelId: string; haspopup: string; triggerRef: RefObject<HTMLElement> },\n): ReactElement | null {\n if (!trigger) return null;\n const own = trigger.props as { onClick?: (...args: unknown[]) => void };\n const ownRef = (trigger as ReactElement & { ref?: Ref<HTMLElement> }).ref;\n return cloneElement(trigger, {\n 'aria-haspopup': haspopup,\n 'aria-expanded': open,\n 'aria-controls': open ? panelId : undefined,\n onClick: (...args: unknown[]) => {\n own.onClick?.(...args);\n onPress();\n },\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof ownRef === 'function') ownRef(node);\n else if (ownRef) ownRef.current = node;\n },\n } as Partial<typeof trigger.props>);\n}\n\nfunction OverlayPortal({ children }: { children: ReactNode }) {\n const hostRef = useRef<HTMLDivElement | null>(null);\n if (typeof document !== 'undefined' && !hostRef.current) {\n hostRef.current = document.createElement('div');\n hostRef.current.setAttribute('data-overlay-root', '');\n }\n useLayoutEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n document.body.appendChild(el);\n return () => el.remove();\n }, []);\n if (!hostRef.current) return null;\n return createPortal(children, hostRef.current);\n}\n\nexport { ovIsTop, ovInOverlayAbove, useOverlayEntry, useOutsidePress, ovCloneTrigger, OverlayPortal };\nexport type { OverlayEntry };\n"]}
@@ -0,0 +1,30 @@
1
+ 'use client';import { Icon } from './chunk-3SBCBYB7.js';
2
+ import { Collapse } from './chunk-7SZCJ7WI.js';
3
+ import './input.css';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function FieldLabel({ id, label, required, optional }) {
7
+ if (!label) return null;
8
+ return /* @__PURE__ */ jsxs("label", { className: "fld__label", htmlFor: id, children: [
9
+ label,
10
+ required && /* @__PURE__ */ jsx("span", { className: "fld__req", "aria-hidden": "true", children: "*" }),
11
+ optional && /* @__PURE__ */ jsx("span", { className: "fld__optional", children: "(optional)" })
12
+ ] });
13
+ }
14
+ function FieldMessage({ message, icon }) {
15
+ return /* @__PURE__ */ jsx(Collapse, { open: !!message, className: "fld__msg-wrap", children: /* @__PURE__ */ jsxs("div", { className: "fld__msg", children: [
16
+ icon && /* @__PURE__ */ jsx(Icon, { name: icon, size: "sm", weight: "fill" }),
17
+ message
18
+ ] }) });
19
+ }
20
+ function resolveFieldMessage(error, warning, success, helper) {
21
+ return {
22
+ state: error ? "is-error" : warning ? "is-warning" : success ? "is-success" : "",
23
+ msg: error || warning || success || helper,
24
+ msgIcon: error ? "warning-circle" : warning ? "warning" : success ? "check-circle" : null
25
+ };
26
+ }
27
+
28
+ export { FieldLabel, FieldMessage, resolveFieldMessage };
29
+ //# sourceMappingURL=chunk-I4XQ4PV2.js.map
30
+ //# sourceMappingURL=chunk-I4XQ4PV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/input/field-chrome.tsx"],"names":[],"mappings":";;;;;AAwCO,SAAS,WAAW,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,UAAS,EAAoB;AAC7E,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,YAAA,EAAa,SAAS,EAAA,EACpC,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA,IACA,4BACC,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAW,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAE9C,CAAA;AAAA,IAED,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,YAAA,EAAU;AAAA,GAAA,EACzD,CAAA;AAEJ;AAOO,SAAS,YAAA,CAAa,EAAE,OAAA,EAAS,IAAA,EAAK,EAAsB;AACjE,EAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,CAAC,CAAC,OAAA,EAAS,SAAA,EAAU,eAAA,EACnC,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,wBAAS,IAAA,EAAA,EAAK,IAAA,EAAM,MAAM,IAAA,EAAK,IAAA,EAAK,QAAO,MAAA,EAAO,CAAA;AAAA,IAClD;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAEO,SAAS,mBAAA,CACd,KAAA,EACA,OAAA,EACA,OAAA,EACA,MAAA,EAC6D;AAC7D,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,GAAQ,UAAA,GAAa,OAAA,GAAU,YAAA,GAAe,UAAU,YAAA,GAAe,EAAA;AAAA,IAC9E,GAAA,EAAK,KAAA,IAAS,OAAA,IAAW,OAAA,IAAW,MAAA;AAAA,IACpC,SAAS,KAAA,GAAQ,gBAAA,GAAmB,OAAA,GAAU,SAAA,GAAY,UAAU,cAAA,GAAiB;AAAA,GACvF;AACF","file":"chunk-I4XQ4PV2.js","sourcesContent":["'use client';\n\nimport './input.css';\nimport type { ReactNode } from 'react';\nimport { Icon, type IconName } from '../../internal/icon/Icon';\nimport { Collapse } from '../collapse/Collapse';\n\nexport interface FieldIdProps {\n /** Field id, ties the label to the control. */\n id?: string;\n}\n\nexport interface FieldRequirementProps {\n /** Mark the control required - reaches the native element and shows a danger `*` after the label. */\n required?: boolean;\n /** Show a muted \"(optional)\" after the label. */\n optional?: boolean;\n}\n\nexport interface FieldCoreMessagingProps {\n /** Label text (sentence case). */\n label?: ReactNode;\n /** Neutral helper text - shown when there's no validation message. */\n helper?: ReactNode;\n /** Error message - sets the error state (border + icon + colour). Wins over warning/success/helper. */\n error?: ReactNode;\n}\n\nexport interface FieldMessagingProps extends FieldIdProps, FieldRequirementProps, FieldCoreMessagingProps {\n /** Warning message - amber state. Loses to `error`; wins over `success`/`helper`. */\n warning?: ReactNode;\n /** Success message - green state. Loses to `error`/`warning`; wins over `helper`. */\n success?: ReactNode;\n}\n\nexport interface FieldLabelProps extends FieldIdProps, FieldRequirementProps {\n /** Label text (sentence case). */\n label?: ReactNode;\n}\n\nexport function FieldLabel({ id, label, required, optional }: FieldLabelProps) {\n if (!label) return null;\n return (\n <label className=\"fld__label\" htmlFor={id}>\n {label}\n {required && (\n <span className=\"fld__req\" aria-hidden=\"true\">\n *\n </span>\n )}\n {optional && <span className=\"fld__optional\">(optional)</span>}\n </label>\n );\n}\n\nexport interface FieldMessageProps {\n message?: ReactNode;\n icon?: IconName | null;\n}\n\nexport function FieldMessage({ message, icon }: FieldMessageProps) {\n return (\n <Collapse open={!!message} className=\"fld__msg-wrap\">\n <div className=\"fld__msg\">\n {icon && <Icon name={icon} size=\"sm\" weight=\"fill\" />}\n {message}\n </div>\n </Collapse>\n );\n}\n\nexport function resolveFieldMessage(\n error: ReactNode,\n warning: ReactNode,\n success: ReactNode,\n helper: ReactNode,\n): { state: string; msg: ReactNode; msgIcon: IconName | null } {\n return {\n state: error ? 'is-error' : warning ? 'is-warning' : success ? 'is-success' : '',\n msg: error || warning || success || helper,\n msgIcon: error ? 'warning-circle' : warning ? 'warning' : success ? 'check-circle' : null,\n };\n}\n"]}
@@ -0,0 +1,67 @@
1
+ 'use client';import { measure, flip, readShared, keepShared, dropShared } from './chunk-L3Q3VDIW.js';
2
+ import { UIMotion } from './chunk-S5ZTZANS.js';
3
+ import { useRef, useLayoutEffect } from 'react';
4
+
5
+ function useSelfFlip(tuning = {}, enabled = true) {
6
+ const ref = useRef(null);
7
+ const previous = useRef(null);
8
+ const playing = useRef(null);
9
+ const { scale, timing } = tuning;
10
+ useLayoutEffect(() => {
11
+ const el = ref.current;
12
+ if (!el || !enabled) return;
13
+ const from = playing.current ? measure(el) : previous.current;
14
+ playing.current?.stop();
15
+ previous.current = measure(el);
16
+ const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;
17
+ playing.current = next;
18
+ next?.finished.then(() => {
19
+ if (playing.current === next) playing.current = null;
20
+ });
21
+ });
22
+ useLayoutEffect(
23
+ () => () => {
24
+ playing.current?.stop();
25
+ },
26
+ []
27
+ );
28
+ return ref;
29
+ }
30
+ function useSharedFlip(id, tuning = {}, enabled = true) {
31
+ const ref = useRef(null);
32
+ const playing = useRef(null);
33
+ const { scale, timing } = tuning;
34
+ useLayoutEffect(() => {
35
+ const el = ref.current;
36
+ if (!el || !enabled) return;
37
+ const live = playing.current;
38
+ const from = live && live.el === el ? measure(el) : readShared(id);
39
+ live?.play.stop();
40
+ keepShared(id, measure(el));
41
+ const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;
42
+ playing.current = next ? { play: next, el } : null;
43
+ next?.finished.then(() => {
44
+ if (playing.current?.play === next) playing.current = null;
45
+ });
46
+ });
47
+ useLayoutEffect(() => {
48
+ if (!enabled) return;
49
+ return () => {
50
+ const live = playing.current;
51
+ if (live) {
52
+ const box = measure(live.el);
53
+ if (box.width && box.height) keepShared(id, box);
54
+ live.play.stop();
55
+ }
56
+ const mine = readShared(id);
57
+ queueMicrotask(() => {
58
+ if (readShared(id) === mine) dropShared(id);
59
+ });
60
+ };
61
+ }, [id, enabled]);
62
+ return ref;
63
+ }
64
+
65
+ export { useSelfFlip, useSharedFlip };
66
+ //# sourceMappingURL=chunk-JSKXZMLH.js.map
67
+ //# sourceMappingURL=chunk-JSKXZMLH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/motion/flip.tsx"],"names":[],"mappings":"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","file":"chunk-JSKXZMLH.js","sourcesContent":["'use client';\n\nimport { useLayoutEffect, useRef, type RefObject } from 'react';\nimport {\n dropShared,\n flip,\n keepShared,\n measure,\n readShared,\n type Box,\n type FlipOptions,\n type Playback,\n} from '../engine';\nimport { UIMotion } from '../tokens/motion-tokens';\n\nexport type FlipTuning = FlipOptions;\n\nexport function useSelfFlip<T extends HTMLElement>(tuning: FlipTuning = {}, enabled = true): RefObject<T | null> {\n const ref = useRef<T | null>(null);\n const previous = useRef<Box | null>(null);\n const playing = useRef<Playback | null>(null);\n const { scale, timing } = tuning;\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n const from = playing.current ? measure(el) : previous.current;\n playing.current?.stop();\n previous.current = measure(el);\n const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;\n playing.current = next;\n next?.finished.then(() => {\n if (playing.current === next) playing.current = null;\n });\n });\n\n useLayoutEffect(\n () => () => {\n playing.current?.stop();\n },\n [],\n );\n\n return ref;\n}\n\nexport function useSharedFlip<T extends HTMLElement>(\n id: string,\n tuning: FlipTuning = {},\n enabled = true,\n): RefObject<T | null> {\n const ref = useRef<T | null>(null);\n const playing = useRef<{ play: Playback; el: T } | null>(null);\n const { scale, timing } = tuning;\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n const live = playing.current;\n const from = live && live.el === el ? measure(el) : readShared(id);\n live?.play.stop();\n keepShared(id, measure(el));\n const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;\n playing.current = next ? { play: next, el } : null;\n next?.finished.then(() => {\n if (playing.current?.play === next) playing.current = null;\n });\n });\n\n useLayoutEffect(() => {\n if (!enabled) return;\n return () => {\n const live = playing.current;\n if (live) {\n const box = measure(live.el);\n if (box.width && box.height) keepShared(id, box);\n live.play.stop();\n }\n const mine = readShared(id);\n queueMicrotask(() => {\n if (readShared(id) === mine) dropShared(id);\n });\n };\n }, [id, enabled]);\n\n return ref;\n}\n"]}