@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,295 @@
1
+ // src/engine/ease.ts
2
+ var NAMED = {
3
+ linear: [0, 0, 1, 1],
4
+ easeIn: [0.42, 0, 1, 1],
5
+ easeOut: [0, 0, 0.58, 1],
6
+ easeInOut: [0.42, 0, 0.58, 1],
7
+ circIn: [0.55, 0, 1, 0.45],
8
+ circOut: [0, 0.55, 0.45, 1],
9
+ circInOut: [0.85, 0, 0.15, 1],
10
+ backIn: [0.36, 0, 0.66, -0.56],
11
+ backOut: [0.34, 1.56, 0.64, 1],
12
+ backInOut: [0.68, -0.6, 0.32, 1.6],
13
+ anticipate: [0.38, -0.4, 0.88, 1.08]
14
+ };
15
+ var bezierCurve = (a, b, t) => {
16
+ const u = 1 - t;
17
+ return 3 * a * u * u * t + 3 * b * u * t * t + t * t * t;
18
+ };
19
+ var bezierSlope = (a, b, t) => {
20
+ const u = 1 - t;
21
+ return 3 * a * (u * u - 2 * t * u) + 3 * b * (2 * t * u - t * t) + 3 * t * t;
22
+ };
23
+ function bezierAt(b, x) {
24
+ const [x1, y1, x2, y2] = b;
25
+ if (x1 === y1 && x2 === y2) return x;
26
+ if (x <= 0) return 0;
27
+ if (x >= 1) return 1;
28
+ let t = x;
29
+ for (let i = 0; i < 8; i++) {
30
+ const err = bezierCurve(x1, x2, t) - x;
31
+ if (err < 1e-4 && err > -1e-4) break;
32
+ const slope = bezierSlope(x1, x2, t);
33
+ if (slope < 1e-6 && slope > -1e-6) break;
34
+ t -= err / slope;
35
+ }
36
+ return bezierCurve(y1, y2, t);
37
+ }
38
+ var toBezier = (ease) => typeof ease === "string" ? NAMED[ease] ?? NAMED.easeInOut : ease;
39
+ var cssBezier = (ease) => `cubic-bezier(${toBezier(ease).join(",")})`;
40
+ var isSegmented = (ease) => Array.isArray(ease) && (Array.isArray(ease[0]) || typeof ease[0] === "string");
41
+ var ARRIVAL = 0.99;
42
+ var SETTLE_BAND = 2e-3;
43
+ var MAX_SPRING_SECONDS = 4;
44
+ var SETTLE_LIMIT = 2.5;
45
+ var SETTLE_STEP = 1 / 240;
46
+ var OMEGA_PROBE = 0.1;
47
+ var OMEGA_CEILING = 1e5;
48
+ function springAt(zeta, omega, t) {
49
+ const decay = Math.exp(-zeta * omega * t);
50
+ if (zeta < 1) {
51
+ const damped = omega * Math.sqrt(1 - zeta * zeta);
52
+ return 1 - decay * (Math.cos(damped * t) + zeta * omega / damped * Math.sin(damped * t));
53
+ }
54
+ return 1 - decay * (1 + omega * t);
55
+ }
56
+ function omegaForArrival(zeta, visual) {
57
+ let hi = OMEGA_PROBE / visual;
58
+ while (hi < OMEGA_CEILING && springAt(zeta, hi, visual) < ARRIVAL) hi *= 2;
59
+ let lo = hi / 2;
60
+ for (let i = 0; i < 40; i++) {
61
+ const mid = (lo + hi) / 2;
62
+ if (springAt(zeta, mid, visual) < ARRIVAL) lo = mid;
63
+ else hi = mid;
64
+ }
65
+ return hi;
66
+ }
67
+ function settleSeconds(zeta, omega, visual) {
68
+ let last = SETTLE_STEP;
69
+ for (let t = SETTLE_STEP; t < MAX_SPRING_SECONDS; t += SETTLE_STEP) {
70
+ if (Math.abs(springAt(zeta, omega, t) - 1) >= SETTLE_BAND) last = t;
71
+ }
72
+ return Math.min(MAX_SPRING_SECONDS, visual * SETTLE_LIMIT, last + SETTLE_STEP);
73
+ }
74
+ var SAMPLE_MS = 4;
75
+ var MIN_SAMPLES = 24;
76
+ var MAX_SAMPLES = 120;
77
+ var trim = (n) => Math.round(n * 1e4) / 1e4;
78
+ function toLinearEasing(at, durationMs) {
79
+ const steps = Math.min(MAX_SAMPLES, Math.max(MIN_SAMPLES, Math.round(durationMs / SAMPLE_MS)));
80
+ const points = [];
81
+ for (let i = 0; i <= steps; i++) points.push(String(trim(at(i / steps))));
82
+ return `linear(${points.join(",")})`;
83
+ }
84
+ var springCache = /* @__PURE__ */ new Map();
85
+ function springCurve(visual, bounce) {
86
+ const key = `${visual}:${bounce}`;
87
+ const cached = springCache.get(key);
88
+ if (cached) return cached;
89
+ const zeta = Math.min(1, Math.max(0.05, 1 - bounce));
90
+ const omega = omegaForArrival(zeta, visual);
91
+ const seconds = settleSeconds(zeta, omega, visual);
92
+ const duration = seconds * 1e3;
93
+ const at = (progress) => progress >= 1 ? 1 : springAt(zeta, omega, progress * seconds);
94
+ const curve = { duration, easing: toLinearEasing(at, duration), at };
95
+ springCache.set(key, curve);
96
+ return curve;
97
+ }
98
+ function resolveTiming(timing = {}) {
99
+ const delay = (timing.delay ?? 0) * 1e3;
100
+ const spring = timing.type === "spring" || timing.visualDuration != null && !timing.type;
101
+ if (spring) {
102
+ const visual = Math.max(timing.visualDuration ?? timing.duration ?? 0.3, 0.01);
103
+ const curve = springCurve(visual, timing.bounce ?? 0);
104
+ return { duration: curve.duration, delay, easing: curve.easing, segments: null, at: curve.at };
105
+ }
106
+ const duration = (timing.duration ?? 0.3) * 1e3;
107
+ const ease = timing.ease;
108
+ if (isSegmented(ease)) {
109
+ const first = toBezier(ease[0]);
110
+ return { duration, delay, easing: "linear", segments: ease.map(cssBezier), at: (p) => bezierAt(first, p) };
111
+ }
112
+ const bezier = ease === void 0 ? NAMED.easeInOut : toBezier(ease);
113
+ return { duration, delay, easing: cssBezier(bezier), segments: null, at: (p) => bezierAt(bezier, p) };
114
+ }
115
+
116
+ // src/engine/animate.ts
117
+ var clock = { scale: 1 };
118
+ var RESET = { translate: "0px 0px", scale: "1" };
119
+ var AUTO_METRIC = { width: "offsetWidth", height: "offsetHeight" };
120
+ var SIZES = ["width", "height"];
121
+ function measureAuto(el, key) {
122
+ const saved = el.style.getPropertyValue(key);
123
+ el.style.setProperty(key, "auto");
124
+ const measured = el[AUTO_METRIC[key]];
125
+ if (saved) el.style.setProperty(key, saved);
126
+ else el.style.removeProperty(key);
127
+ return measured;
128
+ }
129
+ function held(list, index) {
130
+ return list[Math.min(index, list.length - 1)];
131
+ }
132
+ function currentValue(el, key) {
133
+ const raw = getComputedStyle(el).getPropertyValue(key).trim();
134
+ return raw && raw !== "none" ? raw : RESET[key];
135
+ }
136
+ function compile(el, layer) {
137
+ const frames = {};
138
+ const autoKeys = [];
139
+ if (layer.x?.length || layer.y?.length) {
140
+ const x = layer.x?.length ? layer.x : [0];
141
+ const y = layer.y?.length ? layer.y : [0];
142
+ const count = Math.max(x.length, y.length);
143
+ frames.translate = Array.from({ length: count }, (_, i) => `${held(x, i)}px ${held(y, i)}px`);
144
+ }
145
+ if (layer.scale) frames.scale = layer.scale.map((v) => typeof v === "number" ? String(v) : `${v[0]} ${v[1]}`);
146
+ if (layer.opacity) frames.opacity = layer.opacity.map(String);
147
+ for (const key of SIZES) {
148
+ const list = layer[key];
149
+ if (!list) continue;
150
+ if (list[list.length - 1] === "auto") autoKeys.push(key);
151
+ const measured = list.includes("auto") ? measureAuto(el, key) : 0;
152
+ frames[key] = list.map((v) => `${v === "auto" ? measured : v}px`);
153
+ }
154
+ for (const [key, list] of Object.entries(frames)) if (list.length === 1) list.unshift(currentValue(el, key));
155
+ return { frames, autoKeys };
156
+ }
157
+ var owned = /* @__PURE__ */ new WeakMap();
158
+ function claim(el, keys, animation) {
159
+ const map = owned.get(el) ?? /* @__PURE__ */ new Map();
160
+ owned.set(el, map);
161
+ for (const key of keys) {
162
+ const previous = map.get(key);
163
+ if (previous && previous !== animation) previous.cancel();
164
+ if (animation) map.set(key, animation);
165
+ else map.delete(key);
166
+ }
167
+ }
168
+ function play(el, layer) {
169
+ const { frames, autoKeys } = compile(el, layer);
170
+ const keys = Object.keys(frames);
171
+ if (!keys.length) return null;
172
+ const timing = layer.timing;
173
+ const resolved = resolveTiming(timing);
174
+ if (resolved.duration <= 0) {
175
+ claim(el, keys, null);
176
+ if (timing?.fill !== "none") for (const key of keys) el.style.setProperty(key, frames[key][frames[key].length - 1]);
177
+ return null;
178
+ }
179
+ const shaped = { ...frames };
180
+ if (timing?.times) shaped.offset = timing.times;
181
+ if (resolved.segments) shaped.easing = resolved.segments;
182
+ const animation = el.animate(shaped, {
183
+ duration: resolved.duration,
184
+ delay: resolved.delay,
185
+ easing: resolved.easing,
186
+ fill: timing?.fill ?? "both",
187
+ composite: layer.composite
188
+ });
189
+ animation.playbackRate = 1 / clock.scale;
190
+ if (layer.composite !== "add") claim(el, keys, animation);
191
+ const finished = animation.finished.then(
192
+ () => {
193
+ if (!autoKeys.length) return;
194
+ animation.commitStyles();
195
+ animation.cancel();
196
+ for (const key of autoKeys) el.style.setProperty(key, "auto");
197
+ },
198
+ () => {
199
+ }
200
+ );
201
+ return { stop: () => animation.cancel(), finished };
202
+ }
203
+ var settled = { stop() {
204
+ }, finished: Promise.resolve() };
205
+ function animate(el, ...layers) {
206
+ const plays = [];
207
+ for (const layer of layers) {
208
+ const started = play(el, layer);
209
+ if (started) plays.push(started);
210
+ }
211
+ if (!plays.length) return settled;
212
+ if (plays.length === 1) return plays[0];
213
+ return {
214
+ stop: () => {
215
+ for (const started of plays) started.stop();
216
+ },
217
+ finished: Promise.all(plays.map((started) => started.finished)).then(() => {
218
+ })
219
+ };
220
+ }
221
+
222
+ // src/engine/drag.ts
223
+ function startDrag(origin, handlers) {
224
+ const startX = origin.clientX;
225
+ const startY = origin.clientY;
226
+ let lastX = startX;
227
+ let lastY = startY;
228
+ let lastTime = performance.now();
229
+ let velocity = { x: 0, y: 0 };
230
+ const info = () => ({ offset: { x: lastX - startX, y: lastY - startY }, velocity });
231
+ const move = (event) => {
232
+ const now = performance.now();
233
+ const elapsed = now - lastTime;
234
+ if (elapsed > 0) {
235
+ velocity = { x: (event.clientX - lastX) / elapsed * 1e3, y: (event.clientY - lastY) / elapsed * 1e3 };
236
+ lastTime = now;
237
+ }
238
+ lastX = event.clientX;
239
+ lastY = event.clientY;
240
+ handlers.onMove?.(info());
241
+ };
242
+ const detach = () => {
243
+ window.removeEventListener("pointermove", move);
244
+ window.removeEventListener("pointerup", end);
245
+ window.removeEventListener("pointercancel", end);
246
+ };
247
+ const end = () => {
248
+ detach();
249
+ handlers.onEnd?.(info());
250
+ };
251
+ window.addEventListener("pointermove", move);
252
+ window.addEventListener("pointerup", end);
253
+ window.addEventListener("pointercancel", end);
254
+ return detach;
255
+ }
256
+
257
+ // src/engine/flip.ts
258
+ var MOVE_EPSILON = 0.5;
259
+ var SCALE_EPSILON = 0.01;
260
+ function measure(el) {
261
+ const rect = el.getBoundingClientRect();
262
+ return { left: rect.left + window.scrollX, top: rect.top + window.scrollY, width: rect.width, height: rect.height };
263
+ }
264
+ var shared = /* @__PURE__ */ new Map();
265
+ function keepShared(key, box) {
266
+ shared.set(key, box);
267
+ }
268
+ function readShared(key) {
269
+ return shared.get(key) ?? null;
270
+ }
271
+ function dropShared(key) {
272
+ shared.delete(key);
273
+ }
274
+ function flip(el, from, options = {}) {
275
+ const to = measure(el);
276
+ if (!to.width || !to.height) return null;
277
+ const dx = from.left - to.left;
278
+ const dy = from.top - to.top;
279
+ const sx = options.scale === false ? 1 : from.width / to.width;
280
+ const sy = options.scale === false ? 1 : from.height / to.height;
281
+ const moved = Math.abs(dx) > MOVE_EPSILON || Math.abs(dy) > MOVE_EPSILON;
282
+ const scaled = Math.abs(sx - 1) > SCALE_EPSILON || Math.abs(sy - 1) > SCALE_EPSILON;
283
+ if (!moved && !scaled) return null;
284
+ const layer = { x: [dx, 0], y: [dy, 0], timing: { ...options.timing, fill: "none" } };
285
+ if (scaled)
286
+ layer.scale = [
287
+ [sx, sy],
288
+ [1, 1]
289
+ ];
290
+ return animate(el, layer);
291
+ }
292
+
293
+ export { animate, clock, dropShared, flip, keepShared, measure, readShared, startDrag };
294
+ //# sourceMappingURL=chunk-L3Q3VDIW.js.map
295
+ //# sourceMappingURL=chunk-L3Q3VDIW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/ease.ts","../src/engine/animate.ts","../src/engine/drag.ts","../src/engine/flip.ts"],"names":[],"mappings":"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","file":"chunk-L3Q3VDIW.js","sourcesContent":["import type { Bezier, MotionTransition } from '../tokens/motion-tokens';\n\nconst NAMED: Record<string, Bezier> = {\n linear: [0, 0, 1, 1],\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easeInOut: [0.42, 0, 0.58, 1],\n circIn: [0.55, 0, 1, 0.45],\n circOut: [0, 0.55, 0.45, 1],\n circInOut: [0.85, 0, 0.15, 1],\n backIn: [0.36, 0, 0.66, -0.56],\n backOut: [0.34, 1.56, 0.64, 1],\n backInOut: [0.68, -0.6, 0.32, 1.6],\n anticipate: [0.38, -0.4, 0.88, 1.08],\n};\n\nconst bezierCurve = (a: number, b: number, t: number) => {\n const u = 1 - t;\n return 3 * a * u * u * t + 3 * b * u * t * t + t * t * t;\n};\n\nconst bezierSlope = (a: number, b: number, t: number) => {\n const u = 1 - t;\n return 3 * a * (u * u - 2 * t * u) + 3 * b * (2 * t * u - t * t) + 3 * t * t;\n};\n\nexport function bezierAt(b: Bezier, x: number): number {\n const [x1, y1, x2, y2] = b;\n if (x1 === y1 && x2 === y2) return x;\n if (x <= 0) return 0;\n if (x >= 1) return 1;\n let t = x;\n for (let i = 0; i < 8; i++) {\n const err = bezierCurve(x1, x2, t) - x;\n if (err < 1e-4 && err > -1e-4) break;\n const slope = bezierSlope(x1, x2, t);\n if (slope < 1e-6 && slope > -1e-6) break;\n t -= err / slope;\n }\n return bezierCurve(y1, y2, t);\n}\n\nexport type EaseValue = NonNullable<MotionTransition['ease']>;\n\nexport const toBezier = (ease: EaseValue): Bezier =>\n typeof ease === 'string' ? (NAMED[ease] ?? NAMED.easeInOut) : ease;\n\nexport const cssBezier = (ease: EaseValue): string => `cubic-bezier(${toBezier(ease).join(',')})`;\n\nexport const isSegmented = (ease: unknown): ease is EaseValue[] =>\n Array.isArray(ease) && (Array.isArray(ease[0]) || typeof ease[0] === 'string');\n\nconst ARRIVAL = 0.99;\nconst SETTLE_BAND = 0.002;\nconst MAX_SPRING_SECONDS = 4;\nconst SETTLE_LIMIT = 2.5;\nconst SETTLE_STEP = 1 / 240;\nconst OMEGA_PROBE = 0.1;\nconst OMEGA_CEILING = 1e5;\n\nfunction springAt(zeta: number, omega: number, t: number): number {\n const decay = Math.exp(-zeta * omega * t);\n if (zeta < 1) {\n const damped = omega * Math.sqrt(1 - zeta * zeta);\n return 1 - decay * (Math.cos(damped * t) + ((zeta * omega) / damped) * Math.sin(damped * t));\n }\n return 1 - decay * (1 + omega * t);\n}\n\nfunction omegaForArrival(zeta: number, visual: number): number {\n let hi = OMEGA_PROBE / visual;\n while (hi < OMEGA_CEILING && springAt(zeta, hi, visual) < ARRIVAL) hi *= 2;\n let lo = hi / 2;\n for (let i = 0; i < 40; i++) {\n const mid = (lo + hi) / 2;\n if (springAt(zeta, mid, visual) < ARRIVAL) lo = mid;\n else hi = mid;\n }\n return hi;\n}\n\nfunction settleSeconds(zeta: number, omega: number, visual: number): number {\n let last = SETTLE_STEP;\n for (let t = SETTLE_STEP; t < MAX_SPRING_SECONDS; t += SETTLE_STEP) {\n if (Math.abs(springAt(zeta, omega, t) - 1) >= SETTLE_BAND) last = t;\n }\n return Math.min(MAX_SPRING_SECONDS, visual * SETTLE_LIMIT, last + SETTLE_STEP);\n}\n\nconst SAMPLE_MS = 4;\nconst MIN_SAMPLES = 24;\nconst MAX_SAMPLES = 120;\n\nconst trim = (n: number) => Math.round(n * 1e4) / 1e4;\n\nfunction toLinearEasing(at: (progress: number) => number, durationMs: number): string {\n const steps = Math.min(MAX_SAMPLES, Math.max(MIN_SAMPLES, Math.round(durationMs / SAMPLE_MS)));\n const points: string[] = [];\n for (let i = 0; i <= steps; i++) points.push(String(trim(at(i / steps))));\n return `linear(${points.join(',')})`;\n}\n\ninterface SpringCurve {\n duration: number;\n easing: string;\n at(progress: number): number;\n}\n\nconst springCache = new Map<string, SpringCurve>();\n\nfunction springCurve(visual: number, bounce: number): SpringCurve {\n const key = `${visual}:${bounce}`;\n const cached = springCache.get(key);\n if (cached) return cached;\n const zeta = Math.min(1, Math.max(0.05, 1 - bounce));\n const omega = omegaForArrival(zeta, visual);\n const seconds = settleSeconds(zeta, omega, visual);\n const duration = seconds * 1000;\n const at = (progress: number) => (progress >= 1 ? 1 : springAt(zeta, omega, progress * seconds));\n const curve: SpringCurve = { duration, easing: toLinearEasing(at, duration), at };\n springCache.set(key, curve);\n return curve;\n}\n\nexport interface Timing extends Omit<MotionTransition, 'ease'> {\n ease?: EaseValue | EaseValue[];\n times?: number[];\n fill?: FillMode;\n}\n\nexport interface ResolvedTiming {\n duration: number;\n delay: number;\n easing: string;\n segments: string[] | null;\n at(progress: number): number;\n}\n\nexport function resolveTiming(timing: Timing = {}): ResolvedTiming {\n const delay = (timing.delay ?? 0) * 1000;\n const spring = timing.type === 'spring' || (timing.visualDuration != null && !timing.type);\n if (spring) {\n const visual = Math.max(timing.visualDuration ?? timing.duration ?? 0.3, 0.01);\n const curve = springCurve(visual, timing.bounce ?? 0);\n return { duration: curve.duration, delay, easing: curve.easing, segments: null, at: curve.at };\n }\n const duration = (timing.duration ?? 0.3) * 1000;\n const ease = timing.ease;\n if (isSegmented(ease)) {\n const first = toBezier(ease[0]);\n return { duration, delay, easing: 'linear', segments: ease.map(cssBezier), at: (p) => bezierAt(first, p) };\n }\n const bezier = ease === undefined ? NAMED.easeInOut : toBezier(ease);\n return { duration, delay, easing: cssBezier(bezier), segments: null, at: (p) => bezierAt(bezier, p) };\n}\n","import { resolveTiming, type Timing } from './ease';\n\nexport const clock = { scale: 1 };\n\nexport interface Playback {\n stop(): void;\n finished: Promise<void>;\n}\n\ntype Vec = [number, number];\nexport type Size = number | 'auto';\n\nexport interface Layer {\n x?: number[];\n y?: number[];\n scale?: number[] | Vec[];\n opacity?: number[];\n width?: Size[];\n height?: Size[];\n timing?: Timing;\n composite?: CompositeOperation;\n}\n\nconst RESET: Record<string, string> = { translate: '0px 0px', scale: '1' };\nconst AUTO_METRIC = { width: 'offsetWidth', height: 'offsetHeight' } as const;\nconst SIZES = ['width', 'height'] as const;\n\nfunction measureAuto(el: HTMLElement, key: 'width' | 'height'): number {\n const saved = el.style.getPropertyValue(key);\n el.style.setProperty(key, 'auto');\n const measured = el[AUTO_METRIC[key]];\n if (saved) el.style.setProperty(key, saved);\n else el.style.removeProperty(key);\n return measured;\n}\n\nfunction held(list: number[], index: number): number {\n return list[Math.min(index, list.length - 1)];\n}\n\nfunction currentValue(el: HTMLElement, key: string): string {\n const raw = getComputedStyle(el).getPropertyValue(key).trim();\n return raw && raw !== 'none' ? raw : RESET[key];\n}\n\nfunction compile(el: HTMLElement, layer: Layer) {\n const frames: Record<string, string[]> = {};\n const autoKeys: string[] = [];\n\n if (layer.x?.length || layer.y?.length) {\n const x = layer.x?.length ? layer.x : [0];\n const y = layer.y?.length ? layer.y : [0];\n const count = Math.max(x.length, y.length);\n frames.translate = Array.from({ length: count }, (_, i) => `${held(x, i)}px ${held(y, i)}px`);\n }\n if (layer.scale) frames.scale = layer.scale.map((v) => (typeof v === 'number' ? String(v) : `${v[0]} ${v[1]}`));\n if (layer.opacity) frames.opacity = layer.opacity.map(String);\n\n for (const key of SIZES) {\n const list = layer[key];\n if (!list) continue;\n if (list[list.length - 1] === 'auto') autoKeys.push(key);\n const measured = list.includes('auto') ? measureAuto(el, key) : 0;\n frames[key] = list.map((v) => `${v === 'auto' ? measured : v}px`);\n }\n\n for (const [key, list] of Object.entries(frames)) if (list.length === 1) list.unshift(currentValue(el, key));\n return { frames, autoKeys };\n}\n\nconst owned = new WeakMap<HTMLElement, Map<string, Animation>>();\n\nfunction claim(el: HTMLElement, keys: string[], animation: Animation | null): void {\n const map = owned.get(el) ?? new Map<string, Animation>();\n owned.set(el, map);\n for (const key of keys) {\n const previous = map.get(key);\n if (previous && previous !== animation) previous.cancel();\n if (animation) map.set(key, animation);\n else map.delete(key);\n }\n}\n\nfunction play(el: HTMLElement, layer: Layer): Playback | null {\n const { frames, autoKeys } = compile(el, layer);\n const keys = Object.keys(frames);\n if (!keys.length) return null;\n\n const timing = layer.timing;\n const resolved = resolveTiming(timing);\n\n if (resolved.duration <= 0) {\n claim(el, keys, null);\n if (timing?.fill !== 'none') for (const key of keys) el.style.setProperty(key, frames[key][frames[key].length - 1]);\n return null;\n }\n\n const shaped: PropertyIndexedKeyframes = { ...frames };\n if (timing?.times) shaped.offset = timing.times;\n if (resolved.segments) shaped.easing = resolved.segments;\n\n const animation = el.animate(shaped, {\n duration: resolved.duration,\n delay: resolved.delay,\n easing: resolved.easing,\n fill: timing?.fill ?? 'both',\n composite: layer.composite,\n });\n animation.playbackRate = 1 / clock.scale;\n if (layer.composite !== 'add') claim(el, keys, animation);\n\n const finished = animation.finished.then(\n (): void => {\n if (!autoKeys.length) return;\n animation.commitStyles();\n animation.cancel();\n for (const key of autoKeys) el.style.setProperty(key, 'auto');\n },\n (): void => {},\n );\n\n return { stop: () => animation.cancel(), finished };\n}\n\nconst settled: Playback = { stop() {}, finished: Promise.resolve() };\n\nexport function animate(el: HTMLElement, ...layers: Layer[]): Playback {\n const plays: Playback[] = [];\n for (const layer of layers) {\n const started = play(el, layer);\n if (started) plays.push(started);\n }\n if (!plays.length) return settled;\n if (plays.length === 1) return plays[0];\n return {\n stop: () => {\n for (const started of plays) started.stop();\n },\n finished: Promise.all(plays.map((started) => started.finished)).then((): void => {}),\n };\n}\n","interface Axes {\n x: number;\n y: number;\n}\n\nexport interface PanInfo {\n offset: Axes;\n velocity: Axes;\n}\n\ninterface DragHandlers {\n onMove?: (info: PanInfo) => void;\n onEnd?: (info: PanInfo) => void;\n}\n\nexport function startDrag(origin: { clientX: number; clientY: number }, handlers: DragHandlers): () => void {\n const startX = origin.clientX;\n const startY = origin.clientY;\n let lastX = startX;\n let lastY = startY;\n let lastTime = performance.now();\n let velocity: Axes = { x: 0, y: 0 };\n\n const info = (): PanInfo => ({ offset: { x: lastX - startX, y: lastY - startY }, velocity });\n\n const move = (event: PointerEvent) => {\n const now = performance.now();\n const elapsed = now - lastTime;\n if (elapsed > 0) {\n velocity = { x: ((event.clientX - lastX) / elapsed) * 1000, y: ((event.clientY - lastY) / elapsed) * 1000 };\n lastTime = now;\n }\n lastX = event.clientX;\n lastY = event.clientY;\n handlers.onMove?.(info());\n };\n\n const detach = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', end);\n window.removeEventListener('pointercancel', end);\n };\n\n const end = () => {\n detach();\n handlers.onEnd?.(info());\n };\n\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', end);\n window.addEventListener('pointercancel', end);\n return detach;\n}\n","import { animate, type Layer, type Playback } from './animate';\nimport type { Timing } from './ease';\n\nexport interface Box {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nconst MOVE_EPSILON = 0.5;\nconst SCALE_EPSILON = 0.01;\n\nexport function measure(el: HTMLElement): Box {\n const rect = el.getBoundingClientRect();\n return { left: rect.left + window.scrollX, top: rect.top + window.scrollY, width: rect.width, height: rect.height };\n}\n\nconst shared = new Map<string, Box>();\n\nexport function keepShared(key: string, box: Box): void {\n shared.set(key, box);\n}\n\nexport function readShared(key: string): Box | null {\n return shared.get(key) ?? null;\n}\n\nexport function dropShared(key: string): void {\n shared.delete(key);\n}\n\nexport interface FlipOptions {\n scale?: boolean;\n timing?: Timing;\n}\n\nexport function flip(el: HTMLElement, from: Box, options: FlipOptions = {}): Playback | null {\n const to = measure(el);\n if (!to.width || !to.height) return null;\n\n const dx = from.left - to.left;\n const dy = from.top - to.top;\n const sx = options.scale === false ? 1 : from.width / to.width;\n const sy = options.scale === false ? 1 : from.height / to.height;\n\n const moved = Math.abs(dx) > MOVE_EPSILON || Math.abs(dy) > MOVE_EPSILON;\n const scaled = Math.abs(sx - 1) > SCALE_EPSILON || Math.abs(sy - 1) > SCALE_EPSILON;\n if (!moved && !scaled) return null;\n\n const layer: Layer = { x: [dx, 0], y: [dy, 0], timing: { ...options.timing, fill: 'none' } };\n if (scaled)\n layer.scale = [\n [sx, sy],\n [1, 1],\n ];\n\n return animate(el, layer);\n}\n"]}
@@ -0,0 +1,62 @@
1
+ 'use client';import { ovIsTop, ovInOverlayAbove } from './chunk-GY7JOPUQ.js';
2
+ import { useEffect } from 'react';
3
+
4
+ function useReturnFocus(nodeRef) {
5
+ useEffect(() => {
6
+ const prev = document.activeElement;
7
+ return () => {
8
+ const a = document.activeElement;
9
+ const orphaned = !a || a === document.body || nodeRef.current && nodeRef.current.contains(a);
10
+ if (orphaned && prev && prev.isConnected && typeof prev.focus === "function") {
11
+ queueMicrotask(() => {
12
+ if (prev.isConnected) prev.focus({ preventScroll: true });
13
+ });
14
+ }
15
+ };
16
+ }, []);
17
+ }
18
+ var OV_FOCUSABLE = 'a[href], button:not([disabled]), input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
19
+ function useFocusTrap({ panelRef, entry }) {
20
+ useEffect(() => {
21
+ const panel = panelRef.current;
22
+ if (!panel) return void 0;
23
+ const focusables = () => Array.from(panel.querySelectorAll(OV_FOCUSABLE)).filter(
24
+ (el) => el.offsetParent !== null || el === document.activeElement
25
+ );
26
+ const seed = panel.querySelector("[autofocus], [data-autofocus]") || focusables()[0] || panel;
27
+ seed.focus({ preventScroll: true });
28
+ const onKeyDown = (e) => {
29
+ if (e.key !== "Tab") return;
30
+ const f = focusables();
31
+ if (f.length === 0) {
32
+ e.preventDefault();
33
+ return;
34
+ }
35
+ const cur = document.activeElement;
36
+ if (e.shiftKey) {
37
+ if (cur === f[0] || cur === panel) {
38
+ e.preventDefault();
39
+ f[f.length - 1].focus();
40
+ }
41
+ } else if (cur === f[f.length - 1]) {
42
+ e.preventDefault();
43
+ f[0].focus();
44
+ }
45
+ };
46
+ const onFocusIn = (e) => {
47
+ if (panel.contains(e.target)) return;
48
+ if (!ovIsTop(entry) || ovInOverlayAbove(entry, e.target)) return;
49
+ (focusables()[0] || panel).focus({ preventScroll: true });
50
+ };
51
+ panel.addEventListener("keydown", onKeyDown);
52
+ document.addEventListener("focusin", onFocusIn);
53
+ return () => {
54
+ panel.removeEventListener("keydown", onKeyDown);
55
+ document.removeEventListener("focusin", onFocusIn);
56
+ };
57
+ }, []);
58
+ }
59
+
60
+ export { useFocusTrap, useReturnFocus };
61
+ //# sourceMappingURL=chunk-LDC3RIYA.js.map
62
+ //# sourceMappingURL=chunk-LDC3RIYA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/internal/overlay/focus.ts"],"names":[],"mappings":"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","file":"chunk-LDC3RIYA.js","sourcesContent":["'use client';\n\nimport { useEffect, type RefObject } from 'react';\nimport { type OverlayEntry, ovIsTop, ovInOverlayAbove } from './layer';\n\nexport function useReturnFocus(nodeRef: RefObject<HTMLElement>) {\n useEffect(() => {\n const prev = document.activeElement as HTMLElement | null;\n return () => {\n const a = document.activeElement;\n const orphaned = !a || a === document.body || (nodeRef.current && nodeRef.current.contains(a));\n if (orphaned && prev && prev.isConnected && typeof prev.focus === 'function') {\n queueMicrotask(() => {\n if (prev.isConnected) prev.focus({ preventScroll: true });\n });\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nconst OV_FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), ' +\n 'select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nexport function useFocusTrap({ panelRef, entry }: { panelRef: RefObject<HTMLElement>; entry: OverlayEntry }) {\n useEffect(() => {\n const panel = panelRef.current;\n if (!panel) return undefined;\n const focusables = () =>\n Array.from(panel.querySelectorAll<HTMLElement>(OV_FOCUSABLE)).filter(\n (el) => el.offsetParent !== null || el === document.activeElement,\n );\n\n const seed = panel.querySelector<HTMLElement>('[autofocus], [data-autofocus]') || focusables()[0] || panel;\n seed.focus({ preventScroll: true });\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const f = focusables();\n if (f.length === 0) {\n e.preventDefault();\n return;\n }\n const cur = document.activeElement;\n if (e.shiftKey) {\n if (cur === f[0] || cur === panel) {\n e.preventDefault();\n f[f.length - 1].focus();\n }\n } else if (cur === f[f.length - 1]) {\n e.preventDefault();\n f[0].focus();\n }\n };\n const onFocusIn = (e: FocusEvent) => {\n if (panel.contains(e.target as Node)) return;\n if (!ovIsTop(entry) || ovInOverlayAbove(entry, e.target)) return;\n (focusables()[0] || panel).focus({ preventScroll: true });\n };\n\n panel.addEventListener('keydown', onKeyDown);\n document.addEventListener('focusin', onFocusIn);\n return () => {\n panel.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('focusin', onFocusIn);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n}\n"]}
@@ -0,0 +1,43 @@
1
+ 'use client';import { animate } from './chunk-L3Q3VDIW.js';
2
+ import { UIMotion } from './chunk-S5ZTZANS.js';
3
+ import { useRef } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function useGlide(containerRef) {
7
+ const ref = useRef(null);
8
+ const visible = useRef(false);
9
+ function enter(target) {
10
+ const box = containerRef.current, pill = ref.current;
11
+ if (!box || !pill || !target) return;
12
+ const was = pill.getBoundingClientRect();
13
+ const b = box.getBoundingClientRect();
14
+ const t = target.getBoundingClientRect();
15
+ const s = box.offsetWidth ? b.width / box.offsetWidth : 1;
16
+ pill.style.translate = `${(t.left - b.left) / s + box.scrollLeft}px ${(t.top - b.top) / s + box.scrollTop}px`;
17
+ pill.style.width = `${t.width / s}px`;
18
+ pill.style.height = `${t.height / s}px`;
19
+ const now = pill.getBoundingClientRect();
20
+ animate(pill, { opacity: [1], timing: { duration: UIMotion.dur.fast, ease: UIMotion.ease.standard } });
21
+ const glided = visible.current && !UIMotion.reduced;
22
+ visible.current = true;
23
+ if (!glided) return;
24
+ const timing = { ...UIMotion.t.settle, fill: "none" };
25
+ animate(
26
+ pill,
27
+ { x: [was.left - now.left, 0], y: [was.top - now.top, 0], timing, composite: "add" },
28
+ { width: [was.width, now.width], height: [was.height, now.height], timing }
29
+ );
30
+ }
31
+ function leave() {
32
+ visible.current = false;
33
+ if (ref.current) animate(ref.current, { opacity: [0], timing: { duration: UIMotion.dur.fast, ease: UIMotion.ease.exit } });
34
+ }
35
+ return { ref, enter, leave };
36
+ }
37
+ function GlidePill({ className, glide }) {
38
+ return /* @__PURE__ */ jsx("span", { ref: glide.ref, className, "aria-hidden": "true" });
39
+ }
40
+
41
+ export { GlidePill, useGlide };
42
+ //# sourceMappingURL=chunk-MKIQFK7S.js.map
43
+ //# sourceMappingURL=chunk-MKIQFK7S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/motion/glide.tsx"],"names":[],"mappings":"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","file":"chunk-MKIQFK7S.js","sourcesContent":["'use client';\n\nimport { useRef, type RefObject } from 'react';\nimport { animate } from '../engine';\nimport { UIMotion as SM } from '../tokens/motion-tokens';\n\nexport type GlideApi = ReturnType<typeof useGlide>;\n\nexport function useGlide<T extends HTMLElement>(containerRef: RefObject<T | null>) {\n const ref = useRef<HTMLSpanElement | null>(null);\n const visible = useRef(false);\n\n function enter(target: HTMLElement | null) {\n const box = containerRef.current,\n pill = ref.current;\n if (!box || !pill || !target) return;\n const was = pill.getBoundingClientRect();\n const b = box.getBoundingClientRect();\n const t = target.getBoundingClientRect();\n const s = box.offsetWidth ? b.width / box.offsetWidth : 1;\n pill.style.translate = `${(t.left - b.left) / s + box.scrollLeft}px ${(t.top - b.top) / s + box.scrollTop}px`;\n pill.style.width = `${t.width / s}px`;\n pill.style.height = `${t.height / s}px`;\n const now = pill.getBoundingClientRect();\n animate(pill, { opacity: [1], timing: { duration: SM.dur.fast, ease: SM.ease.standard } });\n const glided = visible.current && !SM.reduced;\n visible.current = true;\n if (!glided) return;\n const timing = { ...SM.t.settle, fill: 'none' as const };\n animate(\n pill,\n { x: [was.left - now.left, 0], y: [was.top - now.top, 0], timing, composite: 'add' },\n { width: [was.width, now.width], height: [was.height, now.height], timing },\n );\n }\n\n function leave() {\n visible.current = false;\n if (ref.current) animate(ref.current, { opacity: [0], timing: { duration: SM.dur.fast, ease: SM.ease.exit } });\n }\n\n return { ref, enter, leave };\n}\n\nexport function GlidePill({ className, glide }: { className?: string; glide: GlideApi }) {\n return <span ref={glide.ref} className={className} aria-hidden=\"true\" />;\n}\n"]}
@@ -0,0 +1,20 @@
1
+ 'use client';import { useState, useCallback } from 'react';
2
+
3
+ // src/components/internal/hooks/use-controllable.ts
4
+ function useControllable(value, defaultValue, onChange) {
5
+ const controlled = value !== void 0;
6
+ const [inner, setInner] = useState(defaultValue);
7
+ const val = controlled ? value : inner;
8
+ const commit = useCallback(
9
+ (next, meta) => {
10
+ if (!controlled) setInner(next);
11
+ if (onChange) onChange(next, meta);
12
+ },
13
+ [controlled, onChange]
14
+ );
15
+ return [val, commit];
16
+ }
17
+
18
+ export { useControllable };
19
+ //# sourceMappingURL=chunk-MMRIQNEN.js.map
20
+ //# sourceMappingURL=chunk-MMRIQNEN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/internal/hooks/use-controllable.ts"],"names":[],"mappings":";;;AAIO,SAAS,eAAA,CACd,KAAA,EACA,YAAA,EACA,QAAA,EACqC;AACrC,EAAA,MAAM,aAAa,KAAA,KAAU,MAAA;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAY,YAAY,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,aAAc,KAAA,GAAc,KAAA;AACxC,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,CAAC,MAAS,IAAA,KAAgB;AACxB,MAAA,IAAI,CAAC,UAAA,EAAY,QAAA,CAAS,IAAI,CAAA;AAC9B,MAAA,IAAI,QAAA,EAAU,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,YAAY,QAAQ;AAAA,GACvB;AACA,EAAA,OAAO,CAAC,KAAK,MAAM,CAAA;AACrB","file":"chunk-MMRIQNEN.js","sourcesContent":["'use client';\n\nimport { useCallback, useState } from 'react';\n\nexport function useControllable<T, Meta = unknown>(\n value: T | undefined,\n defaultValue: T,\n onChange?: (next: T, meta?: Meta) => void,\n): [T, (next: T, meta?: Meta) => void] {\n const controlled = value !== undefined;\n const [inner, setInner] = useState<T>(defaultValue);\n const val = controlled ? (value as T) : inner;\n const commit = useCallback(\n (next: T, meta?: Meta) => {\n if (!controlled) setInner(next);\n if (onChange) onChange(next, meta);\n },\n [controlled, onChange],\n );\n return [val, commit];\n}\n"]}
@@ -0,0 +1,59 @@
1
+ 'use client';import { PresenceContext } from './chunk-W3SHPKSB.js';
2
+ import { useState, useRef, useLayoutEffect, useEffect, createElement, Fragment, Children, isValidElement } from 'react';
3
+
4
+ function toEntries(children) {
5
+ const out = [];
6
+ Children.forEach(children, (child, index) => {
7
+ if (isValidElement(child)) out.push({ key: String(child.key ?? index), node: child, exiting: false });
8
+ });
9
+ return out;
10
+ }
11
+ function Presence({ children, initial = true, mode = "sync", onExitComplete }) {
12
+ const incoming = toEntries(children);
13
+ const signature = incoming.map((entry) => entry.key).join("|");
14
+ const [shown, setShown] = useState(incoming);
15
+ const bornAtMount = useRef(new Set(incoming.map((entry) => entry.key)));
16
+ const wasExiting = useRef(false);
17
+ const complete = useRef(onExitComplete);
18
+ complete.current = onExitComplete;
19
+ useLayoutEffect(() => {
20
+ setShown((previous) => {
21
+ const live = new Set(incoming.map((entry) => entry.key));
22
+ const merged = incoming.map((entry) => ({ ...entry }));
23
+ previous.forEach((entry, index) => {
24
+ if (live.has(entry.key)) return;
25
+ merged.splice(index, 0, entry.exiting ? entry : { ...entry, exiting: true });
26
+ });
27
+ return merged;
28
+ });
29
+ }, [signature]);
30
+ const leaving = shown.some((entry) => entry.exiting);
31
+ useEffect(() => {
32
+ if (wasExiting.current && !leaving) complete.current?.();
33
+ wasExiting.current = leaving;
34
+ }, [leaving]);
35
+ const fresh = new Map(incoming.map((entry) => [entry.key, entry.node]));
36
+ const visible = mode === "wait" && leaving ? shown.filter((entry) => entry.exiting) : shown;
37
+ return createElement(
38
+ Fragment,
39
+ null,
40
+ visible.map(
41
+ (entry) => createElement(
42
+ PresenceContext.Provider,
43
+ {
44
+ key: entry.key,
45
+ value: {
46
+ isPresent: !entry.exiting,
47
+ initial: initial || !bornAtMount.current.has(entry.key),
48
+ safeToRemove: () => setShown((previous) => previous.filter((e) => e.key !== entry.key || !e.exiting))
49
+ }
50
+ },
51
+ fresh.get(entry.key) ?? entry.node
52
+ )
53
+ )
54
+ );
55
+ }
56
+
57
+ export { Presence };
58
+ //# sourceMappingURL=chunk-MXOPCFWR.js.map
59
+ //# sourceMappingURL=chunk-MXOPCFWR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/motion/presence.tsx"],"names":[],"mappings":"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","file":"chunk-MXOPCFWR.js","sourcesContent":["'use client';\n\nimport {\n Children,\n Fragment,\n createElement,\n isValidElement,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { PresenceContext } from './presence-context';\n\ninterface Entry {\n key: string;\n node: ReactElement;\n exiting: boolean;\n}\n\nfunction toEntries(children: ReactNode): Entry[] {\n const out: Entry[] = [];\n Children.forEach(children, (child, index) => {\n if (isValidElement(child)) out.push({ key: String(child.key ?? index), node: child, exiting: false });\n });\n return out;\n}\n\nexport interface PresenceProps {\n /** Keyed children. A child animates out only if it renders a `<Motion>` carrying `exit`. */\n children?: ReactNode;\n /** Let children present on the first paint play their `animate`. @default true */\n initial?: boolean;\n /** `wait` holds entering children back until the outgoing ones have left. @default 'sync' */\n mode?: 'sync' | 'wait';\n /** Fires once the last exiting child has been removed. */\n onExitComplete?: () => void;\n}\n\nexport function Presence({ children, initial = true, mode = 'sync', onExitComplete }: PresenceProps) {\n const incoming = toEntries(children);\n const signature = incoming.map((entry) => entry.key).join('|');\n const [shown, setShown] = useState<Entry[]>(incoming);\n const bornAtMount = useRef(new Set(incoming.map((entry) => entry.key)));\n const wasExiting = useRef(false);\n const complete = useRef(onExitComplete);\n complete.current = onExitComplete;\n\n useLayoutEffect(() => {\n setShown((previous) => {\n const live = new Set(incoming.map((entry) => entry.key));\n const merged: Entry[] = incoming.map((entry) => ({ ...entry }));\n previous.forEach((entry, index) => {\n if (live.has(entry.key)) return;\n merged.splice(index, 0, entry.exiting ? entry : { ...entry, exiting: true });\n });\n return merged;\n });\n }, [signature]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const leaving = shown.some((entry) => entry.exiting);\n\n useEffect(() => {\n if (wasExiting.current && !leaving) complete.current?.();\n wasExiting.current = leaving;\n }, [leaving]);\n\n const fresh = new Map(incoming.map((entry) => [entry.key, entry.node]));\n const visible = mode === 'wait' && leaving ? shown.filter((entry) => entry.exiting) : shown;\n\n return createElement(\n Fragment,\n null,\n visible.map((entry) =>\n createElement(\n PresenceContext.Provider,\n {\n key: entry.key,\n value: {\n isPresent: !entry.exiting,\n initial: initial || !bornAtMount.current.has(entry.key),\n safeToRemove: () => setShown((previous) => previous.filter((e) => e.key !== entry.key || !e.exiting)),\n },\n },\n fresh.get(entry.key) ?? entry.node,\n ),\n ),\n );\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import { UIMotion } from './chunk-S5ZTZANS.js';
2
+ import { resolveDirection } from './chunk-VTJTGVZZ.js';
3
+
4
+ // src/motion/motion-timing.ts
5
+ function resolveMotionTiming(animation, defaults) {
6
+ if (animation === null) return { open: { duration: 0 }, close: { duration: 0 } };
7
+ const build = (dir) => {
8
+ const durToken = animation && resolveDirection(animation.duration, dir) || defaults[dir].duration;
9
+ const easeToken = animation && resolveDirection(animation.ease, dir) || defaults[dir].ease;
10
+ return { duration: UIMotion.dur[durToken], ease: UIMotion.ease[easeToken] };
11
+ };
12
+ return { open: build("open"), close: build("close") };
13
+ }
14
+
15
+ export { resolveMotionTiming };
16
+ //# sourceMappingURL=chunk-NEF5XAHG.js.map
17
+ //# sourceMappingURL=chunk-NEF5XAHG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/motion/motion-timing.ts"],"names":[],"mappings":";;;;AAmBO,SAAS,mBAAA,CACd,WACA,QAAA,EACe;AACf,EAAA,IAAI,SAAA,KAAc,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,EAAE,QAAA,EAAU,CAAA,EAAE,EAAG,KAAA,EAAO,EAAE,QAAA,EAAU,GAAE,EAAE;AAE/E,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAA4C;AACzD,IAAA,MAAM,QAAA,GAAY,aAAa,gBAAA,CAAiB,SAAA,CAAU,UAAU,GAAG,CAAA,IAAM,QAAA,CAAS,GAAG,CAAA,CAAE,QAAA;AAC3F,IAAA,MAAM,SAAA,GAAa,aAAa,gBAAA,CAAiB,SAAA,CAAU,MAAM,GAAG,CAAA,IAAM,QAAA,CAAS,GAAG,CAAA,CAAE,IAAA;AACxF,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,QAAQ,GAAG,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAE;AAAA,EAC5E,CAAA;AAEA,EAAA,OAAO,EAAE,MAAM,KAAA,CAAM,MAAM,GAAG,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA,EAAE;AACtD","file":"chunk-NEF5XAHG.js","sourcesContent":["import { UIMotion, type MotionTransition } from '../tokens/motion-tokens';\nimport type { DurationToken, EaseToken } from '../tokens/motion-scale';\nimport { resolveDirection, type DisableableAnimation } from './timing';\n\nexport interface DirectionDefault {\n duration: DurationToken;\n ease: EaseToken;\n}\n\nexport interface MotionTimingDefaults {\n open: DirectionDefault;\n close: DirectionDefault;\n}\n\nexport interface MotionTimings {\n open: MotionTransition;\n close: MotionTransition;\n}\n\nexport function resolveMotionTiming(\n animation: DisableableAnimation | undefined,\n defaults: MotionTimingDefaults,\n): MotionTimings {\n if (animation === null) return { open: { duration: 0 }, close: { duration: 0 } };\n\n const build = (dir: 'open' | 'close'): MotionTransition => {\n const durToken = (animation && resolveDirection(animation.duration, dir)) || defaults[dir].duration;\n const easeToken = (animation && resolveDirection(animation.ease, dir)) || defaults[dir].ease;\n return { duration: UIMotion.dur[durToken], ease: UIMotion.ease[easeToken] };\n };\n\n return { open: build('open'), close: build('close') };\n}\n"]}
@@ -0,0 +1,22 @@
1
+ 'use client';import './checkbox.css';
2
+ import { useRef, useEffect, Fragment } from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ // src/components/primitives/checkbox/check-glyph.tsx
6
+ function CheckGlyph({ indeterminate = false, ...inputProps }) {
7
+ const ref = useRef(null);
8
+ useEffect(() => {
9
+ if (ref.current) ref.current.indeterminate = indeterminate;
10
+ }, [indeterminate, inputProps.checked]);
11
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
12
+ /* @__PURE__ */ jsx("input", { ref, type: "checkbox", className: "cbx__input", ...inputProps }),
13
+ /* @__PURE__ */ jsxs("span", { className: "cbx__box", "aria-hidden": "true", children: [
14
+ /* @__PURE__ */ jsx("svg", { className: "cbx__mark", viewBox: "0 0 16 16", fill: "none", children: /* @__PURE__ */ jsx("path", { className: "cbx__tick", d: "M3.5 8.5 L6.75 11.5 L12.5 4.75" }) }),
15
+ /* @__PURE__ */ jsx("span", { className: "cbx__dash" })
16
+ ] })
17
+ ] });
18
+ }
19
+
20
+ export { CheckGlyph };
21
+ //# sourceMappingURL=chunk-NNXJCLTV.js.map
22
+ //# sourceMappingURL=chunk-NNXJCLTV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/primitives/checkbox/check-glyph.tsx"],"names":[],"mappings":";;;;;AASO,SAAS,WAAW,EAAE,aAAA,GAAgB,KAAA,EAAO,GAAG,YAAW,EAAoB;AACpF,EAAA,MAAM,GAAA,GAAM,OAAyB,IAAI,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,aAAA,GAAgB,aAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,aAAA,EAAe,UAAA,CAAW,OAAO,CAAC,CAAA;AAEtC,EAAA,4BACG,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAM,GAAA,EAAU,IAAA,EAAK,YAAW,SAAA,EAAU,YAAA,EAAc,GAAG,UAAA,EAAY,CAAA;AAAA,oBACxE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,eAAY,MAAA,EACrC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAY,CAAA,EAAE,kCAAiC,CAAA,EACjE,CAAA;AAAA,sBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAY;AAAA,KAAA,EAC9B;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-NNXJCLTV.js","sourcesContent":["'use client';\n\nimport './checkbox.css';\nimport { Fragment, useEffect, useRef, type InputHTMLAttributes } from 'react';\n\nexport interface CheckGlyphProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n indeterminate?: boolean;\n}\n\nexport function CheckGlyph({ indeterminate = false, ...inputProps }: CheckGlyphProps) {\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (ref.current) ref.current.indeterminate = indeterminate;\n }, [indeterminate, inputProps.checked]);\n\n return (\n <Fragment>\n <input ref={ref} type=\"checkbox\" className=\"cbx__input\" {...inputProps} />\n <span className=\"cbx__box\" aria-hidden=\"true\">\n <svg className=\"cbx__mark\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path className=\"cbx__tick\" d=\"M3.5 8.5 L6.75 11.5 L12.5 4.75\" />\n </svg>\n <span className=\"cbx__dash\" />\n </span>\n </Fragment>\n );\n}\n"]}