@yewdiel21/motion-kit 0.10.0 → 0.14.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 (365) hide show
  1. package/README.md +155 -93
  2. package/dist/auto/index.d.ts +53 -3
  3. package/dist/auto/index.js +101 -3
  4. package/dist/auto/index.js.map +1 -1
  5. package/dist/{chunk-IKQ5FODN.js → chunk-6P4P7NU6.js} +2 -218
  6. package/dist/chunk-6P4P7NU6.js.map +1 -0
  7. package/dist/chunk-CU6SXW3E.js +20334 -0
  8. package/dist/chunk-CU6SXW3E.js.map +1 -0
  9. package/dist/{chunk-XAKC2QY7.js → chunk-EY4BJKC4.js} +3 -28
  10. package/dist/chunk-EY4BJKC4.js.map +1 -0
  11. package/dist/chunk-QP4QJOEN.js +72 -0
  12. package/dist/chunk-QP4QJOEN.js.map +1 -0
  13. package/dist/css/components/activity-feed.css +240 -0
  14. package/dist/css/components/attachment.css +266 -0
  15. package/dist/css/components/breadcrumb.css +110 -0
  16. package/dist/css/components/chart-tooltip.css +168 -0
  17. package/dist/css/components/chart.css +296 -0
  18. package/dist/css/components/code-block.css +264 -0
  19. package/dist/css/components/color-area.css +82 -0
  20. package/dist/css/components/color-field.css +67 -0
  21. package/dist/css/components/color-picker.css +131 -0
  22. package/dist/css/components/color-slider.css +113 -0
  23. package/dist/css/components/command-search.css +252 -0
  24. package/dist/css/components/context-menu.css +23 -0
  25. package/dist/css/components/credit-card.css +288 -0
  26. package/dist/css/components/data-table.css +591 -0
  27. package/dist/css/components/date-range-picker.css +168 -0
  28. package/dist/css/components/date-time-picker.css +178 -0
  29. package/dist/css/components/drawer.css +58 -0
  30. package/dist/css/components/editable-table.css +201 -0
  31. package/dist/css/components/empty-state.css +61 -0
  32. package/dist/css/components/file-explorer.css +633 -0
  33. package/dist/css/components/filter-builder.css +232 -0
  34. package/dist/css/components/hold-confirm.css +87 -0
  35. package/dist/css/components/hover-card.css +13 -7
  36. package/dist/css/components/image-preview.css +195 -0
  37. package/dist/css/components/json-viewer.css +272 -0
  38. package/dist/css/components/like-button.css +78 -0
  39. package/dist/css/components/link-preview.css +275 -0
  40. package/dist/css/components/loading-button.css +77 -0
  41. package/dist/css/components/multi-select.css +267 -0
  42. package/dist/css/components/notification-bell.css +127 -0
  43. package/dist/css/components/password-strength.css +183 -0
  44. package/dist/css/components/popover.css +25 -0
  45. package/dist/css/components/progress.css +140 -0
  46. package/dist/css/components/questionnaire.css +217 -0
  47. package/dist/css/components/range-calendar.css +186 -0
  48. package/dist/css/components/range-slider.css +192 -0
  49. package/dist/css/components/resizable-panel.css +243 -0
  50. package/dist/css/components/rich-text-editor.css +284 -0
  51. package/dist/css/components/scratch-card.css +75 -0
  52. package/dist/css/components/skeleton.css +108 -0
  53. package/dist/css/components/split-view.css +19 -0
  54. package/dist/css/components/star-rating.css +80 -0
  55. package/dist/css/components/stat-card.css +164 -0
  56. package/dist/css/components/swipe-actions.css +105 -0
  57. package/dist/css/components/tag-input.css +244 -0
  58. package/dist/css/components/time-field.css +88 -0
  59. package/dist/css/components/timeline.css +219 -0
  60. package/dist/css/components/tooltip.css +79 -0
  61. package/dist/css/components/tree-view.css +210 -0
  62. package/dist/css/components/virtual-list.css +195 -0
  63. package/dist/css/tokens.css +185 -181
  64. package/dist/elements/index.d.ts +674 -5
  65. package/dist/elements/index.js +1361 -8
  66. package/dist/elements/index.js.map +1 -1
  67. package/dist/{engine-GDGwQnJE.d.ts → engine-Cn6IhE3z.d.ts} +1 -1
  68. package/dist/engine-QECQnGz1.d.ts +33 -0
  69. package/dist/index.css +9104 -189
  70. package/dist/index.d.ts +89 -5
  71. package/dist/index.js +243 -9
  72. package/dist/index.js.map +1 -1
  73. package/dist/react/index.d.ts +579 -23
  74. package/dist/react/index.js +2042 -7
  75. package/dist/react/index.js.map +1 -1
  76. package/dist/{reduced-BmBzKH94.d.ts → reduced-BBUusld6.d.ts} +9 -2
  77. package/dist/reveal-DEvp6U6T.d.ts +2381 -0
  78. package/dist/{store-DYb3tTsZ.d.ts → store-DjkTBX7f.d.ts} +2 -2
  79. package/package.json +1 -1
  80. package/registry.json +406 -1
  81. package/src/auto/auto-init.ts +98 -0
  82. package/src/components/activity-feed/README.md +56 -0
  83. package/src/components/activity-feed/activity-feed.css +239 -0
  84. package/src/components/activity-feed/element.ts +36 -0
  85. package/src/components/activity-feed/engine.ts +351 -0
  86. package/src/components/activity-feed/react.tsx +32 -0
  87. package/src/components/attachment/README.md +27 -0
  88. package/src/components/attachment/attachment.css +265 -0
  89. package/src/components/attachment/element.ts +50 -0
  90. package/src/components/attachment/engine.ts +469 -0
  91. package/src/components/attachment/react.tsx +65 -0
  92. package/src/components/breadcrumb/README.md +38 -0
  93. package/src/components/breadcrumb/breadcrumb.css +109 -0
  94. package/src/components/breadcrumb/element.ts +27 -0
  95. package/src/components/breadcrumb/engine.ts +249 -0
  96. package/src/components/breadcrumb/react.tsx +30 -0
  97. package/src/components/chart/README.md +24 -0
  98. package/src/components/chart/chart.css +295 -0
  99. package/src/components/chart/element.ts +41 -0
  100. package/src/components/chart/engine.ts +811 -0
  101. package/src/components/chart/react.tsx +50 -0
  102. package/src/components/chart-tooltip/README.md +53 -0
  103. package/src/components/chart-tooltip/chart-tooltip.css +167 -0
  104. package/src/components/chart-tooltip/element.ts +37 -0
  105. package/src/components/chart-tooltip/engine.ts +442 -0
  106. package/src/components/chart-tooltip/react.tsx +47 -0
  107. package/src/components/code-block/README.md +19 -0
  108. package/src/components/code-block/code-block.css +263 -0
  109. package/src/components/code-block/element.ts +34 -0
  110. package/src/components/code-block/engine.ts +254 -0
  111. package/src/components/code-block/highlight.ts +244 -0
  112. package/src/components/code-block/react.tsx +94 -0
  113. package/src/components/color-area/README.md +50 -0
  114. package/src/components/color-area/color-area.css +81 -0
  115. package/src/components/color-area/element.ts +26 -0
  116. package/src/components/color-area/engine.ts +246 -0
  117. package/src/components/color-area/react.tsx +42 -0
  118. package/src/components/color-field/README.md +43 -0
  119. package/src/components/color-field/color-field.css +66 -0
  120. package/src/components/color-field/element.ts +26 -0
  121. package/src/components/color-field/engine.ts +174 -0
  122. package/src/components/color-field/react.tsx +42 -0
  123. package/src/components/color-picker/README.md +45 -0
  124. package/src/components/color-picker/color-picker.css +130 -0
  125. package/src/components/color-picker/element.ts +45 -0
  126. package/src/components/color-picker/engine.ts +314 -0
  127. package/src/components/color-picker/react.tsx +47 -0
  128. package/src/components/color-slider/README.md +55 -0
  129. package/src/components/color-slider/color-slider.css +112 -0
  130. package/src/components/color-slider/element.ts +26 -0
  131. package/src/components/color-slider/engine.ts +234 -0
  132. package/src/components/color-slider/react.tsx +45 -0
  133. package/src/components/command-search/README.md +15 -0
  134. package/src/components/command-search/command-search.css +251 -0
  135. package/src/components/command-search/element.ts +36 -0
  136. package/src/components/command-search/engine.ts +356 -0
  137. package/src/components/command-search/match.ts +53 -0
  138. package/src/components/command-search/react.tsx +66 -0
  139. package/src/components/context-menu/README.md +31 -0
  140. package/src/components/context-menu/context-menu.css +22 -0
  141. package/src/components/context-menu/element.ts +40 -0
  142. package/src/components/context-menu/engine.ts +153 -0
  143. package/src/components/context-menu/react.tsx +57 -0
  144. package/src/components/credit-card/README.md +20 -0
  145. package/src/components/credit-card/card.ts +77 -0
  146. package/src/components/credit-card/credit-card.css +287 -0
  147. package/src/components/credit-card/element.ts +33 -0
  148. package/src/components/credit-card/engine.ts +410 -0
  149. package/src/components/credit-card/react.tsx +36 -0
  150. package/src/components/data-table/README.md +83 -0
  151. package/src/components/data-table/data-table.css +590 -0
  152. package/src/components/data-table/element.ts +54 -0
  153. package/src/components/data-table/engine.ts +1059 -0
  154. package/src/components/data-table/react.tsx +94 -0
  155. package/src/components/date-range-picker/README.md +51 -0
  156. package/src/components/date-range-picker/date-range-picker.css +167 -0
  157. package/src/components/date-range-picker/element.ts +52 -0
  158. package/src/components/date-range-picker/engine.ts +352 -0
  159. package/src/components/date-range-picker/react.tsx +57 -0
  160. package/src/components/date-time-picker/README.md +48 -0
  161. package/src/components/date-time-picker/date-time-picker.css +177 -0
  162. package/src/components/date-time-picker/element.ts +47 -0
  163. package/src/components/date-time-picker/engine.ts +350 -0
  164. package/src/components/date-time-picker/react.tsx +54 -0
  165. package/src/components/dialog/README.md +103 -102
  166. package/src/components/dialog/element.ts +123 -118
  167. package/src/components/dialog/engine.ts +449 -432
  168. package/src/components/drawer/README.md +28 -0
  169. package/src/components/drawer/drawer.css +57 -0
  170. package/src/components/drawer/element.ts +21 -0
  171. package/src/components/drawer/engine.ts +56 -0
  172. package/src/components/drawer/react.tsx +85 -0
  173. package/src/components/editable-table/README.md +67 -0
  174. package/src/components/editable-table/editable-table.css +200 -0
  175. package/src/components/editable-table/element.ts +45 -0
  176. package/src/components/editable-table/engine.ts +775 -0
  177. package/src/components/editable-table/react.tsx +79 -0
  178. package/src/components/empty-state/README.md +41 -0
  179. package/src/components/empty-state/element.ts +23 -0
  180. package/src/components/empty-state/empty-state.css +60 -0
  181. package/src/components/empty-state/engine.ts +232 -0
  182. package/src/components/empty-state/react.tsx +34 -0
  183. package/src/components/file-explorer/README.md +67 -0
  184. package/src/components/file-explorer/element.ts +39 -0
  185. package/src/components/file-explorer/engine.ts +1307 -0
  186. package/src/components/file-explorer/file-explorer.css +632 -0
  187. package/src/components/file-explorer/react.tsx +77 -0
  188. package/src/components/filter-builder/README.md +47 -0
  189. package/src/components/filter-builder/element.ts +34 -0
  190. package/src/components/filter-builder/engine.ts +365 -0
  191. package/src/components/filter-builder/filter-builder.css +231 -0
  192. package/src/components/filter-builder/react.tsx +36 -0
  193. package/src/components/hold-confirm/README.md +13 -0
  194. package/src/components/hold-confirm/element.ts +24 -0
  195. package/src/components/hold-confirm/engine.ts +216 -0
  196. package/src/components/hold-confirm/hold-confirm.css +86 -0
  197. package/src/components/hold-confirm/react.tsx +28 -0
  198. package/src/components/hover-card/README.md +6 -2
  199. package/src/components/hover-card/engine.ts +68 -6
  200. package/src/components/hover-card/hover-card.css +13 -7
  201. package/src/components/image-preview/README.md +16 -0
  202. package/src/components/image-preview/element.ts +26 -0
  203. package/src/components/image-preview/engine.ts +325 -0
  204. package/src/components/image-preview/image-preview.css +194 -0
  205. package/src/components/image-preview/react.tsx +43 -0
  206. package/src/components/json-viewer/README.md +56 -0
  207. package/src/components/json-viewer/element.ts +37 -0
  208. package/src/components/json-viewer/engine.ts +440 -0
  209. package/src/components/json-viewer/json-viewer.css +271 -0
  210. package/src/components/json-viewer/react.tsx +56 -0
  211. package/src/components/like-button/README.md +13 -0
  212. package/src/components/like-button/element.ts +47 -0
  213. package/src/components/like-button/engine.ts +145 -0
  214. package/src/components/like-button/like-button.css +77 -0
  215. package/src/components/like-button/react.tsx +39 -0
  216. package/src/components/link-preview/README.md +19 -0
  217. package/src/components/link-preview/element.ts +29 -0
  218. package/src/components/link-preview/engine.ts +192 -0
  219. package/src/components/link-preview/link-preview.css +274 -0
  220. package/src/components/link-preview/react.tsx +101 -0
  221. package/src/components/loading-button/README.md +45 -0
  222. package/src/components/loading-button/element.ts +34 -0
  223. package/src/components/loading-button/engine.ts +201 -0
  224. package/src/components/loading-button/loading-button.css +76 -0
  225. package/src/components/loading-button/react.tsx +43 -0
  226. package/src/components/multi-select/README.md +48 -0
  227. package/src/components/multi-select/element.ts +28 -0
  228. package/src/components/multi-select/engine.ts +294 -0
  229. package/src/components/multi-select/multi-select.css +266 -0
  230. package/src/components/multi-select/react.tsx +39 -0
  231. package/src/components/notification-bell/README.md +14 -0
  232. package/src/components/notification-bell/element.ts +48 -0
  233. package/src/components/notification-bell/engine.ts +202 -0
  234. package/src/components/notification-bell/notification-bell.css +126 -0
  235. package/src/components/notification-bell/react.tsx +57 -0
  236. package/src/components/password-strength/README.md +17 -0
  237. package/src/components/password-strength/element.ts +22 -0
  238. package/src/components/password-strength/engine.ts +212 -0
  239. package/src/components/password-strength/password-strength.css +182 -0
  240. package/src/components/password-strength/react.tsx +36 -0
  241. package/src/components/password-strength/score.ts +62 -0
  242. package/src/components/popover/README.md +44 -0
  243. package/src/components/popover/element.ts +31 -0
  244. package/src/components/popover/engine.ts +114 -0
  245. package/src/components/popover/popover.css +24 -0
  246. package/src/components/popover/react.tsx +50 -0
  247. package/src/components/progress/README.md +17 -0
  248. package/src/components/progress/element.ts +30 -0
  249. package/src/components/progress/engine.ts +173 -0
  250. package/src/components/progress/progress.css +139 -0
  251. package/src/components/progress/react.tsx +35 -0
  252. package/src/components/questionnaire/README.md +32 -0
  253. package/src/components/questionnaire/element.ts +118 -0
  254. package/src/components/questionnaire/engine.ts +255 -0
  255. package/src/components/questionnaire/questionnaire.css +216 -0
  256. package/src/components/questionnaire/react.tsx +140 -0
  257. package/src/components/range-calendar/README.md +58 -0
  258. package/src/components/range-calendar/element.ts +42 -0
  259. package/src/components/range-calendar/engine.ts +390 -0
  260. package/src/components/range-calendar/range-calendar.css +185 -0
  261. package/src/components/range-calendar/react.tsx +56 -0
  262. package/src/components/range-slider/README.md +23 -0
  263. package/src/components/range-slider/element.ts +53 -0
  264. package/src/components/range-slider/engine.ts +316 -0
  265. package/src/components/range-slider/range-slider.css +191 -0
  266. package/src/components/range-slider/react.tsx +66 -0
  267. package/src/components/resizable-panel/README.md +61 -0
  268. package/src/components/resizable-panel/element.ts +36 -0
  269. package/src/components/resizable-panel/engine.ts +551 -0
  270. package/src/components/resizable-panel/react.tsx +74 -0
  271. package/src/components/resizable-panel/resizable-panel.css +242 -0
  272. package/src/components/rich-text-editor/README.md +57 -0
  273. package/src/components/rich-text-editor/element.ts +34 -0
  274. package/src/components/rich-text-editor/engine.ts +673 -0
  275. package/src/components/rich-text-editor/react.tsx +60 -0
  276. package/src/components/rich-text-editor/rich-text-editor.css +283 -0
  277. package/src/components/scratch-card/README.md +15 -0
  278. package/src/components/scratch-card/element.ts +30 -0
  279. package/src/components/scratch-card/engine.ts +257 -0
  280. package/src/components/scratch-card/react.tsx +40 -0
  281. package/src/components/scratch-card/scratch-card.css +74 -0
  282. package/src/components/skeleton/README.md +15 -0
  283. package/src/components/skeleton/element.ts +32 -0
  284. package/src/components/skeleton/engine.ts +104 -0
  285. package/src/components/skeleton/react.tsx +41 -0
  286. package/src/components/skeleton/skeleton.css +107 -0
  287. package/src/components/split-view/README.md +50 -0
  288. package/src/components/split-view/element.ts +34 -0
  289. package/src/components/split-view/engine.ts +114 -0
  290. package/src/components/split-view/react.tsx +63 -0
  291. package/src/components/split-view/split-view.css +18 -0
  292. package/src/components/star-rating/README.md +14 -0
  293. package/src/components/star-rating/element.ts +26 -0
  294. package/src/components/star-rating/engine.ts +217 -0
  295. package/src/components/star-rating/react.tsx +33 -0
  296. package/src/components/star-rating/star-rating.css +79 -0
  297. package/src/components/stat-card/README.md +42 -0
  298. package/src/components/stat-card/element.ts +40 -0
  299. package/src/components/stat-card/engine.ts +283 -0
  300. package/src/components/stat-card/react.tsx +36 -0
  301. package/src/components/stat-card/stat-card.css +163 -0
  302. package/src/components/swipe-actions/README.md +19 -0
  303. package/src/components/swipe-actions/element.ts +26 -0
  304. package/src/components/swipe-actions/engine.ts +260 -0
  305. package/src/components/swipe-actions/react.tsx +80 -0
  306. package/src/components/swipe-actions/swipe-actions.css +104 -0
  307. package/src/components/tag-input/README.md +42 -0
  308. package/src/components/tag-input/element.ts +39 -0
  309. package/src/components/tag-input/engine.ts +313 -0
  310. package/src/components/tag-input/react.tsx +54 -0
  311. package/src/components/tag-input/tag-input.css +243 -0
  312. package/src/components/time-field/README.md +54 -0
  313. package/src/components/time-field/element.ts +38 -0
  314. package/src/components/time-field/engine.ts +110 -0
  315. package/src/components/time-field/react.tsx +45 -0
  316. package/src/components/time-field/time-field.css +87 -0
  317. package/src/components/timeline/README.md +57 -0
  318. package/src/components/timeline/element.ts +31 -0
  319. package/src/components/timeline/engine.ts +300 -0
  320. package/src/components/timeline/react.tsx +59 -0
  321. package/src/components/timeline/timeline.css +218 -0
  322. package/src/components/tooltip/README.md +46 -0
  323. package/src/components/tooltip/element.ts +22 -0
  324. package/src/components/tooltip/engine.ts +288 -0
  325. package/src/components/tooltip/react.tsx +30 -0
  326. package/src/components/tooltip/tooltip.css +78 -0
  327. package/src/components/tree-view/README.md +61 -0
  328. package/src/components/tree-view/element.ts +32 -0
  329. package/src/components/tree-view/engine.ts +569 -0
  330. package/src/components/tree-view/react.tsx +78 -0
  331. package/src/components/tree-view/tree-view.css +209 -0
  332. package/src/components/virtual-list/README.md +81 -0
  333. package/src/components/virtual-list/element.ts +42 -0
  334. package/src/components/virtual-list/engine.ts +678 -0
  335. package/src/components/virtual-list/react.tsx +101 -0
  336. package/src/components/virtual-list/virtual-list.css +194 -0
  337. package/src/core/chips.ts +196 -0
  338. package/src/core/color.ts +304 -0
  339. package/src/core/date-range.ts +67 -0
  340. package/src/core/dates.ts +11 -1
  341. package/src/core/files.ts +107 -0
  342. package/src/core/filter.ts +229 -0
  343. package/src/core/gsap.ts +80 -65
  344. package/src/core/listbox.ts +332 -0
  345. package/src/core/mark.ts +29 -0
  346. package/src/core/position.ts +89 -0
  347. package/src/core/relative-time.ts +77 -0
  348. package/src/core/segment-field.ts +373 -0
  349. package/src/core/segments.ts +153 -0
  350. package/src/core/tree.ts +116 -0
  351. package/src/core/virtual.ts +79 -0
  352. package/src/css/tokens.css +186 -182
  353. package/src/elements/index.ts +147 -0
  354. package/src/index.ts +72 -0
  355. package/src/motion/micro.ts +248 -0
  356. package/src/motion/sheet.ts +88 -65
  357. package/src/motion/surface.ts +9 -0
  358. package/src/react/index.ts +57 -0
  359. package/dist/chunk-IKQ5FODN.js.map +0 -1
  360. package/dist/chunk-J6OCFNGU.js +0 -177
  361. package/dist/chunk-J6OCFNGU.js.map +0 -1
  362. package/dist/chunk-TFNRIZHU.js +0 -3977
  363. package/dist/chunk-TFNRIZHU.js.map +0 -1
  364. package/dist/chunk-XAKC2QY7.js.map +0 -1
  365. package/dist/reveal-jsX-uwUz.d.ts +0 -625
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/curves.ts","../src/core/gsap.ts","../src/core/channels.ts","../src/core/split.ts","../src/core/frame.ts","../src/core/styles.ts","../src/core/physics-spring.ts","../src/motion/flow.ts","../src/motion/entrances.ts","../src/core/pointer.ts","../src/motion/reveal.ts","../src/motion/count.ts","../src/motion/anchor.ts","../src/motion/drag-dismiss.ts","../src/motion/floating.ts","../src/motion/surface.ts","../src/motion/liquid.ts","../src/motion/morph.ts","../src/motion/sheet.ts","../src/components/dialog/engine.ts","../src/components/menu/engine.ts","../src/components/quantity/engine.ts","../src/components/pagination/engine.ts","../src/components/hover-card/engine.ts","../src/components/input-otp/engine.ts","../src/components/studio-dock/engine.ts","../src/components/trailer/engine.ts","../src/core/dates.ts","../src/components/calendar/engine.ts","../src/components/slot-picker/engine.ts"],"sourcesContent":["/** curve paths (CustomEase SVG syntax). */\nexport const PATHS = {\n /** The signature: a strong deceleration that is not a plain ease-out. */\n signature: 'M0,0 C0.308,0.19 0.107,0.633 0.288,0.866 0.382,0.987 0.656,1 1,1',\n /** Lists and steps entering (`flowSoft`, also `numberSoft`). */\n flow: 'M0,0 C0.25,0.1 0.25,1 1,1',\n /** A conversation scrolling to its newest message. */\n chatScroll: 'M0,0 C0.308,0.19 0.318,0.567 0.5,0.8 0.593,0.921 0.656,1 1,1',\n} as const;\n\n/**\n * A damped spring sampled as an ease path: `ratio` below 1\n * overshoots and settles, `velocity` is the starting speed.\n */\nexport function springPath(ratio: number, velocity = 0, steps = 72): string {\n const damping = Math.min(Math.max(ratio, 0.05), 0.999);\n const stiffness = 5.6;\n const frequency = (stiffness / damping) * Math.sqrt(1 - damping * damping);\n const phase = (velocity - stiffness) / frequency;\n const at = (time: number) =>\n 1 + Math.exp(-stiffness * time) * (-Math.cos(frequency * time) + phase * Math.sin(frequency * time));\n let path = 'M0,0';\n for (let step = 1; step <= steps; step += 1) {\n const time = step / steps;\n path += ` L${time.toFixed(4)},${(step === steps ? 1 : at(time)).toFixed(4)}`;\n }\n return path;\n}\n\n/**\n * own linear() sampling of the signature curve (its backdrop tint),\n * for CSS and the Web Animations API.\n */\nexport const SIGNATURE_LINEAR =\n 'linear(0 0%, .017 2.5%, .037 5%, .061 7.5%, .091 10%, .13 12.5%, .184 15%, .275 17.5%, .562 20%, .733 22.5%, .803 25%, .848 27.5%, .88 30%, .902 32.5%, .942 40%, .97 50%, .985 60%, .993 70%, .998 80%, 1 90%, 1 100%)';\n","import { gsap } from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport { SplitText } from 'gsap/SplitText';\nimport { CustomEase } from 'gsap/CustomEase';\nimport { Flip } from 'gsap/Flip';\nimport { PATHS, springPath } from './curves';\n\n/** elastic overshoot; close to the `--mk-ease-elastic` CSS curve. */\nexport const ELASTIC = 'elastic.out(1, 0.45)';\n\n/** Custom eases registered by `registerMotion()`. Use the names as GSAP `ease` values. */\nexport const EASE = {\n signature: 'mk-signature',\n flow: 'mk-flow',\n /** A closing surface's fade (`.56,.27,0,1`). Kept from v0.1; same curve as `fadeAway`. */\n close: 'mk-close',\n fadeAway: 'mk-fade-away',\n /** A closing surface's blur (`.37,.35,0,1`). */\n blurAway: 'mk-blur-away',\n chatScroll: 'mk-chat-scroll',\n /** Items travelling to a new place in a list (spring ratio .52). */\n layoutReflow: 'mk-layout-reflow',\n /** A dragged item landing in its slot (spring ratio .62). */\n sortableLand: 'mk-sortable-land',\n slot: 'mk-slot',\n slotResize: 'mk-slot-resize',\n liquidSize: 'mk-liquid-size',\n swatch: 'mk-swatch',\n swatchLight: 'mk-swatch-light',\n sheet: 'mk-sheet',\n inOut: 'mk-in-out',\n} as const;\n\nconst CURVES: Record<keyof typeof EASE, string> = {\n signature: PATHS.signature,\n flow: PATHS.flow,\n close: '.56,.27,0,1',\n fadeAway: '.56,.27,0,1',\n blurAway: '.37,.35,0,1',\n chatScroll: PATHS.chatScroll,\n layoutReflow: springPath(0.52),\n sortableLand: springPath(0.62),\n slot: '.34,1.56,.64,1',\n slotResize: '.2,0,0,1',\n liquidSize: '.8,.3,.5,.8',\n swatch: '.38,.49,0,1.5',\n swatchLight: '.11,1,0,1',\n sheet: '.16,1,.3,1',\n inOut: '.42,0,.58,1',\n};\n\nlet registered = false;\n\n/** Register plugins and eases once. Safe to call from every recipe and during SSR (no-op). */\nexport function registerMotion() {\n if (typeof window === 'undefined') return;\n // Cancels the MK_HEAD_SCRIPT safety net: JS owns the entrance states from here on.\n document.documentElement.classList.add('mk-ready');\n if (registered) return;\n registered = true;\n gsap.registerPlugin(ScrollTrigger, SplitText, CustomEase, Flip);\n for (const key of Object.keys(EASE) as Array<keyof typeof EASE>) CustomEase.create(EASE[key], CURVES[key]);\n}\n\nexport { gsap, ScrollTrigger, SplitText, CustomEase, Flip };\n","import { gsap } from 'gsap';\n\n/**\n * per-property motion channels:\n * each value moves toward its target either on a spring (stiffness, damping, an\n * initial kick) or on an eased duration, all stepped on GSAP's ticker. Used by\n * surfaces that grow out of a control (liquid dialog, toasts) and floating windows.\n */\n\nexport type Channel =\n | { type: 'spring'; stiffness: number; damping: number; mass?: number; velocity?: number; direction?: number }\n | { type: 'ease'; duration: number; ease: (progress: number) => number };\n\nexport interface ChannelState {\n current: number;\n origin: number;\n target: number;\n velocity: number;\n elapsed: number;\n active: boolean;\n config: Channel | null;\n}\n\nexport const easeOut = (t: number) => 1 - (1 - t) * (1 - t);\nexport const easeOutCubic = (t: number) => 1 - (1 - t) ** 3;\nexport const easeInCubic = (t: number) => t * t * t;\n\n/** A cubic-bezier as a function of progress. */\nexport function bezier(x1: number, y1: number, x2: number, y2: number) {\n const at = (t: number, a: number, b: number) => {\n const u = 1 - t;\n return 3 * u * u * t * a + 3 * u * t * t * b + t * t * t;\n };\n return (progress: number) => {\n if (progress <= 0 || progress >= 1) return Math.min(1, Math.max(0, progress));\n let low = 0;\n let high = 1;\n let t = progress;\n for (let step = 0; step < 24; step += 1) {\n const x = at(t, x1, x2);\n if (Math.abs(x - progress) < 1e-5) break;\n if (x < progress) low = t;\n else high = t;\n t = (low + high) / 2;\n }\n return at(t, y1, y2);\n };\n}\n\nexport const spring = (stiffness: number, damping: number, extra: { mass?: number; velocity?: number; direction?: number } = {}): Channel => ({\n type: 'spring',\n stiffness,\n damping,\n ...extra,\n});\n\nexport const eased = (duration: number, ease: (progress: number) => number): Channel => ({ type: 'ease', duration, ease });\n\nexport const createChannelState = (value: number): ChannelState => ({\n current: value,\n origin: value,\n target: value,\n velocity: 0,\n elapsed: 0,\n active: false,\n config: null,\n});\n\n/** Advance one channel by `seconds`. Pure: exported for tests and custom loops. */\nexport function stepChannel(channel: ChannelState, seconds: number) {\n const config = channel.config;\n if (!channel.active || !config) return;\n if (config.type === 'spring') {\n // Sub-steps of at most 1/60 s keep stiff springs stable; a long frame is capped.\n const time = Math.min(0.064, Math.max(0, seconds));\n const steps = Math.max(1, Math.ceil(time / (1 / 60) - 1e-9));\n const step = time / steps;\n for (let index = 0; index < steps; index += 1) {\n const force = -config.stiffness * (channel.current - channel.target) - config.damping * channel.velocity;\n channel.velocity += (force / (config.mass ?? 1)) * step;\n channel.current += channel.velocity * step;\n }\n if (Math.abs(channel.velocity) <= 0.01 && Math.abs(channel.target - channel.current) <= 0.01) {\n channel.current = channel.target;\n channel.velocity = 0;\n channel.active = false;\n }\n } else {\n channel.elapsed += Math.max(0, seconds);\n const progress = Math.min(1, channel.elapsed / config.duration);\n channel.current = progress >= 1 ? channel.target : channel.origin + (channel.target - channel.origin) * config.ease(progress);\n if (progress >= 1) channel.active = false;\n }\n}\n\n/** Animate named values toward targets, each on its own channel, calling `onChange` per frame. */\nexport function channels<K extends string>(start: Record<K, number>, onChange: (name: K, value: number) => void) {\n const names = Object.keys(start) as K[];\n const state = Object.fromEntries(names.map((name) => [name, createChannelState(start[name])])) as Record<K, ChannelState>;\n let last = 0;\n let resolveDone: (() => void) | null = null;\n\n const tick = () => {\n const now = performance.now();\n const elapsed = Math.max(0, (now - last) / 1000);\n last = now;\n let running = false;\n for (const name of names) {\n const channel = state[name];\n if (!channel.active) continue;\n stepChannel(channel, elapsed);\n onChange(name, channel.current);\n running ||= channel.active;\n }\n if (!running) {\n gsap.ticker.remove(tick);\n resolveDone?.();\n resolveDone = null;\n }\n };\n\n return {\n state,\n /** Start moving; resolves when every channel has settled (or `stop()` is called). */\n animate(targets: Partial<Record<K, number>>, configs: Partial<Record<K, Channel>>): Promise<void> {\n for (const name of Object.keys(targets) as K[]) {\n const channel = state[name];\n const config = configs[name];\n if (!channel || !config) continue;\n channel.config = config;\n channel.origin = channel.current;\n channel.target = targets[name] as number;\n channel.elapsed = 0;\n if (config.type === 'spring' && config.velocity) {\n const sign = config.direction !== undefined ? Math.sign(config.direction) : Math.sign(channel.target - channel.current);\n channel.velocity = Math.abs(config.velocity) * sign;\n }\n channel.active = channel.target !== channel.current || channel.velocity !== 0;\n }\n last = performance.now();\n gsap.ticker.remove(tick);\n gsap.ticker.add(tick);\n resolveDone?.();\n return new Promise((resolve) => {\n resolveDone = resolve;\n });\n },\n stop() {\n gsap.ticker.remove(tick);\n for (const name of names) state[name].active = false;\n resolveDone?.();\n resolveDone = null;\n },\n };\n}\n\n/** A damped spring as an ease function of progress. */\nexport function springEase(ratio: number, velocity = 0) {\n const damping = Math.min(Math.max(ratio, 0.05), 0.999);\n const stiffness = 5.6;\n const frequency = (stiffness / damping) * Math.sqrt(1 - damping * damping);\n const phase = (velocity - stiffness) / frequency;\n return (progress: number) =>\n progress >= 1 ? 1 : 1 + Math.exp(-stiffness * progress) * (-Math.cos(frequency * progress) + phase * Math.sin(frequency * progress));\n}\n","/**\n * Split text for animation and put it back afterwards. Words become inline-block\n * spans (so they can move); spaces stay plain text so lines still wrap. Elements\n * matched by `exclude` (tables, code) are left whole.\n */\nexport interface Split {\n parts: HTMLElement[];\n revert(): void;\n}\n\nexport interface SplitWordsOptions {\n exclude?: string[];\n className?: string;\n}\n\nexport function splitWords(el: HTMLElement, { exclude = ['table', 'pre'], className = 'mk-split-word' }: SplitWordsOptions = {}): Split {\n const parts: HTMLElement[] = [];\n const replaced: Array<[Text, Node[]]> = [];\n const skip = exclude.join(',');\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n const texts: Text[] = [];\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const parent = (node as Text).parentElement;\n if (skip && parent?.closest(skip) && el.contains(parent.closest(skip))) continue;\n if ((node as Text).data.trim()) texts.push(node as Text);\n }\n for (const text of texts) {\n const pieces = text.data.split(/(\\s+)/);\n const nodes: Node[] = [];\n for (const piece of pieces) {\n if (!piece) continue;\n if (/^\\s+$/.test(piece)) {\n nodes.push(document.createTextNode(piece));\n continue;\n }\n const span = document.createElement('span');\n span.className = className;\n span.style.display = 'inline-block';\n span.textContent = piece;\n parts.push(span);\n nodes.push(span);\n }\n text.replaceWith(...nodes);\n replaced.push([text, nodes]);\n }\n let reverted = false;\n return {\n parts,\n revert() {\n if (reverted) return;\n reverted = true;\n for (const [text, nodes] of replaced.reverse()) {\n nodes[0]?.parentNode?.insertBefore(text, nodes[0]);\n for (const node of nodes) node.parentNode?.removeChild(node);\n }\n el.normalize();\n },\n };\n}\n\ntype Segmenter = { segment(text: string): Iterable<{ segment: string }> };\n\n/** User-perceived characters (emoji with modifiers stay whole), at most `limit`. */\nexport function splitGraphemes(text: string, limit = 64): string[] {\n const Ctor = (Intl as unknown as { Segmenter?: new (locale?: string, options?: { granularity: string }) => Segmenter }).Segmenter;\n const all = Ctor ? Array.from(new Ctor(undefined, { granularity: 'grapheme' }).segment(text), (part) => part.segment) : Array.from(text);\n return all.slice(0, limit);\n}\n","/** requestAnimationFrame with a timer fallback (tests, old WebViews). Returns a cancel function. */\nexport function requestFrame(fn: (time: number) => void): () => void {\n if (typeof requestAnimationFrame === 'function') {\n const id = requestAnimationFrame(fn);\n return () => cancelAnimationFrame(id);\n }\n const id = setTimeout(() => fn(Date.now()), 16);\n return () => clearTimeout(id);\n}\n\n/** Resolves on the next frame, after the framework has painted a DOM change. */\nexport const nextFrame = () => new Promise<void>((resolve) => requestFrame(() => resolve()));\n","/**\n * Remove inline properties GSAP wrote, without asking GSAP. `gsap.set(el,\n * { clearProps: 'transform' })` measures the element first, and an element\n * that is not rendered (a closed <dialog>, display: none) is moved to the end of\n * the document and back to be measured — which reorders text around it and\n * disconnects custom elements inside. This only edits the style attribute and\n * drops GSAP's cache so the next tween starts from scratch.\n */\nexport function clearStyles(targets: Iterable<Element>, properties: string[]) {\n for (const element of targets) {\n const style = (element as HTMLElement).style;\n if (!style) continue;\n for (const property of properties) style.removeProperty(property);\n if (element.getAttribute('style') === '') element.removeAttribute('style');\n delete (element as unknown as { _gsap?: unknown })._gsap;\n }\n}\n\n/** What the surface morphs write. */\nexport const MORPH_STYLES = [\n 'transform',\n 'translate',\n 'rotate',\n 'scale',\n 'transform-origin',\n 'clip-path',\n 'opacity',\n 'visibility',\n 'filter',\n 'will-change',\n];\n","/*\n * Motion/Framer's physical spring — stiffness, damping and mass, released from\n * rest at 0 toward 1, with parameter pairs such as (400/10, 260/18…).\n * motionSpring() gives a GSAP ease plus the time it takes to settle;\n * springLinear() samples it as a CSS linear(). Ratio-based springs\n * stay in springPath / springEase.\n */\n\nconst REST = 0.001;\nconst STEP = 1 / 240;\nconst LIMIT = 10;\n\nexport interface MotionSpring {\n /** Progress 0…1 over `duration` → position (overshoots when bouncy). */\n ease: (progress: number) => number;\n /** Seconds until it stays within 0.1 % of the target. */\n duration: number;\n}\n\nfunction position(stiffness: number, damping: number, mass: number) {\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n if (zeta < 1) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return (t: number) => 1 - Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0) / wd) * Math.sin(wd * t));\n }\n if (zeta === 1) return (t: number) => 1 - Math.exp(-w0 * t) * (1 + w0 * t);\n const root = Math.sqrt(zeta * zeta - 1);\n const r1 = -w0 * (zeta - root);\n const r2 = -w0 * (zeta + root);\n return (t: number) => 1 - (r2 * Math.exp(r1 * t) - r1 * Math.exp(r2 * t)) / (r2 - r1);\n}\n\nconst springs = new Map<string, MotionSpring>();\n\nexport function motionSpring(stiffness: number, damping: number, mass = 1): MotionSpring {\n const key = `${stiffness}/${damping}/${mass}`;\n const known = springs.get(key);\n if (known) return known;\n const x = position(Math.max(stiffness, 1e-6), Math.max(damping, 0), Math.max(mass, 1e-6));\n let settled = 0;\n for (let i = 0; i * STEP <= LIMIT; i++) if (Math.abs(x(i * STEP) - 1) > REST) settled = (i + 1) * STEP;\n const duration = Math.round(Math.min(settled, LIMIT) * 1000) / 1000;\n const spring: MotionSpring = {\n ease: (progress) => (progress <= 0 ? 0 : progress >= 1 ? 1 : x(progress * duration)),\n duration,\n };\n springs.set(key, spring);\n return spring;\n}\n\n/** Seconds a Motion spring takes to settle. */\nexport const springDuration = (stiffness: number, damping: number, mass = 1) => motionSpring(stiffness, damping, mass).duration;\n\n/** The spring as a CSS linear() easing (pair it with springDuration). */\nexport function springLinear(stiffness: number, damping: number, mass = 1, points = 40) {\n const { ease } = motionSpring(stiffness, damping, mass);\n return `linear(${Array.from({ length: points + 1 }, (_, i) => Number(ease(i / points).toFixed(4))).join(', ')})`;\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { nextFrame } from '../core/frame';\nimport { clearStyles } from '../core/styles';\n\n/*\n * flowIn / flowOut: items drop in from 20 px above out of a 16 px blur,\n * 0.5 s, 50 ms apart (`flowSoft`), and leave 20 px down into the same blur.\n * Style 2 grows them from 90 % instead of moving them.\n */\n\nexport interface FlowInOptions {\n /** Distance travelled (style 1), px. */\n y?: number;\n blur?: number;\n duration?: number;\n stagger?: number;\n delay?: number;\n /** 1: drop from above (default). 2: grow from `startScale`. */\n style?: 1 | 2;\n startScale?: number;\n /** Last item first. */\n reverse?: boolean;\n /** With a single container as target, animate its matches instead. */\n target?: string;\n ease?: string;\n /**\n * Hide with visibility as well as opacity (default). Off for controls that must\n * take focus while they enter (menu options): a visibility:hidden element cannot.\n */\n autoAlpha?: boolean;\n}\n\nexport interface FlowOutOptions {\n y?: number;\n blur?: number;\n duration?: number;\n stagger?: number;\n delay?: number;\n reverse?: boolean;\n target?: string;\n}\n\nconst CLEAR = 'transform,filter,opacity,visibility';\n\nfunction list(targets: gsap.TweenTarget, target?: string, reverse?: boolean): HTMLElement[] {\n let items: HTMLElement[];\n if (target && targets instanceof Element) items = [...targets.querySelectorAll<HTMLElement>(target)];\n else items = gsap.utils.toArray<HTMLElement>(targets);\n return reverse ? items.reverse() : items;\n}\n\n/** Flow items in. Returns the tween, or null when there is nothing to animate or motion is reduced. */\nexport function flowIn(targets: gsap.TweenTarget, options: FlowInOptions = {}): gsap.core.Tween | null {\n registerMotion();\n const {\n y = 20,\n blur = 16,\n duration = TIMING.flow,\n stagger = TIMING.flowStagger,\n delay = 0,\n style = 1,\n startScale = 0.9,\n reverse = false,\n target,\n ease = EASE.flow,\n autoAlpha = true,\n } = options;\n const items = list(targets, target, reverse);\n if (!items.length) return null;\n if (reduced()) {\n // Not gsap.set(clearProps): it would move hidden items around to measure them.\n clearStyles(items, ['transform', 'translate', 'rotate', 'scale', 'filter', 'opacity', 'visibility']);\n return null;\n }\n const from = style === 2 ? { scale: startScale } : { y: -y };\n const to = style === 2 ? { scale: 1 } : { y: 0 };\n const alpha = autoAlpha ? 'autoAlpha' : 'opacity';\n return gsap.fromTo(\n items,\n { ...from, [alpha]: 0, filter: `blur(${blur}px)` },\n { ...to, [alpha]: 1, filter: 'blur(0px)', duration, stagger, delay, ease, clearProps: CLEAR },\n );\n}\n\n/** Flow items out (down into a blur). They stay hidden afterwards; flowIn brings them back. */\nexport function flowOut(targets: gsap.TweenTarget, options: FlowOutOptions = {}): gsap.core.Tween | null {\n registerMotion();\n const { y = 20, blur = 16, duration = TIMING.flow, stagger = TIMING.flowStagger, delay = 0, reverse = false, target } = options;\n const items = list(targets, target, reverse);\n if (!items.length) return null;\n if (reduced()) {\n gsap.set(items, { autoAlpha: 0 });\n return null;\n }\n return gsap.to(items, { y, autoAlpha: 0, filter: `blur(${blur}px)`, duration, stagger, delay, ease: EASE.flow });\n}\n\n/**\n * step change: the current children flow out, `mutate` swaps the\n * content (render the next step there), and after a frame the new children flow in.\n */\nexport async function stepChange(\n container: HTMLElement,\n mutate: () => void | Promise<void>,\n { duration = TIMING.stepChange }: { duration?: number } = {},\n): Promise<void> {\n const before = [...container.children] as HTMLElement[];\n const out = flowOut(before, { duration });\n if (out) await out;\n await mutate();\n await nextFrame();\n flowIn([...container.children] as HTMLElement[], { duration });\n}\n","import { TIMING } from '../core/timing';\nimport { flowIn } from './flow';\n\n/*\n * Named entrances: the same\n * flowIn with each surface's own scale, blur and rhythm.\n */\n\n/** Navigation menu options: grow from 90 % out of 4 px blur, last first, after 0.1 s. */\nexport const flowInMenu = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.9, blur: 4, reverse: true, autoAlpha: false, ...TIMING.menu });\n\n/** Theme picker swatches: pop in from half size, 10 ms apart. */\nexport const flowInPalette = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.5, blur: 4, autoAlpha: false, ...TIMING.palette });\n\n/** Form cards (`[data-flow-item]`): grow from 90 % out of 8 px blur. */\nexport const flowInForm = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.9, blur: 8, ...TIMING.form });\n\n/** Landing pieces: grow from 85 % out of 24 px blur, after 0.15 s. */\nexport const flowInLanding = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.85, blur: 24, ...TIMING.landing });\n\n/** Long-form content (`[data-flow]`, markdown blocks): style 2, 0.6 s, 60 ms apart. */\nexport const flowInContent = (root: Element) =>\n flowIn(root, { style: 2, target: '[data-flow], .markdown-content > *', ...TIMING.content });\n","import { gsap } from 'gsap';\n\n/** Live pointer position (viewport px) plus movement accumulated since the last frame. */\nexport const pointer = { x: 0, y: 0, active: false };\n\nlet mx = 0;\nlet my = 0;\nlet lastX: number | null = null;\nlet lastY: number | null = null;\nlet users = 0;\n\nfunction onMove(e: PointerEvent) {\n if (lastX !== null && lastY !== null) {\n mx += e.clientX - lastX;\n my += e.clientY - lastY;\n }\n lastX = pointer.x = e.clientX;\n lastY = pointer.y = e.clientY;\n pointer.active = true;\n}\n\nfunction onOut(e: PointerEvent) {\n if (e.relatedTarget) return;\n pointer.active = false;\n lastX = lastY = null;\n}\n\n/** Start tracking (reference-counted). Call the returned function when the recipe is destroyed. */\nexport function bindPointer(): () => void {\n if (users++ === 0) {\n addEventListener('pointermove', onMove, { passive: true });\n document.addEventListener('pointerout', onOut);\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (--users > 0) return;\n removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerout', onOut);\n pointer.active = false;\n lastX = lastY = null;\n mx = my = 0;\n };\n}\n\nlet frameMovement = { mx: 0, my: 0 };\nlet movementFrame = -1;\n\n/**\n * Pointer movement since the previous animation frame. Every caller in the same\n * frame gets the same value (two recipes on a page both feel the pointer); the\n * next frame starts again from what moved since.\n */\nexport function takeMovement() {\n const frame = gsap.ticker.frame;\n if (frame !== movementFrame) {\n movementFrame = frame;\n frameMovement = { mx, my };\n mx = my = 0;\n }\n return frameMovement;\n}\n","import { gsap, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { pointer } from '../core/pointer';\nimport { TIMING } from '../core/timing';\n\n/*\n * reveal: a veil in the\n * surface's own colour covers it and a round opening grows from the origin,\n * uncovering the content like a wave; then the veil fades. Overshoot 2 lets the\n * opening pass the far corner halfway through, so the end is soft.\n */\n\nexport type RevealSpeed = keyof typeof TIMING.reveal;\n\nexport interface RevealOptions {\n /** Element (its centre) or viewport point. Default: the last pointer position, else the centre. */\n origin?: Element | { x: number; y: number } | null;\n speed?: RevealSpeed;\n delay?: number;\n overshoot?: number;\n /** Veil colour. Default: the first opaque background up the tree, else var(--mk-bg). */\n fill?: string;\n}\n\nexport interface RevealHandle {\n timeline: gsap.core.Timeline;\n finished: Promise<void>;\n /** Stop now and remove the veil. */\n cancel(): void;\n}\n\nconst TRANSPARENT = /^(transparent|rgba\\(0, 0, 0, 0\\))$/;\n\nfunction backgroundOf(el: Element): string {\n for (let node: Element | null = el; node; node = node.parentElement) {\n const color = getComputedStyle(node).backgroundColor;\n if (color && !TRANSPARENT.test(color)) return color;\n }\n return 'var(--mk-bg, #fff)';\n}\n\nexport function revealFrom(target: HTMLElement, options: RevealOptions = {}): RevealHandle | null {\n if (reduced() || !target.isConnected) return null;\n registerMotion();\n const { speed = 'normal', delay = 0, overshoot = 2 } = options;\n const style = getComputedStyle(target);\n const fill = options.fill ?? backgroundOf(target);\n const position = target.style.position;\n if (style.position === 'static') target.style.position = 'relative';\n\n const box = target.getBoundingClientRect();\n const width = target.clientWidth;\n const height = target.clientHeight;\n let point: { x: number; y: number } | null = null;\n const origin = options.origin;\n if (origin instanceof Element) {\n if (origin.isConnected) {\n const rect = origin.getBoundingClientRect();\n point = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n }\n } else if (origin) point = origin;\n else if (origin === undefined && pointer.active) point = { x: pointer.x, y: pointer.y };\n const x = point ? point.x - box.left - target.clientLeft : width / 2;\n const y = point ? point.y - box.top - target.clientTop : height / 2;\n const radius =\n Math.max(Math.hypot(x, y), Math.hypot(width - x, y), Math.hypot(x, height - y), Math.hypot(width - x, height - y)) * overshoot;\n\n const veil = document.createElement('div');\n veil.setAttribute('aria-hidden', 'true');\n veil.dataset.mkVeil = '';\n Object.assign(veil.style, {\n position: 'absolute',\n top: `${target.scrollTop}px`,\n left: `${target.scrollLeft}px`,\n width: `${width}px`,\n height: `${height}px`,\n borderRadius: style.borderRadius,\n pointerEvents: 'none',\n zIndex: '1000',\n });\n const progress = { value: 0 };\n const paint = () => {\n veil.style.background = `radial-gradient(${radius}px at ${x}px ${y}px, transparent 0%, ${fill} ${progress.value}%)`;\n };\n paint();\n target.append(veil);\n\n let done = false;\n let resolve!: () => void;\n const finished = new Promise<void>((r) => (resolve = r));\n const cleanup = () => {\n if (done) return;\n done = true;\n veil.remove();\n target.style.position = position;\n resolve();\n };\n const [duration, fade] = TIMING.reveal[speed];\n const timeline = gsap\n .timeline({ delay, onComplete: cleanup, onInterrupt: cleanup })\n .to(progress, { value: 100, duration, ease: 'power2.out', onUpdate: paint }, 0)\n .to(veil, { opacity: 0, duration: fade, ease: 'power1.out' }, Math.max(0, duration * Math.min(1, 1 / overshoot) - 0.1));\n\n return {\n timeline,\n finished,\n cancel() {\n timeline.kill();\n cleanup();\n },\n };\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { requestFrame } from '../core/frame';\n\n/*\n * Numbers that count to their new value: animated number (`numberSoft`,\n * 0.6 s; 0.7 s on prices) and the onboarding's revealed balance (rAF, 0.9 s,\n * ease-out cubic). Both continue from the value currently shown.\n */\n\nexport type NumberFormat = (value: number) => string;\nexport interface CountOptions {\n /** Start value. Default: the last value counted on this element, else the number in its text. */\n from?: number;\n duration?: number;\n format?: NumberFormat;\n}\n\nconst shown = new WeakMap<Element, number>();\nconst tweens = new WeakMap<Element, gsap.core.Tween>();\nconst frames = new WeakMap<Element, () => void>();\nconst defaultFormat: NumberFormat = (value) => String(Math.round(value));\n\nfunction current(el: Element): number {\n const known = shown.get(el);\n if (known !== undefined) return known;\n const parsed = Number((el.textContent ?? '').replace(/[^\\d.-]/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\n/** Tween a plain number (no DOM): `onUpdate` gets each value. Reduced motion jumps to `to`. */\nexport function tweenNumber(from: number, to: number, onUpdate: (value: number) => void, { duration = TIMING.number }: { duration?: number } = {}) {\n registerMotion();\n if (from === to || reduced()) {\n onUpdate(to);\n return null;\n }\n const state = { value: from };\n return gsap.to(state, { value: to, duration, ease: EASE.flow, onUpdate: () => onUpdate(state.value), onComplete: () => onUpdate(to) });\n}\n\nexport function countTo(el: HTMLElement, to: number, { from, duration = TIMING.number, format = defaultFormat }: CountOptions = {}) {\n registerMotion();\n tweens.get(el)?.kill();\n const start = from ?? current(el);\n const write = (value: number) => {\n shown.set(el, value);\n el.textContent = format(value);\n };\n if (start === to || reduced()) {\n write(to);\n return null;\n }\n const state = { value: start };\n const tween = gsap.to(state, {\n value: to,\n duration,\n ease: EASE.flow,\n onUpdate: () => write(state.value),\n onComplete: () => {\n write(to);\n tweens.delete(el);\n },\n });\n tweens.set(el, tween);\n return tween;\n}\n\n/** Count with requestAnimationFrame and ease-out cubic. Returns a cancel function. */\nexport function revealCounter(el: HTMLElement, to: number, { from, duration = TIMING.revealCounter, format = defaultFormat }: CountOptions = {}) {\n frames.get(el)?.();\n const start = from ?? current(el);\n const write = (value: number) => {\n shown.set(el, value);\n el.textContent = format(value);\n };\n if (start === to || reduced()) {\n write(to);\n return () => {};\n }\n let began: number | null = null;\n let cancel = () => {};\n const step = (time: number) => {\n began ??= time;\n const progress = Math.min(1, (time - began) / (duration * 1000));\n write(start + (to - start) * (1 - (1 - progress) ** 3));\n if (progress < 1) cancel = requestFrame(step);\n else frames.delete(el);\n };\n cancel = requestFrame(step);\n const stop = () => cancel();\n frames.set(el, stop);\n return stop;\n}\n","/*\n * Place an anchored surface (menu, anchored dialog) under its opener, left\n * aligned with it, inside the viewport: above when there is no room below,\n * beside it when neither fits (never covering it), else as low as it can go.\n * Under 680 px the stylesheet's full-screen sheet wins, so the inline place is cleared.\n */\n\nconst EDGE = 16;\nconst GAP = 8;\nconst PHONE = 680;\n/** Shorthands and longhands: some engines keep the longhands of a removed shorthand. */\nconst PLACED = ['top', 'left', 'right', 'bottom', 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left'];\n\nexport interface Viewport {\n width: number;\n height: number;\n}\n\nexport function anchorSurface(surface: HTMLElement, origin: DOMRect | null | undefined, viewport?: Viewport) {\n const view = viewport ?? { width: innerWidth, height: innerHeight };\n if (!origin || view.width < PHONE) {\n for (const side of PLACED) surface.style.removeProperty(side);\n return;\n }\n const box = surface.getBoundingClientRect();\n const clampLeft = (value: number) => Math.max(EDGE, Math.min(value, view.width - box.width - EDGE));\n const below = origin.bottom + GAP;\n const above = origin.top - GAP - box.height;\n const lowest = Math.max(EDGE, view.height - box.height - EDGE);\n const besideRight = origin.right + GAP;\n const besideLeft = origin.left - GAP - box.width;\n let top: number;\n let left: number;\n if (below <= lowest) [top, left] = [below, clampLeft(origin.left)];\n else if (above >= EDGE) [top, left] = [above, clampLeft(origin.left)];\n else if (besideRight + box.width <= view.width - EDGE) [top, left] = [Math.min(Math.max(EDGE, origin.top), lowest), besideRight];\n else if (besideLeft >= EDGE) [top, left] = [Math.min(Math.max(EDGE, origin.top), lowest), besideLeft];\n else [top, left] = [lowest, clampLeft(origin.left)];\n Object.assign(surface.style, { margin: '0', top: `${Math.round(top)}px`, left: `${Math.round(left)}px`, right: 'auto', bottom: 'auto' });\n}\n\n/** Remove the inline place anchorSurface wrote. */\nexport function clearAnchor(surface: HTMLElement) {\n for (const side of PLACED) surface.style.removeProperty(side);\n}\n","import { gsap, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * modal drag: a surface follows a drag (or a pull\n * with the wheel) at half speed and shrinks as it goes down (1 − y/400); past\n * 100 px it is dismissed, otherwise it springs back (elastic.out(.5,.5), 0.5 s).\n * A drag starts after 6 px, ignores controls, scrollable areas that can still\n * scroll, popovers and [data-mk-no-drag]; with a [data-mk-drag-handle] only the\n * handle drags. The wheel dismisses at speed 1.5 past 16 px, or past 100 px.\n */\n\nconst START = 6;\nconst FOLLOW = 0.5;\nconst DISMISS = 100;\nconst SHRINK = 400;\nconst WHEEL_SPEED = 1.5;\nconst WHEEL_MIN = 16;\nconst WHEEL_IDLE = 90;\nconst WHEEL_COOLDOWN = 250;\nconst CONTROLS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'label',\n 'summary',\n '[contenteditable=\"true\"]',\n '[role=\"button\"]',\n '[role=\"slider\"]',\n '[role=\"combobox\"]',\n '[role=\"option\"]',\n '[role=\"checkbox\"]',\n '[role=\"menuitem\"]',\n].join(',');\n\n/** The nearest element between `target` and `surface` that scrolls vertically. */\nfunction scrollerOf(target: EventTarget | null, surface: HTMLElement) {\n let element = target instanceof Element ? target : null;\n while (element) {\n if (element.scrollHeight > element.clientHeight + 1) {\n const overflow = getComputedStyle(element).overflowY;\n if (overflow === 'auto' || overflow === 'scroll') return element;\n }\n if (element === surface) break;\n element = element.parentElement;\n }\n return null;\n}\n\nconst draggableFrom = (target: EventTarget | null, surface: HTMLElement) =>\n target instanceof Element &&\n !target.closest('[data-mk-no-drag], [popover]') &&\n !target.closest(CONTROLS) &&\n !(surface.querySelector('[data-mk-drag-handle]') && !target.closest('[data-mk-drag-handle]'));\n\nexport interface DragDismissOptions {\n /** Whether a gesture may start now (not while opening, saving or floating). */\n canDrag?: () => boolean;\n onDismiss: () => void;\n}\n\n/** Let `surface` be dragged away. Returns the function that detaches it. */\nexport function attachDragDismiss(surface: HTMLElement, { canDrag = () => true, onDismiss }: DragDismissOptions) {\n registerMotion();\n let pointer: number | null = null;\n let startX = 0;\n let startY = 0;\n let mode: 'drag' | 'scroll' | null = null;\n let pulled = 0;\n let base = { x: 0, y: 0, scale: 1 };\n let target: EventTarget | null = null;\n\n const noSelect = (event: Event) => event.preventDefault();\n const begin = () => {\n mode = 'drag';\n gsap.killTweensOf(surface, 'x,y,scale');\n base = {\n x: Number(gsap.getProperty(surface, 'x')) || 0,\n y: Number(gsap.getProperty(surface, 'y')) || 0,\n scale: Number(gsap.getProperty(surface, 'scaleX')) || 1,\n };\n window.getSelection?.()?.removeAllRanges();\n document.body.style.userSelect = 'none';\n document.addEventListener('selectstart', noSelect);\n };\n const follow = (dx: number, dy: number) => {\n pulled = dy * FOLLOW;\n gsap.set(surface, { x: base.x + dx * FOLLOW, y: base.y + pulled, scale: Math.max(0.1, base.scale * (1 - pulled / SHRINK)) });\n };\n const restore = () => gsap.to(surface, { x: 0, y: 0, scale: 1, duration: TIMING.drag.restore, ease: 'elastic.out(0.5,0.5)' });\n const release = () => {\n document.removeEventListener('selectstart', noSelect);\n document.body.style.userSelect = '';\n const dismiss = pulled > DISMISS;\n mode = null;\n pulled = 0;\n if (dismiss) onDismiss();\n else restore();\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 || pointer !== null || reduced() || !canDrag()) return;\n if (!draggableFrom(event.target, surface)) return;\n pointer = event.pointerId;\n target = event.target;\n startX = event.clientX;\n startY = event.clientY;\n mode = null;\n pulled = 0;\n };\n const onPointerMove = (event: PointerEvent) => {\n if (event.pointerId !== pointer || mode === 'scroll') return;\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (mode === null) {\n if (Math.abs(dx) < START && Math.abs(dy) < START) return;\n if (event.pointerType !== 'mouse') {\n // A touch decides between scrolling the content and dragging the surface.\n const scroller = scrollerOf(target, surface);\n if (scroller && Math.abs(dx) < Math.abs(dy) && !(dy > 0 && scroller.scrollTop <= 0)) {\n mode = 'scroll';\n return;\n }\n }\n begin();\n }\n if (event.cancelable) event.preventDefault();\n follow(dx, dy);\n };\n const onPointerUp = (event: PointerEvent) => {\n if (event.pointerId !== pointer) return;\n pointer = null;\n target = null;\n if (mode !== 'drag') {\n mode = null;\n return;\n }\n // The click that ends a drag does not reach what is under the pointer.\n const swallow = (click: Event) => {\n click.stopPropagation();\n click.preventDefault();\n };\n window.addEventListener('click', swallow, { capture: true, once: true });\n setTimeout(() => window.removeEventListener('click', swallow, { capture: true }), 50);\n release();\n };\n\n // Pulling down with the wheel (scrolling up past the top) drags it as well.\n let wheeling = false;\n let wheelPull = 0;\n let wheelSpeed = 0;\n let lastWheel = 0;\n let idle: ReturnType<typeof setTimeout> | undefined;\n let quietUntil = 0;\n const deltaOf = (event: WheelEvent) =>\n event.deltaMode === 1 ? event.deltaY * 16 : event.deltaMode === 2 ? event.deltaY * innerHeight : event.deltaY;\n function endWheel(dismiss: boolean, at: number) {\n window.removeEventListener('wheel', onWheelCapture, { capture: true });\n clearTimeout(idle);\n wheeling = false;\n quietUntil = at + WHEEL_COOLDOWN;\n pulled = 0;\n wheelPull = 0;\n wheelSpeed = 0;\n lastWheel = 0;\n document.body.style.userSelect = '';\n if (dismiss) onDismiss();\n else restore();\n }\n function stepWheel(event: WheelEvent) {\n const amount = -deltaOf(event);\n const elapsed = lastWheel ? Math.max(1, event.timeStamp - lastWheel) : 16;\n lastWheel = event.timeStamp;\n wheelSpeed = wheelSpeed * 0.4 + (amount / elapsed) * 0.6;\n wheelPull = Math.max(0, wheelPull + amount);\n follow(0, wheelPull);\n if ((wheelSpeed > WHEEL_SPEED && pulled > WHEEL_MIN) || pulled > DISMISS) {\n endWheel(true, event.timeStamp);\n return;\n }\n clearTimeout(idle);\n idle = setTimeout(() => wheeling && endWheel(false, performance.now()), WHEEL_IDLE);\n }\n function onWheelCapture(event: WheelEvent) {\n if (!wheeling) return;\n event.preventDefault();\n event.stopPropagation();\n stepWheel(event);\n }\n const onWheel = (event: WheelEvent) => {\n if (wheeling || reduced() || !canDrag()) return;\n const up = deltaOf(event) < 0;\n const scroller = scrollerOf(event.target, surface);\n const canScroll = scroller\n ? up\n ? scroller.scrollTop > 0\n : scroller.scrollTop + scroller.clientHeight < scroller.scrollHeight - 1\n : false;\n if (canScroll || !up || event.timeStamp < quietUntil) return;\n if (event.target instanceof Element && event.target.closest('[data-mk-no-drag], [popover]')) return;\n event.preventDefault();\n wheeling = true;\n wheelPull = 0;\n wheelSpeed = 0;\n lastWheel = 0;\n begin();\n mode = null;\n window.addEventListener('wheel', onWheelCapture, { passive: false, capture: true });\n stepWheel(event);\n };\n\n surface.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('pointermove', onPointerMove, { passive: false });\n window.addEventListener('pointerup', onPointerUp);\n window.addEventListener('pointercancel', onPointerUp);\n surface.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n surface.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n window.removeEventListener('pointercancel', onPointerUp);\n surface.removeEventListener('wheel', onWheel);\n window.removeEventListener('wheel', onWheelCapture, { capture: true });\n clearTimeout(idle);\n document.removeEventListener('selectstart', noSelect);\n document.body.style.userSelect = '';\n };\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * floating modal: on desktop (≥ 680 px) a handle\n * lifts a surface into a window that moves on a spring (1100/38, mass by area),\n * glides when flung (≥ 350 px/s, decays in 0.18 s), stays inside the viewport\n * (8 px margin), resizes from its corners (min 320 × 240) and remembers where it\n * was left (localStorage `mk-float.<key>`). A press on the handle without\n * moving toggles floating.\n */\n\nconst MIN_WIDTH = 320;\nconst MIN_HEIGHT = 240;\nconst MARGIN = 8;\nconst DESKTOP = 680;\nconst LIFT = 4;\nconst SPRING = { stiffness: 1100, damping: 38 };\nconst MASS_AREA = 24_000;\nconst MAX_MASS = 1.5;\nconst REST_SPEED = 24;\nconst FLING_SPEED = 350;\nconst POINTER_SMOOTHING = 0.05;\nconst SHRINK_FULL = 0.85;\nconst FLOAT_SHADOW = 'rgba(0, 0, 0, 0.24) 0px 0px 24px -6px';\n\nexport const floatingAvailable = () => typeof innerWidth === 'number' && innerWidth >= DESKTOP;\n\nexport interface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** A window kept inside the viewport, at least 320 × 240. */\nexport function clampRect(rect: Rect, viewport = { width: innerWidth, height: innerHeight }): Rect {\n const maxWidth = Math.max(MIN_WIDTH, viewport.width - MARGIN * 2);\n const maxHeight = Math.max(MIN_HEIGHT, viewport.height - MARGIN * 2);\n const width = Math.min(maxWidth, Math.max(MIN_WIDTH, rect.width));\n const height = Math.min(maxHeight, Math.max(MIN_HEIGHT, rect.height));\n return {\n top: Math.min(Math.max(MARGIN, viewport.height - height - MARGIN), Math.max(MARGIN, rect.top)),\n left: Math.min(Math.max(MARGIN, viewport.width - width - MARGIN), Math.max(MARGIN, rect.left)),\n width,\n height,\n };\n}\n\nconst rectOf = (element: HTMLElement): Rect => {\n const box = element.getBoundingClientRect();\n return { top: box.top, left: box.left, width: box.width, height: box.height };\n};\n\nconst place = (element: HTMLElement, rect: Rect) =>\n Object.assign(element.style, {\n position: 'fixed',\n inset: 'auto',\n margin: '0',\n top: `${rect.top}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n maxWidth: 'none',\n maxHeight: 'none',\n });\n\nconst storageKey = (key: string) => `mk-float.${key}`;\n\n/** Where a floating window was left, if this device remembers it. */\nexport function savedFloat(key: string): Rect | null {\n try {\n const value = JSON.parse(localStorage.getItem(storageKey(key)) ?? 'null') as Rect | null;\n return value && (['top', 'left', 'width', 'height'] as const).every((name) => Number.isFinite(value[name])) ? clampRect(value) : null;\n } catch {\n return null;\n }\n}\n\nfunction saveFloat(key: string, rect: Rect) {\n try {\n localStorage.setItem(\n storageKey(key),\n JSON.stringify({ top: Math.round(rect.top), left: Math.round(rect.left), width: Math.round(rect.width), height: Math.round(rect.height) }),\n );\n } catch {\n // A convenience only.\n }\n}\n\nexport function forgetFloat(key: string) {\n try {\n localStorage.removeItem(storageKey(key));\n } catch {\n // A convenience only.\n }\n}\n\n/** Lift a surface into a window at `rect` (its shadow eases in, 0.45 s). */\nexport function liftWindow(surface: HTMLElement, rect: Rect) {\n registerMotion();\n place(surface, clampRect(rect));\n surface.classList.add('is-floating');\n if (!reduced()) {\n gsap.fromTo(\n surface,\n { boxShadow: 'rgba(0, 0, 0, 0) 0px 0px 0px 0px' },\n { boxShadow: FLOAT_SHADOW, duration: TIMING.float.shadow, ease: EASE.signature, clearProps: 'boxShadow' },\n );\n }\n}\n\nconst PLACED = [\n 'position',\n 'inset',\n 'right',\n 'bottom',\n 'margin',\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n 'top',\n 'left',\n 'width',\n 'height',\n 'max-width',\n 'max-height',\n];\n\n/** Remove what liftWindow wrote (no animation). */\nexport function unplaceWindow(surface: HTMLElement) {\n surface.classList.remove('is-floating');\n for (const name of PLACED) surface.style.removeProperty(name);\n}\n\n/** Put a floating surface back in its place, travelling from where it floated. */\nexport function dockWindow(surface: HTMLElement, from: Rect) {\n registerMotion();\n unplaceWindow(surface);\n if (reduced()) return;\n const to = rectOf(surface);\n gsap.from(surface, { x: from.left - to.left, y: from.top - to.top, duration: TIMING.float.shadow, ease: EASE.signature, clearProps: 'transform' });\n}\n\nexport interface FloatingOptions {\n key: string;\n handle: HTMLElement;\n corners?: HTMLElement[];\n isFloating: () => boolean;\n float: () => void;\n dock: () => void;\n}\n\n/** Move a floating surface by its handle and resize it from its corners. Returns the detach function. */\nexport function attachFloating(surface: HTMLElement, { key, handle, corners = [], isFloating, float, dock }: FloatingOptions) {\n const cleanups: Array<() => void> = [];\n const listen = (element: HTMLElement, listener: (event: PointerEvent) => void) => {\n element.addEventListener('pointerdown', listener);\n cleanups.push(() => element.removeEventListener('pointerdown', listener));\n };\n let active: number | null = null;\n let release: (() => void) | null = null;\n /**\n * Follow one pointer until it is released. Moves and the release are heard on\n * the window, not only through pointer capture: the window moves under the\n * pointer, and where capture does not hold the gesture must still end.\n */\n const capture = (element: HTMLElement, down: PointerEvent, { onMove, onUp }: { onMove: (event: PointerEvent) => void; onUp: () => void }) => {\n release?.();\n active = down.pointerId;\n try {\n element.setPointerCapture?.(down.pointerId);\n } catch {\n // The window listeners below still follow the pointer.\n }\n const move = (event: PointerEvent) => {\n if (event.pointerId === active) onMove(event);\n };\n const up = (event: PointerEvent) => {\n if (event.pointerId !== active) return;\n stop();\n onUp();\n };\n const stop = () => {\n active = null;\n release = null;\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n window.removeEventListener('pointercancel', up);\n };\n release = stop;\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n window.addEventListener('pointercancel', up);\n };\n cleanups.push(() => release?.());\n\n type Body = {\n x: number;\n y: number;\n vx: number;\n vy: number;\n w: number;\n h: number;\n targetX: number;\n targetY: number;\n targetW: number;\n targetH: number;\n mass: number;\n time: number;\n gliding: boolean;\n fromX: number;\n fromY: number;\n pointerVx: number;\n pointerVy: number;\n pointerX: number;\n pointerY: number;\n pointerTime: number;\n };\n let body: Body | null = null;\n const settle = () => {\n if (!body) return;\n gsap.ticker.remove(tick);\n body = null;\n };\n function tick() {\n if (!body) return;\n const now = performance.now();\n const elapsed = Math.min((now - body.time) / 1000, 1 / 30);\n if (elapsed <= 0) return;\n body.time = now;\n if (body.gliding) {\n const decay = Math.exp(-elapsed / TIMING.float.glideDecay);\n body.vx *= decay;\n body.vy *= decay;\n } else {\n body.vx += (((body.targetX - body.x) * SPRING.stiffness - body.vx * SPRING.damping) * elapsed) / body.mass;\n body.vy += (((body.targetY - body.y) * SPRING.stiffness - body.vy * SPRING.damping) * elapsed) / body.mass;\n }\n body.x += body.vx * elapsed;\n body.y += body.vy * elapsed;\n const smoothing = 1 - Math.exp(-elapsed / TIMING.float.sizeSmoothing);\n body.w += (body.targetW - body.w) * smoothing;\n body.h += (body.targetH - body.h) * smoothing;\n if (Math.abs(body.targetW - body.w) < 0.5) body.w = body.targetW;\n if (Math.abs(body.targetH - body.h) < 0.5) body.h = body.targetH;\n const rect = clampRect({ top: body.y, left: body.x, width: body.w, height: body.h });\n if (rect.left !== body.x) {\n body.x = rect.left;\n body.vx = 0;\n }\n if (rect.top !== body.y) {\n body.y = rect.top;\n body.vy = 0;\n }\n place(surface, rect);\n const resting = Math.hypot(body.vx, body.vy) < REST_SPEED && body.w === body.targetW && body.h === body.targetH;\n if (body.gliding && resting) {\n saveFloat(key, rect);\n settle();\n }\n }\n\n listen(handle, (down) => {\n if (down.button !== 0 || active !== null || !floatingAvailable()) return;\n down.preventDefault();\n settle();\n let moved = false;\n capture(handle, down, {\n onMove(event) {\n const dx = event.clientX - down.clientX;\n const dy = event.clientY - down.clientY;\n if (!moved) {\n if (Math.abs(dx) < LIFT && Math.abs(dy) < LIFT) return;\n moved = true;\n if (!isFloating()) float();\n const rect = rectOf(surface);\n const fullWidth = innerWidth - MARGIN * 2;\n const fullHeight = innerHeight - MARGIN * 2;\n // A window as large as the screen shrinks so it can be moved.\n const width = rect.width >= fullWidth - 2 ? Math.max(MIN_WIDTH, Math.round(fullWidth * SHRINK_FULL)) : rect.width;\n const height = rect.height >= fullHeight - 2 ? Math.max(MIN_HEIGHT, Math.round(fullHeight * SHRINK_FULL)) : rect.height;\n const grip = rect.width > 0 ? (down.clientX - rect.left) / rect.width : 0;\n const left = rect.left + (rect.width - width) * grip;\n const now = performance.now();\n body = {\n x: left,\n y: rect.top,\n vx: 0,\n vy: 0,\n w: rect.width,\n h: rect.height,\n targetX: left,\n targetY: rect.top,\n targetW: width,\n targetH: height,\n mass: Math.min(MAX_MASS, Math.max(1, Math.sqrt((rect.width * rect.height) / MASS_AREA))),\n time: now,\n gliding: false,\n fromX: left,\n fromY: rect.top,\n pointerVx: 0,\n pointerVy: 0,\n pointerX: event.clientX,\n pointerY: event.clientY,\n pointerTime: now,\n };\n gsap.ticker.add(tick);\n }\n if (!body) return;\n body.targetX = body.fromX + dx;\n body.targetY = body.fromY + dy;\n const now = performance.now();\n const seconds = Math.max(1, now - body.pointerTime) / 1000;\n const smoothing = 1 - Math.exp(-seconds / POINTER_SMOOTHING);\n body.pointerVx += ((event.clientX - body.pointerX) / seconds - body.pointerVx) * smoothing;\n body.pointerVy += ((event.clientY - body.pointerY) / seconds - body.pointerVy) * smoothing;\n body.pointerX = event.clientX;\n body.pointerY = event.clientY;\n body.pointerTime = now;\n },\n onUp() {\n if (!moved) {\n if (isFloating()) dock();\n else float();\n return;\n }\n if (!body) return;\n // A fling keeps gliding; a gentle release stays where it is.\n const speed = performance.now() - body.pointerTime > 80 ? 0 : Math.hypot(body.pointerVx, body.pointerVy);\n if (speed >= FLING_SPEED) {\n body.vx = body.pointerVx;\n body.vy = body.pointerVy;\n } else {\n body.vx = 0;\n body.vy = 0;\n body.targetX = body.x;\n body.targetY = body.y;\n }\n body.gliding = true;\n },\n });\n });\n\n for (const corner of corners) {\n listen(corner, (down) => {\n if (down.button !== 0 || active !== null || !floatingAvailable()) return;\n down.preventDefault();\n settle();\n const side = corner.dataset.mkFloatCorner ?? 'br';\n const fromLeft = side.endsWith('l');\n const fromTop = side.startsWith('t');\n let start: Rect | null = null;\n capture(corner, down, {\n onMove(event) {\n const dx = event.clientX - down.clientX;\n const dy = event.clientY - down.clientY;\n if (!start) {\n if (Math.abs(dx) < LIFT && Math.abs(dy) < LIFT) return;\n if (!isFloating()) float();\n start = rectOf(surface);\n }\n const width = Math.min(innerWidth - MARGIN * 2, Math.max(MIN_WIDTH, fromLeft ? start.width - dx : start.width + dx));\n const height = Math.min(innerHeight - MARGIN * 2, Math.max(MIN_HEIGHT, fromTop ? start.height - dy : start.height + dy));\n place(\n surface,\n clampRect({\n top: fromTop ? start.top + start.height - height : start.top,\n left: fromLeft ? start.left + start.width - width : start.left,\n width,\n height,\n }),\n );\n },\n onUp() {\n if (start) saveFloat(key, rectOf(surface));\n },\n });\n });\n }\n\n return () => {\n if (body?.gliding) saveFloat(key, rectOf(surface));\n settle();\n for (const cleanup of cleanups) cleanup();\n };\n}\n","import { SIGNATURE_LINEAR } from '../core/curves';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * Helpers shared by surfaces (dialogs, menus): opening a <dialog> with a\n * fallback where showModal is missing, the backdrop tint, and an inert visual\n * copy (ghost) that plays a close while the real element is already gone.\n */\n\n/** A computed colour with no alpha: `transparent`, `rgba(…, 0)` or `color(… / 0)`. */\nexport const transparentColor = (color: string) =>\n !color || color === 'transparent' || /,\\s*0\\)$/.test(color) || /\\/\\s*0\\)$/.test(color);\n\ntype DialogLike = HTMLElement & Partial<Pick<HTMLDialogElement, 'showModal' | 'show' | 'close'>>;\n\n/** Open a <dialog> modally (or not). Falls back to the `open` attribute. */\nexport function openModal(dialog: DialogLike, modal = true) {\n if (dialog.hasAttribute('open')) return;\n if (modal && typeof dialog.showModal === 'function') dialog.showModal();\n else if (typeof dialog.show === 'function') dialog.show();\n else dialog.setAttribute('open', '');\n}\n\nexport function closeModal(dialog: DialogLike) {\n if (typeof dialog.close === 'function') dialog.close();\n else dialog.removeAttribute('open');\n}\n\n/**\n * Fade a modal <dialog>'s ::backdrop in (tint: 0.5 s on the signature\n * curve) or out (linear). Resolves at once without the Web Animations API.\n */\nexport function fadeBackdrop(dialog: HTMLElement, direction: 'in' | 'out'): Promise<void> {\n if (typeof dialog.animate !== 'function' || reduced()) return Promise.resolve();\n try {\n const animation = dialog.animate(direction === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }], {\n duration: (direction === 'in' ? TIMING.dialog.backdrop : TIMING.dialog.close) * 1000,\n easing: direction === 'in' ? SIGNATURE_LINEAR : 'linear',\n fill: direction === 'out' ? 'forwards' : 'none',\n pseudoElement: '::backdrop',\n });\n return animation.finished.then(\n () => undefined,\n () => undefined,\n );\n } catch {\n return Promise.resolve();\n }\n}\n\n/**\n * An inert visual copy of `surface`, fixed over the place it occupies now and not\n * yet in the document (null when it has no size). A picture, not a second form:\n * no ids, labels, names or roles to collide with the page.\n */\n/** A fixed copy of a modal's backdrop (tint and blur), for a closing ghost to fade with. Not appended. */\nexport function backdropVeil(surface: HTMLElement): HTMLElement {\n const backdrop = getComputedStyle(surface, '::backdrop');\n const veil = document.createElement('div');\n veil.setAttribute('aria-hidden', 'true');\n veil.dataset.mkVeil = '';\n Object.assign(veil.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483645',\n background: backdrop.background || backdrop.backgroundColor,\n backdropFilter: backdrop.backdropFilter,\n pointerEvents: 'none',\n });\n return veil;\n}\n\nexport function ghostOf(surface: HTMLElement): HTMLElement | null {\n const rect = surface.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n const style = getComputedStyle(surface);\n const ghost = document.createElement('div');\n ghost.className = surface.className;\n ghost.innerHTML = surface.innerHTML;\n ghost.setAttribute('aria-hidden', 'true');\n ghost.inert = true;\n ghost.dataset.mkGhost = '';\n const strip = ['id', 'for', 'name', 'aria-labelledby', 'aria-describedby', 'aria-label', 'role'];\n for (const element of ghost.querySelectorAll(strip.map((name) => `[${name}]`).join(','))) {\n for (const name of strip) element.removeAttribute(name);\n }\n for (const label of ghost.querySelectorAll('label')) {\n const span = document.createElement('span');\n span.className = label.className;\n span.append(...label.childNodes);\n label.replaceWith(span);\n }\n Object.assign(ghost.style, {\n position: 'fixed',\n inset: 'auto',\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n margin: '0',\n display: style.display === 'none' ? 'flex' : style.display,\n flexDirection: style.flexDirection,\n zIndex: '2147483646',\n pointerEvents: 'none',\n });\n return ghost;\n}\n","import { gsap } from '../core/gsap';\nimport { bezier, channels, easeOut, eased, spring } from '../core/channels';\nimport { TIMING } from '../core/timing';\nimport { transparentColor } from './surface';\n\n/*\n * liquid modal: the opener's colour melts into the\n * surface. Two blobs (one on the opener, one with the surface's shape) sit under\n * a \"goo\" filter (blur 20, alpha threshold 19·a − 9), so while the surface's\n * blob swings out of the opener on a spring (144/14, kick 2400 px/s) they\n * stretch and merge like a liquid; the content zooms in from twice its size.\n * Each property runs on its own channel, as in the source.\n */\n\nconst GOO = 'mk-liquid-goo';\n\n/** The goo filter, added to the page once. */\nfunction ensureGoo() {\n if (document.getElementById(GOO)) return;\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('width', '0');\n svg.setAttribute('height', '0');\n svg.style.position = 'absolute';\n svg.innerHTML = `<defs><filter id=\"${GOO}\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\"><feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"20\"/><feColorMatrix type=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 19 -9\"/></filter></defs>`;\n document.body.append(svg);\n}\n\ninterface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** A layer under the surface's content, in viewport coordinates, holding the blobs. */\nfunction gooLayer(surface: HTMLElement) {\n ensureGoo();\n const box = surface.getBoundingClientRect();\n const layer = document.createElement('div');\n layer.className = 'mk-morph-face mk-liquid';\n layer.setAttribute('aria-hidden', 'true');\n Object.assign(layer.style, {\n position: 'absolute',\n left: `${-box.left - surface.clientLeft}px`,\n top: `${-box.top - surface.clientTop}px`,\n width: `${innerWidth}px`,\n height: `${innerHeight}px`,\n zIndex: '-1',\n pointerEvents: 'none',\n filter: `url(#${GOO})`,\n borderRadius: '0',\n background: 'none',\n });\n const blob = (from: Box, radius: number, color: string) => {\n const element = document.createElement('div');\n Object.assign(element.style, {\n position: 'absolute',\n top: `${from.top}px`,\n left: `${from.left}px`,\n width: `${from.width}px`,\n height: `${from.height}px`,\n borderRadius: `${radius}px`,\n background: color,\n });\n layer.append(element);\n return element;\n };\n surface.append(layer);\n return { layer, blob };\n}\n\n/** The surface turns into a frame while its blob is the visible shape. */\nfunction hideFrame(surface: HTMLElement) {\n const saved = surface.getAttribute('style');\n Object.assign(surface.style, {\n transition: 'none',\n background: 'transparent',\n boxShadow: 'none',\n borderColor: 'transparent',\n overflow: 'visible',\n });\n return () => {\n if (saved === null) surface.removeAttribute('style');\n else surface.setAttribute('style', saved);\n };\n}\n\nconst radiusOf = (element: HTMLElement, box: DOMRect) =>\n Math.min(parseFloat(getComputedStyle(element).borderTopLeftRadius) || 0, box.width / 2, box.height / 2);\n\n/** Content parts move and zoom about the surface's centre. */\nfunction centerParts(surface: HTMLElement, parts: HTMLElement[]) {\n const box = surface.getBoundingClientRect();\n const centerX = box.left + box.width / 2;\n const centerY = box.top + box.height / 2;\n for (const part of parts) {\n const own = part.getBoundingClientRect();\n gsap.set(part, { transformOrigin: `${centerX - own.left}px ${centerY - own.top}px` });\n }\n return { centerX, centerY };\n}\n\ntype Frame = { top: number; left: number; width: number; height: number; scale: number; blur: number };\n\n/** Open `surface` out of `origin` the liquid way. Returns a function that stops it and settles the surface. */\nexport function liquidOpen(surface: HTMLElement, origin: HTMLElement, parts: HTMLElement[]) {\n const box = surface.getBoundingClientRect();\n const start = origin.getBoundingClientRect();\n const surfaceColor = getComputedStyle(surface).backgroundColor;\n const originLook = getComputedStyle(origin).backgroundColor;\n const originColor = transparentColor(originLook) ? surfaceColor : originLook;\n const endRadius = radiusOf(surface, box);\n const startRadius = radiusOf(origin, start);\n const { centerX, centerY } = centerParts(surface, parts);\n const restore = hideFrame(surface);\n const { layer, blob } = gooLayer(surface);\n const originBlob = blob(start, startRadius, originColor);\n const shape = blob(start, startRadius, originColor);\n const towardX = start.left + start.width / 2 < innerWidth / 2 ? 1 : -1;\n const towardY = start.top + start.height / 2 < innerHeight / 2 ? 1 : -1;\n if (parts.length) gsap.set(parts, { opacity: 0 });\n const current: Frame = { top: start.top, left: start.left, width: start.width, height: start.height, scale: 2, blur: 8 };\n const paint = () => {\n if (!parts.length) return;\n gsap.set(parts, {\n x: current.left + current.width / 2 - centerX,\n y: current.top + current.height / 2 - centerY,\n scale: current.scale,\n filter: `blur(${current.blur}px)`,\n });\n };\n const motion = channels({ ...current, radius: startRadius }, (name, value) => {\n if (name === 'radius') shape.style.borderRadius = `${value}px`;\n else {\n current[name] = value;\n if (name === 'top' || name === 'left' || name === 'width' || name === 'height') shape.style[name] = `${value}px`;\n paint();\n }\n });\n const L = TIMING.liquid;\n void motion.animate(\n { top: box.top, left: box.left, width: box.width, height: box.height, radius: endRadius, scale: 1, blur: 0 },\n {\n top: spring(144, 14, { velocity: 2400, direction: towardY }),\n left: spring(144, 14, { velocity: 2400, direction: towardX }),\n width: eased(L.size, bezier(0.8, 0.3, 0.5, 0.8)),\n height: eased(L.size, bezier(0.8, 0.3, 0.5, 0.8)),\n radius: eased(L.radius, easeOut),\n scale: eased(L.content, easeOut),\n blur: eased(L.content, easeOut),\n },\n );\n gsap.to(shape, { background: surfaceColor, duration: L.color, delay: L.colorDelay, ease: 'power2.out' });\n if (parts.length) gsap.to(parts, { opacity: 1, duration: L.color, delay: L.colorDelay, ease: 'power2.out' });\n gsap.to(originBlob, { opacity: 0, duration: L.ghost, delay: L.ghostDelay, ease: 'power2.out' });\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n motion.stop();\n clearTimeout(timer);\n layer.remove();\n restore();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter' });\n };\n // The springs settle well within the source's 1.1 s window.\n const timer = setTimeout(finish, L.safetyMs);\n return finish;\n}\n\n/** Close `surface` back into `origin` the liquid way, then call `onComplete`. */\nexport function liquidClose(surface: HTMLElement, origin: HTMLElement, parts: HTMLElement[], onComplete: () => void) {\n const box = surface.getBoundingClientRect();\n const end = origin.getBoundingClientRect();\n const surfaceColor = getComputedStyle(surface).backgroundColor;\n const originLook = getComputedStyle(origin).backgroundColor;\n const originColor = transparentColor(originLook) ? surfaceColor : originLook;\n const startRadius = radiusOf(surface, box);\n const endRadius = radiusOf(origin, end);\n const { centerX, centerY } = centerParts(surface, parts);\n hideFrame(surface);\n const { blob } = gooLayer(surface);\n const originBlob = blob(end, endRadius, originColor);\n originBlob.style.opacity = '0';\n const shape = blob(box, startRadius, surfaceColor);\n const current: Frame = { top: box.top, left: box.left, width: box.width, height: box.height, scale: 1, blur: 0 };\n const motion = channels({ ...current, radius: startRadius, opacity: 1 }, (name, value) => {\n if (name === 'radius') shape.style.borderRadius = `${value}px`;\n else if (name === 'opacity') {\n if (parts.length) gsap.set(parts, { opacity: value });\n } else {\n current[name] = value;\n if (name === 'top' || name === 'left' || name === 'width' || name === 'height') shape.style[name] = `${value}px`;\n if (parts.length) {\n gsap.set(parts, {\n x: current.left + current.width / 2 - centerX,\n y: current.top + current.height / 2 - centerY,\n scale: current.scale,\n filter: `blur(${current.blur}px)`,\n });\n }\n }\n });\n const L = TIMING.liquid;\n void motion.animate(\n { top: end.top, left: end.left, width: end.width, height: end.height, radius: endRadius, scale: 2, blur: 8, opacity: 0 },\n {\n top: spring(130, 18),\n left: spring(130, 18),\n width: eased(L.closeSize, easeOut),\n height: eased(L.closeSize, easeOut),\n // It rounds into the opener's shape early, long before it arrives.\n radius: eased(L.closeSize, easeOut),\n scale: eased(L.closeContent, easeOut),\n blur: eased(L.closeContent, easeOut),\n opacity: spring(137, 20),\n },\n );\n gsap.to(originBlob, { opacity: 1, duration: L.originRestore, delay: 0.15, ease: 'power2.in' });\n gsap.to(shape, { background: originColor, duration: L.originRestore, ease: 'power2.out' });\n gsap.to(surface, { opacity: 0, duration: TIMING.dialog.close, ease: 'power3.in' });\n setTimeout(() => {\n motion.stop();\n onComplete();\n }, L.safetyMs);\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { MORPH_STYLES, clearStyles } from '../core/styles';\nimport { liquidClose, liquidOpen } from './liquid';\nimport { backdropVeil, ghostOf, transparentColor } from './surface';\n\n/*\n * Container transform: a surface\n * (dialog, menu, option list) grows out of the control that opened it and folds\n * back into it. The surface itself is never scaled: it starts clipped to the\n * opener's size and corners, moved onto the opener, and widens to its own box\n * while the opener's colour fades into its own. A dialog's content travels as\n * one group, scaled from the opener's box to its own while it sharpens and\n * fades in. `data-mk-shared=\"id\"` pieces (a title) fly between opener and surface.\n */\n\nconst FACE = 'mk-morph-face';\nconst HIDDEN_ORIGIN = 'data-mk-morph-origin';\nconst SHARED = 'data-mk-shared';\nconst SHARED_HIDDEN = 'data-mk-shared-hidden';\n\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n\n/** A computed radius in pixels (percentages resolve against `size`). */\nconst radiusOf = (value: string, size: number) => {\n const parsed = Number.parseFloat(value) || 0;\n return value.trim().endsWith('%') ? (parsed / 100) * size : parsed;\n};\n\ninterface Shape {\n /** Offset that puts the clipped area on the opener. */\n x: number;\n y: number;\n /** Clip at the opener's size, and the full surface. */\n from: string;\n to: string;\n /** The clipped area in the surface's own coordinates. */\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Where the surface starts: the area of the opener's size nearest to it inside\n * the surface, and the offset that moves that area onto the opener. Null when\n * the opener is gone, tiny or off screen.\n */\nfunction shapeOf(surface: HTMLElement, origin: HTMLElement | null): Shape | null {\n if (!origin?.isConnected) return null;\n const start = origin.getBoundingClientRect();\n const box = surface.getBoundingClientRect();\n if (start.width < 4 || start.height < 4 || !box.width || !box.height) return null;\n if (start.bottom < 0 || start.top > innerHeight || start.right < 0 || start.left > innerWidth) return null;\n const width = Math.min(start.width, box.width);\n const height = Math.min(start.height, box.height);\n const left = clamp(start.left - box.left, 0, box.width - width);\n const top = clamp(start.top - box.top, 0, box.height - height);\n const corner = Math.min(radiusOf(getComputedStyle(origin).borderTopLeftRadius, start.height), width / 2, height / 2);\n const radius = radiusOf(getComputedStyle(surface).borderTopLeftRadius, box.height);\n return {\n x: start.left + (start.width - width) / 2 - (box.left + left),\n y: start.top + (start.height - height) / 2 - (box.top + top),\n from: `inset(${top}px ${box.width - left - width}px ${box.height - top - height}px ${left}px round ${corner}px)`,\n to: `inset(0px 0px 0px 0px round ${radius}px)`,\n left,\n top,\n width,\n height,\n };\n}\n\n/** Properties that make a copy look like the opener wherever it is placed. */\nconst LOOK = [\n 'display',\n 'alignItems',\n 'justifyContent',\n 'gap',\n 'padding',\n 'borderRadius',\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'backgroundColor',\n 'color',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'lineHeight',\n 'letterSpacing',\n 'whiteSpace',\n] as const;\n\n/**\n * A layer over the surface that looks like the opener: its colour fills the\n * surface and, for lists, a copy of its label sits where it was. Fading it out\n * turns the opener into the surface.\n */\nfunction faceOf(surface: HTMLElement, origin: HTMLElement, shape: Shape, withCopy: boolean) {\n const look = getComputedStyle(origin);\n const face = document.createElement('div');\n face.className = FACE;\n face.setAttribute('aria-hidden', 'true');\n face.inert = true;\n if (!transparentColor(look.backgroundColor)) face.style.background = look.backgroundColor;\n surface.append(face);\n if (!withCopy) return { face, copy: null as HTMLElement | null };\n const copy = document.createElement('span');\n copy.innerHTML = origin.innerHTML;\n for (const element of copy.querySelectorAll('[id], [name], [for]')) for (const name of ['id', 'name', 'for']) element.removeAttribute(name);\n for (const property of LOOK) copy.style[property] = look[property];\n Object.assign(copy.style, {\n position: 'absolute',\n left: `${shape.left}px`,\n top: `${shape.top}px`,\n width: `${shape.width}px`,\n height: `${shape.height}px`,\n boxSizing: 'border-box',\n margin: '0',\n overflow: 'hidden',\n });\n face.append(copy);\n return { face, copy };\n}\n\n/** The morph each surface is playing, so a new one stops it first. */\nconst running = new WeakMap<HTMLElement, gsap.core.Animation>();\n\n/** Whether a surface is opening or closing right now. */\nexport const isMorphing = (surface: HTMLElement) => running.has(surface);\n\nfunction stop(surface: HTMLElement) {\n running.get(surface)?.kill();\n running.delete(surface);\n gsap.killTweensOf(surface);\n for (const face of surface.querySelectorAll(`:scope > .${FACE}`)) face.remove();\n clearStyles([surface], MORPH_STYLES);\n}\n\n/** Stop a surface's morph now and put the surface and its content back to rest. */\nexport function stopMorph(surface: HTMLElement) {\n stop(surface);\n const parts = [...surface.querySelectorAll<HTMLElement>(':scope > *')].filter((element) => !element.classList.contains('mk-liquid'));\n gsap.killTweensOf(parts);\n clearStyles(parts, MORPH_STYLES);\n}\n\n/** Small controls disappear into the surface they open, like a shared element. */\nconst compact = (element: HTMLElement) => {\n const box = element.getBoundingClientRect();\n return box.width <= 360 && box.height <= 72;\n};\n\n/** Show a hidden opener again; with `fade` it comes back while its surface closes (0.3 s after 0.2 s). */\nexport function showOrigin(origin: HTMLElement | null | undefined, { fade = false }: { fade?: boolean } = {}) {\n if (!origin?.hasAttribute(HIDDEN_ORIGIN)) return;\n if (!fade || reduced()) {\n origin.removeAttribute(HIDDEN_ORIGIN);\n return;\n }\n const previous = origin.style.transition;\n const { originShow, originShowDelay } = TIMING.dialog;\n origin.style.transition = `opacity ${originShow}s cubic-bezier(0.215, 0.61, 0.355, 1) ${originShowDelay}s`;\n origin.removeAttribute(HIDDEN_ORIGIN);\n setTimeout(() => {\n origin.style.transition = previous;\n }, (originShow + originShowDelay) * 1000 + 50);\n}\n\n/** Scale and offset that fit the content, as one group, into the opener's box inside the surface. */\nfunction groupOf(surface: HTMLElement, parts: HTMLElement[], shape: Shape) {\n const box = surface.getBoundingClientRect();\n for (const part of parts) {\n const own = part.getBoundingClientRect();\n gsap.set(part, { transformOrigin: `${box.left - own.left}px ${box.top - own.top}px` });\n }\n return {\n x: shape.left,\n y: shape.top,\n scaleX: box.width ? shape.width / box.width : 1,\n scaleY: box.height ? shape.height / box.height : 1,\n };\n}\n\nconst escape = (value: string) => (typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(value) : value.replace(/\"/g, '\\\\\"'));\n\nfunction sharedPairs(origin: HTMLElement, surface: HTMLElement) {\n return [origin, ...origin.querySelectorAll<HTMLElement>(`[${SHARED}]`)]\n .filter((source) => source.hasAttribute(SHARED))\n .map((source) => ({\n source,\n target: surface.querySelector<HTMLElement>(`[${SHARED}=\"${escape(source.getAttribute(SHARED) ?? '')}\"]`),\n }))\n .filter((pair): pair is { source: HTMLElement; target: HTMLElement } => pair.target !== null);\n}\n\n/** Where an element's text sits: its box without padding and border. */\nfunction textBox(element: HTMLElement) {\n const box = element.getBoundingClientRect();\n const style = getComputedStyle(element);\n const px = (value: string) => parseFloat(value) || 0;\n const left = box.left + px(style.borderLeftWidth) + px(style.paddingLeft);\n const top = box.top + px(style.borderTopWidth) + px(style.paddingTop);\n const bottom = box.bottom - px(style.borderBottomWidth) - px(style.paddingBottom);\n return { left, top, height: Math.max(0, bottom - top), style };\n}\n\nconst textOf = (element: HTMLElement) =>\n element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement\n ? element.value || element.placeholder\n : (element.firstChild?.textContent ?? element.textContent ?? '');\n\n/** Fly a copy of `from`'s text onto `to` (place, size, colour) in the top layer. Resolves when it lands. */\nfunction flyText(from: HTMLElement, to: HTMLElement, text: string, duration: number) {\n return new Promise<void>((resolve) => {\n const start = textBox(from);\n const end = textBox(to);\n const fromSize = parseFloat(start.style.fontSize) || 16;\n const toSize = parseFloat(end.style.fontSize) || fromSize;\n const scale = toSize / fromSize;\n const ghost = document.createElement('div');\n ghost.setAttribute('aria-hidden', 'true');\n ghost.setAttribute('popover', 'manual');\n ghost.textContent = text;\n Object.assign(ghost.style, {\n position: 'fixed',\n inset: 'auto',\n left: `${start.left}px`,\n top: `${start.top}px`,\n margin: '0',\n padding: '0',\n border: '0',\n background: 'transparent',\n overflow: 'visible',\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n fontFamily: start.style.fontFamily,\n fontSize: start.style.fontSize,\n fontWeight: start.style.fontWeight,\n lineHeight: `${start.height || fromSize * 1.2}px`,\n letterSpacing: start.style.letterSpacing,\n color: start.style.color,\n transformOrigin: '0 0',\n });\n document.body.append(ghost);\n if (typeof ghost.showPopover === 'function') ghost.showPopover();\n const height = (start.height || fromSize * 1.2) * scale;\n gsap.to(ghost, {\n x: end.left - start.left,\n y: end.top + end.height / 2 - height / 2 - start.top,\n scale,\n color: end.style.color,\n duration,\n ease: EASE.signature,\n onComplete: () => {\n ghost.remove();\n resolve();\n },\n });\n });\n}\n\n/** Show the opener's shared pieces again (a surface closed without its animation). */\nexport function releaseShared(origin: HTMLElement | null | undefined) {\n if (!origin) return;\n for (const element of [origin, ...origin.querySelectorAll(`[${SHARED_HIDDEN}]`)]) element.removeAttribute(SHARED_HIDDEN);\n}\n\n/** The opener's pieces travel into the surface; they stay hidden at home until it closes. */\nexport function shareInto(origin: HTMLElement, surface: HTMLElement, duration: number = TIMING.dialog.open) {\n for (const { source, target } of sharedPairs(origin, surface)) {\n const text = textOf(source);\n source.setAttribute(SHARED_HIDDEN, '');\n gsap.set(target, { opacity: 0 });\n void flyText(source, target, text, duration).then(() => gsap.set(target, { clearProps: 'opacity' }));\n }\n}\n\n/** The surface's pieces travel back home and show there again. */\nexport function shareBack(surface: HTMLElement, origin: HTMLElement, duration: number = TIMING.dialog.close) {\n for (const { source, target } of sharedPairs(origin, surface)) {\n gsap.set(target, { opacity: 0 });\n void flyText(target, source, textOf(source), duration).then(() => source.removeAttribute(SHARED_HIDDEN));\n }\n}\n\nexport interface MorphOpenOptions {\n duration?: number;\n /** Keep a compact opener hidden while the surface is open; call showOrigin when it closes. */\n hideOrigin?: boolean;\n /** What enters inside the surface (selector); by default its children. */\n content?: string;\n /** Delay between content parts: an option list cascades instead of growing as one. */\n stagger?: number;\n liquid?: boolean;\n}\n\nconst partsOf = (surface: HTMLElement, content: string | undefined) =>\n [...surface.querySelectorAll<HTMLElement>(content ?? ':scope > *')].filter(\n (element) => !element.classList.contains(FACE) && !element.classList.contains('mk-liquid'),\n );\n\n/**\n * Open `surface` out of `origin`. Returns the timeline (null when reduced).\n * Shape travels from the opener (0.7 s, signature) and takes the surface's\n * colour over the first 0.3 s; the content grows from the opener's box out of\n * an 8 px blur on the same curve. Without an opener on screen: scale .92 → 1, 0.35 s.\n */\nexport function morphOpen(surface: HTMLElement, origin: HTMLElement | null, options: MorphOpenOptions = {}) {\n registerMotion();\n const { duration = TIMING.dialog.open, hideOrigin = false, content, stagger = 0, liquid = false } = options;\n stop(surface);\n if (reduced()) return null;\n const parts = partsOf(surface, content);\n if (liquid && !stagger && origin && shapeOf(surface, origin)) {\n if (hideOrigin && compact(origin)) origin.setAttribute(HIDDEN_ORIGIN, '');\n const settle = liquidOpen(surface, origin, parts);\n const window = gsap.timeline({\n onComplete: () => {\n settle();\n running.delete(surface);\n },\n onInterrupt: settle,\n });\n window.to({}, { duration: TIMING.liquid.safetyMs / 1000 });\n running.set(surface, window);\n return window;\n }\n const enter = stagger\n ? { opacity: 1, y: 0, duration: TIMING.dialog.list, ease: 'power2.out', stagger, clearProps: 'opacity,transform' }\n : { opacity: 1, filter: 'blur(0px)', duration, ease: EASE.signature, clearProps: 'opacity,filter' };\n const enterFrom = stagger ? { opacity: 0, y: -6 } : { opacity: 0, filter: 'blur(8px)' };\n const shape = shapeOf(surface, origin);\n if (!shape || !origin) {\n const rise = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n },\n })\n .fromTo(\n surface,\n { opacity: 0, scale: 0.92 },\n { opacity: 1, scale: 1, duration: TIMING.dialog.fallback, ease: 'power2.out', clearProps: 'opacity,transform' },\n );\n if (parts.length) rise.fromTo(parts, enterFrom, { ...enter, duration: Math.min(enter.duration, TIMING.dialog.fallback) }, 0);\n running.set(surface, rise);\n return rise;\n }\n const list = Boolean(stagger);\n if (!list) shareInto(origin, surface, duration);\n const { face, copy } = faceOf(surface, origin, shape, list);\n const group = list ? null : groupOf(surface, parts, shape);\n if (hideOrigin && compact(origin)) origin.setAttribute(HIDDEN_ORIGIN, '');\n const finish = () => {\n face.remove();\n running.delete(surface);\n gsap.set(surface, { clearProps: 'transform,clipPath,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter' });\n };\n const timeline = gsap\n .timeline({ onComplete: finish, onInterrupt: finish })\n .fromTo(\n surface,\n { x: shape.x, y: shape.y, clipPath: shape.from, willChange: 'transform,clip-path' },\n { x: 0, y: 0, clipPath: shape.to, duration, ease: EASE.signature },\n 0,\n )\n // The opener's colour hands over early, so a light button never flashes over a dark form.\n .to(face, { opacity: 0, duration: TIMING.dialog.surfaceColor, ease: EASE.signature }, 0);\n if (copy) timeline.to(copy, { opacity: 0, duration: 0.25, ease: 'power2.out' }, 0.05);\n if (parts.length) {\n if (group) {\n timeline.fromTo(\n parts,\n { ...group, opacity: 0, filter: 'blur(8px)' },\n { x: 0, y: 0, scaleX: 1, scaleY: 1, opacity: 1, filter: 'blur(0px)', duration, ease: EASE.signature },\n 0,\n );\n } else timeline.fromTo(parts, enterFrom, enter, duration * 0.2);\n }\n running.set(surface, timeline);\n return timeline;\n}\n\nexport interface MorphCloseOptions {\n duration?: number;\n content?: string;\n liquid?: boolean;\n}\n\n/**\n * Fold `surface` back into `origin`, then call `onComplete` (which hides it).\n * Without an opener on screen it closes in place: 90 % scale, 32 px blur.\n */\nexport function morphClose(surface: HTMLElement, origin: HTMLElement | null, onComplete: () => void, options: MorphCloseOptions = {}) {\n registerMotion();\n const { duration = TIMING.dialog.close, content, liquid = false } = options;\n stop(surface);\n if (reduced()) {\n onComplete();\n return null;\n }\n const parts = partsOf(surface, content);\n const shape = shapeOf(surface, origin);\n if (!shape || !origin) {\n const fade = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n gsap.set(surface, { clearProps: 'opacity,transform' });\n if (parts.length) gsap.set(parts, { clearProps: 'filter' });\n },\n })\n .to(surface, { scale: 0.9, duration, ease: EASE.signature }, 0)\n .to(surface, { opacity: 0, duration, ease: EASE.fadeAway }, 0);\n if (parts.length) fade.to(parts, { filter: 'blur(32px)', duration, ease: EASE.blurAway }, 0);\n running.set(surface, fade);\n return fade;\n }\n const list = content !== undefined;\n if (liquid && !list) {\n liquidClose(surface, origin, parts, onComplete);\n return null;\n }\n const { face, copy } = faceOf(surface, origin, shape, list);\n gsap.set(copy ? [face, copy] : face, { opacity: 0 });\n if (!list) {\n // The shape folds back into the opener and takes its colour (0.5 s); the\n // content heads for the opener on a 2 s path while it fades and blurs away\n // within the 0.5 s, and the surface fades out (power3.in).\n shareBack(surface, origin, duration);\n const group = groupOf(surface, parts, shape);\n const signature = gsap.parseEase(EASE.signature);\n const toward = (progress: number) => signature(progress * (duration / TIMING.dialog.contentReturn));\n const timeline = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n face.remove();\n gsap.set(surface, { clearProps: 'transform,clipPath,opacity,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter,borderRadius' });\n },\n onInterrupt: () => {\n face.remove();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter,borderRadius' });\n },\n })\n .fromTo(\n surface,\n { clipPath: shape.to, willChange: 'transform,clip-path' },\n { x: shape.x, y: shape.y, clipPath: shape.from, duration, ease: EASE.signature },\n 0,\n )\n .to(face, { opacity: 1, duration, ease: EASE.signature }, 0)\n .to(surface, { opacity: 0, duration, ease: 'power3.in' }, 0);\n if (parts.length) {\n timeline\n .to(parts, { ...group, duration, ease: toward }, 0)\n // Rounds the content toward a 400 px radius while it fades and blurs.\n .to(parts, { opacity: 0, borderRadius: '400px', duration, ease: EASE.fadeAway }, 0)\n .to(parts, { filter: 'blur(32px)', duration, ease: EASE.blurAway }, 0);\n }\n running.set(surface, timeline);\n return timeline;\n }\n // A list: its content dissolves while the shape travels back and takes the label back.\n const timeline = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n face.remove();\n gsap.set(surface, { clearProps: 'transform,clipPath,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,filter' });\n },\n onInterrupt: () => {\n face.remove();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,filter' });\n },\n })\n .fromTo(\n surface,\n { clipPath: shape.to, willChange: 'transform,clip-path' },\n { x: shape.x, y: shape.y, clipPath: shape.from, duration, ease: EASE.signature },\n 0,\n )\n .to(face, { opacity: 1, duration: duration * 0.5, ease: 'power1.in' }, duration * 0.3);\n if (parts.length) timeline.to(parts, { opacity: 0, filter: 'blur(32px)', duration: duration * 0.7, ease: 'power2.in' }, 0);\n if (copy) timeline.to(copy, { opacity: 1, duration: duration * 0.3, ease: 'power1.in' }, duration * 0.65);\n running.set(surface, timeline);\n return timeline;\n}\n\n/**\n * Close a modal at once (focus returns, the page takes input) while an inert\n * copy folds back into the opener over a fading veil. `inPlace` (after a drag)\n * closes it where it was dropped instead of folding into the opener.\n */\nexport function morphCloseWithGhost(\n surface: HTMLElement,\n origin: HTMLElement | null,\n { inPlace = false, liquid = false }: { inPlace?: boolean; liquid?: boolean } = {},\n) {\n registerMotion();\n const dragged = inPlace\n ? {\n x: Number(gsap.getProperty(surface, 'x')) || 0,\n y: Number(gsap.getProperty(surface, 'y')) || 0,\n scale: Number(gsap.getProperty(surface, 'scaleX')) || 1,\n }\n : null;\n if (dragged) gsap.set(surface, { clearProps: 'transform' });\n const ghost = reduced() ? null : ghostOf(surface);\n if (!ghost) {\n showOrigin(origin);\n releaseShared(origin);\n return;\n }\n // The veil copies the modal's backdrop (tint and blur) and fades with the copy.\n const veil = backdropVeil(surface);\n document.body.append(veil, ghost);\n showOrigin(origin, { fade: true });\n gsap.to(veil, { opacity: 0, duration: TIMING.dialog.close, ease: 'power3.in' });\n if (dragged) gsap.set(ghost, { ...dragged, transformOrigin: getComputedStyle(surface).transformOrigin });\n morphClose(\n ghost,\n dragged ? null : origin,\n () => {\n showOrigin(origin);\n releaseShared(origin);\n ghost.remove();\n veil.remove();\n },\n { liquid },\n );\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { motionSpring } from '../core/physics-spring';\nimport { reduced } from '../core/reduced';\nimport { clearStyles } from '../core/styles';\nimport { TIMING } from '../core/timing';\nimport { backdropVeil, ghostOf } from './surface';\n\n/*\n * project sheet: the surface rises from below the screen (0.72 s,\n * cubic(.16,1,.3,1)) while the page behind ([data-mk-underlay]) sinks to\n * scale .98 / opacity .4 on a 300/30 spring. It closes through an inert copy\n * that drops away, so focus returns at once.\n */\n\nconst UNDERLAY_STYLES = ['transform', 'translate', 'rotate', 'scale', 'transform-origin', 'opacity'];\n\nexport function sheetOpen(surface: HTMLElement) {\n if (reduced()) return null;\n registerMotion();\n return gsap.fromTo(surface, { yPercent: 100 }, { yPercent: 0, duration: TIMING.sheet.open, ease: EASE.sheet, clearProps: 'transform' });\n}\n\n/** Drop a copy of the (still open) sheet off the bottom of the screen. */\nexport function sheetClose(surface: HTMLElement, { inPlace = false }: { inPlace?: boolean } = {}) {\n registerMotion();\n const dragged = inPlace ? Number(gsap.getProperty(surface, 'y')) || 0 : 0;\n gsap.killTweensOf(surface);\n clearStyles([surface], ['transform', 'translate', 'rotate', 'scale']);\n const ghost = reduced() ? null : ghostOf(surface);\n if (!ghost) return null;\n const veil = backdropVeil(surface);\n document.body.append(veil, ghost);\n gsap.to(veil, { opacity: 0, duration: TIMING.sheet.close, ease: 'power3.in', onComplete: () => veil.remove() });\n return gsap.fromTo(\n ghost,\n { y: dragged, yPercent: 0 },\n { yPercent: 100, duration: TIMING.sheet.close, ease: EASE.sheet, onComplete: () => ghost.remove() },\n );\n}\n\nexport function pushUnderlay(elements: HTMLElement[]) {\n if (!elements.length || reduced()) return;\n registerMotion();\n const { ease, duration } = motionSpring(...TIMING.springs.underlay);\n gsap.to(elements, {\n scale: TIMING.sheet.underlayScale,\n opacity: TIMING.sheet.underlayOpacity,\n transformOrigin: '50% 0',\n duration,\n ease,\n overwrite: 'auto',\n });\n}\n\nexport function releaseUnderlay(elements: HTMLElement[], animated = true) {\n if (!elements.length) return;\n const restore = () => clearStyles(elements, UNDERLAY_STYLES);\n if (!animated || reduced()) {\n gsap.killTweensOf(elements);\n restore();\n return;\n }\n const { ease, duration } = motionSpring(...TIMING.springs.underlay);\n gsap.to(elements, { scale: 1, opacity: 1, duration, ease, overwrite: 'auto', onComplete: restore });\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Cleanup, type Instance } from '../../core/types';\nimport { MORPH_STYLES, clearStyles } from '../../core/styles';\nimport { anchorSurface, clearAnchor } from '../../motion/anchor';\nimport { attachDragDismiss } from '../../motion/drag-dismiss';\nimport {\n attachFloating,\n dockWindow,\n floatingAvailable,\n forgetFloat,\n liftWindow,\n savedFloat,\n unplaceWindow,\n} from '../../motion/floating';\nimport { isMorphing, morphCloseWithGhost, morphOpen, releaseShared, showOrigin, stopMorph } from '../../motion/morph';\nimport { pushUnderlay, releaseUnderlay, sheetClose, sheetOpen } from '../../motion/sheet';\nimport { closeModal, fadeBackdrop, openModal } from '../../motion/surface';\n\n/*\n * Dialog on a native <dialog> (focus trap, Escape, top layer): the\n * control that opened it turns into it and it folds back into that control\n * (morph or liquid) over a backdrop tinted on the signature curve. It eases to\n * new heights (auto-resize), can be dragged away (> 100 px) and, on desktop,\n * lifted into a floating window by its handle. Parts: [data-mk-part] header,\n * title, description, body, footer, close, handle.\n */\n\nexport type DialogVariant = 'morph' | 'liquid' | 'sheet';\nexport type DialogPlacement = 'center' | 'anchor' | 'side';\n\nexport interface DialogLabels {\n close?: string;\n float?: string;\n dock?: string;\n}\n\nexport interface DialogOptions {\n /** morph (default), liquid, or sheet: rises from the bottom and pushes [data-mk-underlay] back. */\n variant?: DialogVariant;\n placement?: DialogPlacement;\n /** Tinted backdrop; false leaves it transparent (menus). */\n backdrop?: boolean;\n closeOnBackdrop?: boolean;\n /** Drag (or wheel) down to dismiss. */\n drag?: boolean;\n /** A key turns on the floating window (desktop) and remembers its place. */\n float?: string | false;\n autoResize?: boolean;\n /** `[data-mk-open=\"<id>\"]` buttons open it: true uses the dialog's id; a string names another id; false: none. */\n triggers?: boolean | string;\n /** Modal (default) or a non-modal dialog. */\n modal?: boolean;\n labels?: DialogLabels;\n /** Grow the content with the surface (default). Menus turn it off and cascade their items instead. */\n animateContent?: boolean;\n onOpen?: () => void;\n /** After it closed, whatever closed it. */\n onClose?: () => void;\n}\n\nexport interface DialogInstance extends Instance {\n /** `origin`: the control it grows from; omitted, the focused control; null, none (scale-in). */\n open(origin?: HTMLElement | null): void;\n close(): void;\n toggle(origin?: HTMLElement | null): void;\n float(): void;\n dock(): void;\n readonly isOpen: boolean;\n readonly isFloating: boolean;\n readonly element: HTMLElement;\n}\n\nconst DEFAULT_LABELS: Required<DialogLabels> = { close: 'Cerrar', float: 'Ventana flotante', dock: 'Volver a su sitio' };\nconst FIELDS = '[autofocus], input:not([type=\"hidden\"]):not(:disabled), textarea:not(:disabled), select:not(:disabled)';\nconst CORNERS = ['tl', 'tr', 'bl', 'br'] as const;\nlet uid = 0;\n\nconst part = (dialog: HTMLElement, name: string) => dialog.querySelector<HTMLElement>(`[data-mk-part=\"${name}\"]`);\n\nexport function createDialog(dialog: HTMLElement | null, options: DialogOptions = {}): DialogInstance {\n if (!dialog) {\n warnOnce('dialog: missing <dialog> element');\n return inert({ open() {}, close() {}, toggle() {}, float() {}, dock() {}, isOpen: false, isFloating: false, element: null as unknown as HTMLElement });\n }\n registerMotion();\n const {\n variant = 'morph',\n placement = 'center',\n backdrop = true,\n closeOnBackdrop = true,\n drag = true,\n float: floatKey = false,\n autoResize = true,\n triggers = true,\n modal = true,\n } = options;\n const labels = { ...DEFAULT_LABELS, ...options.labels };\n const liquid = variant === 'liquid';\n const sheet = variant === 'sheet';\n const scope = createScope();\n /** Effects that live while it is open. */\n let session: Cleanup[] = [];\n let opener: HTMLElement | null = null;\n let isOpen = false;\n let closing = false;\n let floating = false;\n /**\n * Lifting and docking swap modal ↔ popover: the native `close` events they cause\n * (queued, so they arrive later) are not the person closing it.\n */\n let ownCloses = 0;\n const closeNatively = () => {\n if (!dialog.hasAttribute('open')) return;\n ownCloses += 1;\n closeModal(dialog as HTMLDialogElement);\n };\n let destroyed = false;\n /** destroy() is under way: the page behind comes back at once. */\n let tearingDown = false;\n\n if (placement !== 'center') scope.attr(dialog, 'data-mk-placement', placement);\n if (!backdrop) scope.attr(dialog, 'data-mk-backdrop', 'none');\n scope.attr(dialog, 'data-mk-variant', variant);\n const title = part(dialog, 'title');\n if (title && !dialog.hasAttribute('aria-label') && !dialog.hasAttribute('aria-labelledby')) {\n if (!title.id) scope.attr(title, 'id', `mk-dialog-title-${++uid}`);\n scope.attr(dialog, 'aria-labelledby', title.id);\n }\n const description = part(dialog, 'description');\n if (description && !dialog.hasAttribute('aria-describedby')) {\n if (!description.id) scope.attr(description, 'id', `mk-dialog-description-${++uid}`);\n scope.attr(dialog, 'aria-describedby', description.id);\n }\n const closeButton = part(dialog, 'close');\n if (closeButton && !closeButton.hasAttribute('aria-label') && !closeButton.textContent?.trim()) {\n scope.attr(closeButton, 'aria-label', labels.close);\n }\n const handle = floatKey ? part(dialog, 'handle') : null;\n if (handle) {\n scope.attr(handle, 'data-mk-no-drag', '');\n scope.attr(handle, 'aria-pressed', 'false');\n scope.attr(handle, 'aria-label', labels.float);\n }\n const corners: HTMLElement[] = [];\n if (floatKey) {\n for (const corner of CORNERS) {\n const element = document.createElement('span');\n element.className = 'mk-float-corner';\n element.dataset.mkFloatCorner = corner;\n element.dataset.mkNoDrag = '';\n element.setAttribute('aria-hidden', 'true');\n dialog.append(element);\n corners.push(element);\n }\n scope.add(() => corners.forEach((corner) => corner.remove()));\n }\n\n const emit = (type: string, cancelable = false, detail: Record<string, unknown> = {}) =>\n dialog.dispatchEvent(new CustomEvent(type, { bubbles: true, cancelable, detail: { dialog, ...detail } }));\n\n const endSession = () => {\n for (const cleanup of session.splice(0).reverse()) cleanup();\n };\n\n const settleFloating = () => {\n if (!floating) return;\n floating = false;\n if (typeof dialog.hidePopover === 'function' && dialog.hasAttribute('popover')) {\n try {\n dialog.hidePopover();\n } catch {\n // Already hidden.\n }\n }\n dialog.removeAttribute('popover');\n unplaceWindow(dialog);\n if (handle) {\n handle.setAttribute('aria-pressed', 'false');\n handle.setAttribute('aria-label', labels.float);\n }\n };\n\n /** Closed without our animation (owner, form[method=dialog], destroy). */\n const closedQuietly = () => {\n stopMorph(dialog);\n endSession();\n isOpen = false;\n closing = false;\n showOrigin(opener);\n releaseShared(opener);\n emit('mk:closed');\n options.onClose?.();\n };\n\n const lift = () => {\n if (!floatKey || floating || !isOpen || !floatingAvailable()) return;\n const box = dialog.getBoundingClientRect();\n const rect = savedFloat(floatKey) ?? { top: box.top, left: box.left, width: box.width, height: box.height };\n const focused = document.activeElement;\n // Its backdrop leaves as the window lifts off the page.\n const backdropStyle = getComputedStyle(dialog, '::backdrop');\n const veil = document.createElement('div');\n veil.setAttribute('aria-hidden', 'true');\n Object.assign(veil.style, {\n position: 'fixed',\n inset: '0',\n background: backdropStyle.background || backdropStyle.backgroundColor,\n backdropFilter: backdropStyle.backdropFilter,\n pointerEvents: 'none',\n });\n closeNatively();\n document.body.append(veil);\n dialog.setAttribute('popover', 'manual');\n if (typeof dialog.showPopover === 'function') dialog.showPopover();\n else openModal(dialog, false);\n liftWindow(dialog, rect);\n gsap.to(veil, { opacity: 0, duration: reduced() ? 0 : TIMING.float.shadow, ease: EASE.signature, onComplete: () => veil.remove() });\n floating = true;\n if (handle) {\n handle.setAttribute('aria-pressed', 'true');\n handle.setAttribute('aria-label', labels.dock);\n }\n showOrigin(opener, { fade: true });\n if (focused instanceof HTMLElement && dialog.contains(focused)) focused.focus();\n };\n\n const dock = () => {\n if (!floatKey || !floating) return;\n const box = dialog.getBoundingClientRect();\n const focused = document.activeElement;\n floating = false;\n if (typeof dialog.hidePopover === 'function') dialog.hidePopover();\n dialog.removeAttribute('popover');\n closeNatively();\n openModal(dialog, modal);\n dockWindow(dialog, { top: box.top, left: box.left, width: box.width, height: box.height });\n if (backdrop) void fadeBackdrop(dialog, 'in');\n forgetFloat(floatKey);\n if (handle) {\n handle.setAttribute('aria-pressed', 'false');\n handle.setAttribute('aria-label', labels.float);\n }\n if (focused instanceof HTMLElement && dialog.contains(focused)) focused.focus();\n };\n\n const startSession = () => {\n if (sheet) {\n const behind = [...document.querySelectorAll<HTMLElement>('[data-mk-underlay]')];\n pushUnderlay(behind);\n const root = document.documentElement;\n const overflow = root.style.overflow;\n root.style.overflow = 'hidden';\n session.push(() => {\n root.style.overflow = overflow;\n if (root.getAttribute('style') === '') root.removeAttribute('style');\n releaseUnderlay(behind, !tearingDown);\n });\n }\n if (autoResize && typeof ResizeObserver === 'function') {\n let last = dialog.offsetHeight;\n let resizing: gsap.core.Tween | null = null;\n const observer = new ResizeObserver(() => {\n if (resizing?.isActive()) return;\n const next = dialog.offsetHeight;\n const previous = last;\n last = next;\n // A floating window's size is the person's, not its content's.\n if (floating || Math.abs(next - previous) < 2 || !previous || isMorphing(dialog) || reduced()) return;\n resizing = gsap.fromTo(\n dialog,\n { height: previous },\n {\n height: next,\n duration: TIMING.dialog.autoResize,\n ease: EASE.signature,\n clearProps: 'height',\n onComplete: () => {\n last = dialog.offsetHeight;\n },\n },\n );\n });\n observer.observe(dialog);\n session.push(() => {\n observer.disconnect();\n resizing?.kill();\n clearStyles([dialog], ['height']);\n });\n }\n if (drag) {\n session.push(\n attachDragDismiss(dialog, {\n canDrag: () => !isMorphing(dialog) && !floating && !closing && isOpen,\n onDismiss: () => close(true),\n }),\n );\n }\n if (placement === 'anchor') {\n const onResize = () => {\n if (isOpen && !floating) anchorSurface(dialog, opener?.isConnected ? opener.getBoundingClientRect() : null);\n };\n addEventListener('resize', onResize);\n session.push(() => {\n removeEventListener('resize', onResize);\n clearAnchor(dialog);\n });\n }\n if (floatKey && handle) {\n session.push(attachFloating(dialog, { key: floatKey, handle, corners, isFloating: () => floating, float: lift, dock }));\n const onResize = () => {\n if (floating && !floatingAvailable()) dock();\n };\n addEventListener('resize', onResize);\n session.push(() => removeEventListener('resize', onResize));\n }\n };\n\n const open = (origin?: HTMLElement | null) => {\n if (destroyed || isOpen) return;\n const active = document.activeElement;\n // undefined: the focused control (usually the one clicked); null: no opener at all.\n opener = origin !== undefined ? origin : active instanceof HTMLElement && active !== document.body && !dialog.contains(active) ? active : null;\n closing = false;\n isOpen = true;\n openModal(dialog, modal);\n if (placement === 'anchor') anchorSurface(dialog, opener?.getBoundingClientRect());\n if (backdrop && modal) void fadeBackdrop(dialog, 'in');\n if (sheet) sheetOpen(dialog);\n else morphOpen(dialog, opener, { hideOrigin: true, liquid, content: options.animateContent === false ? ':scope > :not(*)' : undefined });\n startSession();\n // Forms start at their first field (after showModal: a closed dialog cannot take focus).\n dialog.querySelector<HTMLElement>(FIELDS)?.focus({ preventScroll: true });\n emit('mk:open', false, { origin: opener });\n options.onOpen?.();\n };\n\n /** Animated close: the dialog closes at once while an inert copy folds into the opener. */\n const close = (inPlace = false) => {\n if (destroyed || !isOpen || closing) return;\n if (!emit('mk:close', true, { inPlace })) return;\n closing = true;\n // The copy is measured first: the session cleanup clears an anchored place.\n if (sheet) sheetClose(dialog, { inPlace });\n else morphCloseWithGhost(dialog, opener, { inPlace, liquid });\n endSession();\n if (floating) settleFloating();\n if (dialog.hasAttribute('open')) closeModal(dialog as HTMLDialogElement);\n isOpen = false;\n closing = false;\n if (opener?.isConnected) opener.focus();\n emit('mk:closed');\n options.onClose?.();\n };\n\n scope.on(dialog, 'cancel', (event) => {\n event.preventDefault();\n close();\n });\n scope.on(dialog, 'close', () => {\n if (ownCloses > 0) {\n ownCloses -= 1;\n return;\n }\n // A native close we did not start (form method=\"dialog\", dialog.close()).\n if (!isOpen || closing) return;\n closedQuietly();\n });\n scope.on(dialog, 'keydown', (event) => {\n // A floating (non-modal) window still closes with Escape.\n if ((event as KeyboardEvent).key === 'Escape' && floating) {\n event.preventDefault();\n close();\n }\n });\n scope.on(dialog, 'click', (event) => {\n const target = event.target as Element | null;\n if (target?.closest('[data-mk-part=\"close\"], [data-mk-close]') && dialog.contains(target)) {\n close();\n return;\n }\n if (target !== dialog || !closeOnBackdrop || floating) return;\n const mouse = event as MouseEvent;\n const box = dialog.getBoundingClientRect();\n if (mouse.clientX < box.left || mouse.clientX > box.right || mouse.clientY < box.top || mouse.clientY > box.bottom) close();\n });\n const triggerId = triggers === true ? dialog.id : triggers || '';\n if (triggerId) {\n const selector = `[data-mk-open=\"${typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(triggerId) : triggerId}\"]`;\n scope.on(document, 'click', (event) => {\n const trigger = (event.target as Element | null)?.closest<HTMLElement>(selector);\n if (!trigger || dialog.contains(trigger)) return;\n event.preventDefault();\n if (isOpen) close();\n else open(trigger);\n });\n }\n dialog.dataset.mkReady = '';\n\n return {\n open,\n close: () => close(),\n toggle: (origin?: HTMLElement | null) => (isOpen ? close() : open(origin)),\n float: lift,\n dock,\n get isOpen() {\n return isOpen;\n },\n get isFloating() {\n return floating;\n },\n element: dialog,\n destroy() {\n if (destroyed) return;\n tearingDown = true;\n if (isOpen) {\n settleFloating();\n closing = true;\n if (dialog.hasAttribute('open')) closeModal(dialog as HTMLDialogElement);\n closedQuietly();\n }\n destroyed = true;\n endSession();\n gsap.killTweensOf(dialog);\n clearStyles([dialog], [...MORPH_STYLES, 'height']);\n scope.dispose();\n delete dialog.dataset.mkReady;\n },\n };\n}\n","import { createScope } from '../../core/scope';\nimport { gsap } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce } from '../../core/types';\nimport { flowInMenu } from '../../motion/entrances';\nimport { createDialog, type DialogInstance, type DialogOptions } from '../dialog/engine';\n\n/*\n * Options menu: the same surface engine as a dialog, anchored to its\n * button, without a tinted backdrop, on a translucent surface that grows out of\n * the button; its options flow in from 90 % out of a 4 px blur, last first,\n * 40 ms apart, after 0.1 s. Arrow keys, Home and End move between options.\n */\n\nexport interface MenuOptions extends Omit<DialogOptions, 'placement' | 'backdrop' | 'drag' | 'autoResize' | 'animateContent'> {\n ticket?: boolean;\n /** Close after an option is chosen (default). */\n closeOnSelect?: boolean;\n onSelect?: (value: string, item: HTMLElement) => void;\n}\n\nexport interface MenuInstance extends DialogInstance {\n readonly items: HTMLElement[];\n}\n\nconst ITEM = '[data-mk-item]';\n\nexport function createMenu(dialog: HTMLElement | null, options: MenuOptions = {}): MenuInstance {\n if (!dialog) {\n warnOnce('menu: missing <dialog> element');\n return inert({\n open() {},\n close() {},\n toggle() {},\n float() {},\n dock() {},\n isOpen: false,\n isFloating: false,\n element: null as unknown as HTMLElement,\n items: [],\n });\n }\n const { closeOnSelect = true } = options;\n const scope = createScope();\n let ticketAnimation: gsap.core.Timeline | undefined;\n if (options.ticket) {\n scope.attr(dialog, 'data-mk-ticket', '');\n scope.attr(dialog, 'style', dialog.getAttribute('style'));\n for (const item of dialog.querySelectorAll<HTMLElement>(ITEM)) scope.attr(item, 'style', item.getAttribute('style'));\n scope.add(() => ticketAnimation?.kill());\n }\n const items = () => [...dialog.querySelectorAll<HTMLElement>(ITEM)].filter((item) => !item.hasAttribute('disabled') && item.getAttribute('aria-disabled') !== 'true');\n\n scope.attr(dialog, 'role', 'menu');\n // Options can come and go (frameworks): roles are applied now and on every open.\n const markItems = () => {\n for (const item of dialog.querySelectorAll<HTMLElement>(ITEM)) {\n scope.attr(item, 'role', 'menuitem');\n scope.attr(item, 'tabindex', '-1');\n }\n };\n markItems();\n\n const surface = createDialog(dialog, {\n ...options,\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n animateContent: false,\n onOpen: () => {\n markItems();\n const list = items();\n if (options.ticket && !reduced()) {\n ticketAnimation?.kill();\n ticketAnimation = gsap.timeline()\n .fromTo(dialog, { clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0% 0)', duration: TIMING.ticketMenu.open, ease: 'expo.out' })\n .fromTo(list, { yPercent: TIMING.ticketMenu.from }, { yPercent: 0, duration: TIMING.ticketMenu.content, stagger: TIMING.ticketMenu.stagger, ease: 'expo.out' }, 0);\n } else flowInMenu(list);\n list[0]?.focus({ preventScroll: true });\n options.onOpen?.();\n },\n });\n\n const select = (item: HTMLElement) => {\n const value = item.dataset.mkValue ?? item.textContent?.trim() ?? '';\n dialog.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { value, item } }));\n options.onSelect?.(value, item);\n if (closeOnSelect) surface.close();\n };\n\n scope.on(dialog, 'click', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);\n if (item && dialog.contains(item) && items().includes(item)) select(item);\n });\n scope.on(dialog, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const list = items();\n if (!list.length) return;\n const at = list.indexOf(document.activeElement as HTMLElement);\n const moves: Record<string, number> = {\n ArrowDown: at < 0 ? 0 : (at + 1) % list.length,\n ArrowUp: at < 0 ? list.length - 1 : (at - 1 + list.length) % list.length,\n Home: 0,\n End: list.length - 1,\n };\n if (key in moves) {\n event.preventDefault();\n list[moves[key]]?.focus();\n return;\n }\n // Buttons and links activate themselves; other items need Enter and Space.\n const target = event.target as HTMLElement;\n if ((key === 'Enter' || key === ' ') && list.includes(target) && !target.matches('button, a[href]')) {\n event.preventDefault();\n select(target);\n }\n });\n\n return {\n open: surface.open,\n close: surface.close,\n toggle: surface.toggle,\n float: surface.float,\n dock: surface.dock,\n get isOpen() {\n return surface.isOpen;\n },\n get isFloating() {\n return surface.isFloating;\n },\n get items() {\n return items();\n },\n element: dialog,\n destroy() {\n surface.destroy();\n scope.dispose();\n },\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface QuantityOptions {\n min?: number;\n max?: number;\n step?: number;\n value?: number;\n disabled?: boolean;\n onChange?: (value: number) => void;\n}\nexport interface QuantityInstance extends Instance {\n setValue(value: number, notify?: boolean): void;\n readonly value: number;\n}\n\n/** Bounded numeric control. Bite/rotation is CSS; buttons remain native. */\nexport function createQuantity(root: HTMLElement | null, options: QuantityOptions = {}): QuantityInstance {\n const input = root?.querySelector<HTMLInputElement>('[data-mk-quantity-input]');\n if (!root || !input) return inert({ setValue() {}, value: 0 });\n const scope = createScope();\n const min = Number.isFinite(options.min) ? options.min! : 1;\n const max = Number.isFinite(options.max) ? Math.max(min, options.max!) : Math.max(min, 999);\n const step = Number.isFinite(options.step) && options.step! > 0 ? options.step! : 1;\n const steps = Math.floor((max - min) / step + 1e-9);\n const upper = Math.min(max, Number((min + steps * step).toFixed(10)));\n const normalize = (n: number) => Math.max(min, Math.min(upper, Number((min + Math.round((n - min) / step) * step).toFixed(10))));\n const original = input.value;\n const disabled = options.disabled ?? input.disabled;\n const decrease = root.querySelector<HTMLButtonElement>('[data-mk-quantity-decrease]');\n const increase = root.querySelector<HTMLButtonElement>('[data-mk-quantity-increase]');\n scope.attr(input, 'min', String(min));\n scope.attr(input, 'max', String(max));\n scope.attr(input, 'step', String(step));\n scope.attr(input, 'disabled', disabled ? '' : null);\n scope.attr(root, 'data-mk-ready', '');\n const initial = input.value.trim() ? Number(input.value) : NaN;\n let value = normalize(Number.isFinite(options.value) ? options.value! : Number.isFinite(initial) ? initial : min);\n let pendingReset: Event | null = null;\n const typed = () => (input.value.trim() && Number.isFinite(input.valueAsNumber) ? input.valueAsNumber : NaN);\n const render = (syncInput = true) => {\n if (pendingReset) {\n if (pendingReset.eventPhase !== 0) return;\n if (!pendingReset.defaultPrevented) value = normalize(Number.isFinite(typed()) ? typed() : min);\n pendingReset = null;\n }\n if (syncInput) input.value = String(value);\n if (decrease) scope.attr(decrease, 'disabled', disabled || value <= min ? '' : null);\n if (increase) scope.attr(increase, 'disabled', disabled || value >= upper ? '' : null);\n };\n const commit = (next: number, notify: boolean, syncInput: boolean) => {\n if (scope.disposed || !Number.isFinite(next)) return;\n if (pendingReset?.eventPhase === 0) pendingReset = null;\n const previous = value;\n value = normalize(next);\n render(syncInput);\n if (notify && value !== previous) {\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value, previous } }));\n }\n };\n const setValue = (next: number, notify = true) => commit(next, notify, true);\n if (decrease) scope.on(decrease, 'click', () => { if (!decrease.disabled) setValue(value - step); });\n if (increase) scope.on(increase, 'click', () => { if (!increase.disabled) setValue(value + step); });\n // While typing, commit only numbers that are already valid and leave the text alone;\n // partial or out-of-range input settles on change/blur.\n scope.on(input, 'input', () => {\n const n = typed();\n if (Number.isFinite(n) && normalize(n) === n) commit(n, true, false);\n });\n scope.on(input, 'change', () => {\n if (Number.isFinite(typed())) setValue(typed());\n else render();\n });\n scope.on(input, 'blur', () => render());\n if (input.form) scope.on(input.form, 'reset', (event) => {\n // reset's native default action runs after its listeners. Match the final input silently.\n render();\n pendingReset = event;\n scope.timeout(() => { if (pendingReset === event) render(); }, 0);\n });\n scope.add(() => { input.value = original; });\n render();\n return { setValue, get value() { return value; }, destroy: () => scope.dispose() };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface PaginationOptions {\n totalPages?: number;\n page?: number;\n siblings?: number;\n pageLabel?: (page: number) => string;\n onChange?: (page: number) => void;\n}\nexport interface PaginationInstance extends Instance {\n setPage(page: number, notify?: boolean): void;\n setTotalPages(total: number): void;\n readonly page: number;\n readonly totalPages: number;\n}\n// Reserve room for the page-window arithmetic so incrementing always progresses.\nconst positive = (n: number | undefined, fallback: number) => Number.isFinite(n) ? Math.max(1, Math.min(Number.MAX_SAFE_INTEGER - 32, Math.floor(n!))) : fallback;\n\n/** Renders a bounded window of pages, even when totalPages is very large. */\nexport function createPagination(root: HTMLElement | null, options: PaginationOptions = {}): PaginationInstance {\n const pages = root?.querySelector<HTMLElement>('[data-mk-pagination-pages]');\n if (!root || !pages) return inert({ setPage() {}, setTotalPages() {}, page: 1, totalPages: 1 });\n const scope = createScope();\n const original = [...pages.childNodes];\n const previous = root.querySelector<HTMLButtonElement>('[data-mk-pagination-previous]');\n const next = root.querySelector<HTMLButtonElement>('[data-mk-pagination-next]');\n let total = positive(options.totalPages, 10);\n let page = Math.min(total, positive(options.page, 1));\n const siblings = Math.min(10, Math.max(0, Number.isFinite(options.siblings) ? Math.floor(options.siblings!) : 1));\n scope.attr(root, 'data-mk-ready', '');\n const render = () => {\n const hadFocus = pages.contains(document.activeElement);\n const selected = new Set([1, total]);\n for (let n = Math.max(1, page - siblings); n <= Math.min(total, page + siblings); n++) selected.add(n);\n const fragment = document.createDocumentFragment();\n let last = 0;\n for (const n of [...selected].sort((a, b) => a - b)) {\n if (last && n - last > 1) {\n const gap = document.createElement('span');\n gap.className = 'mk-pagination__gap';\n gap.textContent = '…';\n gap.setAttribute('aria-hidden', 'true');\n fragment.append(gap);\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.dataset.mkPage = String(n);\n button.textContent = String(n);\n button.setAttribute('aria-label', options.pageLabel?.(n) ?? `Página ${n}`);\n if (n === page) button.setAttribute('aria-current', 'page');\n fragment.append(button);\n last = n;\n }\n pages.replaceChildren(fragment);\n if (hadFocus) pages.querySelector<HTMLButtonElement>('[aria-current]')?.focus();\n if (previous) scope.attr(previous, 'disabled', page === 1 ? '' : null);\n if (next) scope.attr(next, 'disabled', page === total ? '' : null);\n };\n const setPage = (value: number, notify = true) => {\n if (scope.disposed || !Number.isFinite(value)) return;\n const candidate = Math.max(1, Math.min(total, Math.round(value)));\n if (candidate === page) return;\n const focused = pages.contains(document.activeElement);\n page = candidate;\n render();\n if (focused) pages.querySelector<HTMLButtonElement>('[aria-current]')?.focus();\n if (notify) {\n options.onChange?.(page);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { page, totalPages: total } }));\n }\n };\n scope.on(root, 'click', (event) => {\n const target = (event.target as Element).closest<HTMLButtonElement>('button');\n if (!target || target.disabled) return;\n if (target === previous) setPage(page - 1);\n else if (target === next) setPage(page + 1);\n else if (target.dataset.mkPage) setPage(Number(target.dataset.mkPage));\n });\n scope.on(root, 'keydown', (event) => {\n if (!(event.target instanceof HTMLButtonElement)) return;\n const to = event.key === 'ArrowRight' ? page + 1 : event.key === 'ArrowLeft' ? page - 1 : event.key === 'Home' ? 1 : event.key === 'End' ? total : null;\n if (to === null) return;\n event.preventDefault();\n setPage(to);\n pages.querySelector<HTMLButtonElement>('[aria-current]')?.focus();\n });\n scope.add(() => pages.replaceChildren(...original));\n render();\n return {\n setPage,\n setTotalPages(value) {\n if (scope.disposed || !Number.isFinite(value)) return;\n total = positive(value, 1);\n if (page > total) setPage(total);\n else render();\n },\n get page() { return page; },\n get totalPages() { return total; },\n destroy: () => scope.dispose(),\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface HoverCardOptions {\n openDelay?: number;\n closeDelay?: number;\n placement?: 'top' | 'bottom';\n onOpenChange?: (open: boolean) => void;\n}\nexport interface HoverCardInstance extends Instance {\n open(): void;\n close(): void;\n readonly isOpen: boolean;\n}\nlet sequence = 0;\n\n/** Nonmodal preview: pointer, keyboard focus and tap all reveal the same panel. */\nexport function createHoverCard(root: HTMLElement | null, options: HoverCardOptions = {}): HoverCardInstance {\n const trigger = root?.querySelector<HTMLElement>('[data-mk-hover-trigger]');\n const panel = root?.querySelector<HTMLElement>('[data-mk-hover-panel]');\n if (!root || !trigger || !panel) return inert({ open() {}, close() {}, isOpen: false });\n const scope = createScope();\n const openDelay = Number.isFinite(options.openDelay) ? Math.max(0, options.openDelay!) : 120;\n const closeDelay = Number.isFinite(options.closeDelay) ? Math.max(0, options.closeDelay!) : 140;\n let opened = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pointerInside = false;\n let id = panel.id;\n if (!id) { do { id = `mk-hover-${++sequence}`; } while (document.getElementById(id)); }\n scope.attr(panel, 'id', id);\n scope.attr(trigger, 'aria-controls', id);\n scope.attr(root, 'data-mk-placement', options.placement ?? 'top');\n scope.attr(root, 'data-mk-ready', '');\n const cancel = () => { clearTimeout(timer); timer = undefined; };\n const set = (value: boolean) => {\n cancel();\n if (scope.disposed) return;\n const changed = value !== opened;\n opened = value;\n scope.attr(trigger, 'aria-expanded', String(value));\n scope.attr(panel, 'hidden', value ? null : '');\n scope.attr(root, 'data-mk-open', value ? '' : null);\n if (changed) {\n options.onOpenChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:open-change', { bubbles: true, detail: { open: value } }));\n }\n };\n const schedule = (value: boolean, delay: number) => { cancel(); timer = setTimeout(() => set(value), delay); };\n scope.on(root, 'pointerenter', () => { pointerInside = true; schedule(true, openDelay); });\n scope.on(root, 'pointerleave', () => {\n pointerInside = false;\n if (!root.contains(document.activeElement)) schedule(false, closeDelay);\n });\n scope.on(root, 'focusin', () => set(true));\n scope.on(root, 'focusout', (event) => {\n if (!pointerInside && !root.contains((event as FocusEvent).relatedTarget as Node | null)) schedule(false, closeDelay);\n });\n scope.on(trigger, 'click', () => set(true));\n scope.on(document, 'pointerdown', (event) => { if (!root.contains(event.target as Node)) set(false); });\n scope.on(root, 'keydown', (event) => {\n if (event.key !== 'Escape' || !opened) return;\n event.preventDefault();\n trigger.focus();\n set(false);\n });\n scope.add(cancel);\n set(false);\n return { open: () => set(true), close: () => set(false), get isOpen() { return opened; }, destroy: () => scope.dispose() };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface InputOtpOptions {\n length?: number;\n value?: string;\n mask?: boolean;\n onChange?: (value: string) => void;\n onComplete?: (value: string) => void;\n}\nexport interface InputOtpInstance extends Instance {\n setValue(value: string, notify?: boolean): void;\n focus(): void;\n readonly value: string;\n}\n\n/** One real input preserves native editing, mobile autofill and password managers. */\nexport function createInputOtp(root: HTMLElement | null, options: InputOtpOptions = {}): InputOtpInstance {\n const input = root?.querySelector<HTMLInputElement>('[data-mk-otp-input]');\n const slots = root?.querySelector<HTMLElement>('[data-mk-otp-slots]');\n if (!root || !input || !slots) return inert({ setValue() {}, focus() {}, value: '' });\n const scope = createScope();\n const length = Number.isFinite(options.length) ? Math.min(16, Math.max(1, Math.round(options.length!))) : 6;\n const clean = (text: string) => text.replace(/[^0-9]/g, '').slice(0, length);\n const original = input.value;\n const originalNodes = [...slots.childNodes];\n let value = clean(options.value ?? input.value);\n let pendingReset: Event | null = null;\n const cells = Array.from({ length }, () => {\n const cell = document.createElement('span');\n cell.className = 'mk-input-otp__slot';\n return cell;\n });\n slots.replaceChildren(...cells);\n scope.attr(slots, 'aria-hidden', 'true');\n scope.attr(input, 'type', 'text');\n scope.attr(input, 'inputmode', 'numeric');\n scope.attr(input, 'autocomplete', 'one-time-code');\n scope.attr(input, 'maxlength', String(length));\n scope.attr(input, 'pattern', `[0-9]{${length}}`);\n scope.attr(root, 'data-mk-ready', '');\n const render = () => {\n if (pendingReset) {\n if (pendingReset.eventPhase !== 0) return;\n if (!pendingReset.defaultPrevented) value = clean(input.value);\n pendingReset = null;\n }\n input.value = value;\n const active = document.activeElement === input ? Math.min(length - 1, input.selectionStart ?? value.length) : -1;\n cells.forEach((cell, i) => {\n const text = value[i] ? options.mask ? '•' : value[i]! : '';\n if (cell.textContent !== text) cell.textContent = text;\n cell.toggleAttribute('data-mk-active', i === active);\n cell.toggleAttribute('data-mk-filled', i < value.length);\n });\n scope.attr(root, 'data-mk-complete', value.length === length ? '' : null);\n };\n const setValue = (next: string, notify = true) => {\n if (scope.disposed) return;\n if (pendingReset?.eventPhase === 0) pendingReset = null;\n const previous = value;\n value = clean(String(next));\n render();\n if (notify && value !== previous) {\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value, complete: value.length === length } }));\n if (value.length === length) {\n options.onComplete?.(value);\n root.dispatchEvent(new CustomEvent('mk:complete', { bubbles: true, detail: { value } }));\n }\n }\n };\n scope.on(input, 'input', (event) => {\n if ((event as InputEvent).isComposing) return;\n const caret = clean(input.value.slice(0, input.selectionStart ?? input.value.length)).length;\n setValue(input.value);\n input.setSelectionRange(caret, caret);\n render();\n });\n scope.on(input, 'compositionend', () => setValue(input.value));\n scope.on(input, 'paste', (event) => {\n const text = (event as ClipboardEvent).clipboardData?.getData('text');\n if (text === undefined) return;\n event.preventDefault();\n const start = input.selectionStart ?? value.length;\n const end = input.selectionEnd ?? start;\n const inserted = clean(text);\n setValue(value.slice(0, start) + inserted + value.slice(end));\n const caret = Math.min(length, start + inserted.length);\n input.setSelectionRange(caret, caret);\n render();\n });\n scope.on(input, 'focus', render);\n scope.on(input, 'blur', render);\n scope.on(input, 'keyup', render);\n scope.on(input, 'click', render);\n scope.on(document, 'selectionchange', () => { if (document.activeElement === input) render(); });\n if (input.form) scope.on(input.form, 'reset', (event) => {\n render();\n pendingReset = event;\n scope.timeout(() => { if (pendingReset === event) render(); }, 0);\n });\n scope.add(() => { slots.replaceChildren(...originalNodes); input.value = original; });\n render();\n return { setValue, focus: () => { if (!scope.disposed) input.focus(); }, get value() { return value; }, destroy: () => scope.dispose() };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\n\nexport type StudioDockView = 'menu' | 'contact' | 'reel';\nexport interface StudioDockState { open: boolean; view: StudioDockView; page: number; }\nexport interface StudioDockOptions {\n /** Seconds. Reference sheet: 1.3 s, outBack(.52). */\n duration?: number;\n ease?: string;\n /** Move focus into a newly opened view. Defaults to true. */\n focusOnOpen?: boolean;\n /** Contain Tab within the open panel and its toggle. Defaults to true. */\n trapFocus?: boolean;\n onChange?: (state: StudioDockState) => void;\n}\nexport interface StudioDockInstance extends Instance {\n open(view?: StudioDockView): void;\n close(): void;\n toggle(): void;\n selectPage(index: number): void;\n readonly state: StudioDockState;\n}\n\nlet nextId = 0;\n/** Panel distance from the dock's edge (bar + gap); --mk-studio-dock-offset overrides it. */\nconst PANEL_OFFSET = 76;\nconst VIEWPORT_GAP = 12;\nconst MIN_SPACE = 320;\nconst FOCUSABLE = 'a[href],button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),video[controls],[tabindex]:not([tabindex=\"-1\"])';\n\n/** A contained studio sheet. Markup remains useful without JavaScript; fixed positioning is CSS opt-in. */\nexport function createStudioDock(root: HTMLElement | null, options: StudioDockOptions = {}): StudioDockInstance {\n const toggleButton = root?.querySelector<HTMLButtonElement>('[data-mk-studio-toggle]');\n const panel = root?.querySelector<HTMLElement>('[data-mk-studio-panel]');\n if (!root || !toggleButton || !panel) return inert({ open() {}, close() {}, toggle() {}, selectPage() {}, state: { open: false, view: 'menu' as const, page: 0 } });\n registerMotion();\n const scope = createScope();\n const context = gsap.context(() => {}, root);\n scope.add(() => context.revert());\n const views = [...panel.querySelectorAll<HTMLElement>('[data-mk-studio-view]')];\n const pages = [...panel.querySelectorAll<HTMLElement>('[data-mk-studio-page]')];\n const pageButtons = [...root.querySelectorAll<HTMLElement>('[data-mk-studio-page-to]')];\n const slide = root.querySelector<HTMLElement>('[data-mk-studio-slide]');\n const tracked = [root, panel, ...(slide ? [slide] : [])];\n tracked.forEach(el => { const style = el.getAttribute('style'); scope.add(() => style === null ? el.removeAttribute('style') : el.setAttribute('style', style)); });\n scope.attr(panel, 'id', panel.id || `mk-studio-panel-${++nextId}`);\n scope.attr(panel, 'role', panel.getAttribute('role') || 'dialog');\n scope.attr(panel, 'aria-label', panel.getAttribute('aria-label') || 'Studio navigation');\n scope.attr(panel, 'tabindex', '-1');\n scope.attr(toggleButton, 'aria-controls', panel.id);\n scope.attr(toggleButton, 'aria-expanded', 'false');\n scope.attr(panel, 'hidden', '');\n scope.attr(panel, 'aria-hidden', 'true');\n scope.attr(root, 'data-mk-ready', '');\n let state: StudioDockState = { open: false, view: 'menu', page: 0 };\n let previousFocus: HTMLElement | null = null;\n let animation: gsap.core.Tween | undefined;\n let slideStart: number | null = null;\n let slideDistance = 0;\n let slideMoved = false;\n let suppressSlideClick = false;\n\n // The sheet opens above the bar. Cap it to the room actually left in the viewport\n // (it scrolls inside) and open it below the bar when above is too tight.\n const place = (decide = false) => {\n const view = root.ownerDocument.defaultView;\n if (!state.open || !view) return;\n const rect = root.getBoundingClientRect();\n const offset = parseFloat(view.getComputedStyle(root).getPropertyValue('--mk-studio-dock-offset')) || PANEL_OFFSET;\n const above = rect.bottom - offset - VIEWPORT_GAP;\n const below = view.innerHeight - rect.top - offset - VIEWPORT_GAP;\n // The direction is chosen on open only, so scrolling never flips an open sheet.\n if (decide) scope.attr(root, 'data-mk-studio-below', above < Math.min(panel.scrollHeight || MIN_SPACE, MIN_SPACE) && below > above ? '' : null);\n const flip = root.hasAttribute('data-mk-studio-below');\n root.style.setProperty('--mk-studio-dock-space', `${Math.max(MIN_SPACE / 2, Math.floor(flip ? below : above))}px`);\n };\n const hidden = () => root.hasAttribute('data-mk-studio-below')\n ? { clipPath: 'inset(0% 0% 100% 0% round 18px)', y: -16, opacity: 0 }\n : { clipPath: 'inset(100% 0% 0% 0% round 18px)', y: 16, opacity: 0 };\n const notify = () => {\n const value = { ...state };\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:studio-dock', { bubbles: true, detail: value }));\n };\n const isTabbable = (el: HTMLElement) => el.tabIndex >= 0 && !el.closest('[hidden], [inert]') && el.getAttribute('aria-disabled') !== 'true';\n const visibleFocus = () => [...panel.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(isTabbable);\n const focusView = () => { if (options.focusOnOpen !== false) (visibleFocus()[0] ?? panel).focus({ preventScroll: true }); };\n const setView = (view: StudioDockView) => {\n state.view = views.length && !views.some(el => el.dataset.mkStudioView === view) ? 'menu' : view;\n views.forEach(el => scope.attr(el, 'hidden', el.dataset.mkStudioView === state.view ? null : ''));\n scope.attr(root, 'data-mk-studio-active', state.view);\n panel.querySelectorAll<HTMLVideoElement>('video').forEach(video => { if (state.view !== 'reel') video.pause(); });\n };\n const selectPage = (index: number, announce = true) => {\n if (scope.disposed || !pages.length || !Number.isFinite(index)) return;\n state.page = ((Math.round(index) % pages.length) + pages.length) % pages.length;\n pages.forEach((el, i) => scope.attr(el, 'hidden', i === state.page ? null : ''));\n pageButtons.forEach(el => scope.attr(el, 'aria-current', Number(el.dataset.mkStudioPageTo) === state.page ? 'true' : null));\n if (announce) notify();\n };\n const open = (view: StudioDockView = 'menu') => {\n if (scope.disposed) return;\n const wasOpen = state.open;\n if (wasOpen && state.view === view) return;\n if (!wasOpen) {\n const active = root.ownerDocument.activeElement;\n previousFocus = active instanceof HTMLElement && active !== root.ownerDocument.body && !panel.contains(active) ? active : toggleButton;\n }\n animation?.kill();\n state.open = true;\n scope.attr(panel, 'hidden', null);\n scope.attr(panel, 'inert', null);\n scope.attr(panel, 'aria-hidden', 'false');\n scope.attr(root, 'data-mk-studio-open', '');\n scope.attr(toggleButton, 'aria-expanded', 'true');\n setView(view);\n place(!wasOpen);\n if (!reduced()) context.add(() => {\n animation = gsap.fromTo(panel, hidden(), { clipPath: 'inset(0% 0% 0% 0% round 18px)', y: 0, opacity: 1, duration: Math.max(0, options.duration ?? 1.3), ease: options.ease ?? 'back.out(0.52)', overwrite: true });\n });\n else context.add(() => { gsap.set(panel, { clipPath: 'inset(0% round 18px)', y: 0, opacity: 1 }); });\n focusView();\n notify();\n };\n const close = (restoreFocus = true) => {\n if (scope.disposed || !state.open) return;\n animation?.kill();\n state.open = false;\n scope.attr(toggleButton, 'aria-expanded', 'false');\n scope.attr(root, 'data-mk-studio-open', null);\n // Stop focus immediately while the visual sheet collapses.\n scope.attr(panel, 'inert', '');\n scope.attr(panel, 'aria-hidden', 'true');\n if (reduced()) scope.attr(panel, 'hidden', '');\n else context.add(() => {\n animation = gsap.to(panel, { ...hidden(), duration: Math.max(0, options.duration ?? 1.3), ease: options.ease ?? 'back.out(0.52)', overwrite: true, onComplete: () => { if (!scope.disposed && !state.open) scope.attr(panel, 'hidden', ''); } });\n });\n panel.querySelectorAll<HTMLVideoElement>('video').forEach(video => video.pause());\n if (restoreFocus) (previousFocus?.isConnected ? previousFocus : toggleButton).focus({ preventScroll: true });\n notify();\n };\n scope.on(root, 'click', event => {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n if (target.closest('[data-mk-studio-toggle]') === toggleButton) state.open ? close() : open();\n else if (target.closest('[data-mk-studio-close]')) close();\n else if (target.closest('[data-mk-studio-slide]')) {\n if (suppressSlideClick) { event.preventDefault(); suppressSlideClick = false; }\n else open('contact');\n } else {\n const view = target.closest<HTMLElement>('[data-mk-studio-to]')?.dataset.mkStudioTo;\n if (view === 'menu' || view === 'contact' || view === 'reel') open(view);\n const page = target.closest<HTMLElement>('[data-mk-studio-page-to]');\n if (page) selectPage(Number(page.dataset.mkStudioPageTo));\n }\n });\n if (root.ownerDocument.defaultView) scope.on(root.ownerDocument.defaultView, 'resize', () => place());\n scope.on(root.ownerDocument, 'scroll', () => place(), { passive: true, capture: true });\n scope.on(root.ownerDocument, 'pointerdown', event => {\n if (state.open && event.target instanceof Node && !root.contains(event.target)) close(false);\n });\n scope.on(root.ownerDocument, 'keydown', event => {\n if (!state.open || event.defaultPrevented) return;\n if (event.key === 'Escape') { event.preventDefault(); close(); return; }\n if (!(event.target instanceof Node) || !root.contains(event.target)) return;\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && (event.target as Element).closest('[data-mk-studio-pages]')) {\n event.preventDefault(); selectPage(state.page + (event.key === 'ArrowRight' ? 1 : -1));\n pageButtons.find(el => Number(el.dataset.mkStudioPageTo) === state.page)?.focus();\n }\n if (event.key === 'Tab' && options.trapFocus !== false) {\n // querySelectorAll keeps the authored DOM order, including a toggle before OR after the panel.\n const elements = [...root.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(el => (el === toggleButton || panel.contains(el)) && isTabbable(el));\n if (!elements.length) { event.preventDefault(); panel.focus(); return; }\n const first = elements[0]!, last = elements.at(-1)!;\n if (event.shiftKey && (root.ownerDocument.activeElement === first || root.ownerDocument.activeElement === panel)) { event.preventDefault(); last.focus(); }\n else if (!event.shiftKey && root.ownerDocument.activeElement === last) { event.preventDefault(); first.focus(); }\n }\n });\n if (slide) {\n scope.on(slide, 'pointerdown', event => { if (event.button !== 0) return; slideStart = event.clientX; slideDistance = 0; slideMoved = false; });\n scope.on(root.ownerDocument, 'pointermove', event => {\n if (slideStart === null) return;\n const width = Math.max(0, (slide.parentElement?.clientWidth ?? 0) - slide.offsetWidth);\n slideMoved ||= Math.abs(event.clientX - slideStart) > 5;\n slideDistance = Math.max(0, Math.min(width, event.clientX - slideStart));\n if (!reduced()) slide.style.setProperty('--mk-studio-drag', `${slideDistance}px`);\n });\n const release = (cancel = false) => {\n if (slideStart === null) return;\n const width = Math.max(0, (slide.parentElement?.clientWidth ?? 0) - slide.offsetWidth);\n suppressSlideClick = slideMoved;\n slideStart = null;\n slide.style.removeProperty('--mk-studio-drag');\n if (!cancel && width > 0 && slideDistance / width >= .7) open('contact');\n scope.timeout(() => { suppressSlideClick = false; }, 150);\n };\n scope.on(root.ownerDocument, 'pointerup', () => release());\n scope.on(root.ownerDocument, 'pointercancel', () => release(true));\n }\n const clocks = [...root.querySelectorAll<HTMLElement>('[data-mk-studio-timezone]')];\n const clockOriginals = clocks.map(el => ({ el, text: el.textContent, style: el.getAttribute('style') }));\n const tick = () => clocks.forEach(el => {\n try { el.textContent = new Intl.DateTimeFormat(undefined, { hour: '2-digit', minute: '2-digit', timeZone: el.dataset.mkStudioTimezone }).format(new Date()); } catch { /* Invalid caller time zone leaves the original label intact. */ }\n });\n if (clocks.length) { tick(); const timer = setInterval(tick, 60_000); scope.add(() => clearInterval(timer)); }\n scope.add(() => clockOriginals.forEach(({ el, text, style }) => { el.textContent = text; if (style === null) el.removeAttribute('style'); else el.setAttribute('style', style); }));\n setView('menu');\n selectPage(0, false);\n return { open, close, toggle: () => state.open ? close() : open(), selectPage, get state() { return { ...state }; }, destroy() { if (scope.disposed) return; const focused = root.contains(root.ownerDocument.activeElement); animation?.kill(); panel.querySelectorAll<HTMLVideoElement>('video').forEach(video => video.pause()); scope.dispose(); if (focused) toggleButton.focus({ preventScroll: true }); } };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { createDialog } from '../dialog/engine';\n\nexport interface TrailerOptions {\n triggers?: boolean | string;\n autoplay?: boolean;\n closeOnBackdrop?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n}\nexport interface TrailerInstance extends Instance {\n open(origin?: HTMLElement | null): void;\n close(): void;\n toggle(origin?: HTMLElement | null): void;\n play(): Promise<boolean>;\n pause(): void;\n seek(seconds: number): void;\n setVolume(volume: number): void;\n readonly isOpen: boolean;\n}\nconst time = (value: number) => {\n const seconds = Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0;\n return `${Math.floor(seconds / 60).toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`;\n};\n\n/** Native modal + consumer-owned video, with optional accessible custom transport controls. */\nexport function createTrailer(root: HTMLElement | null, options: TrailerOptions = {}): TrailerInstance {\n const video = root?.querySelector<HTMLVideoElement>('video');\n if (!root || !video || root.tagName !== 'DIALOG') return inert({ open() {}, close() {}, toggle() {}, play: async () => false, pause() {}, seek() {}, setVolume() {}, isOpen: false });\n const scope = createScope();\n const get = <T extends HTMLElement>(name: string) => root.querySelector<T>(`[data-mk-trailer-${name}]`);\n const playButton = get<HTMLButtonElement>('play');\n const muteButton = get<HTMLButtonElement>('mute');\n const fullButton = get<HTMLButtonElement>('fullscreen');\n // The Fullscreen API rejects HTMLDialogElement. A consumer can wrap media and\n // transport in a stage; otherwise fullscreen just the native video element.\n const fullTarget = get<HTMLElement>('stage') ?? video;\n const captionsButton = get<HTMLButtonElement>('captions');\n const seekInput = get<HTMLInputElement>('seek');\n const volumeInput = get<HTMLInputElement>('volume');\n const output = get<HTMLElement>('time');\n const status = get<HTMLElement>('status');\n const originalText = [output, status].filter((el): el is HTMLElement => !!el).map(el => [el, el.textContent] as const);\n scope.add(() => originalText.forEach(([el, text]) => { el.textContent = text; }));\n scope.attr(root, 'data-mk-trailer-ready', '');\n scope.attr(root, 'data-mk-trailer-state', 'paused');\n const controls = video.controls;\n // Keep the browser's controls unless the consumer supplied a complete transport.\n if (playButton && muteButton && seekInput && (!video.querySelector('track') || captionsButton)) video.controls = false;\n scope.add(() => { video.controls = controls; });\n for (const input of [seekInput, volumeInput]) {\n if (!input) continue;\n const initialValue = input.value;\n scope.add(() => { input.value = initialValue; });\n scope.attr(input, 'min', '0');\n scope.attr(input, 'max', '1');\n scope.attr(input, 'step', input === volumeInput ? '.01' : '.1');\n scope.attr(input, 'aria-label', input.getAttribute('aria-label') ?? (input === volumeInput ? 'Volumen' : 'Posición del video'));\n }\n if (status) scope.attr(status, 'role', 'status');\n const tell = (message: string) => { if (!scope.disposed && status) status.textContent = message; };\n const sync = () => {\n if (scope.disposed) return;\n const duration = Number.isFinite(video.duration) ? Math.max(0, video.duration) : 0;\n scope.attr(root, 'data-mk-trailer-state', video.ended ? 'ended' : video.paused ? 'paused' : 'playing');\n if (playButton) {\n scope.attr(playButton, 'aria-label', video.paused || video.ended ? 'Reproducir' : 'Pausar');\n scope.attr(playButton, 'aria-pressed', String(!video.paused && !video.ended));\n }\n if (muteButton) {\n scope.attr(muteButton, 'aria-label', video.muted ? 'Activar sonido' : 'Silenciar');\n scope.attr(muteButton, 'aria-pressed', String(video.muted));\n }\n if (seekInput) {\n scope.attr(seekInput, 'max', String(duration || 1));\n scope.attr(seekInput, 'disabled', duration ? null : '');\n scope.attr(seekInput, 'aria-valuetext', `${time(video.currentTime)} de ${time(duration)}`);\n seekInput.value = String(Number.isFinite(video.currentTime) ? video.currentTime : 0);\n }\n if (volumeInput) volumeInput.value = String(video.muted ? 0 : video.volume);\n if (captionsButton) {\n scope.attr(captionsButton, 'disabled', video.textTracks.length ? null : '');\n scope.attr(captionsButton, 'aria-pressed', String(video.textTracks[0]?.mode === 'showing'));\n }\n if (output) output.textContent = `${time(video.currentTime)} / ${time(duration)}`;\n };\n let playRequest = 0;\n let wantsPlayback = false;\n const pause = () => { if (!scope.disposed) { wantsPlayback = false; ++playRequest; video.pause(); sync(); } };\n const play = async () => {\n if (scope.disposed) return false;\n wantsPlayback = true;\n const request = ++playRequest;\n try {\n await video.play();\n if (scope.disposed || request !== playRequest) {\n // A stale request must not pause a newer play after a quick close/reopen.\n if (scope.disposed || !wantsPlayback) video.pause();\n return false;\n }\n tell('');\n sync();\n return true;\n } catch {\n if (scope.disposed || request !== playRequest) return false;\n wantsPlayback = false;\n tell('No se pudo reproducir el video. Revisa la fuente y vuelve a intentarlo.');\n sync();\n return false;\n }\n };\n const seek = (seconds: number) => {\n if (scope.disposed || !Number.isFinite(seconds) || !Number.isFinite(video.duration) || video.duration <= 0) return;\n video.currentTime = Math.max(0, Math.min(video.duration, seconds));\n sync();\n };\n const setVolume = (volume: number) => {\n if (scope.disposed || !Number.isFinite(volume)) return;\n video.volume = Math.max(0, Math.min(1, volume));\n video.muted = volume <= 0;\n sync();\n };\n const exitFullscreen = () => {\n if (document.fullscreenElement !== fullTarget) return;\n void document.exitFullscreen?.().catch(() => {});\n };\n const dialog = createDialog(root, {\n triggers: options.triggers,\n closeOnBackdrop: options.closeOnBackdrop ?? true,\n drag: false,\n autoResize: false,\n animateContent: false,\n onOpen: () => { sync(); if (options.autoplay) void play(); options.onOpen?.(); },\n onClose: () => { ++playRequest; pause(); exitFullscreen(); options.onClose?.(); },\n });\n if (playButton) scope.on(playButton, 'click', () => video.paused || video.ended ? void play() : pause());\n if (muteButton) scope.on(muteButton, 'click', () => { video.muted = !video.muted; sync(); });\n if (seekInput) scope.on(seekInput, 'input', () => seek(Number(seekInput.value)));\n if (volumeInput) scope.on(volumeInput, 'input', () => setVolume(Number(volumeInput.value)));\n if (captionsButton) scope.on(captionsButton, 'click', () => {\n const track = video.textTracks[0];\n if (track) track.mode = track.mode === 'showing' ? 'hidden' : 'showing';\n sync();\n });\n const fullscreen = async () => {\n if (scope.disposed) return;\n try {\n if (document.fullscreenElement === fullTarget) await document.exitFullscreen?.();\n else if (fullTarget.requestFullscreen) {\n await fullTarget.requestFullscreen();\n if (scope.disposed || !dialog.isOpen) exitFullscreen();\n }\n else tell('La pantalla completa no está disponible en este navegador.');\n } catch { tell('No se pudo abrir la pantalla completa.'); }\n };\n if (fullButton) {\n scope.attr(fullButton, 'aria-label', 'Pantalla completa');\n scope.on(fullButton, 'click', () => { void fullscreen(); });\n scope.on(document, 'fullscreenchange', () => {\n scope.attr(fullButton, 'aria-label', document.fullscreenElement === fullTarget ? 'Salir de pantalla completa' : 'Pantalla completa');\n });\n }\n for (const event of ['loadedmetadata', 'durationchange', 'timeupdate', 'play', 'pause', 'ended', 'volumechange']) scope.on(video, event, sync);\n scope.on(video, 'error', () => { tell('El video no está disponible.'); scope.attr(root, 'data-mk-trailer-state', 'error'); });\n scope.on(root, 'keydown', (event) => {\n if (!dialog.isOpen || (event.target instanceof Element && event.target.closest('button, input, select, textarea, a, [contenteditable]'))) return;\n if (event.key === ' ' || event.key.toLowerCase() === 'k') { event.preventDefault(); video.paused ? void play() : pause(); }\n else if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') { event.preventDefault(); seek(video.currentTime + (event.key === 'ArrowRight' ? 5 : -5)); }\n else if (event.key.toLowerCase() === 'm') { video.muted = !video.muted; sync(); }\n });\n sync();\n return {\n open: (origin) => { if (!scope.disposed) dialog.open(origin); },\n close: () => { if (!scope.disposed) dialog.close(); },\n toggle: (origin) => { if (!scope.disposed) dialog.toggle(origin); },\n play, pause, seek, setVolume,\n get isOpen() { return dialog.isOpen; },\n destroy() {\n if (scope.disposed) return;\n wantsPlayback = false;\n ++playRequest;\n video.pause();\n exitFullscreen();\n dialog.destroy();\n scope.dispose();\n },\n };\n}\n","/*\n * Calendar date helpers on local dates (no time zone maths): the calendar and\n * slot-picker components share them. Days are compared by their YYYY-MM-DD key.\n */\n\nexport type DateInput = Date | string | number;\n\n/** Local midnight of a date; \"2026-10-23\" is read as a local day, not UTC. */\nexport function toDate(input: DateInput | null | undefined, fallback = new Date()): Date {\n if (input instanceof Date) return Number.isNaN(input.getTime()) ? startOfDay(fallback) : startOfDay(input);\n if (typeof input === 'string') {\n const day = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(input.trim());\n if (day) return new Date(Number(day[1]), Number(day[2]) - 1, Number(day[3]));\n }\n if (typeof input === 'string' || typeof input === 'number') {\n const parsed = new Date(input);\n if (!Number.isNaN(parsed.getTime())) return startOfDay(parsed);\n }\n return startOfDay(fallback);\n}\n\n/** A full date-time (events keep their hour). */\nexport function toDateTime(input: DateInput): Date | null {\n if (input instanceof Date) return Number.isNaN(input.getTime()) ? null : input;\n if (typeof input === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(input.trim())) return toDate(input);\n const parsed = new Date(input);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nexport const startOfDay = (date: Date) => new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\nexport const addDays = (date: Date, days: number) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n\n/** Same day number in another month, clamped to that month's length (Jan 31 + 1 → Feb 28/29). */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const last = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();\n return new Date(target.getFullYear(), target.getMonth(), Math.min(date.getDate(), last));\n}\n\nexport const startOfMonth = (date: Date) => new Date(date.getFullYear(), date.getMonth(), 1);\n\nexport function startOfWeek(date: Date, firstDay = 0): Date {\n const shift = (date.getDay() - firstDay + 7) % 7;\n return addDays(startOfDay(date), -shift);\n}\n\nexport const sameDay = (a: Date | null | undefined, b: Date | null | undefined) =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n\nexport const sameMonth = (a: Date, b: Date) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** YYYY-MM-DD of the local day. */\nexport const dayKey = (date: Date) => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n\n/** The weeks shown for a month: from the week of the 1st to the week of the last day (4–6 rows). */\nexport function monthWeeks(date: Date, firstDay = 0): Date[][] {\n const first = startOfMonth(date);\n const last = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n const weeks: Date[][] = [];\n for (let start = startOfWeek(first, firstDay); start <= last; start = addDays(start, 7)) {\n weeks.push(Array.from({ length: 7 }, (_, i) => addDays(start, i)));\n }\n return weeks;\n}\n\nexport const weekDays = (date: Date, firstDay = 0) => Array.from({ length: 7 }, (_, i) => addDays(startOfWeek(date, firstDay), i));\n\n/** Weekday names in display order, e.g. [\"dom\", \"lun\", …] for es with firstDay 0. */\nexport function weekdayNames(locale: string, firstDay = 0, width: 'long' | 'short' | 'narrow' = 'short'): string[] {\n const format = safeFormat(locale, { weekday: width });\n // 2024-09-01 was a Sunday.\n return Array.from({ length: 7 }, (_, i) => format.format(new Date(2024, 8, 1 + ((firstDay + i) % 7))));\n}\n\nexport function safeFormat(locale: string | undefined, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n try {\n return new Intl.DateTimeFormat(locale, options);\n } catch {\n return new Intl.DateTimeFormat(undefined, options);\n }\n}\n\nexport const capitalize = (text: string) => text.charAt(0).toLocaleUpperCase() + text.slice(1);\n\n/** Options given as JSON text (data-mk-* attributes through autoInit) become values. */\nexport function fromJson<T>(value: T | string | undefined): T | undefined {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nexport const clampFirstDay =(n: unknown) => (Number.isInteger(n) && (n as number) >= 0 && (n as number) <= 6 ? (n as number) : 0);\n","import { gsap, registerMotion } from '../../core/gsap';\r\nimport { reduced } from '../../core/reduced';\r\nimport { createScope } from '../../core/scope';\r\nimport { inert, type Instance } from '../../core/types';\r\nimport {\r\n addDays, addMonths, capitalize, clampFirstDay, dayKey, monthWeeks, safeFormat, sameDay, sameMonth,\r\n fromJson, startOfWeek, toDate, toDateTime, weekDays, weekdayNames, type DateInput,\r\n} from '../../core/dates';\r\nimport { flowIn } from '../../motion/flow';\r\n\r\n/*\r\n * Calendar (Melon Mind, section-calendar-test): month and week grids with\r\n * event chips. Motion from the reference: on first load the day cells flow in\r\n * (search-result-item-in: y −20, blur 16, .5 s) 5 ms apart and the events\r\n * 20 ms apart (CalendarComponent eventsSet → flowChilds). Changing month or\r\n * week slides the grid like Melon Mind's time slots: out −30 px / in +30 px,\r\n * .25 s ease-out (schedulePicker.css view transitions); the old grid leaves\r\n * first (.12 s) so two dense months never overlap. Keyboard: an ARIA grid\r\n * with a roving day button.\r\n */\r\n\r\nexport type CalendarView = 'month' | 'week';\r\nexport type CalendarEventStatus = 'pending' | 'done' | 'cancelled';\r\n\r\nexport interface CalendarEvent {\r\n id: string | number;\r\n title: string;\r\n start: DateInput;\r\n end?: DateInput;\r\n allDay?: boolean;\r\n status?: CalendarEventStatus;\r\n /** Any CSS colour for the chip. */\r\n color?: string;\r\n}\r\n\r\nexport interface CalendarRange { start: Date; end: Date; view: CalendarView }\r\n\r\nexport interface CalendarLabels {\r\n more?: (count: number) => string;\r\n events?: (count: number) => string;\r\n status?: Partial<Record<CalendarEventStatus, string>>;\r\n}\r\n\r\nexport interface CalendarOptions {\r\n /** Date the calendar opens on. */\r\n date?: DateInput;\r\n view?: CalendarView;\r\n /** 0 = Sunday … 6 = Saturday. */\r\n firstDay?: number;\r\n locale?: string;\r\n events?: CalendarEvent[];\r\n /** Chips per day in the month view before \"+N\". */\r\n maxEvents?: number;\r\n selected?: DateInput | null;\r\n /** Override \"today\" (tests, demos in another zone). */\r\n today?: DateInput;\r\n labels?: CalendarLabels;\r\n onSelect?: (date: Date) => void;\r\n onEventClick?: (event: CalendarEvent) => void;\r\n onNavigate?: (range: CalendarRange) => void;\r\n}\r\n\r\nexport interface CalendarInstance extends Instance {\r\n next(): void;\r\n prev(): void;\r\n goToday(): void;\r\n setDate(date: DateInput): void;\r\n setView(view: CalendarView): void;\r\n setEvents(events: CalendarEvent[]): void;\r\n select(date: DateInput | null, notify?: boolean): void;\r\n readonly date: Date;\r\n readonly view: CalendarView;\r\n readonly selected: Date | null;\r\n readonly range: CalendarRange;\r\n}\r\n\r\nconst SLIDE = 30;\r\nconst SLIDE_OUT = 0.12;\r\nconst SLIDE_GAP = 0.1;\r\nconst SLIDE_DURATION = 0.25;\r\nconst CELL_STAGGER = 0.005;\r\nconst EVENT_STAGGER = 0.02;\r\n\r\nexport function createCalendar(root: HTMLElement | null, options: CalendarOptions = {}): CalendarInstance {\r\n const grid = root?.querySelector<HTMLElement>('[data-mk-calendar-grid]');\r\n if (!root || !grid) {\r\n const now = toDate(null);\r\n return inert({\r\n next() {}, prev() {}, goToday() {}, setDate() {}, setView() {}, setEvents() {}, select() {},\r\n date: now, view: 'month' as CalendarView, selected: null, range: { start: now, end: now, view: 'month' as CalendarView },\r\n });\r\n }\r\n registerMotion();\r\n const scope = createScope();\r\n const ctx = gsap.context(() => {});\r\n scope.add(() => ctx.revert());\r\n const locale = options.locale ?? 'es';\r\n const firstDay = clampFirstDay(options.firstDay);\r\n const maxEvents = Number.isFinite(options.maxEvents) ? Math.max(0, Math.floor(options.maxEvents!)) : 3;\r\n const labels = {\r\n more: options.labels?.more ?? ((n: number) => `+${n} más`),\r\n events: options.labels?.events ?? ((n: number) => (n === 1 ? '1 evento' : `${n} eventos`)),\r\n status: { pending: 'pendiente', done: 'completado', cancelled: 'cancelado', ...options.labels?.status },\r\n };\r\n let date = toDate(options.date);\r\n let view: CalendarView = options.view === 'week' ? 'week' : 'month';\r\n let selected: Date | null = options.selected ? toDate(options.selected) : null;\r\n let focusDay: Date = selected ?? date;\r\n let events: CalendarEvent[] = [];\r\n let byDay = new Map<string, CalendarEvent[]>();\r\n let first = true;\r\n const today = () => toDate(options.today ?? null);\r\n\r\n const title = root.querySelector<HTMLElement>('[data-mk-calendar-title]');\r\n const prevButton = root.querySelector<HTMLButtonElement>('[data-mk-calendar-prev]');\r\n const nextButton = root.querySelector<HTMLButtonElement>('[data-mk-calendar-next]');\r\n const todayButton = root.querySelector<HTMLButtonElement>('[data-mk-calendar-today]');\r\n const viewButtons = [...root.querySelectorAll<HTMLButtonElement>('[data-mk-calendar-view]')];\r\n\r\n const originalGrid = [...grid.childNodes];\r\n const originalTitle = title ? [...title.childNodes] : [];\r\n scope.add(() => {\r\n grid.replaceChildren(...originalGrid);\r\n title?.replaceChildren(...originalTitle);\r\n });\r\n scope.attr(root, 'data-mk-ready', '');\r\n scope.attr(grid, 'role', 'grid');\r\n if (title) {\r\n if (!title.id) scope.attr(title, 'id', `mk-calendar-${Math.random().toString(36).slice(2, 8)}`);\r\n scope.attr(grid, 'aria-labelledby', title.id);\r\n }\r\n\r\n const monthTitle = safeFormat(locale, { month: 'long', year: 'numeric' });\r\n const rangeTitle = safeFormat(locale, { day: 'numeric', month: 'short', year: 'numeric' });\r\n const fullDay = safeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' });\r\n const timeFormat = safeFormat(locale, { hour: 'numeric', minute: '2-digit' });\r\n\r\n const index = (list: CalendarEvent[]) => {\r\n events = Array.isArray(list) ? list.filter((e) => e && toDateTime(e.start)) : [];\r\n byDay = new Map();\r\n const sorted = [...events].sort((a, b) => toDateTime(a.start)!.getTime() - toDateTime(b.start)!.getTime());\r\n for (const event of sorted) {\r\n const start = toDate(toDateTime(event.start)!);\r\n const endTime = event.end ? toDateTime(event.end) : null;\r\n const end = endTime && endTime > start ? toDate(endTime) : start;\r\n // Multi-day events show on every day they cover (at most two months).\r\n for (let day = start, n = 0; day <= end && n < 62; day = addDays(day, 1), n++) {\r\n const key = dayKey(day);\r\n byDay.set(key, [...(byDay.get(key) ?? []), event]);\r\n }\r\n }\r\n };\r\n index(fromJson<CalendarEvent[]>(options.events) ?? []);\r\n\r\n const days = () => (view === 'week' ? [weekDays(date, firstDay)] : monthWeeks(date, firstDay));\r\n const range = (): CalendarRange => {\r\n const weeks = days();\r\n return { start: weeks[0][0], end: weeks[weeks.length - 1][6], view };\r\n };\r\n const inRange = (day: Date) => {\r\n const r = range();\r\n return day >= r.start && day <= r.end;\r\n };\r\n\r\n const header = () => {\r\n const row = document.createElement('div');\r\n row.className = 'mk-calendar__head';\r\n row.setAttribute('role', 'row');\r\n const long = weekdayNames(locale, firstDay, 'short');\r\n const narrow = weekdayNames(locale, firstDay, 'narrow');\r\n long.forEach((name, i) => {\r\n const cell = document.createElement('div');\r\n cell.className = 'mk-calendar__weekday';\r\n cell.setAttribute('role', 'columnheader');\r\n cell.innerHTML = '<span class=\"mk-calendar__weekday-long\"></span><span class=\"mk-calendar__weekday-narrow\" aria-hidden=\"true\"></span>';\r\n cell.firstElementChild!.textContent = name;\r\n cell.lastElementChild!.textContent = narrow[i];\r\n row.append(cell);\r\n });\r\n return row;\r\n };\r\n\r\n const chip = (event: CalendarEvent) => {\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\n button.className = 'mk-calendar__event';\r\n button.dataset.mkEvent = String(event.id);\r\n const status = event.status ?? 'pending';\r\n button.dataset.state = status;\r\n if (event.color) button.style.setProperty('--mk-calendar-event-color', event.color);\r\n const start = toDateTime(event.start)!;\r\n const time = event.allDay ? '' : timeFormat.format(start);\r\n button.innerHTML = '<span class=\"mk-calendar__status\" aria-hidden=\"true\"></span><span class=\"mk-calendar__event-title\"></span><span class=\"mk-calendar__event-time\"></span>';\r\n button.children[1].textContent = event.title;\r\n button.children[2].textContent = time;\r\n button.setAttribute('aria-label', [event.title, time, labels.status[status]].filter(Boolean).join(', '));\r\n return button;\r\n };\r\n\r\n const body = () => {\r\n const wrap = document.createElement('div');\r\n wrap.className = 'mk-calendar__body';\r\n wrap.dataset.view = view;\r\n wrap.setAttribute('role', 'rowgroup');\r\n const now = today();\r\n const focusKey = dayKey(focusDay);\r\n for (const week of days()) {\r\n const row = document.createElement('div');\r\n row.className = 'mk-calendar__week';\r\n row.setAttribute('role', 'row');\r\n for (const day of week) {\r\n const key = dayKey(day);\r\n const cell = document.createElement('div');\r\n cell.className = 'mk-calendar__day';\r\n cell.setAttribute('role', 'gridcell');\r\n cell.dataset.mkDate = key;\r\n if (view === 'month' && !sameMonth(day, date)) cell.dataset.outside = '';\r\n if (sameDay(day, now)) cell.dataset.today = '';\r\n const isSelected = sameDay(day, selected);\r\n cell.setAttribute('aria-selected', String(isSelected));\r\n const list = byDay.get(key) ?? [];\r\n const number = document.createElement('button');\r\n number.type = 'button';\r\n number.className = 'mk-calendar__number';\r\n number.dataset.mkDay = key;\r\n number.textContent = view === 'week' ? `${day.getDate()}` : String(day.getDate());\r\n number.tabIndex = key === focusKey ? 0 : -1;\r\n number.setAttribute('aria-label', `${capitalize(fullDay.format(day))}${list.length ? `, ${labels.events(list.length)}` : ''}`);\r\n if (sameDay(day, now)) number.setAttribute('aria-current', 'date');\r\n cell.append(number);\r\n if (list.length) {\r\n const box = document.createElement('div');\r\n box.className = 'mk-calendar__events';\r\n const shown = view === 'week' ? list : list.slice(0, maxEvents);\r\n for (const event of shown) box.append(chip(event));\r\n if (shown.length < list.length) {\r\n const more = document.createElement('button');\r\n more.type = 'button';\r\n more.className = 'mk-calendar__more';\r\n more.dataset.mkMore = key;\r\n more.textContent = labels.more(list.length - shown.length);\r\n box.append(more);\r\n }\r\n cell.append(box);\r\n }\r\n row.append(cell);\r\n }\r\n wrap.append(row);\r\n }\r\n return wrap;\r\n };\r\n\r\n let current: HTMLElement | null = null;\r\n const leaving = new Set<HTMLElement>();\r\n scope.add(() => leaving.forEach((el) => el.remove()));\r\n\r\n const syncChrome = () => {\r\n if (title) {\r\n const r = range();\r\n let text = capitalize(monthTitle.format(date));\r\n if (view === 'week') {\r\n const format = rangeTitle as Intl.DateTimeFormat & { formatRange?: (a: Date, b: Date) => string };\r\n text = format.formatRange ? format.formatRange(r.start, r.end) : `${rangeTitle.format(r.start)} – ${rangeTitle.format(r.end)}`;\r\n }\r\n title.textContent = text;\r\n }\r\n for (const button of viewButtons) {\r\n scope.attr(button, 'aria-pressed', String(button.dataset.mkCalendarView === view));\r\n }\r\n };\r\n\r\n const render = (direction: number) => {\r\n const next = body();\r\n const motion = !reduced();\r\n if (!current) {\r\n grid.replaceChildren(header(), next);\r\n } else if (motion && direction !== 0) {\r\n const old = current;\r\n old.style.top = `${old.offsetTop}px`;\r\n old.classList.add('mk-calendar__body--leaving');\r\n old.setAttribute('aria-hidden', 'true');\r\n old.querySelectorAll('button').forEach((b) => (b.tabIndex = -1));\r\n leaving.add(old);\r\n grid.append(next);\r\n ctx.add(() => {\r\n // Out, then in: two dense month grids crossfading read as noise.\r\n gsap.to(old, { x: -SLIDE * direction, opacity: 0, duration: SLIDE_OUT, ease: 'power1.in', onComplete: () => { old.remove(); leaving.delete(old); } });\r\n gsap.fromTo(next, { x: SLIDE * direction, opacity: 0 }, { x: 0, opacity: 1, duration: SLIDE_DURATION, delay: SLIDE_GAP, ease: 'power2.out', clearProps: 'transform,opacity' });\r\n });\r\n } else {\r\n current.replaceWith(next);\r\n }\r\n current = next;\r\n syncChrome();\r\n if (motion) {\r\n ctx.add(() => {\r\n if (first) flowIn(next, { target: '.mk-calendar__day', stagger: CELL_STAGGER });\r\n flowIn(next, { target: '.mk-calendar__event, .mk-calendar__more', stagger: EVENT_STAGGER, delay: first ? 0.1 : direction ? SLIDE_GAP + SLIDE_DURATION * 0.5 : 0 });\r\n });\r\n }\r\n first = false;\r\n };\r\n\r\n const focusButton = () => grid.querySelector<HTMLButtonElement>(`.mk-calendar__body:not(.mk-calendar__body--leaving) [data-mk-day=\"${dayKey(focusDay)}\"]`);\r\n const navigate = (to: Date, focus = false) => {\r\n if (scope.disposed) return;\r\n const from = date;\r\n const moved = view === 'week' ? !sameDay(startOfWeek(to, firstDay), startOfWeek(from, firstDay)) : !sameMonth(to, from);\r\n date = to;\r\n focusDay = to;\r\n if (moved) {\r\n render(to > from ? 1 : -1);\r\n const r = range();\r\n options.onNavigate?.(r);\r\n root.dispatchEvent(new CustomEvent('mk:navigate', { bubbles: true, detail: r }));\r\n } else {\r\n grid.querySelectorAll<HTMLButtonElement>('[data-mk-day]').forEach((b) => (b.tabIndex = b.dataset.mkDay === dayKey(to) ? 0 : -1));\r\n }\r\n if (focus) focusButton()?.focus();\r\n };\r\n\r\n const select = (value: DateInput | null, notify = true) => {\r\n if (scope.disposed) return;\r\n selected = value === null ? null : toDate(value);\r\n grid.querySelectorAll<HTMLElement>('.mk-calendar__day').forEach((cell) => cell.setAttribute('aria-selected', String(!!selected && cell.dataset.mkDate === dayKey(selected))));\r\n if (selected && notify) {\r\n options.onSelect?.(selected);\r\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { date: selected, key: dayKey(selected) } }));\r\n }\r\n };\r\n\r\n scope.on(root, 'click', (e) => {\r\n const target = (e.target as Element).closest<HTMLElement>('button');\r\n if (!target || !root.contains(target) || (target as HTMLButtonElement).disabled) return;\r\n if (target === prevButton) navigate(view === 'week' ? addDays(date, -7) : addMonths(date, -1));\r\n else if (target === nextButton) navigate(view === 'week' ? addDays(date, 7) : addMonths(date, 1));\r\n else if (target === todayButton) navigate(today(), true);\r\n else if (target.dataset.mkCalendarView) setView(target.dataset.mkCalendarView as CalendarView);\r\n else if (target.dataset.mkEvent !== undefined) {\r\n const event = events.find((ev) => String(ev.id) === target.dataset.mkEvent);\r\n if (event) {\r\n options.onEventClick?.(event);\r\n root.dispatchEvent(new CustomEvent('mk:event', { bubbles: true, detail: { event } }));\r\n }\r\n } else if (target.dataset.mkDay || target.dataset.mkMore) {\r\n const day = toDate(target.dataset.mkDay ?? target.dataset.mkMore);\r\n focusDay = day;\r\n grid.querySelectorAll<HTMLButtonElement>('[data-mk-day]').forEach((b) => (b.tabIndex = b.dataset.mkDay === dayKey(day) ? 0 : -1));\r\n select(day);\r\n }\r\n });\r\n\r\n scope.on(grid, 'keydown', (e) => {\r\n const event = e as KeyboardEvent;\r\n const target = event.target as HTMLElement;\r\n if (!target.dataset?.mkDay) return;\r\n const day = toDate(target.dataset.mkDay);\r\n const map: Record<string, () => Date> = {\r\n ArrowLeft: () => addDays(day, -1),\r\n ArrowRight: () => addDays(day, 1),\r\n ArrowUp: () => addDays(day, -7),\r\n ArrowDown: () => addDays(day, 7),\r\n Home: () => startOfWeek(day, firstDay),\r\n End: () => addDays(startOfWeek(day, firstDay), 6),\r\n PageUp: () => addMonths(day, event.shiftKey ? -12 : -1),\r\n PageDown: () => addMonths(day, event.shiftKey ? 12 : 1),\r\n };\r\n const to = map[event.key]?.();\r\n if (!to) return;\r\n event.preventDefault();\r\n if (!event.key.startsWith('Page') && inRange(to)) {\r\n focusDay = to;\r\n grid.querySelectorAll<HTMLButtonElement>('[data-mk-day]').forEach((b) => (b.tabIndex = b.dataset.mkDay === dayKey(to) ? 0 : -1));\r\n focusButton()?.focus();\r\n } else navigate(to, true);\r\n });\r\n\r\n const setView = (next: CalendarView) => {\r\n if (scope.disposed || (next !== 'month' && next !== 'week') || next === view) return;\r\n view = next;\r\n date = focusDay;\r\n render(0);\r\n const r = range();\r\n options.onNavigate?.(r);\r\n root.dispatchEvent(new CustomEvent('mk:navigate', { bubbles: true, detail: r }));\r\n };\r\n\r\n render(0);\r\n\r\n return {\r\n next: () => navigate(view === 'week' ? addDays(date, 7) : addMonths(date, 1)),\r\n prev: () => navigate(view === 'week' ? addDays(date, -7) : addMonths(date, -1)),\r\n goToday: () => navigate(today()),\r\n setDate: (value) => navigate(toDate(value, date)),\r\n setView,\r\n setEvents(list) {\r\n if (scope.disposed) return;\r\n const hadFocus = grid.contains(document.activeElement);\r\n index(fromJson<CalendarEvent[]>(list) ?? []);\r\n const fresh = body();\r\n current?.replaceWith(fresh);\r\n current = fresh;\r\n if (hadFocus) focusButton()?.focus();\r\n },\r\n select,\r\n get date() { return date; },\r\n get view() { return view; },\r\n get selected() { return selected; },\r\n get range() { return range(); },\r\n destroy: () => scope.dispose(),\r\n };\r\n}\r\n","import { CustomEase, gsap, registerMotion } from '../../core/gsap';\r\nimport { reduced } from '../../core/reduced';\r\nimport { createScope } from '../../core/scope';\r\nimport { inert, type Instance } from '../../core/types';\r\nimport {\r\n addDays, addMonths, capitalize, clampFirstDay, dayKey, monthWeeks, safeFormat, sameDay, sameMonth,\r\n fromJson, startOfWeek, toDate, weekdayNames, type DateInput,\r\n} from '../../core/dates';\r\nimport { flowIn } from '../../motion/flow';\r\n\r\n/*\r\n * Slot picker (Melon Mind \"Agendar cita\"): a compact month on one side and the\r\n * day's times on the other. From the reference: changing day slides the times\r\n * out −30 px and the new ones in from +30 px, .25 s ease-out (view transition\r\n * \"time-slot\", schedulePicker.css); the first list grows in (scale .7, blur 32,\r\n * .3 s cubic-bezier(.38,.49,0,1.1)); the day heading opens 0 → 56 px in .5 s\r\n * cubic-bezier(.38,.49,0,1.4) and a picked time lights up in .7 s\r\n * (animation-highlight-1). Month changes slide the days the same way.\r\n */\r\n\r\nexport type SlotSource = string[] | Record<string, string[]> | ((date: Date) => string[] | Promise<string[]>);\r\n\r\nexport interface SlotValue { date: Date; time: string; key: string; value: string }\r\n\r\nexport interface SlotPickerLabels {\r\n placeholder?: string;\r\n empty?: string;\r\n loading?: string;\r\n heading?: (date: Date) => string;\r\n}\r\n\r\nexport interface SlotPickerOptions {\r\n /** Month shown first (and the selected day when `value` is not given). */\r\n date?: DateInput;\r\n /** Initial value: \"2026-10-23T10:30\" or { date, time }. */\r\n value?: string | { date: DateInput; time: string } | null;\r\n slots?: SlotSource;\r\n min?: DateInput;\r\n max?: DateInput;\r\n /** Weekdays never available (0 = Sunday). */\r\n closedDays?: number[];\r\n isDisabled?: (date: Date) => boolean;\r\n firstDay?: number;\r\n locale?: string;\r\n labels?: SlotPickerLabels;\r\n onChange?: (value: SlotValue) => void;\r\n onDateChange?: (date: Date) => void;\r\n}\r\n\r\nexport interface SlotPickerInstance extends Instance {\r\n selectDate(date: DateInput): void;\r\n selectTime(time: string | null): void;\r\n setSlots(slots: SlotSource): void;\r\n readonly date: Date | null;\r\n readonly time: string | null;\r\n readonly value: string | null;\r\n}\r\n\r\nconst SLIDE = 30;\r\nconst SLIDE_DURATION = 0.25;\r\nlet slotEaseReady = false;\r\n\r\nexport function createSlotPicker(root: HTMLElement | null, options: SlotPickerOptions = {}): SlotPickerInstance {\r\n const daysHost = root?.querySelector<HTMLElement>('[data-mk-slot-days]');\r\n const timesHost = root?.querySelector<HTMLElement>('[data-mk-slot-times]');\r\n if (!root || !daysHost || !timesHost) {\r\n return inert({ selectDate() {}, selectTime() {}, setSlots() {}, date: null, time: null, value: null });\r\n }\r\n registerMotion();\r\n if (!slotEaseReady && typeof window !== 'undefined') {\r\n CustomEase.create('mk-slot-in', '.38,.49,0,1.1');\r\n slotEaseReady = true;\r\n }\r\n const scope = createScope();\r\n const ctx = gsap.context(() => {});\r\n scope.add(() => ctx.revert());\r\n const locale = options.locale ?? 'es';\r\n const firstDay = clampFirstDay(options.firstDay);\r\n const labels = {\r\n placeholder: options.labels?.placeholder ?? 'Elige un día para ver los horarios.',\r\n empty: options.labels?.empty ?? 'No hay horarios este día.',\r\n loading: options.labels?.loading ?? 'Cargando horarios…',\r\n heading: options.labels?.heading ?? ((d: Date) => capitalize(safeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long' }).format(d))),\r\n };\r\n const min = options.min !== undefined ? toDate(options.min) : null;\r\n const max = options.max !== undefined ? toDate(options.max) : null;\r\n const closedList = fromJson<number[]>(options.closedDays);\r\n const closed = new Set((Array.isArray(closedList) ? closedList : []).filter((n) => Number.isInteger(n)));\r\n let slots: SlotSource = fromJson<SlotSource>(options.slots) ?? [];\r\n\r\n const initial = (() => {\r\n const v = options.value;\r\n if (typeof v === 'string') {\r\n const match = /^(\\d{4}-\\d{2}-\\d{2})(?:T(\\d{1,2}:\\d{2}))?/.exec(v);\r\n return match ? { date: toDate(match[1]), time: match[2] ?? null } : null;\r\n }\r\n return v ? { date: toDate(v.date), time: v.time ?? null } : null;\r\n })();\r\n let month = initial?.date ?? toDate(options.date);\r\n let date: Date | null = initial?.date ?? (options.date !== undefined ? toDate(options.date) : null);\r\n let time: string | null = initial?.time ?? null;\r\n let focusDay = date ?? month;\r\n let times: string[] = [];\r\n let request = 0;\r\n\r\n const title = root.querySelector<HTMLElement>('[data-mk-slot-title]');\r\n const heading = root.querySelector<HTMLElement>('[data-mk-slot-heading]');\r\n const prev = root.querySelector<HTMLButtonElement>('[data-mk-slot-prev]');\r\n const next = root.querySelector<HTMLButtonElement>('[data-mk-slot-next]');\r\n const output = root.querySelector<HTMLInputElement>('[data-mk-slot-value]');\r\n const originals = [daysHost, timesHost, title, heading].filter(Boolean).map((el) => [el!, [...el!.childNodes]] as const);\r\n scope.add(() => originals.forEach(([el, nodes]) => el.replaceChildren(...nodes)));\r\n if (output) {\r\n const before = output.value;\r\n scope.add(() => { output.value = before; });\r\n }\r\n scope.attr(root, 'data-mk-ready', '');\r\n scope.attr(daysHost, 'role', 'grid');\r\n scope.attr(timesHost, 'role', 'radiogroup');\r\n if (heading) {\r\n if (!heading.id) scope.attr(heading, 'id', `mk-slot-${Math.random().toString(36).slice(2, 8)}`);\r\n scope.attr(timesHost, 'aria-labelledby', heading.id);\r\n }\r\n if (title) {\r\n if (!title.id) scope.attr(title, 'id', `mk-slot-month-${Math.random().toString(36).slice(2, 8)}`);\r\n scope.attr(daysHost, 'aria-labelledby', title.id);\r\n }\r\n\r\n const monthTitle = safeFormat(locale, { month: 'long', year: 'numeric' });\r\n const fullDay = safeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' });\r\n const disabled = (d: Date) => (min && d < min) || (max && d > max) || closed.has(d.getDay()) || !!options.isDisabled?.(d);\r\n\r\n /* ── Days ───────────────────────────────────────────── */\r\n let daysBody: HTMLElement | null = null;\r\n const leaving = new Set<HTMLElement>();\r\n scope.add(() => leaving.forEach((el) => el.remove()));\r\n const buildDays = () => {\r\n const wrap = document.createElement('div');\r\n wrap.className = 'mk-slot-picker__days';\r\n wrap.setAttribute('role', 'rowgroup');\r\n const head = document.createElement('div');\r\n head.className = 'mk-slot-picker__weekdays';\r\n head.setAttribute('role', 'row');\r\n for (const name of weekdayNames(locale, firstDay, 'short')) {\r\n const cell = document.createElement('span');\r\n cell.setAttribute('role', 'columnheader');\r\n cell.textContent = name.slice(0, 2);\r\n head.append(cell);\r\n }\r\n wrap.append(head);\r\n const focusKey = dayKey(focusDay);\r\n for (const week of monthWeeks(month, firstDay)) {\r\n const row = document.createElement('div');\r\n row.className = 'mk-slot-picker__week';\r\n row.setAttribute('role', 'row');\r\n for (const d of week) {\r\n const cell = document.createElement('span');\r\n cell.setAttribute('role', 'gridcell');\r\n if (!sameMonth(d, month)) {\r\n row.append(cell);\r\n continue;\r\n }\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\n button.className = 'mk-slot-picker__day';\r\n button.dataset.mkSlotDay = dayKey(d);\r\n button.textContent = String(d.getDate());\r\n button.tabIndex = dayKey(d) === focusKey ? 0 : -1;\r\n button.setAttribute('aria-label', capitalize(fullDay.format(d)));\r\n if (disabled(d)) button.disabled = true;\r\n if (sameDay(d, new Date())) button.setAttribute('aria-current', 'date');\r\n cell.setAttribute('aria-selected', String(sameDay(d, date)));\r\n cell.append(button);\r\n row.append(cell);\r\n }\r\n wrap.append(row);\r\n }\r\n return wrap;\r\n };\r\n const renderDays = (direction: number) => {\r\n const fresh = buildDays();\r\n if (title) title.textContent = capitalize(monthTitle.format(month));\r\n // No earlier month when its last day is before `min`; no later one when its first day is after `max`.\r\n if (prev) scope.attr(prev, 'disabled', min && new Date(month.getFullYear(), month.getMonth(), 0) < min ? '' : null);\r\n if (next) scope.attr(next, 'disabled', max && new Date(month.getFullYear(), month.getMonth() + 1, 1) > max ? '' : null);\r\n if (daysBody && direction && !reduced()) {\r\n const old = daysBody;\r\n old.style.top = `${old.offsetTop}px`;\r\n old.classList.add('mk-slot-picker__leaving');\r\n old.setAttribute('aria-hidden', 'true');\r\n leaving.add(old);\r\n daysHost.append(fresh);\r\n ctx.add(() => {\r\n gsap.to(old, { x: -SLIDE * direction, opacity: 0, duration: SLIDE_DURATION, ease: 'power1.out', onComplete: () => { old.remove(); leaving.delete(old); } });\r\n gsap.fromTo(fresh, { x: SLIDE * direction, opacity: 0 }, { x: 0, opacity: 1, duration: SLIDE_DURATION, ease: 'power1.out', clearProps: 'transform,opacity' });\r\n });\r\n } else if (daysBody) daysBody.replaceWith(fresh);\r\n else daysHost.replaceChildren(fresh);\r\n daysBody = fresh;\r\n };\r\n const dayButton = (d: Date) => daysHost.querySelector<HTMLButtonElement>(`.mk-slot-picker__days:not(.mk-slot-picker__leaving) [data-mk-slot-day=\"${dayKey(d)}\"]`);\r\n const moveFocus = (to: Date, focus: boolean) => {\r\n focusDay = to;\r\n if (!sameMonth(to, month)) {\r\n const direction = to > month ? 1 : -1;\r\n month = to;\r\n renderDays(direction);\r\n } else daysHost.querySelectorAll<HTMLButtonElement>('[data-mk-slot-day]').forEach((b) => (b.tabIndex = b.dataset.mkSlotDay === dayKey(to) ? 0 : -1));\r\n if (focus) dayButton(to)?.focus();\r\n };\r\n\r\n /* ── Times ──────────────────────────────────────────── */\r\n let timesBody: HTMLElement | null = null;\r\n let firstList = true;\r\n const buildTimes = (state: 'placeholder' | 'loading' | 'ready') => {\r\n const wrap = document.createElement('div');\r\n wrap.className = 'mk-slot-picker__list';\r\n if (state !== 'ready' || !times.length) {\r\n const note = document.createElement('p');\r\n note.className = 'mk-slot-picker__note';\r\n note.textContent = state === 'placeholder' ? labels.placeholder : state === 'loading' ? labels.loading : labels.empty;\r\n wrap.append(note);\r\n return wrap;\r\n }\r\n const focusTime = time && times.includes(time) ? time : times[0];\r\n for (const t of times) {\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\n button.className = 'mk-slot-picker__time';\r\n button.setAttribute('role', 'radio');\r\n button.dataset.mkSlotTime = t;\r\n button.textContent = t;\r\n button.setAttribute('aria-checked', String(t === time));\r\n button.tabIndex = t === focusTime ? 0 : -1;\r\n wrap.append(button);\r\n }\r\n return wrap;\r\n };\r\n const renderTimes = (state: 'placeholder' | 'loading' | 'ready', direction: number) => {\r\n const fresh = buildTimes(state);\r\n scope.attr(timesHost, 'aria-busy', state === 'loading' ? 'true' : null);\r\n const motion = !reduced();\r\n if (timesBody && direction && motion) {\r\n const old = timesBody;\r\n old.style.top = `${old.offsetTop}px`;\r\n old.classList.add('mk-slot-picker__leaving');\r\n old.setAttribute('aria-hidden', 'true');\r\n old.querySelectorAll('button').forEach((b) => (b.tabIndex = -1));\r\n leaving.add(old);\r\n timesHost.append(fresh);\r\n ctx.add(() => {\r\n gsap.to(old, { x: -SLIDE * direction, opacity: 0, duration: SLIDE_DURATION, ease: 'power1.out', onComplete: () => { old.remove(); leaving.delete(old); } });\r\n gsap.fromTo(fresh, { x: SLIDE * direction, opacity: 0 }, { x: 0, opacity: 1, duration: SLIDE_DURATION, ease: 'power1.out', clearProps: 'transform,opacity' });\r\n });\r\n } else if (timesBody) timesBody.replaceWith(fresh);\r\n else timesHost.replaceChildren(fresh);\r\n timesBody = fresh;\r\n if (state === 'ready' && times.length && motion && firstList) {\r\n firstList = false;\r\n ctx.add(() => flowIn(fresh, { target: '.mk-slot-picker__time', style: 2, startScale: 0.7, blur: 32, duration: 0.3, stagger: 0.02, ease: 'mk-slot-in' }));\r\n }\r\n };\r\n const resolve = (d: Date): string[] | Promise<string[]> => {\r\n const source = slots;\r\n if (Array.isArray(source)) return source;\r\n if (typeof source === 'function') return source(d);\r\n return source?.[dayKey(d)] ?? [];\r\n };\r\n const clean = (list: unknown) => (Array.isArray(list) ? [...new Set(list.filter((t): t is string => typeof t === 'string' && /^\\d{1,2}:\\d{2}$/.test(t)))] : []);\r\n const load = (direction: number) => {\r\n if (!date) {\r\n times = [];\r\n renderTimes('placeholder', 0);\r\n return;\r\n }\r\n const mine = ++request;\r\n let result: string[] | Promise<string[]>;\r\n try {\r\n result = resolve(date);\r\n } catch {\r\n result = [];\r\n }\r\n if (result && typeof (result as Promise<string[]>).then === 'function') {\r\n renderTimes('loading', direction);\r\n (result as Promise<string[]>).then(\r\n (list) => { if (mine === request && !scope.disposed) { times = clean(list); renderTimes('ready', 0); } },\r\n () => { if (mine === request && !scope.disposed) { times = []; renderTimes('ready', 0); } },\r\n );\r\n } else {\r\n times = clean(result);\r\n if (time && !times.includes(time)) time = null;\r\n renderTimes('ready', direction);\r\n }\r\n };\r\n\r\n const syncHeading = () => {\r\n if (!heading) return;\r\n if (date) {\r\n heading.textContent = labels.heading(date);\r\n if (!heading.hasAttribute('data-mk-shown')) scope.attr(heading, 'data-mk-shown', '');\r\n }\r\n };\r\n const emit = () => {\r\n const key = date ? dayKey(date) : '';\r\n const value = date && time ? `${key}T${time}` : null;\r\n if (output) {\r\n output.value = value ?? '';\r\n output.dispatchEvent(new Event('input', { bubbles: true }));\r\n output.dispatchEvent(new Event('change', { bubbles: true }));\r\n }\r\n if (date && time && value) {\r\n const detail: SlotValue = { date, time, key, value };\r\n options.onChange?.(detail);\r\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail }));\r\n }\r\n };\r\n\r\n const selectDate = (input: DateInput, notify = true) => {\r\n if (scope.disposed) return;\r\n const d = toDate(input);\r\n if (disabled(d)) return;\r\n const direction = date ? Math.sign(d.getTime() - date.getTime()) : 0;\r\n if (sameDay(d, date)) return;\r\n date = d;\r\n time = null;\r\n focusDay = d;\r\n if (!sameMonth(d, month)) {\r\n const dir = d > month ? 1 : -1;\r\n month = d;\r\n renderDays(dir);\r\n }\r\n daysHost.querySelectorAll<HTMLElement>('[role=\"gridcell\"]').forEach((cell) => {\r\n const b = cell.querySelector<HTMLButtonElement>('[data-mk-slot-day]');\r\n if (b) {\r\n cell.setAttribute('aria-selected', String(b.dataset.mkSlotDay === dayKey(d)));\r\n b.tabIndex = b.dataset.mkSlotDay === dayKey(d) ? 0 : -1;\r\n }\r\n });\r\n syncHeading();\r\n load(direction);\r\n if (notify) {\r\n options.onDateChange?.(d);\r\n emit();\r\n }\r\n };\r\n const selectTime = (t: string | null, notify = true) => {\r\n if (scope.disposed || !date) return;\r\n if (t !== null && !times.includes(t)) return;\r\n time = t;\r\n timesHost.querySelectorAll<HTMLButtonElement>('[data-mk-slot-time]').forEach((b) => {\r\n b.setAttribute('aria-checked', String(b.dataset.mkSlotTime === t));\r\n b.tabIndex = (t ? b.dataset.mkSlotTime === t : b === timesHost.querySelector('[data-mk-slot-time]')) ? 0 : -1;\r\n });\r\n if (notify) emit();\r\n };\r\n\r\n scope.on(root, 'click', (e) => {\r\n const target = (e.target as Element).closest<HTMLButtonElement>('button');\r\n if (!target || target.disabled || !root.contains(target)) return;\r\n if (target === prev) moveFocus(addMonths(month, -1), false);\r\n else if (target === next) moveFocus(addMonths(month, 1), false);\r\n else if (target.dataset.mkSlotDay) selectDate(target.dataset.mkSlotDay);\r\n else if (target.dataset.mkSlotTime) selectTime(target.dataset.mkSlotTime);\r\n });\r\n scope.on(daysHost, 'keydown', (e) => {\r\n const event = e as KeyboardEvent;\r\n const key = (event.target as HTMLElement).dataset?.mkSlotDay;\r\n if (!key) return;\r\n const d = toDate(key);\r\n const to = ({\r\n ArrowLeft: () => addDays(d, -1), ArrowRight: () => addDays(d, 1), ArrowUp: () => addDays(d, -7), ArrowDown: () => addDays(d, 7),\r\n Home: () => startOfWeek(d, firstDay), End: () => addDays(startOfWeek(d, firstDay), 6),\r\n PageUp: () => addMonths(d, -1), PageDown: () => addMonths(d, 1),\r\n } as Record<string, () => Date>)[event.key]?.();\r\n if (!to) return;\r\n event.preventDefault();\r\n moveFocus(to, true);\r\n });\r\n scope.on(timesHost, 'keydown', (e) => {\r\n const event = e as KeyboardEvent;\r\n const current = (event.target as HTMLElement).dataset?.mkSlotTime;\r\n if (!current) return;\r\n const i = times.indexOf(current);\r\n const to = ({ ArrowRight: i + 1, ArrowDown: i + 1, ArrowLeft: i - 1, ArrowUp: i - 1, Home: 0, End: times.length - 1 } as Record<string, number>)[event.key];\r\n if (to === undefined) return;\r\n event.preventDefault();\r\n const t = times[(to + times.length) % times.length];\r\n selectTime(t);\r\n timesHost.querySelector<HTMLButtonElement>(`[data-mk-slot-time=\"${t}\"]`)?.focus();\r\n });\r\n\r\n renderDays(0);\r\n if (date) {\r\n syncHeading();\r\n load(0);\r\n if (time && !times.includes(time)) time = null;\r\n } else renderTimes('placeholder', 0);\r\n\r\n return {\r\n selectDate: (d) => selectDate(d),\r\n selectTime: (t) => selectTime(t),\r\n setSlots(source) {\r\n if (scope.disposed) return;\r\n slots = fromJson<SlotSource>(source) ?? [];\r\n load(0);\r\n },\r\n get date() { return date; },\r\n get time() { return time; },\r\n get value() { return date && time ? `${dayKey(date)}T${time}` : null; },\r\n destroy: () => scope.dispose(),\r\n };\r\n}\r\n"],"mappings":"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","names":["time","gsap","time","running","part","id","spring","gsap","position","time","stop","pointer","PLACED","onMove","stop","now","part","current","radiusOf","part","window","list","timeline","list","place","list","time","shown","current","SLIDE","SLIDE_DURATION","time","list","current"]}