@yewdiel21/motion-kit 0.9.1 → 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 (458) hide show
  1. package/README.md +72 -0
  2. package/dist/auto/index.d.ts +72 -3
  3. package/dist/auto/index.js +139 -3
  4. package/dist/auto/index.js.map +1 -1
  5. package/dist/{chunk-BFC27F2G.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-XDWBVFHQ.js → chunk-EY4BJKC4.js} +1203 -29
  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/calendar.css +159 -0
  17. package/dist/css/components/chart-tooltip.css +168 -0
  18. package/dist/css/components/chart.css +296 -0
  19. package/dist/css/components/code-block.css +264 -0
  20. package/dist/css/components/color-area.css +82 -0
  21. package/dist/css/components/color-field.css +67 -0
  22. package/dist/css/components/color-picker.css +131 -0
  23. package/dist/css/components/color-slider.css +113 -0
  24. package/dist/css/components/command-search.css +252 -0
  25. package/dist/css/components/context-menu.css +23 -0
  26. package/dist/css/components/credit-card.css +288 -0
  27. package/dist/css/components/data-table.css +591 -0
  28. package/dist/css/components/date-range-picker.css +168 -0
  29. package/dist/css/components/date-time-picker.css +178 -0
  30. package/dist/css/components/drawer.css +58 -0
  31. package/dist/css/components/editable-table.css +201 -0
  32. package/dist/css/components/empty-state.css +61 -0
  33. package/dist/css/components/file-explorer.css +633 -0
  34. package/dist/css/components/filter-builder.css +232 -0
  35. package/dist/css/components/hold-confirm.css +87 -0
  36. package/dist/css/components/hover-card.css +20 -0
  37. package/dist/css/components/image-preview.css +195 -0
  38. package/dist/css/components/input-otp.css +10 -0
  39. package/dist/css/components/json-viewer.css +272 -0
  40. package/dist/css/components/like-button.css +78 -0
  41. package/dist/css/components/link-preview.css +275 -0
  42. package/dist/css/components/loading-button.css +77 -0
  43. package/dist/css/components/multi-select.css +267 -0
  44. package/dist/css/components/notification-bell.css +127 -0
  45. package/dist/css/components/pagination.css +11 -0
  46. package/dist/css/components/password-strength.css +183 -0
  47. package/dist/css/components/popover.css +25 -0
  48. package/dist/css/components/progress.css +140 -0
  49. package/dist/css/components/quantity.css +16 -0
  50. package/dist/css/components/questionnaire.css +217 -0
  51. package/dist/css/components/range-calendar.css +186 -0
  52. package/dist/css/components/range-slider.css +192 -0
  53. package/dist/css/components/resizable-panel.css +243 -0
  54. package/dist/css/components/rich-text-editor.css +284 -0
  55. package/dist/css/components/scratch-card.css +75 -0
  56. package/dist/css/components/skeleton.css +108 -0
  57. package/dist/css/components/slot-picker.css +126 -0
  58. package/dist/css/components/split-view.css +19 -0
  59. package/dist/css/components/star-rating.css +80 -0
  60. package/dist/css/components/stat-card.css +164 -0
  61. package/dist/css/components/studio-dock.css +35 -0
  62. package/dist/css/components/swipe-actions.css +105 -0
  63. package/dist/css/components/tag-input.css +244 -0
  64. package/dist/css/components/time-field.css +88 -0
  65. package/dist/css/components/timeline.css +219 -0
  66. package/dist/css/components/tooltip.css +79 -0
  67. package/dist/css/components/trailer.css +37 -0
  68. package/dist/css/components/tree-view.css +210 -0
  69. package/dist/css/components/virtual-list.css +195 -0
  70. package/dist/css/controls.css +65 -0
  71. package/dist/css/tokens.css +185 -181
  72. package/dist/elements/index.d.ts +742 -5
  73. package/dist/elements/index.js +1527 -8
  74. package/dist/elements/index.js.map +1 -1
  75. package/dist/{engine-GDGwQnJE.d.ts → engine-Cn6IhE3z.d.ts} +1 -1
  76. package/dist/engine-QECQnGz1.d.ts +33 -0
  77. package/dist/index.css +10113 -181
  78. package/dist/index.d.ts +89 -5
  79. package/dist/index.js +285 -9
  80. package/dist/index.js.map +1 -1
  81. package/dist/react/index.d.ts +678 -23
  82. package/dist/react/index.js +2389 -7
  83. package/dist/react/index.js.map +1 -1
  84. package/dist/{reduced-B98f8LPs.d.ts → reduced-BBUusld6.d.ts} +206 -2
  85. package/dist/reveal-DEvp6U6T.d.ts +2381 -0
  86. package/dist/{store-pHiUvxP8.d.ts → store-DjkTBX7f.d.ts} +2 -2
  87. package/package.json +1 -1
  88. package/registry.json +583 -104
  89. package/skills/motion-kit/SKILL.md +209 -189
  90. package/src/auto/auto-init.ts +136 -0
  91. package/src/components/activity-feed/README.md +56 -0
  92. package/src/components/activity-feed/activity-feed.css +239 -0
  93. package/src/components/activity-feed/element.ts +36 -0
  94. package/src/components/activity-feed/engine.ts +351 -0
  95. package/src/components/activity-feed/react.tsx +32 -0
  96. package/src/components/attachment/README.md +27 -0
  97. package/src/components/attachment/attachment.css +265 -0
  98. package/src/components/attachment/element.ts +50 -0
  99. package/src/components/attachment/engine.ts +469 -0
  100. package/src/components/attachment/react.tsx +65 -0
  101. package/src/components/breadcrumb/README.md +38 -0
  102. package/src/components/breadcrumb/breadcrumb.css +109 -0
  103. package/src/components/breadcrumb/element.ts +27 -0
  104. package/src/components/breadcrumb/engine.ts +249 -0
  105. package/src/components/breadcrumb/react.tsx +30 -0
  106. package/src/components/calendar/README.md +82 -0
  107. package/src/components/calendar/calendar.css +158 -0
  108. package/src/components/calendar/element.ts +27 -0
  109. package/src/components/calendar/engine.ts +412 -0
  110. package/src/components/calendar/react.tsx +69 -0
  111. package/src/components/chart/README.md +24 -0
  112. package/src/components/chart/chart.css +295 -0
  113. package/src/components/chart/element.ts +41 -0
  114. package/src/components/chart/engine.ts +811 -0
  115. package/src/components/chart/react.tsx +50 -0
  116. package/src/components/chart-tooltip/README.md +53 -0
  117. package/src/components/chart-tooltip/chart-tooltip.css +167 -0
  118. package/src/components/chart-tooltip/element.ts +37 -0
  119. package/src/components/chart-tooltip/engine.ts +442 -0
  120. package/src/components/chart-tooltip/react.tsx +47 -0
  121. package/src/components/code-block/README.md +19 -0
  122. package/src/components/code-block/code-block.css +263 -0
  123. package/src/components/code-block/element.ts +34 -0
  124. package/src/components/code-block/engine.ts +254 -0
  125. package/src/components/code-block/highlight.ts +244 -0
  126. package/src/components/code-block/react.tsx +94 -0
  127. package/src/components/color-area/README.md +50 -0
  128. package/src/components/color-area/color-area.css +81 -0
  129. package/src/components/color-area/element.ts +26 -0
  130. package/src/components/color-area/engine.ts +246 -0
  131. package/src/components/color-area/react.tsx +42 -0
  132. package/src/components/color-field/README.md +43 -0
  133. package/src/components/color-field/color-field.css +66 -0
  134. package/src/components/color-field/element.ts +26 -0
  135. package/src/components/color-field/engine.ts +174 -0
  136. package/src/components/color-field/react.tsx +42 -0
  137. package/src/components/color-picker/README.md +45 -0
  138. package/src/components/color-picker/color-picker.css +130 -0
  139. package/src/components/color-picker/element.ts +45 -0
  140. package/src/components/color-picker/engine.ts +314 -0
  141. package/src/components/color-picker/react.tsx +47 -0
  142. package/src/components/color-slider/README.md +55 -0
  143. package/src/components/color-slider/color-slider.css +112 -0
  144. package/src/components/color-slider/element.ts +26 -0
  145. package/src/components/color-slider/engine.ts +234 -0
  146. package/src/components/color-slider/react.tsx +45 -0
  147. package/src/components/command-search/README.md +15 -0
  148. package/src/components/command-search/command-search.css +251 -0
  149. package/src/components/command-search/element.ts +36 -0
  150. package/src/components/command-search/engine.ts +356 -0
  151. package/src/components/command-search/match.ts +53 -0
  152. package/src/components/command-search/react.tsx +66 -0
  153. package/src/components/context-menu/README.md +31 -0
  154. package/src/components/context-menu/context-menu.css +22 -0
  155. package/src/components/context-menu/element.ts +40 -0
  156. package/src/components/context-menu/engine.ts +153 -0
  157. package/src/components/context-menu/react.tsx +57 -0
  158. package/src/components/credit-card/README.md +20 -0
  159. package/src/components/credit-card/card.ts +77 -0
  160. package/src/components/credit-card/credit-card.css +287 -0
  161. package/src/components/credit-card/element.ts +33 -0
  162. package/src/components/credit-card/engine.ts +410 -0
  163. package/src/components/credit-card/react.tsx +36 -0
  164. package/src/components/data-table/README.md +83 -0
  165. package/src/components/data-table/data-table.css +590 -0
  166. package/src/components/data-table/element.ts +54 -0
  167. package/src/components/data-table/engine.ts +1059 -0
  168. package/src/components/data-table/react.tsx +94 -0
  169. package/src/components/date-range-picker/README.md +51 -0
  170. package/src/components/date-range-picker/date-range-picker.css +167 -0
  171. package/src/components/date-range-picker/element.ts +52 -0
  172. package/src/components/date-range-picker/engine.ts +352 -0
  173. package/src/components/date-range-picker/react.tsx +57 -0
  174. package/src/components/date-time-picker/README.md +48 -0
  175. package/src/components/date-time-picker/date-time-picker.css +177 -0
  176. package/src/components/date-time-picker/element.ts +47 -0
  177. package/src/components/date-time-picker/engine.ts +350 -0
  178. package/src/components/date-time-picker/react.tsx +54 -0
  179. package/src/components/dialog/README.md +103 -102
  180. package/src/components/dialog/element.ts +123 -118
  181. package/src/components/dialog/engine.ts +449 -432
  182. package/src/components/drawer/README.md +28 -0
  183. package/src/components/drawer/drawer.css +57 -0
  184. package/src/components/drawer/element.ts +21 -0
  185. package/src/components/drawer/engine.ts +56 -0
  186. package/src/components/drawer/react.tsx +85 -0
  187. package/src/components/editable-table/README.md +67 -0
  188. package/src/components/editable-table/editable-table.css +200 -0
  189. package/src/components/editable-table/element.ts +45 -0
  190. package/src/components/editable-table/engine.ts +775 -0
  191. package/src/components/editable-table/react.tsx +79 -0
  192. package/src/components/empty-state/README.md +41 -0
  193. package/src/components/empty-state/element.ts +23 -0
  194. package/src/components/empty-state/empty-state.css +60 -0
  195. package/src/components/empty-state/engine.ts +232 -0
  196. package/src/components/empty-state/react.tsx +34 -0
  197. package/src/components/file-explorer/README.md +67 -0
  198. package/src/components/file-explorer/element.ts +39 -0
  199. package/src/components/file-explorer/engine.ts +1307 -0
  200. package/src/components/file-explorer/file-explorer.css +632 -0
  201. package/src/components/file-explorer/react.tsx +77 -0
  202. package/src/components/filter-builder/README.md +47 -0
  203. package/src/components/filter-builder/element.ts +34 -0
  204. package/src/components/filter-builder/engine.ts +365 -0
  205. package/src/components/filter-builder/filter-builder.css +231 -0
  206. package/src/components/filter-builder/react.tsx +36 -0
  207. package/src/components/hold-confirm/README.md +13 -0
  208. package/src/components/hold-confirm/element.ts +24 -0
  209. package/src/components/hold-confirm/engine.ts +216 -0
  210. package/src/components/hold-confirm/hold-confirm.css +86 -0
  211. package/src/components/hold-confirm/react.tsx +28 -0
  212. package/src/components/hover-card/README.md +20 -0
  213. package/src/components/hover-card/element.ts +8 -0
  214. package/src/components/hover-card/engine.ts +131 -0
  215. package/src/components/hover-card/hover-card.css +19 -0
  216. package/src/components/hover-card/react.tsx +19 -0
  217. package/src/components/image-preview/README.md +16 -0
  218. package/src/components/image-preview/element.ts +26 -0
  219. package/src/components/image-preview/engine.ts +325 -0
  220. package/src/components/image-preview/image-preview.css +194 -0
  221. package/src/components/image-preview/react.tsx +43 -0
  222. package/src/components/input-otp/README.md +18 -0
  223. package/src/components/input-otp/element.ts +14 -0
  224. package/src/components/input-otp/engine.ts +106 -0
  225. package/src/components/input-otp/input-otp.css +9 -0
  226. package/src/components/input-otp/react.tsx +21 -0
  227. package/src/components/json-viewer/README.md +56 -0
  228. package/src/components/json-viewer/element.ts +37 -0
  229. package/src/components/json-viewer/engine.ts +440 -0
  230. package/src/components/json-viewer/json-viewer.css +271 -0
  231. package/src/components/json-viewer/react.tsx +56 -0
  232. package/src/components/like-button/README.md +13 -0
  233. package/src/components/like-button/element.ts +47 -0
  234. package/src/components/like-button/engine.ts +145 -0
  235. package/src/components/like-button/like-button.css +77 -0
  236. package/src/components/like-button/react.tsx +39 -0
  237. package/src/components/link-preview/README.md +19 -0
  238. package/src/components/link-preview/element.ts +29 -0
  239. package/src/components/link-preview/engine.ts +192 -0
  240. package/src/components/link-preview/link-preview.css +274 -0
  241. package/src/components/link-preview/react.tsx +101 -0
  242. package/src/components/loading-button/README.md +45 -0
  243. package/src/components/loading-button/element.ts +34 -0
  244. package/src/components/loading-button/engine.ts +201 -0
  245. package/src/components/loading-button/loading-button.css +76 -0
  246. package/src/components/loading-button/react.tsx +43 -0
  247. package/src/components/multi-select/README.md +48 -0
  248. package/src/components/multi-select/element.ts +28 -0
  249. package/src/components/multi-select/engine.ts +294 -0
  250. package/src/components/multi-select/multi-select.css +266 -0
  251. package/src/components/multi-select/react.tsx +39 -0
  252. package/src/components/notification-bell/README.md +14 -0
  253. package/src/components/notification-bell/element.ts +48 -0
  254. package/src/components/notification-bell/engine.ts +202 -0
  255. package/src/components/notification-bell/notification-bell.css +126 -0
  256. package/src/components/notification-bell/react.tsx +57 -0
  257. package/src/components/pagination/README.md +17 -0
  258. package/src/components/pagination/element.ts +14 -0
  259. package/src/components/pagination/engine.ts +102 -0
  260. package/src/components/pagination/pagination.css +10 -0
  261. package/src/components/pagination/react.tsx +22 -0
  262. package/src/components/password-strength/README.md +17 -0
  263. package/src/components/password-strength/element.ts +22 -0
  264. package/src/components/password-strength/engine.ts +212 -0
  265. package/src/components/password-strength/password-strength.css +182 -0
  266. package/src/components/password-strength/react.tsx +36 -0
  267. package/src/components/password-strength/score.ts +62 -0
  268. package/src/components/popover/README.md +44 -0
  269. package/src/components/popover/element.ts +31 -0
  270. package/src/components/popover/engine.ts +114 -0
  271. package/src/components/popover/popover.css +24 -0
  272. package/src/components/popover/react.tsx +50 -0
  273. package/src/components/progress/README.md +17 -0
  274. package/src/components/progress/element.ts +30 -0
  275. package/src/components/progress/engine.ts +173 -0
  276. package/src/components/progress/progress.css +139 -0
  277. package/src/components/progress/react.tsx +35 -0
  278. package/src/components/quantity/README.md +20 -0
  279. package/src/components/quantity/element.ts +14 -0
  280. package/src/components/quantity/engine.ts +85 -0
  281. package/src/components/quantity/quantity.css +15 -0
  282. package/src/components/quantity/react.tsx +21 -0
  283. package/src/components/questionnaire/README.md +32 -0
  284. package/src/components/questionnaire/element.ts +118 -0
  285. package/src/components/questionnaire/engine.ts +255 -0
  286. package/src/components/questionnaire/questionnaire.css +216 -0
  287. package/src/components/questionnaire/react.tsx +140 -0
  288. package/src/components/range-calendar/README.md +58 -0
  289. package/src/components/range-calendar/element.ts +42 -0
  290. package/src/components/range-calendar/engine.ts +390 -0
  291. package/src/components/range-calendar/range-calendar.css +185 -0
  292. package/src/components/range-calendar/react.tsx +56 -0
  293. package/src/components/range-slider/README.md +23 -0
  294. package/src/components/range-slider/element.ts +53 -0
  295. package/src/components/range-slider/engine.ts +316 -0
  296. package/src/components/range-slider/range-slider.css +191 -0
  297. package/src/components/range-slider/react.tsx +66 -0
  298. package/src/components/resizable-panel/README.md +61 -0
  299. package/src/components/resizable-panel/element.ts +36 -0
  300. package/src/components/resizable-panel/engine.ts +551 -0
  301. package/src/components/resizable-panel/react.tsx +74 -0
  302. package/src/components/resizable-panel/resizable-panel.css +242 -0
  303. package/src/components/rich-text-editor/README.md +57 -0
  304. package/src/components/rich-text-editor/element.ts +34 -0
  305. package/src/components/rich-text-editor/engine.ts +673 -0
  306. package/src/components/rich-text-editor/react.tsx +60 -0
  307. package/src/components/rich-text-editor/rich-text-editor.css +283 -0
  308. package/src/components/scratch-card/README.md +15 -0
  309. package/src/components/scratch-card/element.ts +30 -0
  310. package/src/components/scratch-card/engine.ts +257 -0
  311. package/src/components/scratch-card/react.tsx +40 -0
  312. package/src/components/scratch-card/scratch-card.css +74 -0
  313. package/src/components/skeleton/README.md +15 -0
  314. package/src/components/skeleton/element.ts +32 -0
  315. package/src/components/skeleton/engine.ts +104 -0
  316. package/src/components/skeleton/react.tsx +41 -0
  317. package/src/components/skeleton/skeleton.css +107 -0
  318. package/src/components/slot-picker/README.md +68 -0
  319. package/src/components/slot-picker/element.ts +27 -0
  320. package/src/components/slot-picker/engine.ts +412 -0
  321. package/src/components/slot-picker/react.tsx +76 -0
  322. package/src/components/slot-picker/slot-picker.css +125 -0
  323. package/src/components/split-view/README.md +50 -0
  324. package/src/components/split-view/element.ts +34 -0
  325. package/src/components/split-view/engine.ts +114 -0
  326. package/src/components/split-view/react.tsx +63 -0
  327. package/src/components/split-view/split-view.css +18 -0
  328. package/src/components/star-rating/README.md +14 -0
  329. package/src/components/star-rating/element.ts +26 -0
  330. package/src/components/star-rating/engine.ts +217 -0
  331. package/src/components/star-rating/react.tsx +33 -0
  332. package/src/components/star-rating/star-rating.css +79 -0
  333. package/src/components/stat-card/README.md +42 -0
  334. package/src/components/stat-card/element.ts +40 -0
  335. package/src/components/stat-card/engine.ts +283 -0
  336. package/src/components/stat-card/react.tsx +36 -0
  337. package/src/components/stat-card/stat-card.css +163 -0
  338. package/src/components/studio-dock/README.md +44 -0
  339. package/src/components/studio-dock/element.ts +11 -0
  340. package/src/components/studio-dock/engine.ts +212 -0
  341. package/src/components/studio-dock/react.tsx +23 -0
  342. package/src/components/studio-dock/studio-dock.css +34 -0
  343. package/src/components/swipe-actions/README.md +19 -0
  344. package/src/components/swipe-actions/element.ts +26 -0
  345. package/src/components/swipe-actions/engine.ts +260 -0
  346. package/src/components/swipe-actions/react.tsx +80 -0
  347. package/src/components/swipe-actions/swipe-actions.css +104 -0
  348. package/src/components/tag-input/README.md +42 -0
  349. package/src/components/tag-input/element.ts +39 -0
  350. package/src/components/tag-input/engine.ts +313 -0
  351. package/src/components/tag-input/react.tsx +54 -0
  352. package/src/components/tag-input/tag-input.css +243 -0
  353. package/src/components/time-field/README.md +54 -0
  354. package/src/components/time-field/element.ts +38 -0
  355. package/src/components/time-field/engine.ts +110 -0
  356. package/src/components/time-field/react.tsx +45 -0
  357. package/src/components/time-field/time-field.css +87 -0
  358. package/src/components/timeline/README.md +57 -0
  359. package/src/components/timeline/element.ts +31 -0
  360. package/src/components/timeline/engine.ts +300 -0
  361. package/src/components/timeline/react.tsx +59 -0
  362. package/src/components/timeline/timeline.css +218 -0
  363. package/src/components/tooltip/README.md +46 -0
  364. package/src/components/tooltip/element.ts +22 -0
  365. package/src/components/tooltip/engine.ts +288 -0
  366. package/src/components/tooltip/react.tsx +30 -0
  367. package/src/components/tooltip/tooltip.css +78 -0
  368. package/src/components/trailer/README.md +28 -0
  369. package/src/components/trailer/element.ts +13 -0
  370. package/src/components/trailer/engine.ts +189 -0
  371. package/src/components/trailer/react.tsx +16 -0
  372. package/src/components/trailer/trailer.css +36 -0
  373. package/src/components/tree-view/README.md +61 -0
  374. package/src/components/tree-view/element.ts +32 -0
  375. package/src/components/tree-view/engine.ts +569 -0
  376. package/src/components/tree-view/react.tsx +78 -0
  377. package/src/components/tree-view/tree-view.css +209 -0
  378. package/src/components/virtual-list/README.md +81 -0
  379. package/src/components/virtual-list/element.ts +42 -0
  380. package/src/components/virtual-list/engine.ts +678 -0
  381. package/src/components/virtual-list/react.tsx +101 -0
  382. package/src/components/virtual-list/virtual-list.css +194 -0
  383. package/src/core/chips.ts +196 -0
  384. package/src/core/color.ts +304 -0
  385. package/src/core/date-range.ts +67 -0
  386. package/src/core/dates.ts +108 -0
  387. package/src/core/files.ts +107 -0
  388. package/src/core/filter.ts +229 -0
  389. package/src/core/gsap.ts +80 -65
  390. package/src/core/listbox.ts +332 -0
  391. package/src/core/mark.ts +29 -0
  392. package/src/core/position.ts +89 -0
  393. package/src/core/relative-time.ts +77 -0
  394. package/src/core/segment-field.ts +373 -0
  395. package/src/core/segments.ts +153 -0
  396. package/src/core/tree.ts +116 -0
  397. package/src/core/virtual.ts +79 -0
  398. package/src/css/controls/README.md +14 -0
  399. package/src/css/controls/status.css +63 -0
  400. package/src/css/tokens.css +186 -182
  401. package/src/elements/index.ts +171 -0
  402. package/src/index.ts +97 -0
  403. package/src/motion/micro.ts +248 -0
  404. package/src/motion/sheet.ts +88 -65
  405. package/src/motion/surface.ts +9 -0
  406. package/src/react/index.ts +78 -0
  407. package/src/react/use-action-button.ts +6 -0
  408. package/src/react/use-editorial-reveal.ts +7 -0
  409. package/src/react/use-film-hero.ts +6 -0
  410. package/src/react/use-font-cycle.ts +7 -0
  411. package/src/react/use-image-zoom.ts +5 -0
  412. package/src/react/use-joined-cta.ts +5 -0
  413. package/src/react/use-local-clock.ts +5 -0
  414. package/src/react/use-scroll-dock.ts +5 -0
  415. package/src/react/use-sticker.ts +5 -0
  416. package/src/react/use-studio-dock.ts +8 -0
  417. package/src/react/use-thumbnail-nav.ts +7 -0
  418. package/src/react/use-trailer.ts +6 -0
  419. package/src/react/use-weight-hover.ts +5 -0
  420. package/src/recipes/action-button/README.md +31 -0
  421. package/src/recipes/action-button/action-button.css +113 -0
  422. package/src/recipes/action-button/create-action-button.ts +56 -0
  423. package/src/recipes/editorial-reveal/README.md +35 -0
  424. package/src/recipes/editorial-reveal/create-editorial-reveal.ts +91 -0
  425. package/src/recipes/editorial-reveal/editorial-reveal.css +17 -0
  426. package/src/recipes/film-hero/README.md +23 -0
  427. package/src/recipes/film-hero/create-film-hero.ts +65 -0
  428. package/src/recipes/film-hero/film-hero.css +29 -0
  429. package/src/recipes/font-cycle/README.md +11 -0
  430. package/src/recipes/font-cycle/create-font-cycle.ts +126 -0
  431. package/src/recipes/font-cycle/font-cycle.css +36 -0
  432. package/src/recipes/image-zoom/README.md +16 -0
  433. package/src/recipes/image-zoom/create-image-zoom.ts +27 -0
  434. package/src/recipes/image-zoom/image-zoom.css +7 -0
  435. package/src/recipes/joined-cta/README.md +13 -0
  436. package/src/recipes/joined-cta/create-joined-cta.ts +22 -0
  437. package/src/recipes/joined-cta/joined-cta.css +17 -0
  438. package/src/recipes/local-clock/README.md +31 -0
  439. package/src/recipes/local-clock/create-local-clock.ts +61 -0
  440. package/src/recipes/scroll-dock/README.md +46 -0
  441. package/src/recipes/scroll-dock/create-scroll-dock.ts +72 -0
  442. package/src/recipes/scroll-dock/scroll-dock.css +70 -0
  443. package/src/recipes/sticker/README.md +59 -0
  444. package/src/recipes/sticker/create-sticker.ts +490 -0
  445. package/src/recipes/sticker/sticker.css +112 -0
  446. package/src/recipes/thumbnail-nav/README.md +16 -0
  447. package/src/recipes/thumbnail-nav/create-thumbnail-nav.ts +165 -0
  448. package/src/recipes/thumbnail-nav/thumbnail-nav.css +108 -0
  449. package/src/recipes/weight-hover/README.md +37 -0
  450. package/src/recipes/weight-hover/create-weight-hover.ts +136 -0
  451. package/src/recipes/weight-hover/weight-hover.css +7 -0
  452. package/dist/chunk-BFC27F2G.js.map +0 -1
  453. package/dist/chunk-J6OCFNGU.js +0 -177
  454. package/dist/chunk-J6OCFNGU.js.map +0 -1
  455. package/dist/chunk-JQMJQSXD.js +0 -2374
  456. package/dist/chunk-JQMJQSXD.js.map +0 -1
  457. package/dist/chunk-XDWBVFHQ.js.map +0 -1
  458. package/dist/reveal-C0hCDcB_.d.ts +0 -415
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/scroll-track.ts","../src/motion/details.ts","../src/motion/indicator.ts","../src/motion/layout.ts","../src/core/spring.ts","../src/recipes/spring-cards/create-spring-cards.ts","../src/core/visible.ts","../src/recipes/curved-carousel/carousel-math.ts","../src/recipes/curved-carousel/create-curved-carousel.ts","../src/recipes/pile/pile-math.ts","../src/recipes/pile/create-pile.ts","../src/recipes/words/create-words.ts","../src/recipes/flow/create-flow.ts","../src/recipes/pop/create-pop.ts","../src/recipes/fit-text/create-fit-text.ts","../src/recipes/stretch-footer/create-stretch-footer.ts","../src/recipes/radial-menu/create-radial-menu.ts","../src/recipes/tabs/create-tabs.ts","../src/recipes/counter/create-counter.ts","../src/recipes/details/create-details.ts","../src/recipes/reveal/create-reveal.ts","../src/recipes/reflow/create-reflow.ts","../src/recipes/slot-text/create-slot-text.ts","../src/recipes/sortable/create-sortable.ts","../src/recipes/mask-text/create-mask-text.ts","../src/recipes/cascade/create-cascade.ts","../src/recipes/text-roll/create-text-roll.ts","../src/recipes/letters/create-letters.ts","../src/recipes/parallax/create-parallax.ts","../src/recipes/depth-grid/create-depth-grid.ts","../src/recipes/frame-zoom/create-frame-zoom.ts","../src/recipes/contrast/create-contrast.ts","../src/recipes/marquee/create-marquee.ts","../src/recipes/card-dock/create-card-dock.ts","../src/recipes/snap-strip/create-snap-strip.ts","../src/recipes/fill-text/create-fill-text.ts","../src/recipes/ticket-menu/create-ticket-menu.ts","../src/recipes/infinite-reel/create-infinite-reel.ts","../src/recipes/repel-bento/create-repel-bento.ts","../src/recipes/rotator/create-rotator.ts","../src/recipes/drag-ruler/create-drag-ruler.ts","../src/recipes/dock-pill/create-dock-pill.ts"],"sourcesContent":["import { whileVisible } from './loop';\n\n/*\n * How far an element has travelled through the viewport, 0 → 1, between two\n * ScrollTrigger-style positions (\"<element edge> <viewport line>\"), read from\n * its box every frame while it is near the screen. Native scroll is followed\n * exactly with lerp 1; pass lerp .1 to smooth the effect alone. Parallax, depth grid and\n * frame zoom render from it.\n */\n\nexport interface ScrollTrackOptions {\n /** \"<top|center|bottom|n%> <top|center|bottom|n%>\" — default \"top bottom\" (the element enters). */\n start?: string;\n /** Default \"bottom top\" (the element has left). */\n end?: string;\n /** Share of the distance covered each 60 fps frame (default 1: follow the page exactly). */\n lerp?: number;\n onUpdate?: (value: number) => void;\n}\n\nexport interface ScrollTrack {\n readonly value: number;\n readonly target: number;\n /** Raw progress now, from the element's box. */\n measure(): number;\n /** Measure and ease one frame (dt = 1 at 60 Hz). */\n update(dt?: number): void;\n /** Jump to a value (manual control). */\n set(value: number): void;\n destroy(): void;\n}\n\nconst clamp01 = (value: number) => Math.min(1, Math.max(0, value));\n\nfunction edgeOf(box: DOMRect, edge: string) {\n if (edge === 'top') return box.top;\n if (edge === 'bottom') return box.bottom;\n if (edge === 'center') return box.top + box.height / 2;\n if (edge.endsWith('%')) return box.top + (box.height * parseFloat(edge)) / 100;\n return box.top + (parseFloat(edge) || 0);\n}\n\nfunction lineOf(height: number, line: string) {\n if (line === 'top') return 0;\n if (line === 'bottom') return height;\n if (line === 'center') return height / 2;\n if (line.endsWith('%')) return (height * parseFloat(line)) / 100;\n return parseFloat(line) || 0;\n}\n\nexport function trackScroll(\n el: Element,\n { start = 'top bottom', end = 'bottom top', lerp = 1, onUpdate }: ScrollTrackOptions = {},\n): ScrollTrack {\n const [startEdge = 'top', startLine = 'bottom'] = start.trim().split(/\\s+/);\n const [endEdge = 'bottom', endLine = 'top'] = end.trim().split(/\\s+/);\n let destroyed = false;\n\n const measure = () => {\n const box = el.getBoundingClientRect();\n const height = window.innerHeight;\n // Both grow as the page scrolls down; their difference is the distance travelled.\n const fromStart = lineOf(height, startLine) - edgeOf(box, startEdge);\n const fromEnd = lineOf(height, endLine) - edgeOf(box, endEdge);\n const distance = fromStart - fromEnd;\n if (distance <= 0) return fromStart >= 0 ? 1 : 0;\n return clamp01(fromStart / distance);\n };\n\n let target = measure();\n let value = target;\n onUpdate?.(value);\n\n const update = (dt = 1) => {\n if (destroyed) return;\n target = measure();\n const step = lerp >= 1 ? 1 : 1 - Math.pow(1 - Math.max(lerp, 0), dt);\n value += (target - value) * step;\n if (Math.abs(target - value) < 1e-4) value = target;\n onUpdate?.(value);\n };\n const stop = whileVisible(el, update, '200px');\n\n return {\n get value() {\n return value;\n },\n get target() {\n return target;\n },\n measure,\n update,\n set(next: number) {\n if (destroyed) return;\n value = target = clamp01(next);\n onUpdate?.(value);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n stop();\n },\n };\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * Details: a disclosure grows to its content's height while the\n * content fades in, and folds back to its summary (0.32 s, signature). A\n * `[data-mk-chevron]` inside the summary turns 180° in 0.25 s.\n */\n\nconst running = new WeakMap<HTMLDetailsElement, gsap.core.Timeline>();\n\nexport function toggleDetails(details: HTMLDetailsElement, open: boolean, { duration = TIMING.details }: { duration?: number } = {}) {\n registerMotion();\n const summary = details.querySelector<HTMLElement>(':scope > summary');\n const chevron = summary?.querySelector<HTMLElement>('[data-mk-chevron]');\n running.get(details)?.kill();\n if (!summary || reduced()) {\n details.open = open;\n if (chevron) gsap.set(chevron, { rotation: open ? 180 : 0 });\n return null;\n }\n const from = details.offsetHeight;\n const content = [...details.children].filter((child): child is HTMLElement => child !== summary && child instanceof HTMLElement);\n // Both ends measured without painting them; it stays open while it animates.\n details.style.height = '';\n details.open = false;\n const closed = details.offsetHeight;\n details.open = true;\n const to = open ? details.offsetHeight : closed;\n const timeline = gsap.timeline({\n onComplete: () => {\n if (!open) details.open = false;\n gsap.set(details, { clearProps: 'height,overflow,boxSizing' });\n gsap.set(content, { clearProps: 'opacity' });\n running.delete(details);\n },\n });\n if (from !== to) {\n timeline.fromTo(details, { height: from, overflow: 'hidden', boxSizing: 'border-box' }, { height: to, duration, ease: EASE.signature }, 0);\n }\n timeline.fromTo(content, { opacity: open ? 0 : 1 }, { opacity: open ? 1 : 0, duration, ease: EASE.signature }, 0);\n if (chevron) timeline.to(chevron, { rotation: open ? 180 : 0, duration: TIMING.chevron, ease: EASE.signature }, 0);\n running.set(details, timeline);\n return timeline;\n}\n\n/**\n * Animate every disclosure under `root` with one listener. Controls inside a\n * summary keep their clicks; `data-mk-motion=\"none\"` opts a disclosure out.\n * Returns the function that removes the listener.\n */\nexport function installDetailsMotion(root: Document | HTMLElement = document): () => void {\n const onClick = (event: Event) => {\n const mouse = event as MouseEvent;\n if (mouse.defaultPrevented || mouse.button !== 0) return;\n const target = mouse.target instanceof Element ? mouse.target : null;\n const summary = target?.closest('summary');\n const details = summary?.parentElement;\n if (!summary || !(details instanceof HTMLDetailsElement)) return;\n if (details.querySelector(':scope > summary') !== summary) return;\n if (details.dataset.mkMotion === 'none') return;\n const control = target?.closest('a, button, input, select, textarea');\n if (control && control !== summary && summary.contains(control)) return;\n mouse.preventDefault();\n toggleDetails(details, !details.open);\n };\n root.addEventListener('click', onClick);\n return () => root.removeEventListener('click', onClick);\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * Tabs: the indicator fits the selected option's box in 0.45 s\n * on the signature curve (Flip.fit in the original; here the same box is\n * tweened directly). The indicator is an absolutely positioned child at 0,0 of\n * the group. A scrolling group centres the selected option.\n */\n\nexport interface IndicatorOptions {\n immediate?: boolean;\n duration?: number;\n /** Scroll container to centre the target in (when it overflows). */\n scroller?: HTMLElement | null;\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport function slideIndicator(indicator: HTMLElement, target: HTMLElement | null, options: IndicatorOptions = {}) {\n registerMotion();\n const { immediate = false, duration = TIMING.indicator, scroller, orientation = 'horizontal' } = options;\n gsap.killTweensOf(indicator);\n if (!target) {\n gsap.set(indicator, { opacity: 0 });\n return null;\n }\n const box = { x: target.offsetLeft, y: target.offsetTop, width: target.offsetWidth, height: target.offsetHeight, opacity: 1 };\n if (scroller) {\n const horizontal = orientation === 'horizontal';\n const overflow = horizontal ? scroller.scrollWidth > scroller.clientWidth : scroller.scrollHeight > scroller.clientHeight;\n if (overflow && typeof scroller.scrollTo === 'function') {\n const offset = horizontal\n ? box.x - (scroller.clientWidth - box.width) / 2\n : box.y - (scroller.clientHeight - box.height) / 2;\n scroller.scrollTo({ [horizontal ? 'left' : 'top']: offset, behavior: immediate || reduced() ? 'auto' : 'smooth' });\n }\n }\n if (immediate || reduced()) {\n gsap.set(indicator, box);\n return null;\n }\n return gsap.to(indicator, { ...box, duration, ease: EASE.signature });\n}\n","import { gsap, Flip, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * layout reflow: items that changed place travel there on a spring\n * (0.62 s, ratio .52) and new ones grow in (scale .94, in 60 % of the time).\n * Capture before the DOM change, reflow after it; items pair by `data-flip-id`.\n * Don't make the items `position: absolute` — the list would collapse.\n */\n\nexport interface CapturedLayout {\n state: ReturnType<typeof Flip.getState>;\n ids: Set<string | undefined>;\n}\n\nexport function captureLayout(root: Element, selector: string): CapturedLayout {\n registerMotion();\n const items = [...root.querySelectorAll<HTMLElement>(selector)];\n return { state: Flip.getState(items), ids: new Set(items.map((item) => item.dataset.flipId)) };\n}\n\nexport function reflowLayout(root: Element, selector: string, captured: CapturedLayout, { duration = TIMING.layoutTravel }: { duration?: number } = {}) {\n registerMotion();\n if (reduced()) return null;\n const targets = [...root.querySelectorAll<HTMLElement>(selector)];\n return Flip.from(captured.state, {\n targets,\n duration,\n ease: EASE.layoutReflow,\n zIndex: 3,\n onEnter: (elements) =>\n gsap.fromTo(\n elements,\n { opacity: 0, scale: 0.94 },\n { opacity: 1, scale: 1, duration: duration * TIMING.layoutEnterFactor, ease: EASE.layoutReflow, clearProps: 'opacity,transform' },\n ),\n });\n}\n","export interface Vec { x: number; y: number }\r\nexport interface Spring {\r\n current: Vec;\r\n target: Vec;\r\n velocity: Vec;\r\n update(dt?: number): void;\r\n}\r\n\r\n/** spring (stiffness .05, friction .8), normalised so dt = 1 is one 60 Hz frame. */\r\nexport function createSpring(stiffness = 0.05, friction = 0.8): Spring {\r\n const current = { x: 0, y: 0 };\r\n const target = { x: 0, y: 0 };\r\n const velocity = { x: 0, y: 0 };\r\n function update(dt = 1) {\r\n const decay = Math.pow(friction, dt);\r\n for (const axis of ['x', 'y'] as const) {\r\n velocity[axis] = velocity[axis] * decay + (target[axis] - current[axis]) * stiffness * dt;\r\n current[axis] = Math.round((current[axis] + velocity[axis] * dt) * 100) / 100;\r\n }\r\n }\r\n return { current, target, velocity, update };\r\n}\r\n","import { gsap, ELASTIC, registerMotion } from '../../core/gsap';\nimport { entrances, reduced } from '../../core/reduced';\nimport { createSpring, type Spring } from '../../core/spring';\nimport { whileVisible } from '../../core/loop';\nimport { bindPointer, pointer, takeMovement } from '../../core/pointer';\nimport { clamp } from '../../core/math';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * spring-cards: each card owns a spring that starts at a random offset\n * and is pulled home shortly after; pointer movement near a card adds velocity\n * with a (1 − distance)^falloff · push weight. CSS turns the variables into\n * translate/rotate (see spring-cards.css).\n */\n\nexport interface SpringCardsOptions {\n /** Cards inside the root. */\n selector?: string;\n /** Random start offset range, ±px. */\n initialOffset?: number;\n /** Delay before the springs are pulled to rest, ms. */\n releaseAfter?: number;\n /** Strength of the pointer push. */\n push?: number;\n /** Exponent of the distance falloff. */\n falloff?: number;\n /** Per-frame decay of the pushed velocity. */\n damping?: number;\n stiffness?: number;\n friction?: number;\n /** Scale-in entrance. */\n entrance?: boolean;\n stagger?: number;\n delay?: number;\n}\n\nexport type SpringCardsInstance = Instance;\n\nconst VARS = ['--mk-x', '--mk-y', '--mk-velocity'] as const;\n\ninterface Card {\n el: HTMLElement;\n spring: Spring;\n push: { x: number; y: number };\n cx: number;\n cy: number;\n}\n\nconst rand = (min: number, max: number) => Math.random() * (max - min) + min;\n\nexport function createSpringCards(root: HTMLElement | null, options: SpringCardsOptions = {}): SpringCardsInstance {\n const o = {\n selector: '[data-mk-card]',\n initialOffset: 100,\n releaseAfter: 100,\n push: 0.4,\n falloff: 6,\n damping: 0.9,\n stiffness: 0.05,\n friction: 0.8,\n entrance: true,\n stagger: 0.08,\n delay: 0.4,\n ...options,\n };\n const elements = root ? [...root.querySelectorAll<HTMLElement>(o.selector)] : [];\n if (!root || !elements.length) {\n warnOnce(`spring-cards: no \"${o.selector}\" inside the root`);\n return inert();\n }\n\n registerMotion();\n const scope = createScope();\n const ctx = gsap.context(() => {});\n scope.add(() => ctx.revert());\n\n if (o.entrance && entrances()) {\n ctx.add(() => gsap.fromTo(elements, { scale: 0 }, { scale: 1, duration: 1, ease: ELASTIC, stagger: o.stagger, delay: o.delay }));\n }\n root.dataset.mkReady = '';\n scope.add(() => {\n delete root.dataset.mkReady;\n elements.forEach((el) => VARS.forEach((name) => el.style.removeProperty(name)));\n });\n\n if (reduced()) return { destroy: () => scope.dispose() };\n\n scope.add(bindPointer());\n const cards: Card[] = elements.map((el) => {\n const spring = createSpring(o.stiffness, o.friction);\n spring.current.x = spring.target.x = rand(-o.initialOffset, o.initialOffset);\n spring.current.y = spring.target.y = rand(-o.initialOffset, o.initialOffset);\n return { el, spring, push: { x: 0, y: 0 }, cx: 0, cy: 0 };\n });\n scope.timeout(() => cards.forEach(({ spring }) => (spring.target.x = spring.target.y = 0)), o.releaseAfter);\n\n // Centres in page coordinates; the card element is only scaled, never translated.\n const measure = () =>\n cards.forEach((card) => {\n const rect = card.el.getBoundingClientRect();\n card.cx = rect.left + scrollX + rect.width / 2;\n card.cy = rect.top + scrollY + rect.height / 2;\n });\n measure();\n scope.observe(new ResizeObserver(measure)).observe(root);\n\n scope.add(\n whileVisible(root, (dt) => {\n const movement = takeMovement();\n const mx = clamp(movement.mx, -80, 80);\n const my = clamp(movement.my, -80, 80);\n const decay = Math.pow(o.damping, dt);\n\n for (const card of cards) {\n const { spring, push } = card;\n push.x *= decay;\n push.y *= decay;\n spring.current.x += push.x * dt;\n spring.current.y += push.y * dt;\n spring.update(dt);\n\n if (pointer.active) {\n const dx = ((pointer.x + scrollX - card.cx) / innerWidth) * 2;\n const dy = ((pointer.y + scrollY - card.cy) / innerHeight) * 2;\n const k = Math.pow(Math.max(0, 1 - Math.hypot(dx, dy)), o.falloff) * o.push;\n push.x += mx * k;\n push.y += my * k;\n }\n\n const style = card.el.style;\n style.setProperty('--mk-x', spring.current.x.toFixed(2));\n style.setProperty('--mk-y', spring.current.y.toFixed(2));\n style.setProperty('--mk-velocity', (spring.velocity.x - spring.velocity.y).toFixed(3));\n }\n }),\n );\n\n return { destroy: () => scope.dispose() };\n}\n","/*\n * IntersectionObserver helpers. Chromium only reports an entry as intersecting\n * once it crosses the first threshold; Firefox and Safari report the first\n * visible pixel. Entrances check the share themselves so they start at the same\n * point everywhere.\n */\n\n/** Thresholds that keep reporting while a block moves through the screen (and `threshold` itself). */\nexport function thresholds(threshold: number): number[] {\n const steps = Array.from({ length: 11 }, (_, i) => i / 10);\n return [...new Set([...steps, threshold])].sort((a, b) => a - b);\n}\n\n/** `threshold` of the target shows — or, for a target taller than the screen, that share of the screen. */\nexport function shows(entry: IntersectionObserverEntry, threshold: number): boolean {\n if (!entry.isIntersecting) return false;\n if (entry.intersectionRatio >= threshold) return true;\n return entry.rootBounds ? entry.intersectionRect.height >= entry.rootBounds.height * threshold : false;\n}\n","import { wrap } from '../../core/math';\n\nexport const FRICTION = 0.85;\n\n/** X of slide k relative to the viewport's left edge, wrapped so the track loops. */\nexport function slideX(k: number, offset: number, step: number, length: number) {\n return wrap(k * step - offset + step, length) - step;\n}\n\n/** Where the offset ends if velocity v (px/frame, applied as offset -= v) decays by f each frame. */\nexport const restingOffset = (offset: number, v: number, f = FRICTION) => offset - (v * f) / (1 - f);\n\n/** Velocity that makes restingOffset(offset, v) === target. */\nexport const velocityFor = (target: number, offset: number, f = FRICTION) => -((target - offset) * (1 - f)) / f;\n\n/** Offset that centres the slide nearest to the projected rest; `dir` forces ±1 slide from the current one. */\nexport function snapOffset(offset: number, v: number, step: number, center: number, f = FRICTION, dir = 0) {\n const base = dir === 0 ? restingOffset(offset, v, f) : offset;\n return (Math.round((base + center) / step) + dir) * step - center;\n}\n","import { registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { whileVisible } from '../../core/loop';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { shows, thresholds } from '../../core/visible';\nimport { wrap } from '../../core/math';\nimport { FRICTION, slideX, snapOffset } from './carousel-math';\n\n/*\n * curved-carousel: offset with friction .85, drag follows the pointer,\n * release multiplies the velocity and snaps to the slide nearest the projected\n * rest. Slides loop by wrapping their x; CSS turns the distance from the centre\n * (`--mk-t`) into the arc (see curved-carousel.css).\n */\n\nexport interface CurvedCarouselOptions {\n /** Slides inside the root. */\n slideSelector?: string;\n /** Per-frame velocity decay (0–1). */\n friction?: number;\n /** Multiplier applied to the release velocity before snapping. */\n throwBoost?: number;\n /** Horizontal wheel / trackpad factor. */\n wheel?: number;\n /** Movement below this many px counts as a tap (click), not a drag. */\n tapDistance?: number;\n startIndex?: number;\n /** Tap/click or Enter on a slide. */\n onSelect?: (index: number, slide: HTMLElement) => void;\n}\n\nexport interface CurvedCarouselInstance extends Instance {\n next(): void;\n prev(): void;\n goTo(index: number): void;\n /** Index of the slide closest to the centre. */\n readonly index: number;\n}\n\nexport function createCurvedCarousel(root: HTMLElement | null, options: CurvedCarouselOptions = {}): CurvedCarouselInstance {\n const o = {\n slideSelector: '[data-mk-slide]',\n friction: FRICTION,\n throwBoost: 2,\n wheel: 0.2,\n tapDistance: 6,\n startIndex: 0,\n ...options,\n };\n o.friction = Math.min(0.99, Math.max(0.5, o.friction));\n const slides = root ? [...root.querySelectorAll<HTMLElement>(o.slideSelector)] : [];\n const count = slides.length;\n if (!root || !count) {\n warnOnce(`curved-carousel: no \"${o.slideSelector}\" inside the root`);\n return inert({ next() {}, prev() {}, goTo() {}, index: 0 });\n }\n\n registerMotion();\n const scope = createScope();\n root.dataset.mkCarousel = '';\n slides.forEach((slide, k) => slide.style.setProperty('--mk-k', String(k)));\n scope.add(() => {\n delete root.dataset.mkCarousel;\n delete root.dataset.mkReady;\n delete root.dataset.mkInview;\n slides.forEach((slide) => ['--mk-k', '--mk-x', '--mk-t'].forEach((name) => slide.style.removeProperty(name)));\n });\n\n let rootW = 0;\n let slideW = 0;\n let step = 1;\n let length = count;\n let center = 0;\n let offset = 0;\n let v = 0;\n let target: number | null = null;\n let measured = false;\n\n let down = false;\n let dragDelta = 0;\n let lastX = 0;\n let travelled = 0;\n let suppressClick = false;\n let wheelTimer: ReturnType<typeof setTimeout> | undefined;\n scope.add(() => clearTimeout(wheelTimer));\n\n const render = () => {\n for (let k = 0; k < count; k++) {\n const x = slideX(k, offset, step, length);\n const style = slides[k]!.style;\n style.setProperty('--mk-x', x.toFixed(2));\n style.setProperty('--mk-t', (x + slideW / 2 - rootW / 2).toFixed(2));\n }\n };\n\n /** Offset that centres slide k, picking the loop copy nearest to the current offset. */\n const centred = (k: number) => {\n const base = k * step - center;\n return base + Math.round((offset - base) / length) * length;\n };\n\n const settleTo = (next: number) => {\n target = next;\n if (!reduced()) return;\n offset = next;\n target = null;\n v = 0;\n render();\n };\n\n const measure = () => {\n const previousCenter = center;\n rootW = root.clientWidth;\n slideW = slides[0]!.offsetWidth;\n const gap = parseFloat(getComputedStyle(root).columnGap) || 16;\n const index = measured ? (offset + previousCenter) / step : o.startIndex;\n step = slideW + gap || 1;\n length = count * step;\n center = (rootW - slideW) / 2;\n offset = index * step - center;\n if (target !== null) target = Math.round((target + previousCenter) / step) * step - center;\n measured = true;\n render();\n };\n\n const tick = (dt: number) => {\n if (down) {\n v = dragDelta;\n dragDelta = 0;\n offset -= v;\n } else if (target !== null) {\n // Geometric approach to the snap point: using velocity decay.\n const next = offset + (target - offset) * (1 - Math.pow(o.friction, dt));\n v = offset - next;\n offset = next;\n if (Math.abs(target - offset) < 0.1) {\n offset = target;\n target = null;\n v = 0;\n }\n } else if (Math.abs(v) > 0.01) {\n v *= Math.pow(o.friction, dt);\n offset -= v * dt;\n } else {\n return;\n }\n render();\n };\n\n // Drag (window listeners so the drag survives leaving the carousel)\n scope.on(root, 'pointerdown', (e: PointerEvent) => {\n if (e.button !== 0) return;\n if (e.pointerType === 'mouse') e.preventDefault();\n down = true;\n target = null;\n dragDelta = 0;\n travelled = 0;\n lastX = e.clientX;\n });\n scope.on(\n window,\n 'pointermove',\n (e: PointerEvent) => {\n if (!down) return;\n const dx = e.clientX - lastX;\n lastX = e.clientX;\n dragDelta += dx;\n travelled += Math.abs(dx);\n },\n { passive: true },\n );\n const release = (cancelled: boolean) => {\n if (!down) return;\n down = false;\n suppressClick = travelled > o.tapDistance;\n const throwV = cancelled || reduced() ? 0 : v * o.throwBoost;\n settleTo(snapOffset(offset, throwV, step, center, o.friction));\n };\n scope.on(window, 'pointerup', () => release(false));\n scope.on(window, 'pointercancel', () => release(true));\n\n // A drag must not count as a click on the slide under the pointer.\n scope.on(\n root,\n 'click',\n (e: MouseEvent) => {\n if (!suppressClick) return;\n suppressClick = false;\n e.preventDefault();\n e.stopPropagation();\n },\n true,\n );\n scope.on(root, 'click', (e: MouseEvent) => {\n const slide = (e.target as Element).closest<HTMLElement>(o.slideSelector);\n if (slide && root.contains(slide)) o.onSelect?.(slides.indexOf(slide), slide);\n });\n\n // Horizontal wheel / trackpad\n scope.on(\n root,\n 'wheel',\n (e: WheelEvent) => {\n if (Math.abs(e.deltaX) <= Math.abs(e.deltaY)) return;\n e.preventDefault();\n target = null;\n if (reduced()) {\n offset += e.deltaX;\n render();\n } else {\n v -= e.deltaX * o.wheel;\n }\n clearTimeout(wheelTimer);\n wheelTimer = setTimeout(() => settleTo(snapOffset(offset, v, step, center, o.friction)), 150);\n },\n { passive: false },\n );\n\n // Keyboard: arrows step one slide; focusing a slide centres it.\n const stepBy = (dir: 1 | -1) => settleTo(snapOffset(target ?? offset, 0, step, center, o.friction, dir));\n scope.on(root, 'keydown', (e: KeyboardEvent) => {\n if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;\n e.preventDefault();\n stepBy(e.key === 'ArrowLeft' ? -1 : 1);\n });\n scope.on(root, 'focusin', (e: FocusEvent) => {\n const slide = (e.target as Element).closest<HTMLElement>(o.slideSelector);\n if (!slide || down) return;\n settleTo(centred(slides.indexOf(slide)));\n });\n\n scope.observe(new ResizeObserver(measure)).observe(root);\n scope\n .observe(\n new IntersectionObserver(\n ([entry]) => {\n if (entry && shows(entry, 0.2)) root.dataset.mkInview = '';\n },\n { threshold: thresholds(0.2) },\n ),\n )\n .observe(root);\n scope.add(whileVisible(root, tick));\n measure();\n root.dataset.mkReady = '';\n\n return {\n destroy: () => scope.dispose(),\n next: () => stepBy(1),\n prev: () => stepBy(-1),\n goTo: (index: number) => settleTo(centred(wrap(Math.round(index), count))),\n get index() {\n return wrap(Math.round(((target ?? offset) + center) / step), count);\n },\n };\n}\n","export interface PileLayer {\n rotation: number;\n offsetX: number;\n offsetY: number;\n}\n\nfunction mulberry32(seed: number) {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** stack transforms, seeded so SSR output is stable. Layer 0 is the back. */\nexport function pileLayers(count: number, seed: number): PileLayer[] {\n const rand = mulberry32(seed + 1);\n const range = (min: number, max: number) => rand() * (max - min) + min;\n return Array.from({ length: count }, (_, i) => ({\n rotation: range(2, 5) * ((i % 2) * 2 - 1),\n offsetX: range(4, 10) * (rand() < 0.5 ? -1 : 1),\n offsetY: (count - i) * 5,\n }));\n}\n","import { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { shows, thresholds } from '../../core/visible';\nimport type { PileLayer } from './pile-math';\n\nexport { pileLayers, type PileLayer } from './pile-math';\n\n/*\n * pile: a pile of two or three rotated layers that\n * scale in (CSS, elastic) once the pile scrolls into view. The rotations are\n * generated once with `pileLayers()` and written into the markup with\n * `pileStyle()`, so server and client render the same pile.\n */\n\nexport interface PileOptions {\n /** Fraction of the pile that must be visible before it scales in. */\n threshold?: number;\n}\n\nexport type PileInstance = Instance;\n\n/** Inline style for a back layer: `style={pileStyle(layer)}`. */\nexport const pileStyle = (layer: PileLayer) =>\n `--mk-rot:${layer.rotation.toFixed(2)};--mk-px:${layer.offsetX.toFixed(2)};--mk-py:${layer.offsetY}`;\n\nexport function createPile(root: HTMLElement | null, options: PileOptions = {}): PileInstance {\n if (!root) {\n warnOnce('pile: missing root');\n return inert();\n }\n const scope = createScope();\n const threshold = Math.min(1, Math.max(0, options.threshold ?? 0.25));\n const io = scope.observe(\n new IntersectionObserver(\n ([entry]) => {\n if (!entry || !shows(entry, threshold)) return;\n root.dataset.mkInview = '';\n io.disconnect();\n },\n { threshold: thresholds(threshold) },\n ),\n );\n io.observe(root);\n root.dataset.mkReady = '';\n scope.add(() => {\n delete root.dataset.mkInview;\n delete root.dataset.mkReady;\n });\n return { destroy: () => scope.dispose() };\n}\n","import { gsap, ELASTIC, ScrollTrigger, SplitText, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * words: every word (or letter) grows from its baseline,\n * scaleY 0 → 1 and 25 % up → 0, elastic, 100 ms apart (60 ms for letters).\n */\n\nexport interface WordsOptions {\n by?: 'words' | 'chars';\n /** 'scroll' plays when the element enters the viewport; 'load' plays now; 'manual' waits for reveal(). */\n trigger?: 'scroll' | 'load' | 'manual';\n /** ScrollTrigger start for trigger 'scroll'. */\n start?: string;\n duration?: number;\n stagger?: number;\n delay?: number;\n}\n\nexport interface WordsInstance extends Instance {\n /** Play the entrance (splits first if needed). */\n reveal(delay?: number): void;\n /** Change the text (e.g. language switch) and replay the entrance. */\n replace(mutate: () => void): void;\n}\n\nconst HIDDEN = { scaleY: 0, yPercent: 25 };\n\nexport function createWords(el: HTMLElement | null, options: WordsOptions = {}): WordsInstance {\n if (!el) {\n warnOnce('words: missing element');\n return inert({ reveal() {}, replace(mutate: () => void) { mutate(); } });\n }\n const letters = options.by === 'chars';\n const o = {\n trigger: 'scroll' as const,\n start: 'top 88%',\n duration: 0.8,\n stagger: letters ? 0.06 : 0.1,\n delay: 0,\n ...options,\n };\n\n registerMotion();\n let split: SplitText | null = null;\n let scroll: ScrollTrigger | null = null;\n let destroyed = false;\n\n const units = () => (split ? ((letters ? split.chars : split.words) as HTMLElement[]) : []);\n // SplitText needs rendered text: a closed <dialog> or display:none parent loses word spaces.\n const rendered = () => el.getClientRects().length > 0;\n\n const prepare = () => {\n split = SplitText.create(el, {\n type: letters ? 'chars' : 'words',\n charsClass: 'mk-w',\n wordsClass: 'mk-w',\n // Headings get an aria-label; inline elements stay readable as they are.\n aria: /^H[1-6]$/.test(el.tagName) ? 'auto' : 'none',\n smartWrap: letters,\n });\n const list = units();\n if (list.length) gsap.set(list, { transformOrigin: '50% 100%', ...HIDDEN });\n };\n\n const release = () => {\n if (!split) return;\n gsap.killTweensOf(units());\n split.revert();\n split = null;\n };\n\n function reveal(delay = o.delay) {\n if (destroyed) return;\n scroll?.kill();\n scroll = null;\n if (!entrances()) return;\n if (!split) prepare();\n const list = units();\n if (!list.length) return;\n gsap.killTweensOf(list);\n gsap.fromTo(list, HIDDEN, { scaleY: 1, yPercent: 0, duration: o.duration, ease: ELASTIC, stagger: o.stagger, delay });\n }\n\n function replace(mutate: () => void) {\n release();\n mutate();\n if (entrances() && rendered()) {\n prepare();\n reveal(0);\n }\n }\n\n if (entrances() && rendered()) prepare();\n el.dataset.mkReady = '';\n\n if (o.trigger === 'load') reveal(o.delay || 0.2);\n else if (o.trigger === 'scroll' && entrances()) {\n scroll = ScrollTrigger.create({ trigger: el, start: o.start, end: 'max', once: true, onEnter: () => reveal() });\n }\n\n return {\n reveal,\n replace,\n destroy() {\n if (destroyed) return;\n destroyed = true;\n scroll?.kill();\n release();\n delete el.dataset.mkReady;\n },\n };\n}\n","import { gsap, ScrollTrigger, registerMotion } from '../../core/gsap';\nimport { flowIn, type FlowInOptions } from '../../motion/flow';\nimport { entrances } from '../../core/reduced';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/* flowIn on a container: its children drop in from 20 px above, blurred 16 px, 0.5 s, 50 ms apart. */\n\nexport interface FlowOptions extends FlowInOptions {\n trigger?: 'scroll' | 'load' | 'manual';\n start?: string;\n}\n\nexport interface FlowInstance extends Instance {\n play(): void;\n}\n\nexport { flowIn };\n\n/** Flow the container's children in, on scroll by default. */\nexport function createFlow(container: HTMLElement | null, options: FlowOptions = {}): FlowInstance {\n if (!container) {\n warnOnce('flow: missing container');\n return inert({ play() {} });\n }\n registerMotion();\n const children = [...container.children] as HTMLElement[];\n const animate = entrances() && children.length > 0;\n const ctx = gsap.context(() => {});\n let played = !animate;\n\n const play = () => {\n if (played) return;\n played = true;\n ctx.add(() => flowIn(children, options));\n };\n\n if (animate) {\n ctx.add(() => {\n gsap.set(children, { autoAlpha: 0 });\n if (options.trigger === 'load') play();\n else if (options.trigger !== 'manual') {\n ScrollTrigger.create({ trigger: container, start: options.start ?? 'top 88%', end: 'max', once: true, onEnter: play });\n }\n });\n }\n container.dataset.mkReady = '';\n\n return {\n play,\n destroy() {\n ctx.revert();\n delete container.dataset.mkReady;\n },\n };\n}\n","import { gsap, ELASTIC, ScrollTrigger, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/* Elastic scale-in for a single element (scale .7 → 1). */\n\nexport interface PopOptions {\n scale?: number;\n duration?: number;\n delay?: number;\n trigger?: 'scroll' | 'load' | 'manual';\n start?: string;\n}\n\nexport interface PopInstance extends Instance {\n play(): void;\n}\n\nexport function createPop(el: HTMLElement | null, options: PopOptions = {}): PopInstance {\n if (!el) {\n warnOnce('pop: missing element');\n return inert({ play() {} });\n }\n registerMotion();\n const { scale = 0.7, duration = 1.1, delay = 0, trigger = 'scroll', start = 'top 85%' } = options;\n const animate = entrances();\n const ctx = gsap.context(() => {});\n let played = !animate;\n\n const play = () => {\n if (played) return;\n played = true;\n ctx.add(() => gsap.to(el, { scale: 1, autoAlpha: 1, duration, delay, ease: ELASTIC }));\n };\n\n if (animate) {\n ctx.add(() => {\n gsap.set(el, { scale, autoAlpha: 0 });\n if (trigger === 'load') play();\n else if (trigger !== 'manual') ScrollTrigger.create({ trigger: el, start, end: 'max', once: true, onEnter: play });\n });\n }\n el.dataset.mkReady = '';\n\n return {\n play,\n destroy() {\n ctx.revert();\n delete el.dataset.mkReady;\n },\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/* Size a one-line element so it spans its parent's content box (giant \"Portfolio\" / footer words). */\n\nexport interface FitTextOptions {\n /** Fraction of the available width to use; leaves room for side bearings. */\n safety?: number;\n}\n\nexport interface FitTextInstance extends Instance {\n refit(): void;\n}\n\nexport function createFitText(el: HTMLElement | null, options: FitTextOptions = {}): FitTextInstance {\n const parent = el?.parentElement;\n if (!el || !parent) {\n warnOnce('fit-text: element needs a parent');\n return inert({ refit() {} });\n }\n const safety = Math.min(1, Math.max(0.5, options.safety ?? 0.995));\n const scope = createScope();\n const previousSize = el.style.fontSize;\n\n const refit = () => {\n const style = getComputedStyle(parent);\n const available = parent.clientWidth - parseFloat(style.paddingLeft || '0') - parseFloat(style.paddingRight || '0');\n el.style.fontSize = '100px';\n const width = el.getBoundingClientRect().width;\n if (width > 0 && available > 0) el.style.fontSize = `${(100 * available * safety) / width}px`;\n else el.style.fontSize = previousSize;\n };\n\n // Refit on width changes only; the height change caused by fitting must not loop.\n let lastWidth = -1;\n scope\n .observe(\n new ResizeObserver(([entry]) => {\n const width = entry?.contentRect.width ?? 0;\n if (width === lastWidth) return;\n lastWidth = width;\n refit();\n }),\n )\n .observe(parent);\n refit();\n el.dataset.mkReady = '';\n scope.add(() => {\n el.style.fontSize = previousSize;\n if (!el.getAttribute('style')) el.removeAttribute('style');\n delete el.dataset.mkReady;\n });\n\n return { refit, destroy: () => scope.dispose() };\n}\n","import { registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { whileVisible } from '../../core/loop';\nimport { damp, mapRange } from '../../core/math';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * stretch-footer: fixed behind the page and revealed by a 100dvh\n * \"phantom\" at the end of the flow. Smoothed scroll g = damp(g, scrollY, λ)\n * drives the title's scaleY (0 → 1) and lifts the footer from \"title on the\n * bottom edge\" to its resting place.\n */\n\nexport interface StretchFooterOptions {\n /** Spacer at the end of the flow; defaults to `[data-mk-phantom]` in the document. */\n phantom?: HTMLElement | null;\n /** Stretching title; defaults to `[data-mk-footer-title]` inside the footer. */\n title?: HTMLElement | null;\n /** Scroll smoothing (higher follows faster). */\n lambda?: number;\n}\n\nexport type StretchFooterInstance = Instance;\n\nexport function createStretchFooter(footer: HTMLElement | null, options: StretchFooterOptions = {}): StretchFooterInstance {\n const phantom = options.phantom ?? document.querySelector<HTMLElement>('[data-mk-phantom]');\n const title = options.title ?? footer?.querySelector<HTMLElement>('[data-mk-footer-title]') ?? null;\n if (!footer || !phantom || !title) {\n warnOnce('stretch-footer: needs the footer, a [data-mk-phantom] spacer and a [data-mk-footer-title]');\n return inert();\n }\n registerMotion();\n const scope = createScope();\n footer.dataset.mkReady = '';\n scope.add(() => {\n delete footer.dataset.mkReady;\n footer.style.removeProperty('--mk-footer-scale');\n footer.style.removeProperty('--mk-footer-offset');\n if (!footer.getAttribute('style')) footer.removeAttribute('style');\n });\n if (reduced()) return { destroy: () => scope.dispose() };\n\n const lambda = options.lambda ?? 0.9;\n let phantomTop = 0;\n let titleBottom = 0;\n let viewport = innerHeight;\n let g = scrollY;\n\n const measure = () => {\n phantomTop = phantom.offsetTop;\n titleBottom = title.offsetTop + title.offsetHeight;\n viewport = innerHeight;\n };\n measure();\n scope.observe(new ResizeObserver(measure)).observe(document.body);\n scope.on(window, 'resize', measure);\n\n const update = (dt: number) => {\n g = damp(g, scrollY, lambda, dt);\n const start = phantomTop - viewport;\n footer.style.setProperty('--mk-footer-scale', mapRange(g, start, phantomTop, 0, 1, true).toFixed(4));\n footer.style.setProperty('--mk-footer-offset', mapRange(g, start, phantomTop, viewport - titleBottom, 0, true).toFixed(2));\n };\n update(100); // settle on the current scroll position before the first frame\n scope.add(whileVisible(phantom, update, '0px'));\n\n return { destroy: () => scope.dispose() };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * radial-menu: options fan out in an arc from a\n * round toggle (CSS trig on --mk-i), elastic, 50 ms apart. Closed options are\n * `inert`, so they are skipped by Tab and screen readers.\n */\n\nexport interface RadialMenuOptions {\n /** Distance of the options from the toggle (any CSS length). */\n radius?: string;\n /** Angle of the first option, radians (π/2 → left, 0 → down). */\n startAngle?: number;\n /** Angle between options, radians. */\n spacing?: number;\n closeOnOutside?: boolean;\n onToggle?: (open: boolean) => void;\n}\n\nexport interface RadialMenuInstance extends Instance {\n open(): void;\n close(): void;\n toggle(): void;\n readonly isOpen: boolean;\n}\n\nconst noop = { open() {}, close() {}, toggle() {}, isOpen: false };\n\nexport function createRadialMenu(root: HTMLElement | null, options: RadialMenuOptions = {}): RadialMenuInstance {\n const toggleEl = root?.querySelector<HTMLElement>('[data-mk-toggle]');\n const items = root ? [...root.querySelectorAll<HTMLElement>('[data-mk-item]')] : [];\n if (!root || !toggleEl || !items.length) {\n warnOnce('radial-menu: needs a [data-mk-toggle] and at least one [data-mk-item]');\n return inert(noop);\n }\n const scope = createScope();\n\n // Remember what we overwrite so destroy() can put it back.\n const expandedBefore = toggleEl.getAttribute('aria-expanded');\n const inertBefore = items.map((item) => item.hasAttribute('inert'));\n const vars: Array<[string, string | undefined]> = [\n ['--mk-radius', options.radius],\n ['--mk-start', options.startAngle?.toString()],\n ['--mk-spacing', options.spacing?.toString()],\n ];\n vars.forEach(([name, value]) => value !== undefined && root.style.setProperty(name, value));\n items.forEach((item, i) => item.style.setProperty('--mk-i', String(i)));\n\n let open = false;\n const set = (next: boolean) => {\n open = next;\n root.toggleAttribute('data-mk-open', open);\n toggleEl.setAttribute('aria-expanded', String(open));\n items.forEach((item) => (item.inert = !open));\n options.onToggle?.(open);\n };\n set(false);\n\n scope.on(toggleEl, 'click', () => set(!open));\n scope.on(root, 'keydown', (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || !open) return;\n set(false);\n toggleEl.focus();\n });\n if (options.closeOnOutside ?? true) {\n scope.on(document, 'pointerdown', (e: PointerEvent) => {\n if (open && !root.contains(e.target as Node)) set(false);\n });\n }\n root.dataset.mkReady = '';\n\n scope.add(() => {\n root.removeAttribute('data-mk-open');\n delete root.dataset.mkReady;\n if (expandedBefore === null) toggleEl.removeAttribute('aria-expanded');\n else toggleEl.setAttribute('aria-expanded', expandedBefore);\n items.forEach((item, i) => {\n item.inert = inertBefore[i]!;\n item.style.removeProperty('--mk-i');\n if (!item.getAttribute('style')) item.removeAttribute('style');\n });\n vars.forEach(([name]) => root.style.removeProperty(name));\n if (!root.getAttribute('style')) root.removeAttribute('style');\n });\n\n return {\n open: () => set(true),\n close: () => set(false),\n toggle: () => set(!open),\n get isOpen() {\n return open;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { TIMING } from '../../core/timing';\nimport { slideIndicator } from '../../motion/indicator';\n\n/*\n * Tabs: an indicator slides onto the selected tab in 0.45 s on\n * the signature curve; a scrolling tab list centres the selection. Arrow keys\n * (by orientation), Home and End move the selection.\n */\n\nexport interface TabsOptions {\n orientation?: 'horizontal' | 'vertical';\n duration?: number;\n onSelect?: (index: number, tab: HTMLElement) => void;\n}\n\nexport interface TabsInstance extends Instance {\n select(index: number): void;\n readonly index: number;\n}\n\nexport function createTabs(root: HTMLElement | null, options: TabsOptions = {}): TabsInstance {\n const tabs = root ? [...root.querySelectorAll<HTMLElement>('[data-mk-tab]')] : [];\n if (!root || !tabs.length) {\n warnOnce('tabs: needs at least one [data-mk-tab]');\n return inert({ select() {}, index: 0 });\n }\n registerMotion();\n const { orientation = 'horizontal', duration = TIMING.indicator } = options;\n const indicator = root.querySelector<HTMLElement>('[data-mk-indicator]');\n const scope = createScope();\n const ctx = gsap.context(() => {});\n let index = Math.max(0, tabs.findIndex((tab) => tab.getAttribute('aria-selected') === 'true'));\n\n scope.attr(root, 'role', 'tablist');\n if (orientation === 'vertical') scope.attr(root, 'aria-orientation', 'vertical');\n\n const render = (immediate: boolean) => {\n tabs.forEach((tab, i) => {\n scope.attr(tab, 'role', 'tab');\n scope.attr(tab, 'aria-selected', String(i === index));\n scope.attr(tab, 'tabindex', i === index ? '0' : '-1');\n });\n if (indicator) ctx.add(() => slideIndicator(indicator, tabs[index], { immediate, duration, scroller: root, orientation }));\n };\n\n const select = (next: number, focus = false) => {\n const target = Math.min(tabs.length - 1, Math.max(0, next));\n if (focus) tabs[target].focus();\n if (target === index) return;\n index = target;\n render(false);\n root.dispatchEvent(new CustomEvent('mk:tab', { detail: { index, tab: tabs[index] }, bubbles: true }));\n options.onSelect?.(index, tabs[index]);\n };\n\n scope.on(root, 'click', (event) => {\n const tab = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-tab]');\n const at = tab ? tabs.indexOf(tab) : -1;\n if (at >= 0) select(at);\n });\n scope.on(root, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const back = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n const forward = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const moves: Record<string, number> = { [back]: index - 1, [forward]: index + 1, Home: 0, End: tabs.length - 1 };\n if (!(key in moves)) return;\n event.preventDefault();\n select(moves[key], true);\n });\n if (typeof ResizeObserver === 'function') {\n scope.observe(new ResizeObserver(() => render(true))).observe(root);\n }\n\n render(true);\n root.dataset.mkReady = '';\n\n return {\n select: (next: number) => select(next),\n get index() {\n return index;\n },\n destroy() {\n scope.dispose();\n ctx.revert();\n delete root.dataset.mkReady;\n },\n };\n}\n","import { gsap, ScrollTrigger, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { TIMING } from '../../core/timing';\nimport { countTo } from '../../motion/count';\n\n/* animated number: counts to its value with `numberSoft` (0.6 s), from the value shown. */\n\nexport interface CounterOptions {\n /** Final value. Default: the number written in the element. */\n to?: number;\n from?: number;\n duration?: number;\n decimals?: number;\n /** Intl locale for grouping and decimals. Default: the browser's. */\n locale?: string;\n prefix?: string;\n suffix?: string;\n trigger?: 'scroll' | 'load' | 'manual';\n start?: string;\n}\n\nexport interface CounterInstance extends Instance {\n /** Count from the start value to `to`. */\n play(): void;\n /** Count from the value shown to `value`. */\n set(value: number): void;\n}\n\nexport function createCounter(el: HTMLElement | null, options: CounterOptions = {}): CounterInstance {\n if (!el) {\n warnOnce('counter: missing element');\n return inert({ play() {}, set() {} });\n }\n registerMotion();\n const original = el.textContent ?? '';\n const parsed = Number(original.replace(/[^\\d.-]/g, ''));\n const {\n to = Number.isFinite(parsed) ? parsed : 0,\n from = 0,\n duration = TIMING.number,\n decimals = 0,\n locale,\n prefix = '',\n suffix = '',\n trigger = 'scroll',\n start = 'top 90%',\n } = options;\n const format = (value: number) =>\n prefix + value.toLocaleString(locale, { minimumFractionDigits: decimals, maximumFractionDigits: decimals }) + suffix;\n const ctx = gsap.context(() => {});\n let played = false;\n\n const play = () => {\n if (played) return;\n played = true;\n ctx.add(() => countTo(el, to, { from, duration, format }));\n };\n\n if (entrances()) {\n el.textContent = format(from);\n ctx.add(() => {\n if (trigger === 'load') play();\n else if (trigger !== 'manual') ScrollTrigger.create({ trigger: el, start, end: 'max', once: true, onEnter: play });\n });\n } else {\n played = true;\n el.textContent = format(to);\n }\n el.dataset.mkReady = '';\n\n return {\n play,\n set(value: number) {\n played = true;\n ctx.add(() => countTo(el, value, { duration, format }));\n },\n destroy() {\n ctx.revert();\n el.textContent = original;\n delete el.dataset.mkReady;\n },\n };\n}\n","import { inert, warnOnce, type Instance } from '../../core/types';\nimport { installDetailsMotion } from '../../motion/details';\n\n/*\n * Details for every <details> under `root` (or `root` itself):\n * height and content fade in 0.32 s on the signature curve, chevron 180° in 0.25 s.\n */\n\nexport type DetailsInstance = Instance;\n\nexport function createDetails(root: HTMLElement | null): DetailsInstance {\n if (!root) {\n warnOnce('details: missing root');\n return inert();\n }\n const uninstall = installDetailsMotion(root);\n root.dataset.mkReady = '';\n let destroyed = false;\n return {\n destroy() {\n if (destroyed) return;\n destroyed = true;\n uninstall();\n delete root.dataset.mkReady;\n },\n };\n}\n","import { entrances } from '../../core/reduced';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { revealFrom, type RevealHandle, type RevealSpeed } from '../../motion/reveal';\n\n/*\n * reveal on an element: a veil in its own colour opens like a wave\n * from the origin (an element, else the last pointer position, else the centre).\n */\n\nexport interface RevealRecipeOptions {\n speed?: RevealSpeed;\n /** CSS selector of the origin element (searched in the document). */\n origin?: string;\n delay?: number;\n trigger?: 'manual' | 'load';\n}\n\nexport interface RevealInstance extends Instance {\n /** Play the wave, optionally from another origin. */\n play(origin?: Element | { x: number; y: number }): void;\n}\n\nexport function createReveal(el: HTMLElement | null, options: RevealRecipeOptions = {}): RevealInstance {\n if (!el) {\n warnOnce('reveal: missing element');\n return inert({ play() {} });\n }\n const { speed = 'normal', delay = 0, trigger = 'manual' } = options;\n let handle: RevealHandle | null = null;\n\n const play = (origin?: Element | { x: number; y: number }) => {\n handle?.cancel();\n const from = origin ?? (options.origin ? document.querySelector(options.origin) : undefined);\n handle = revealFrom(el, { speed, delay, origin: from });\n };\n\n if (trigger === 'load' && entrances()) play();\n el.dataset.mkReady = '';\n\n return {\n play,\n destroy() {\n handle?.cancel();\n handle = null;\n delete el.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { TIMING } from '../../core/timing';\nimport { captureLayout, reflowLayout, type CapturedLayout } from '../../motion/layout';\n\n/*\n * layout reflow on a list: call `capture()` before changing the DOM\n * and `play()` after it; moved items travel on a spring and new ones grow in.\n * Give items a stable `data-flip-id` so moves pair up.\n */\n\nexport interface ReflowOptions {\n selector?: string;\n duration?: number;\n}\n\nexport interface ReflowInstance extends Instance {\n capture(): void;\n play(): void;\n}\n\nexport function createReflow(root: HTMLElement | null, options: ReflowOptions = {}): ReflowInstance {\n if (!root) {\n warnOnce('reflow: missing root');\n return inert({ capture() {}, play() {} });\n }\n registerMotion();\n const { selector = '[data-mk-item]', duration = TIMING.layoutTravel } = options;\n const ctx = gsap.context(() => {});\n let captured: CapturedLayout | null = null;\n root.dataset.mkReady = '';\n\n return {\n capture() {\n captured = captureLayout(root, selector);\n },\n play() {\n if (!captured) return;\n const state = captured;\n captured = null;\n ctx.add(() => reflowLayout(root, selector, state, { duration }));\n },\n destroy() {\n ctx.revert();\n captured = null;\n delete root.dataset.mkReady;\n },\n };\n}\n","import { reduced } from '../../core/reduced';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { TIMING } from '../../core/timing';\nimport { splitGraphemes } from '../../core/split';\n\n/*\n * Slot text: when the text changes, each letter\n * that differs rolls out and the new one rolls in (300 ms, a springy curve),\n * with a slight deterministic tilt (≤ 5°) and a 45 ms cascade; letter boxes ease\n * to their new width. Letters are grouped by word so lines only break between\n * words. Screen readers get a plain copy; the rolling letters are aria-hidden.\n */\n\nexport interface SlotTextOptions {\n direction?: 'down' | 'up';\n /** ms per letter */\n duration?: number;\n /** ms between letters */\n stagger?: number;\n /** ms between the old letter leaving and the new one entering */\n exitOffset?: number;\n /** ms the letters take to fade */\n colorFade?: number;\n maxTilt?: number;\n /** Initial text. Default: the element's text. Pass it when a framework owns the element (it must render no children). */\n text?: string;\n /** Add a visually hidden plain copy for screen readers (default). Turn off when you render your own. */\n accessibleCopy?: boolean;\n}\n\nexport interface SlotTextInstance extends Instance {\n set(text: string): void;\n readonly text: string;\n}\n\nconst EASING = 'cubic-bezier(0.34, 1.56, 0.64, 1)';\nconst RESIZE_EASING = 'cubic-bezier(0.2, 0, 0, 1)';\nconst BOUNCE = 0.6;\nconst VARIATION = { index: 12.9898, channel: 78.233, seed: 43758.5453, duration: 1, stagger: 2, tilt: 3 };\nconst GLYPH = { tailDuration: 0.75, durationStrength: 0.45, tailStaggerStart: 0.5, tailStaggerStep: 0.25, staggerStrength: 0.25 };\nconst WIDTH = { tailCollapseDelay: 0.55, tailCollapseDuration: 0.6, newSlotExpansion: 0.45, minimumChange: 0.5 };\nconst COMPLETION_BUFFER = 80;\nconst NBSP = ' ';\n\nconst glyph = (letter: string) => (letter === ' ' ? NBSP : letter);\nconst letters = (text: string) => splitGraphemes(text, Number.MAX_SAFE_INTEGER);\n\n/** A stable pseudo-random value in [-1, 1] for a letter and a channel. */\nconst noise = (index: number, channel: number) => {\n const value = Math.sin((index + 1) * VARIATION.index + channel * VARIATION.channel) * VARIATION.seed;\n return (value - Math.floor(value)) * 2 - 1;\n};\n\nconst face = (letter: string) => {\n const element = document.createElement('span');\n element.className = 'mk-slot__face';\n element.textContent = glyph(letter);\n return element;\n};\n\nconst slot = (letter: string) => {\n const element = document.createElement('span');\n element.className = 'mk-slot__char';\n element.dataset.char = letter;\n const sizer = document.createElement('span');\n sizer.className = 'mk-slot__sizer';\n sizer.textContent = glyph(letter);\n element.append(sizer, face(letter));\n return element;\n};\n\n/** Letters grouped by word; a space is the last slot of the word before it. */\nfunction build(target: HTMLElement, text: string) {\n const nodes: HTMLElement[] = [];\n let word: HTMLElement | null = null;\n for (const letter of letters(text)) {\n if (letter === ' ') {\n if (word) word.append(slot(letter));\n else nodes.push(slot(letter));\n word = null;\n continue;\n }\n if (!word) {\n word = document.createElement('span');\n word.className = 'mk-slot__word';\n nodes.push(word);\n }\n word.append(slot(letter));\n }\n target.replaceChildren(...nodes);\n}\n\nexport function createSlotText(el: HTMLElement | null, options: SlotTextOptions = {}): SlotTextInstance {\n if (!el) {\n warnOnce('slot-text: missing element');\n return inert({ set() {}, text: '' });\n }\n const {\n direction = 'down',\n duration: baseDuration = TIMING.slot.durationMs,\n stagger = TIMING.slot.staggerMs,\n exitOffset = TIMING.slot.exitOffsetMs,\n colorFade = TIMING.slot.colorFadeMs,\n maxTilt = TIMING.slot.maxTilt,\n } = options;\n const original = [...el.childNodes];\n const originalText = el.textContent ?? '';\n let text = options.text ?? originalText;\n let timers: number[] = [];\n let destroyed = false;\n\n const copy = document.createElement('span');\n copy.className = 'mk-sr-only';\n copy.textContent = text;\n const track = document.createElement('span');\n track.className = 'mk-slot';\n track.setAttribute('aria-hidden', 'true');\n build(track, text);\n if (options.accessibleCopy === false) {\n track.removeAttribute('aria-hidden');\n el.replaceChildren(track);\n } else el.replaceChildren(copy, track);\n el.dataset.mkReady = '';\n\n const stop = () => {\n for (const timer of timers) clearTimeout(timer);\n timers = [];\n };\n\n const roll = (next: string) => {\n const interrupted = timers.length > 0;\n stop();\n if (interrupted) build(track, text);\n let slots = [...track.querySelectorAll<HTMLElement>('.mk-slot__char')];\n if (!slots.length || reduced()) {\n build(track, next);\n return;\n }\n const current = slots.map((entry) => entry.dataset.char ?? '');\n const target = letters(next);\n for (let index = slots.length; index < Math.max(current.length, target.length); index += 1) {\n const extra = slot('');\n track.append(extra);\n slots = [...slots, extra];\n }\n const firstFilled = slots.find((entry) => (entry.dataset.char ?? '') !== '') ?? slots[0];\n const height = Math.ceil(firstFilled?.getBoundingClientRect().height ?? 0) || 18;\n const changes = slots\n .map((entry, index) => ({\n index,\n slot: entry,\n sizer: entry.querySelector<HTMLElement>('.mk-slot__sizer'),\n previous: entry.querySelector<HTMLElement>('.mk-slot__face'),\n from: current[index] ?? '',\n to: target[index] ?? '',\n width: entry.getBoundingClientRect().width,\n }))\n .filter(({ from, to }) => from !== to);\n if (!changes.length) {\n build(track, next);\n return;\n }\n for (const change of changes) if (change.sizer) change.sizer.textContent = glyph(change.to);\n const measured = changes.map((change) => {\n const width = change.sizer?.getBoundingClientRect().width ?? change.width;\n return { ...change, targetWidth: width, resize: Math.abs(width - change.width) > WIDTH.minimumChange };\n });\n\n const later = (run: () => void, ms: number) => timers.push(window.setTimeout(run, ms));\n const enterFrom = direction === 'down' ? -height : height;\n const exitTo = -enterFrom;\n let completion = 0;\n const planned = measured.map((change) => {\n const tail = change.to === '';\n const vary = (strength: number, channel: number) => 1 + BOUNCE * strength * noise(change.index, channel);\n const duration = Math.round(baseDuration * (tail ? GLYPH.tailDuration : 1) * vary(GLYPH.durationStrength, VARIATION.duration));\n const order = tail ? target.length * GLYPH.tailStaggerStart + (change.index - target.length) * GLYPH.tailStaggerStep : change.index;\n const delay = Math.round(order * stagger * vary(GLYPH.staggerStrength, VARIATION.stagger));\n const tilt = Number((BOUNCE * maxTilt * noise(change.index, VARIATION.tilt)).toFixed(2));\n const minimum = (factor: number) => Math.max(TIMING.slot.minResizeMs, Math.round(duration * factor));\n const widthTiming =\n change.to === ''\n ? { delay: delay + Math.round(duration * WIDTH.tailCollapseDelay), duration: minimum(WIDTH.tailCollapseDuration) }\n : change.from === ''\n ? { delay, duration: minimum(WIDTH.newSlotExpansion) }\n : { delay, duration };\n if (change.resize) change.slot.style.width = `${change.width}px`;\n if (change.from === '' || change.to === '') change.slot.classList.add('is-resizing');\n const incoming = face(change.to);\n incoming.style.transform = `translateY(${enterFrom}px) rotate(${tilt}deg)`;\n incoming.style.opacity = '0';\n change.slot.append(incoming);\n completion = Math.max(completion, change.resize ? widthTiming.delay + widthTiming.duration : 0, delay + exitOffset + duration);\n return { change, duration, delay, tilt, widthTiming, incoming };\n });\n void track.offsetWidth;\n for (const { change, duration, delay, tilt, widthTiming, incoming } of planned) {\n const transition = `transform ${duration}ms ${EASING}, opacity ${colorFade}ms linear`;\n if (change.resize) {\n later(() => {\n change.slot.style.transition = `width ${widthTiming.duration}ms ${RESIZE_EASING}`;\n change.slot.style.width = `${change.targetWidth}px`;\n }, widthTiming.delay);\n }\n if (change.previous) {\n const previous = change.previous;\n later(() => {\n previous.style.transition = transition;\n previous.style.transform = `translateY(${exitTo}px) rotate(${-tilt}deg)`;\n previous.style.opacity = '0';\n }, delay);\n }\n later(() => {\n incoming.style.transition = transition;\n incoming.style.transform = 'translateY(0) rotate(0deg)';\n incoming.style.opacity = '1';\n }, delay + exitOffset);\n }\n later(() => {\n timers = [];\n build(track, next);\n }, completion + COMPLETION_BUFFER);\n };\n\n return {\n set(next: string) {\n if (destroyed || next === text) return;\n roll(next);\n text = next;\n copy.textContent = next;\n },\n get text() {\n return text;\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n stop();\n if (text === originalText) el.replaceChildren(...original);\n else el.textContent = text;\n delete el.dataset.mkReady;\n },\n };\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { clearStyles } from '../../core/styles';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { captureLayout, reflowLayout } from '../../motion/layout';\n\n/*\n * Drag reorder for lists and groups. Past 6 px\n * the item lifts (0.18 s) into a floating copy that follows the pointer on a\n * spring (1100/38, heavier when bigger) and tilts with its speed (spring\n * 170/13, up to 14°); the item it left is a hidden slot. The others never\n * change place in the DOM while dragging: they slide (0.62 s, spring .52) to\n * open a gap where the item would land. On release the copy lands in its new\n * place (0.42 s, spring .62) and the list is reordered: by the engine\n * (`mutate`, vanilla) or by the app (`onReorder`, then the engine waits for the\n * DOM to change). Edges auto-scroll (56 px, up to 16 px a frame); Escape\n * cancels; on touch only [data-mk-sort-handle] drags, so the list still\n * scrolls. Keyboard (added): Space/Enter lifts, arrows move, Space/Enter drops,\n * Escape cancels, each step announced.\n * Parts: [data-mk-sortable-group] (optional; data-mk-sortable-locked refuses\n * drops), [data-mk-item] with data-mk-id, [data-mk-sort-handle].\n */\n\nexport interface SortableLabels {\n lifted?: (position: number, total: number) => string;\n moved?: (position: number, total: number, group: string) => string;\n dropped?: (position: number, total: number) => string;\n cancelled?: string;\n}\n\nexport interface SortableOptions {\n /** Reorder the DOM on drop (default). Off when a framework renders the list: answer onReorder. */\n mutate?: boolean;\n /** Drag only from [data-mk-sort-handle] (always so on touch screens). */\n handle?: boolean;\n autoScroll?: boolean;\n /** The floating copy's spring (default: 1100 / 38). */\n follow?: { stiffness?: number; damping?: number };\n labels?: SortableLabels;\n onReorder?: (detail: ReorderDetail) => void;\n}\n\nexport interface ReorderDetail {\n id: string;\n item: HTMLElement;\n fromGroup: string;\n toGroup: string;\n fromIndex: number;\n toIndex: number;\n groupChanged: boolean;\n /** Neighbours at the destination. */\n afterId: string | null;\n beforeId: string | null;\n}\n\nexport interface SortableInstance extends Instance {\n /** Stop a drag in progress: the item flies back. */\n cancel(): void;\n readonly dragging: boolean;\n}\n\nconst GROUP = '[data-mk-sortable-group]';\nconst ITEM = '[data-mk-item]';\nconst HANDLE = '[data-mk-sort-handle]';\nconst INTERACTIVE = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[contenteditable=\"true\"]',\n '[role=\"button\"]',\n '[role=\"slider\"]',\n '[data-clickable=\"true\"]',\n].join(',');\nconst THRESHOLD = 6;\nconst TILT = { max: 14, vel: 2e-3, accel: 45e-5, stiffness: 170, damping: 13, hang: 0.4, refArea: 24000 };\nconst EDGE = 56;\nconst MAX_SCROLL = 16;\nconst TRANSFORMS = ['transform', 'translate', 'rotate', 'scale'];\n\nconst LABELS: Required<SortableLabels> = {\n lifted: (position, total) =>\n `Elemento levantado, posición ${position} de ${total}. Flechas para mover, Espacio para soltar, Escape para cancelar.`,\n moved: (position, total, group) => (group ? `${group}, posición ${position} de ${total}.` : `Posición ${position} de ${total}.`),\n dropped: (position, total) => `Elemento soltado en la posición ${position} de ${total}.`,\n cancelled: 'Movimiento cancelado.',\n};\n\ninterface Measured {\n el: HTMLElement;\n top: number;\n height: number;\n}\n\ninterface MeasuredGroup {\n el: HTMLElement;\n rect: DOMRect;\n locked: boolean;\n items: Measured[];\n}\n\ninterface Layer {\n el: HTMLElement;\n ox: number;\n oy: number;\n}\n\ninterface Press {\n item: HTMLElement;\n group: HTMLElement;\n index: number;\n startX: number;\n startY: number;\n grabX: number;\n grabY: number;\n width: number;\n height: number;\n}\n\nexport function createSortable(root: HTMLElement | null, options: SortableOptions = {}): SortableInstance {\n if (!root) {\n warnOnce('sortable: missing root');\n return inert({ cancel() {}, dragging: false });\n }\n registerMotion();\n const scope = createScope();\n const { mutate = true, autoScroll = true } = options;\n const follow = { stiffness: 1100, damping: 38, ...options.follow };\n const labels = { ...LABELS, ...options.labels };\n\n // ── Structure ─────────────────────────────────────────────────────────────\n const groups = () => {\n const list = [...root.querySelectorAll<HTMLElement>(GROUP)];\n if (root.matches(GROUP)) list.unshift(root);\n else if (!list.length) list.push(root);\n return list;\n };\n const ownerOf = (item: HTMLElement) => {\n const group = item.parentElement?.closest<HTMLElement>(GROUP);\n return group && root.contains(group) ? group : root;\n };\n const itemsOf = (group: HTMLElement) => [...group.querySelectorAll<HTMLElement>(ITEM)].filter((item) => ownerOf(item) === group);\n const keyOf = (group: HTMLElement) => group.dataset.mkSortableGroup ?? '';\n const isLocked = (group: HTMLElement) => group.hasAttribute('data-mk-sortable-locked') && group.dataset.mkSortableLocked !== 'false';\n const idOf = (item: HTMLElement) => {\n if (item.dataset.mkId !== undefined) return item.dataset.mkId;\n warnOnce('sortable: give each [data-mk-item] a data-mk-id');\n return String(itemsOf(ownerOf(item)).indexOf(item));\n };\n const findItem = (id: string) => [...root.querySelectorAll<HTMLElement>(ITEM)].find((item) => item.dataset.mkId === id) ?? null;\n // Reading a transform makes GSAP write translate/rotate/scale: none inline; untouch() takes them off.\n const touched = new Set<HTMLElement>();\n const transformY = (el: HTMLElement) => {\n touched.add(el);\n return Number(gsap.getProperty(el, 'y')) || 0;\n };\n const transformX = (el: HTMLElement) => {\n touched.add(el);\n return Number(gsap.getProperty(el, 'x')) || 0;\n };\n const untouch = () => {\n const idle = [...touched].filter((el) => !gsap.isTweening(el));\n for (const el of idle) touched.delete(el);\n clearStyles(idle, TRANSFORMS);\n };\n\n const makeDetail = (item: HTMLElement, from: { group: HTMLElement; index: number }, to: { group: HTMLElement; index: number }) => {\n const others = itemsOf(to.group).filter((el) => el !== item);\n const after = others[to.index - 1];\n const before = others[to.index];\n const detail: ReorderDetail = {\n id: idOf(item),\n item,\n fromGroup: keyOf(from.group),\n toGroup: keyOf(to.group),\n fromIndex: from.index,\n toIndex: to.index,\n groupChanged: from.group !== to.group,\n afterId: after ? idOf(after) : null,\n beforeId: after ? null : before ? idOf(before) : null,\n };\n return detail;\n };\n\n const moveDom = (item: HTMLElement, group: HTMLElement, index: number) => {\n const focused = item.contains(document.activeElement) ? (document.activeElement as HTMLElement) : null;\n const others = itemsOf(group).filter((el) => el !== item);\n const before = others[index];\n if (before) before.before(item);\n else if (others.length) others[others.length - 1]!.after(item);\n else group.append(item);\n focused?.focus({ preventScroll: true });\n };\n\n /** Resolves when the app has changed the list (or false after `ms` without a change). */\n const waiting = new Set<() => void>();\n scope.add(() => {\n for (const stop of [...waiting]) stop();\n });\n const domChange = (ms = 400) =>\n new Promise<boolean>((resolve) => {\n let done = false;\n const finish = (changed: boolean) => {\n if (done) return;\n done = true;\n waiting.delete(stop);\n observer.disconnect();\n clearTimeout(timer);\n resolve(changed);\n };\n const stop = () => finish(false);\n waiting.add(stop);\n const observer = new MutationObserver((records) => {\n if (\n records.some((record) =>\n [...record.addedNodes, ...record.removedNodes].some((node) => node instanceof HTMLElement && node.matches(ITEM)),\n )\n )\n finish(true);\n });\n observer.observe(root, { childList: true, subtree: true });\n const timer = setTimeout(stop, ms);\n });\n\n // ── Live region (keyboard) ────────────────────────────────────────────────\n let live: HTMLElement | null = null;\n const announce = (text: string) => {\n if (!live) {\n live = document.createElement('div');\n live.setAttribute('aria-live', 'assertive');\n live.setAttribute('role', 'status');\n Object.assign(live.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n clipPath: 'inset(50%)',\n whiteSpace: 'nowrap',\n });\n document.body.append(live);\n const created = live;\n scope.add(() => created.remove());\n }\n live.textContent = text;\n };\n\n // ── Pointer drag ──────────────────────────────────────────────────────────\n const pointer = { x: 0, y: 0 };\n let press: Press | null = null;\n let dragging = false;\n let floating = { x: 0, y: 0, width: 0, tilt: 0, lift: 0, fade: 0 };\n let layers: Layer[] = [];\n let lifting: gsap.core.Tween | null = null;\n let landing: gsap.core.Timeline | null = null;\n let layout: { groups: MeasuredGroup[]; source: MeasuredGroup; dragTop: number; shift: number } | null = null;\n const shifted = new Map<HTMLElement, number>();\n let placement: { group: HTMLElement; index: number } | null = null;\n let physics: {\n vx: number;\n vy: number;\n tiltV: number;\n fvx: number;\n fvy: number;\n armX: number;\n armY: number;\n mass: number;\n x: number;\n y: number;\n t: number;\n } | null = null;\n let scrollers: Array<{ el: HTMLElement | null; y: boolean; x: boolean }> = [];\n let draggedEls = new Set<HTMLElement>();\n\n const render = () => {\n const { x, y, width, tilt, lift, fade } = floating;\n layers.forEach((layer, i) => {\n const style = layer.el.style;\n style.transform = `translate3d(${x - layer.ox}px, ${y - layer.oy}px, 0) rotate(${tilt}deg) scale(${1 + lift * 0.03})`;\n style.width = `${width}px`;\n style.setProperty('--mk-lift', lift.toFixed(3));\n if (layers.length > 1) style.opacity = String(i === 0 ? 1 - fade : fade);\n });\n };\n\n /** A copy of `source` floating in `parent` (position fixed), so the parent's CSS still styles it. */\n const makeLayer = (source: HTMLElement, parent: HTMLElement, grabX: number, grabY: number): Layer => {\n const el = source.cloneNode(true) as HTMLElement;\n for (const name of ['data-mk-item', 'data-mk-id', 'data-mk-dragging', 'data-mk-sort-grabbed', 'data-flip-id', 'id', 'tabindex'])\n el.removeAttribute(name);\n for (const child of el.querySelectorAll('[id]')) child.removeAttribute('id');\n el.dataset.mkSortableClone = '';\n el.setAttribute('aria-hidden', 'true');\n el.inert = true;\n Object.assign(el.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n margin: '0',\n boxSizing: 'border-box',\n zIndex: '9999',\n pointerEvents: 'none',\n willChange: 'transform',\n transform: 'none',\n transformOrigin: `${grabX}px ${grabY}px`,\n translate: 'none',\n rotate: 'none',\n scale: 'none',\n visibility: 'visible',\n });\n parent.append(el);\n // A transformed ancestor would anchor `fixed` to itself: measure that offset once.\n const box = el.getBoundingClientRect();\n return { el, ox: box.left, oy: box.top };\n };\n\n const measure = () => {\n if (!press) return;\n const item = press.item;\n const measured = groups().map((group) => ({\n el: group,\n rect: group.getBoundingClientRect(),\n locked: isLocked(group),\n items: itemsOf(group).map((el) => {\n const box = el.getBoundingClientRect();\n return { el, top: box.top - transformY(el), height: box.height };\n }),\n }));\n const source = measured.find((group) => group.el === press!.group) ?? measured[0]!;\n const index = source.items.findIndex((entry) => entry.el === item);\n const dragged = source.items[index];\n if (!dragged) return;\n const next = source.items[index + 1];\n const previous = source.items[index - 1];\n // The gap an item leaves: its height plus the space to its neighbour (gap or margins).\n const spacing = next\n ? next.top - (dragged.top + dragged.height)\n : previous\n ? dragged.top - (previous.top + previous.height)\n : parseFloat(getComputedStyle(source.el).rowGap) || 0;\n layout = { groups: measured, source, dragTop: dragged.top, shift: dragged.height + Math.max(0, spacing) };\n };\n\n const applyShift = (target: MeasuredGroup, index: number) => {\n if (!layout || !press) return;\n const item = press.item;\n const next = new Map<HTMLElement, number>();\n for (const entry of layout.source.items) if (entry.top > layout.dragTop) next.set(entry.el, -layout.shift);\n target.items\n .filter((entry) => entry.el !== item)\n .forEach((entry, i) => {\n if (i >= index) next.set(entry.el, (next.get(entry.el) ?? 0) + layout!.shift);\n });\n for (const el of shifted.keys()) if (!next.has(el)) next.set(el, 0);\n for (const [el, y] of next) {\n if ((shifted.get(el) ?? 0) === y) continue;\n shifted.set(el, y);\n touched.add(el);\n gsap.to(el, { y, duration: reduced() ? 0 : TIMING.sortable.shift, ease: EASE.layoutReflow, overwrite: 'auto' });\n }\n };\n\n const unshift = (animated: boolean) => {\n const els = [...shifted.keys()];\n shifted.clear();\n if (!els.length) return;\n if (animated && !reduced()) {\n gsap.to(els, {\n y: 0,\n duration: TIMING.sortable.shift,\n ease: EASE.layoutReflow,\n overwrite: 'auto',\n onComplete: () => {\n clearStyles(els, TRANSFORMS);\n for (const el of els) touched.delete(el);\n },\n });\n } else {\n gsap.killTweensOf(els);\n clearStyles(els, TRANSFORMS);\n }\n };\n\n const place = () => {\n if (!layout || !press) return;\n const all = layout.groups;\n const inside = (rect: DOMRect) => pointer.x >= rect.left && pointer.x <= rect.right;\n const target =\n all.length <= 1\n ? all[0]\n : (all.find(({ rect }) => inside(rect) && pointer.y >= rect.top && pointer.y <= rect.bottom) ??\n all.find(({ rect }) => inside(rect)));\n if (!target || target.locked) return;\n const others = target.items.filter((entry) => entry.el !== press!.item);\n let index = 0;\n for (const entry of others) {\n if (pointer.y < entry.top + entry.height / 2) break;\n index++;\n }\n applyShift(target, index);\n placement = { group: target.el, index };\n };\n\n const tick = () => {\n if (!physics || !press) return;\n const target = { x: pointer.x - press.grabX, y: pointer.y - press.grabY };\n if (reduced()) {\n floating.x = target.x;\n floating.y = target.y;\n render();\n return;\n }\n const P = physics;\n const now = performance.now();\n const dt = Math.min((now - P.t) / 1000, 1 / 30);\n if (dt <= 0) return;\n P.t = now;\n // Smoothed pointer velocity, then a torque from velocity and acceleration about the grab point.\n const k = 1 - Math.exp(-dt / 0.05);\n const ax = ((pointer.x - P.x) / dt - P.vx) * k;\n const ay = ((pointer.y - P.y) / dt - P.vy) * k;\n P.vx += ax;\n P.vy += ay;\n P.x = pointer.x;\n P.y = pointer.y;\n const torque = (P.vx * TILT.vel + (ax / dt) * TILT.accel) * P.armY - (P.vy * TILT.vel + (ay / dt) * TILT.accel) * P.armX;\n const tilt = TILT.max * Math.tanh(torque / TILT.max);\n P.tiltV += (((tilt - floating.tilt) * TILT.stiffness - P.tiltV * TILT.damping) * dt) / P.mass;\n floating.tilt += P.tiltV * dt;\n P.fvx += (((target.x - floating.x) * follow.stiffness - P.fvx * follow.damping) * dt) / P.mass;\n P.fvy += (((target.y - floating.y) * follow.stiffness - P.fvy * follow.damping) * dt) / P.mass;\n floating.x += P.fvx * dt;\n floating.y += P.fvy * dt;\n render();\n };\n\n const scrollStep = (distance: number) => Math.ceil(MAX_SCROLL * Math.min(1, distance / EDGE));\n const scrollTick = () => {\n for (const scroller of scrollers) {\n const el = scroller.el;\n const box = el ? el.getBoundingClientRect() : { top: 0, left: 0, bottom: innerHeight, right: innerWidth };\n const top = el ? el.scrollTop : scrollY;\n const left = el ? el.scrollLeft : scrollX;\n const height = el ? el.clientHeight : innerHeight;\n const width = el ? el.clientWidth : innerWidth;\n const fullHeight = el ? el.scrollHeight : document.documentElement.scrollHeight;\n const fullWidth = el ? el.scrollWidth : document.documentElement.scrollWidth;\n let dy = 0;\n let dx = 0;\n if (scroller.y) {\n if (pointer.y < box.top + EDGE && top > 0) dy = -scrollStep(box.top + EDGE - pointer.y);\n else if (pointer.y > box.bottom - EDGE && top + height < fullHeight - 1) dy = scrollStep(pointer.y - (box.bottom - EDGE));\n }\n if (scroller.x) {\n if (pointer.x < box.left + EDGE && left > 0) dx = -scrollStep(box.left + EDGE - pointer.x);\n else if (pointer.x > box.right - EDGE && left + width < fullWidth - 1) dx = scrollStep(pointer.x - (box.right - EDGE));\n }\n if (dx || dy) {\n if (el) el.scrollBy(dx, dy);\n else window.scrollBy(dx, dy);\n measure();\n place();\n return;\n }\n }\n };\n const startScroll = () => {\n scrollers = [];\n for (let el: HTMLElement | null = root; el && el !== document.body && el !== document.documentElement; el = el.parentElement) {\n const style = getComputedStyle(el);\n const y = /(auto|scroll)/.test(style.overflowY) && el.scrollHeight > el.clientHeight + 1;\n const x = /(auto|scroll)/.test(style.overflowX) && el.scrollWidth > el.clientWidth + 1;\n if (x || y) scrollers.push({ el, x, y });\n }\n const page = document.documentElement;\n scrollers.push({ el: null, y: page.scrollHeight > innerHeight + 1, x: page.scrollWidth > innerWidth + 1 });\n gsap.ticker.add(scrollTick);\n };\n\n const start = () => {\n if (!press) return;\n const { item, group, startX, startY, grabX, grabY, width, height } = press;\n dragging = true;\n floating = { x: startX - grabX, y: startY - grabY, width, tilt: 0, lift: reduced() ? 1 : 0, fade: 0 };\n layers = [makeLayer(item, group, grabX, grabY)];\n draggedEls = new Set([item]);\n item.setAttribute('data-mk-dragging', '');\n root.setAttribute('data-mk-sorting', '');\n if (!reduced()) lifting = gsap.to(floating, { lift: 1, duration: TIMING.sortable.lift, ease: 'power2.out', onUpdate: render });\n const halfW = width / 2 || 1;\n const halfH = height / 2 || 1;\n physics = {\n vx: 0,\n vy: 0,\n tiltV: 0,\n fvx: 0,\n fvy: 0,\n armX: (halfW - grabX) / halfW,\n armY: Math.max((halfH - grabY) / halfH, TILT.hang),\n mass: Math.min(2.5, Math.max(1, Math.sqrt((width * height) / TILT.refArea))),\n x: pointer.x,\n y: pointer.y,\n t: performance.now(),\n };\n gsap.ticker.add(tick);\n measure();\n if (autoScroll) startScroll();\n placement = { group, index: press.index };\n render();\n };\n\n const finish = () => {\n landing = null;\n lifting?.kill();\n lifting = null;\n for (const layer of layers) layer.el.remove();\n layers = [];\n for (const el of draggedEls) el.removeAttribute('data-mk-dragging');\n draggedEls.clear();\n root.removeAttribute('data-mk-sorting');\n dragging = false;\n untouch();\n };\n\n const land = (target: HTMLElement | null) => {\n lifting?.kill();\n lifting = null;\n const item = target && target.isConnected ? target : null;\n if (!item || reduced()) {\n finish();\n return;\n }\n if (!draggedEls.has(item)) {\n item.setAttribute('data-mk-dragging', '');\n draggedEls.add(item);\n }\n const box = item.getBoundingClientRect();\n // Arriving somewhere else: cross-fade to a copy styled by the new place.\n if (layers.length === 1 && ownerOf(item) !== layers[0]!.el.parentElement) {\n const origin = layers[0]!.el.style.transformOrigin.split(' ').map(parseFloat);\n layers.push(makeLayer(item, ownerOf(item), origin[0] ?? 0, origin[1] ?? 0));\n render();\n }\n landing = gsap.timeline({ onComplete: finish });\n landing.to(\n floating,\n {\n x: box.left - transformX(item),\n y: box.top - transformY(item),\n width: box.width,\n tilt: 0,\n lift: 0,\n duration: TIMING.sortable.land,\n ease: EASE.sortableLand,\n onUpdate: render,\n },\n 0,\n );\n landing.to(floating, { fade: 1, duration: TIMING.sortable.landFade, ease: 'power1.inOut', onUpdate: render }, 0);\n };\n\n const stopTracking = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onEscape);\n gsap.ticker.remove(tick);\n gsap.ticker.remove(scrollTick);\n physics = null;\n scrollers = [];\n };\n\n const swallowClick = () => {\n const swallow = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n window.addEventListener('click', swallow, { capture: true, once: true });\n setTimeout(() => window.removeEventListener('click', swallow, { capture: true }), 0);\n };\n\n const drop = async () => {\n const current = press;\n const target = placement;\n const started = dragging;\n stopTracking();\n press = null;\n placement = null;\n layout = null;\n if (!current || !started) return;\n swallowClick();\n const { item } = current;\n const origin = { group: current.group, index: current.index };\n if (!target || (target.group === origin.group && target.index === origin.index)) {\n unshift(true);\n land(item);\n return;\n }\n const detail = makeDetail(item, origin, target);\n if (!root.dispatchEvent(new CustomEvent<ReorderDetail>('mk:reorder', { bubbles: true, cancelable: true, detail }))) {\n unshift(true);\n land(item);\n return;\n }\n if (mutate) {\n moveDom(item, target.group, target.index);\n unshift(false);\n options.onReorder?.(detail);\n land(item);\n return;\n }\n const changed = domChange();\n options.onReorder?.(detail);\n const answered = await changed;\n if (scope.disposed) return;\n if (!answered) {\n // The app kept the order: everything flies back.\n unshift(true);\n land(item.isConnected ? item : findItem(detail.id));\n return;\n }\n unshift(false);\n land(findItem(detail.id) ?? item);\n };\n\n const cancel = () => {\n const current = press;\n const started = dragging;\n stopTracking();\n press = null;\n placement = null;\n layout = null;\n if (!current || !started) return;\n unshift(true);\n land(current.item);\n };\n\n function onMove(event: PointerEvent) {\n if (!press) return;\n pointer.x = event.clientX;\n pointer.y = event.clientY;\n if (!dragging) {\n const dx = event.clientX - press.startX;\n const dy = event.clientY - press.startY;\n if (dx * dx + dy * dy < THRESHOLD * THRESHOLD) return;\n start();\n }\n event.preventDefault();\n place();\n }\n function onUp() {\n void drop();\n }\n function onCancel() {\n cancel();\n }\n function onEscape(event: KeyboardEvent) {\n if (event.key === 'Escape') cancel();\n }\n\n scope.on(root, 'pointerdown', (event) => {\n const down = event as PointerEvent;\n const target = down.target as Element | null;\n if (down.button > 0 || press || keyboard || !target) return;\n const item = target.closest<HTMLElement>(ITEM);\n if (!item || !root.contains(item)) return;\n const onHandle = Boolean(target.closest(HANDLE));\n const coarse = window.matchMedia?.('(pointer: coarse)').matches === true;\n if ((options.handle || coarse) && !onHandle) return;\n const control = target.closest(INTERACTIVE);\n if (!onHandle && control && control !== item && item.contains(control)) return;\n landing?.progress(1);\n const group = ownerOf(item);\n const box = item.getBoundingClientRect();\n press = {\n item,\n group,\n index: itemsOf(group).indexOf(item),\n startX: down.clientX,\n startY: down.clientY,\n grabX: down.clientX - box.left,\n grabY: down.clientY - box.top,\n width: box.width,\n height: box.height,\n };\n pointer.x = down.clientX;\n pointer.y = down.clientY;\n down.preventDefault();\n window.addEventListener('pointermove', onMove, { passive: false });\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onEscape);\n });\n // Links and images inside items must not start the browser's own drag.\n scope.on(root, 'dragstart', (event) => {\n if ((event.target as Element | null)?.closest?.(ITEM)) event.preventDefault();\n });\n\n // ── Keyboard ──────────────────────────────────────────────────────────────\n let keyboard: { item: HTMLElement; startGroup: HTMLElement; startIndex: number } | null = null;\n let moving = false;\n let flipping: gsap.core.Timeline | null = null;\n\n const positionOf = (item: HTMLElement) => {\n const list = itemsOf(ownerOf(item));\n return { position: list.indexOf(item) + 1, total: list.length };\n };\n const groupName = (group: HTMLElement) => group.getAttribute('aria-label') ?? (groups().length > 1 ? keyOf(group) : '');\n\n /** Move an item by keyboard: reorder now (DOM or app) and let the list reflow. */\n const commit = async (item: HTMLElement, group: HTMLElement, index: number) => {\n const from = { group: ownerOf(item), index: itemsOf(ownerOf(item)).indexOf(item) };\n if (from.group === group && from.index === index) return item;\n const detail = makeDetail(item, from, { group, index });\n if (!root.dispatchEvent(new CustomEvent<ReorderDetail>('mk:reorder', { bubbles: true, cancelable: true, detail }))) return item;\n moving = true;\n // Taken first: measuring can move the focus away (moving a node blurs it).\n const focused = item.contains(document.activeElement) ? (document.activeElement as HTMLElement) : item;\n const captured = captureLayout(root, ITEM);\n let current: HTMLElement = item;\n if (mutate) {\n moveDom(item, group, index);\n options.onReorder?.(detail);\n } else {\n const changed = domChange();\n options.onReorder?.(detail);\n await changed;\n current = findItem(detail.id) ?? item;\n }\n const target = current === item ? focused : current;\n if (target.isConnected && document.activeElement !== target) target.focus({ preventScroll: true });\n moving = false;\n if (scope.disposed) return current;\n // Flip tags elements with auto ids; take them off once the reflow is over.\n const untag = () => {\n for (const el of root.querySelectorAll<HTMLElement>('[data-flip-id^=\"auto-\"]')) {\n el.removeAttribute('data-flip-id');\n touched.add(el);\n }\n untouch();\n };\n flipping?.progress(1);\n flipping = reflowLayout(root, ITEM, captured);\n if (flipping) flipping.eventCallback('onComplete', untag);\n else untag();\n return current;\n };\n\n const release = (announcement?: string) => {\n if (!keyboard) return;\n keyboard.item.removeAttribute('data-mk-sort-grabbed');\n keyboard = null;\n if (announcement) announce(announcement);\n };\n\n scope.on(root, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n const target = key.target as HTMLElement | null;\n const item = target?.closest<HTMLElement>(ITEM);\n if (!item || !root.contains(item) || dragging) return;\n const handle = target!.closest(HANDLE);\n if (target !== item && !(handle && item.contains(handle))) return;\n const lift = key.key === ' ' || key.key === 'Enter';\n if (keyboard && keyboard.item !== item) release();\n if (!keyboard) {\n if (!lift) return;\n key.preventDefault();\n keyboard = { item, startGroup: ownerOf(item), startIndex: itemsOf(ownerOf(item)).indexOf(item) };\n item.setAttribute('data-mk-sort-grabbed', '');\n const { position, total } = positionOf(item);\n announce(labels.lifted(position, total));\n return;\n }\n const grabbed = keyboard;\n const group = ownerOf(item);\n const list = itemsOf(group);\n const index = list.indexOf(item);\n let to: { group: HTMLElement; index: number } | null = null;\n if (key.key === 'ArrowUp' || key.key === 'ArrowDown') {\n const next = Math.min(list.length - 1, Math.max(0, index + (key.key === 'ArrowUp' ? -1 : 1)));\n to = { group, index: next };\n } else if (key.key === 'ArrowLeft' || key.key === 'ArrowRight') {\n const open = groups().filter((candidate) => candidate === group || !isLocked(candidate));\n const next = open[open.indexOf(group) + (key.key === 'ArrowLeft' ? -1 : 1)];\n if (next) to = { group: next, index: Math.min(index, itemsOf(next).length) };\n } else if (lift) {\n key.preventDefault();\n const { position, total } = positionOf(item);\n release(labels.dropped(position, total));\n return;\n } else if (key.key === 'Escape') {\n key.preventDefault();\n void commit(item, grabbed.startGroup, grabbed.startIndex).then(() => release(labels.cancelled));\n return;\n } else return;\n key.preventDefault();\n if (!to) return;\n void commit(item, to.group, to.index).then((moved) => {\n if (!keyboard) return;\n if (moved !== keyboard.item) {\n keyboard.item.removeAttribute('data-mk-sort-grabbed');\n keyboard.item = moved;\n moved.setAttribute('data-mk-sort-grabbed', '');\n }\n const { position, total } = positionOf(moved);\n announce(labels.moved(position, total, groupName(ownerOf(moved))));\n });\n });\n // Space on a button handle would click it on keyup.\n scope.on(root, 'keyup', (event) => {\n if ((event as KeyboardEvent).key === ' ' && (event.target as Element | null)?.closest(HANDLE)) event.preventDefault();\n });\n scope.on(root, 'focusout', (event) => {\n if (!keyboard || moving) return;\n const next = (event as FocusEvent).relatedTarget as Node | null;\n if (next && keyboard.item.contains(next)) return;\n release();\n });\n\n // Items must take focus for the keyboard: those without a handle get tabindex 0.\n const focusable = (item: HTMLElement) => {\n if (item.querySelector(HANDLE) || item.hasAttribute('tabindex') || item.matches(INTERACTIVE)) return;\n scope.attr(item, 'tabindex', '0');\n };\n for (const item of root.querySelectorAll<HTMLElement>(ITEM)) focusable(item);\n scope\n .observe(\n new MutationObserver(() => {\n for (const item of root.querySelectorAll<HTMLElement>(`${ITEM}:not([tabindex])`)) focusable(item);\n }),\n )\n .observe(root, { childList: true, subtree: true });\n\n root.dataset.mkReady = '';\n\n return {\n cancel,\n get dragging() {\n return dragging;\n },\n destroy() {\n stopTracking();\n press = null;\n landing?.kill();\n flipping?.progress(1);\n unshift(false);\n finish();\n release();\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n}\n\n/** Move one entry of an array (for onReorder in a single list): moveItem(list, fromIndex, toIndex). */\nexport function moveItem<T>(list: readonly T[], from: number, to: number): T[] {\n const next = list.slice();\n const [entry] = next.splice(from, 1);\n if (entry !== undefined) next.splice(Math.min(Math.max(to, 0), next.length), 0, entry);\n return next;\n}\n","import { gsap, SplitText, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { TIMING } from '../../core/timing';\nimport { shows, thresholds } from '../../core/visible';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * masked type: the text is split into lines,\n * words or letters, each inside its own clip, and rises from below it\n * (yPercent 100 → 0, 1.2 s expo.out, 0.1 s delay, 20 ms apart) once 80 % of it\n * is on screen. It hides again when it leaves the screen (unless `once`), so it\n * plays every time it comes back. SplitText re-splits on resize and font load.\n */\n\nexport interface MaskTextOptions {\n by?: 'lines' | 'words' | 'chars';\n /** Start offset in % of each piece. */\n y?: number;\n duration?: number;\n ease?: string;\n delay?: number;\n stagger?: number;\n /** 'scroll' (default) plays when 80 % is visible; 'load' now; 'manual' waits for play(). */\n trigger?: 'scroll' | 'load' | 'manual';\n /** Play once and stay. */\n once?: boolean;\n}\n\nexport interface MaskTextInstance extends Instance {\n play(): void;\n /** exit: back down into the clips, 2 ms apart. */\n hide(): void;\n readonly split: SplitText | null;\n}\n\nconst CLASSES = { lines: 'mk-mask-line', words: 'mk-mask-word', chars: 'mk-mask-char' };\nconst TYPES = { lines: 'lines', words: 'words', chars: 'words,chars' };\n\nexport function createMaskText(el: HTMLElement | null, options: MaskTextOptions = {}): MaskTextInstance {\n if (!el) {\n warnOnce('mask-text: missing element');\n return inert({ play() {}, hide() {}, split: null });\n }\n const t = TIMING.maskText;\n const {\n by = 'lines',\n y = t.y,\n duration = t.duration,\n ease = 'expo.out',\n delay = t.delay,\n stagger = t.stagger,\n trigger = 'scroll',\n once = false,\n } = options;\n if (!entrances()) {\n el.dataset.mkReady = '';\n return {\n play() {},\n hide() {},\n split: null,\n destroy() {\n delete el.dataset.mkReady;\n },\n };\n }\n registerMotion();\n let shown = false;\n let tween: gsap.core.Tween | null = null;\n let observer: IntersectionObserver | null = null;\n\n const split = SplitText.create(el, {\n type: TYPES[by],\n mask: by,\n autoSplit: true,\n aria: 'auto',\n linesClass: CLASSES.lines,\n wordsClass: CLASSES.words,\n charsClass: CLASSES.chars,\n // A new split (resize, fonts) keeps the state the text was in.\n onSplit: (self: SplitText) => {\n tween?.kill();\n gsap.set(self[by], { yPercent: shown ? 0 : y });\n },\n });\n const pieces = () => split[by] as HTMLElement[];\n gsap.set(pieces(), { yPercent: y });\n\n const play = () => {\n shown = true;\n tween?.kill();\n tween = gsap.to(pieces(), { yPercent: 0, duration, ease, delay, stagger: { each: stagger, from: 'start' }, overwrite: true });\n };\n const hide = () => {\n shown = false;\n tween?.kill();\n tween = gsap.to(pieces(), { yPercent: y, duration, ease, stagger: { each: t.exitStagger }, overwrite: true });\n };\n const reset = () => {\n shown = false;\n tween?.kill();\n gsap.set(pieces(), { yPercent: y });\n };\n\n if (trigger === 'load') play();\n else if (trigger === 'scroll' && typeof IntersectionObserver === 'function') {\n observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n // 80 % visible — or, for text taller than the screen, 80 % of the screen.\n if (shows(entry, t.threshold)) {\n if (!shown) play();\n if (once) observer?.disconnect();\n } else if (!entry.isIntersecting && shown && !once) reset();\n }\n },\n { threshold: thresholds(t.threshold), rootMargin: '10px' },\n );\n observer.observe(el);\n }\n el.dataset.mkReady = '';\n\n return {\n play,\n hide,\n split,\n destroy() {\n observer?.disconnect();\n tween?.kill();\n gsap.killTweensOf(pieces());\n split.revert();\n delete el.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { clearStyles } from '../../core/styles';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { shows, thresholds } from '../../core/visible';\n\n/*\n * reveal group: when the block shows (30 %), its marked children enter\n * one after another, 30 ms apart, 1.2 s expo.out — rules grow from alternating\n * sides (scaleX 0 → 1), fades appear, rises come up from 200 %\n * inside their clip. When it leaves, every child goes back to its start state\n * so the block enters again next time (unless once).\n * Children: [data-mk-cascade=\"rule|fade|rise\"].\n */\n\nexport interface CascadeOptions {\n /** Seconds before the first child (also data-mk-delay). */\n delay?: number;\n duration?: number;\n /** Seconds between children. */\n step?: number;\n once?: boolean;\n trigger?: 'scroll' | 'load' | 'manual';\n}\n\nexport interface CascadeInstance extends Instance {\n play(): void;\n /** Every child back to its start state. */\n reset(): void;\n}\n\ntype Kind = 'rule' | 'fade' | 'rise';\nconst STYLES = ['transform', 'translate', 'rotate', 'scale', 'transform-origin', 'opacity', 'visibility'];\n\nexport function createCascade(root: HTMLElement | null, options: CascadeOptions = {}): CascadeInstance {\n if (!root) {\n warnOnce('cascade: missing element');\n return inert({ play() {}, reset() {} });\n }\n const t = TIMING.cascade;\n const { duration = t.duration, step = t.step, once = false, trigger = 'scroll' } = options;\n const delay = options.delay ?? (Number(root.dataset.mkDelay) || 0);\n const items = [...root.querySelectorAll<HTMLElement>('[data-mk-cascade]')].map((el, index) => ({\n el,\n index,\n kind: (el.dataset.mkCascade as Kind) || 'fade',\n }));\n if (!entrances() || !items.length) {\n root.dataset.mkReady = '';\n return {\n play() {},\n reset() {},\n destroy() {\n delete root.dataset.mkReady;\n },\n };\n }\n registerMotion();\n let observer: IntersectionObserver | null = null;\n\n const setOut = ({ el, index, kind }: (typeof items)[number]) => {\n gsap.killTweensOf(el);\n if (kind === 'rule') gsap.set(el, { scaleX: 0, transformOrigin: index % 2 === 0 ? 'left center' : 'right center' });\n else if (kind === 'rise') gsap.set(el, { yPercent: t.rise });\n else gsap.set(el, { autoAlpha: 0 });\n };\n items.forEach(setOut);\n\n let shown = false;\n const play = () => {\n shown = true;\n for (const { el, index, kind } of items) {\n const to = kind === 'rule' ? { scaleX: 1 } : kind === 'rise' ? { yPercent: 0 } : { autoAlpha: 1 };\n gsap.to(el, { ...to, duration, ease: 'expo.out', delay: delay + index * step, overwrite: 'auto' });\n }\n };\n const reset = () => {\n shown = false;\n items.forEach(setOut);\n };\n\n if (trigger === 'load') play();\n else if (trigger === 'scroll' && typeof IntersectionObserver === 'function') {\n observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (shows(entry, t.threshold)) {\n if (!shown) play();\n if (once) observer?.disconnect();\n } else if (!entry.isIntersecting && shown && !once) reset();\n }\n },\n { threshold: thresholds(t.threshold) },\n );\n observer.observe(root);\n }\n root.dataset.mkReady = '';\n\n return {\n play,\n reset,\n destroy() {\n observer?.disconnect();\n const elements = items.map((item) => item.el);\n gsap.killTweensOf(elements);\n clearStyles(elements, STYLES);\n delete root.dataset.mkReady;\n },\n };\n}\n","import { gsap, SplitText, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { shows, thresholds } from '../../core/visible';\n\n/*\n * slot title: every letter is a little reel — its face and a copy\n * under it scroll up one height per turn, 8–14 turns picked at random, in a\n * paused timeline. play() pushes all those timelines from 0 to 1 in 2 s\n * (expo.out, 40 ms apart in random order), so the letters spin fast and settle\n * one by one on the same letter. Optionally it plays again every 6 s while\n * visible and the page is not scrolling (it waits 1 s of calm).\n */\n\nexport interface TextRollOptions {\n duration?: number;\n stagger?: number;\n /** [min, max] repeats of each letter's turn (default: 8–14). */\n turns?: readonly [number, number];\n /** 'load' (default) after `delay`; 'scroll' when it shows; 'hover'; 'manual'. */\n trigger?: 'load' | 'scroll' | 'hover' | 'manual';\n delay?: number;\n /** Replay every n ms while visible and not scrolling (default: 6000). 0: off. */\n interval?: number;\n}\n\nexport interface TextRollInstance extends Instance {\n play(): void;\n readonly timelines: gsap.core.Timeline[];\n}\n\nexport function createTextRoll(el: HTMLElement | null, options: TextRollOptions = {}): TextRollInstance {\n if (!el) {\n warnOnce('text-roll: missing element');\n return inert({ play() {}, timelines: [] });\n }\n const t = TIMING.textRoll;\n const { duration = t.duration, stagger = t.stagger, turns = t.turns, trigger = 'load', delay = 0, interval = 0 } = options;\n if (!entrances()) {\n el.dataset.mkReady = '';\n return {\n play() {},\n timelines: [],\n destroy() {\n delete el.dataset.mkReady;\n },\n };\n }\n registerMotion();\n const split = SplitText.create(el, { type: 'words,chars', wordsClass: 'mk-roll-word', charsClass: 'mk-roll-char', aria: 'auto' });\n const timelines = (split.chars as HTMLElement[]).map((char) => {\n const letter = char.textContent ?? '';\n const face = document.createElement('span');\n face.className = 'mk-roll-face';\n face.textContent = letter;\n const copy = face.cloneNode(true);\n char.replaceChildren(face, copy);\n const timeline = gsap.timeline({ paused: true });\n timeline.to([face, copy], { yPercent: '-=100', repeat: gsap.utils.random(turns[0], turns[1], 1), ease: 'none', duration: 1 });\n return timeline;\n });\n\n let envelope: gsap.core.Tween | null = null;\n const play = () => {\n envelope?.kill();\n envelope = gsap.to(timelines, {\n progress: 1,\n duration,\n ease: 'expo.out',\n stagger: { each: stagger, ease: 'none', from: 'random' },\n onComplete: () => {\n gsap.set(timelines, { progress: 0 });\n },\n });\n };\n\n const cleanups: Array<() => void> = [];\n let visible = true;\n let scrolling = false;\n if (interval > 0 || trigger === 'scroll') {\n if (typeof IntersectionObserver === 'function') {\n visible = false;\n let played = false;\n const observer = new IntersectionObserver(\n ([entry]) => {\n visible = Boolean(entry?.isIntersecting);\n if (entry && shows(entry, 0.5) && trigger === 'scroll' && !played) {\n played = true;\n play();\n }\n },\n { threshold: thresholds(0.5) },\n );\n observer.observe(el);\n cleanups.push(() => observer.disconnect());\n }\n }\n if (interval > 0) {\n let quiet: ReturnType<typeof setTimeout> | undefined;\n const onScroll = () => {\n scrolling = true;\n clearTimeout(quiet);\n quiet = setTimeout(() => (scrolling = false), t.quietMs);\n };\n addEventListener('scroll', onScroll, { passive: true });\n const timer = setInterval(() => {\n if (visible && !scrolling) play();\n }, interval);\n cleanups.push(() => {\n removeEventListener('scroll', onScroll);\n clearInterval(timer);\n clearTimeout(quiet);\n });\n }\n if (trigger === 'hover') {\n el.addEventListener('pointerenter', play);\n cleanups.push(() => el.removeEventListener('pointerenter', play));\n }\n if (trigger === 'load') {\n const call = gsap.delayedCall(delay, play);\n cleanups.push(() => call.kill());\n }\n el.dataset.mkReady = '';\n\n return {\n play,\n timelines,\n destroy() {\n for (const cleanup of cleanups.splice(0)) cleanup();\n envelope?.kill();\n timelines.forEach((timeline) => timeline.kill());\n split.revert();\n delete el.dataset.mkReady;\n },\n };\n}\n","import { gsap, EASE, SplitText, registerMotion } from '../../core/gsap';\nimport { motionSpring } from '../../core/physics-spring';\nimport { entrances } from '../../core/reduced';\nimport { clearStyles } from '../../core/styles';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * hero words. 'scale': on hover every letter springs up (scale 1.3,\n * y −5 px, Motion 300/10), 30 ms after the previous one, and back on leave.\n * 'blink': every letter flashes a pastel and returns (0.6 s, ease-in-out) with\n * scattered delays, twice; it plays 0.6 s after start and on hover.\n */\n\nexport interface LettersOptions {\n effect?: 'scale' | 'blink';\n /** Blink colours. */\n colors?: string[];\n /** Blink once 0.6 s after start (default true). */\n autoplay?: boolean;\n}\n\nexport interface LettersInstance extends Instance {\n /** Blink now (the scale effect follows the pointer). */\n play(): void;\n}\n\nconst PASTELS = ['#FFD6FF', '#E7C6FF', '#C8B6FF', '#B8C0FF', '#BBD0FF'];\nconst ORDER = [0, 2, 1, 4, 3, 0, 2, 1, 4];\n\nexport function createLetters(el: HTMLElement | null, options: LettersOptions = {}): LettersInstance {\n if (!el) {\n warnOnce('letters: missing element');\n return inert({ play() {} });\n }\n const t = TIMING.letters;\n const { effect = 'scale', colors = PASTELS, autoplay = true } = options;\n if (!entrances()) {\n el.dataset.mkReady = '';\n return {\n play() {},\n destroy() {\n delete el.dataset.mkReady;\n },\n };\n }\n registerMotion();\n const split = SplitText.create(el, { type: 'words,chars', wordsClass: 'mk-letters-word', charsClass: 'mk-letter', aria: 'auto' });\n const chars = split.chars as HTMLElement[];\n const cleanups: Array<() => void> = [];\n const spring = motionSpring(...TIMING.springs.letters);\n\n const lift = (up: boolean) => {\n chars.forEach((char, index) =>\n gsap.to(char, {\n scale: up ? t.scale : 1,\n y: up ? t.y : 0,\n duration: spring.duration,\n ease: spring.ease,\n delay: index * t.step,\n overwrite: true,\n }),\n );\n };\n\n const blink = () => {\n chars.forEach((char, index) => {\n gsap.killTweensOf(char, 'color');\n clearStyles([char], ['color']);\n const own = getComputedStyle(char).color;\n const pastel = colors[ORDER[index % ORDER.length]! % colors.length]!;\n gsap.to(char, {\n keyframes: [\n { color: pastel, duration: t.blink / 2, ease: EASE.inOut },\n { color: own, duration: t.blink / 2, ease: EASE.inOut },\n ],\n delay: t.blinkDelays[index % t.blinkDelays.length],\n repeat: 1,\n repeatDelay: t.blinkRepeatDelay,\n onComplete: () => clearStyles([char], ['color']),\n });\n });\n };\n\n if (effect === 'scale') {\n const enter = () => lift(true);\n const leave = () => lift(false);\n el.addEventListener('pointerenter', enter);\n el.addEventListener('pointerleave', leave);\n cleanups.push(() => {\n el.removeEventListener('pointerenter', enter);\n el.removeEventListener('pointerleave', leave);\n });\n } else {\n el.addEventListener('pointerenter', blink);\n cleanups.push(() => el.removeEventListener('pointerenter', blink));\n if (autoplay) {\n const call = gsap.delayedCall(t.blinkStart, blink);\n cleanups.push(() => call.kill());\n }\n }\n el.dataset.mkReady = '';\n\n return {\n play: effect === 'blink' ? blink : () => lift(true),\n destroy() {\n for (const cleanup of cleanups.splice(0)) cleanup();\n gsap.killTweensOf(chars);\n split.revert();\n delete el.dataset.mkReady;\n },\n };\n}\n","import { registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { trackScroll, type ScrollTrack } from '../../core/scroll-track';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * photo parallax: the frame clips, the picture inside is scaled up\n * (1.2, or 1.3 for a stronger amount on wide screens) and travels from −10 % to\n * +10 % of its height × amount while the frame crosses the screen (a frame at\n * the top of the page counts from \"top top\", so it starts at −10 %). Target:\n * [data-mk-parallax-target], else the first img / video / picture, else the\n * first child.\n */\n\nexport interface ParallaxOptions {\n amount?: number;\n lerp?: number;\n /** Follow the scroll (default). Off: only seek() moves it. */\n scroll?: boolean;\n}\n\nexport interface ParallaxInstance extends Instance {\n /** Show the state at progress 0…1. */\n seek(progress: number): void;\n}\n\nexport function createParallax(root: HTMLElement | null, options: ParallaxOptions = {}): ParallaxInstance {\n const target =\n root?.querySelector<HTMLElement>('[data-mk-parallax-target]') ??\n root?.querySelector<HTMLElement>(':scope > img, :scope > video, :scope > picture') ??\n (root?.firstElementChild as HTMLElement | null) ??\n null;\n if (!root || !target) {\n warnOnce('parallax: needs an element with a picture inside');\n return inert({ seek() {} });\n }\n const t = TIMING.parallax;\n const { amount = 1, lerp = t.lerp, scroll = true } = options;\n const phone = typeof matchMedia === 'function' && matchMedia('(max-width: 767px)').matches;\n const scale = amount !== 1 && !phone ? t.strongScale : t.scale;\n registerMotion();\n // Not an entrance: it hides nothing, so only reduced motion stills it.\n const moving = !reduced();\n const originalTransform = target.style.transform;\n const originalOverflow = root.style.overflow;\n root.style.overflow = 'clip';\n\n const render = (progress: number) => {\n const p = moving ? progress : 0.5;\n const y = Number((-t.travel * amount + p * 2 * t.travel * amount).toFixed(3));\n target.style.transform = `translateY(${y}%) scale(${scale})`;\n };\n let track: ScrollTrack | null = null;\n if (moving && scroll) {\n const top = root.getBoundingClientRect().top + (window.scrollY || 0);\n track = trackScroll(root, { start: top < 20 ? 'top top' : 'top bottom', lerp, onUpdate: render });\n } else render(0.5);\n root.dataset.mkReady = '';\n\n return {\n seek(progress: number) {\n if (track) track.set(progress);\n else render(progress);\n },\n destroy() {\n track?.destroy();\n target.style.transform = originalTransform;\n root.style.overflow = originalOverflow;\n for (const el of [target, root]) if (el.getAttribute('style') === '') el.removeAttribute('style');\n delete root.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { trackScroll, type ScrollTrack } from '../../core/scroll-track';\nimport { clearStyles } from '../../core/styles';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * About grid: the pictures come from far away — pushed out from the\n * grid's centre (900 px), deep into the screen (up to −3000 px), tilted (up to\n * 160°), nearly transparent (.05) and small (.4) — and gather into their places\n * as the grid scrolls from its top at the screen's centre to its bottom at the\n * screen's bottom (eased .1 a frame). Centre first, 0.15 s spread to the edges.\n * The timeline follows normalized progress, ending with the grid fully assembled.\n */\n\nexport interface DepthGridOptions {\n start?: string;\n end?: string;\n lerp?: number;\n /** Follow the scroll (default). Off: only seek() moves it. */\n scroll?: boolean;\n}\n\nexport interface DepthGridInstance extends Instance {\n seek(progress: number): void;\n}\n\nconst STYLES = ['transform', 'translate', 'rotate', 'scale', 'opacity', 'visibility'];\n\n/** Initial position: where a child starts, from its centre relative to the grid's. */\nfunction origin(child: Element, box: DOMRect) {\n const t = TIMING.depthGrid;\n const own = child.getBoundingClientRect();\n const centre = { x: box.width / 2, y: box.height / 2 };\n const point = { x: own.left - box.left + own.width / 2, y: own.top - box.top + own.height / 2 };\n const angle = Math.atan2(Math.abs(centre.y - point.y), Math.abs(centre.x - point.x));\n const cos = Math.abs(Math.cos(angle));\n const sin = Math.abs(Math.sin(angle));\n const reach = Math.hypot(centre.x, centre.y) || 1;\n const h = Math.hypot(centre.x - point.x, centre.y - point.y) / reach;\n const left = point.x < centre.x;\n const above = point.y < centre.y;\n return {\n x: (left ? -1 : 1) * cos * t.distance,\n y: (above ? -1 : 1) * sin * t.distance,\n z: t.depth * h,\n rotateX: (above ? -1 : 1) * sin * t.rotate * h,\n rotateY: (left ? 1 : -1) * cos * t.rotate * h,\n };\n}\n\nexport function createDepthGrid(root: HTMLElement | null, options: DepthGridOptions = {}): DepthGridInstance {\n const items = root ? ([...root.children] as HTMLElement[]) : [];\n if (!root || !items.length) {\n warnOnce('depth-grid: needs a grid with children');\n return inert({ seek() {} });\n }\n const t = TIMING.depthGrid;\n const { start = 'top center', end = 'bottom bottom', lerp = t.lerp, scroll = true } = options;\n if (!entrances()) {\n root.dataset.mkReady = '';\n return {\n seek() {},\n destroy() {\n delete root.dataset.mkReady;\n },\n };\n }\n registerMotion();\n const perspective = root.style.perspective;\n root.style.perspective = `${t.perspective}px`;\n const box = root.getBoundingClientRect();\n const starts = items.map((item) => origin(item, box));\n const timeline = gsap.timeline({ paused: true, defaults: { ease: 'none' } });\n timeline.fromTo(\n items,\n {\n x: (i: number) => starts[i]!.x,\n y: (i: number) => starts[i]!.y,\n z: (i: number) => starts[i]!.z,\n rotateX: (i: number) => starts[i]!.rotateX,\n rotateY: (i: number) => starts[i]!.rotateY,\n autoAlpha: t.opacity,\n scale: t.scale,\n },\n {\n x: 0,\n y: 0,\n z: 0,\n rotateX: 0,\n rotateY: 0,\n autoAlpha: 1,\n scale: 1,\n duration: 1,\n stagger: { amount: t.stagger, from: 'center', grid: 'auto' },\n },\n );\n const render = (progress: number) => timeline.progress(progress);\n let track: ScrollTrack | null = null;\n if (scroll) track = trackScroll(root, { start, end, lerp, onUpdate: render });\n else render(0);\n root.dataset.mkReady = '';\n\n return {\n seek(progress: number) {\n if (track) track.set(progress);\n else render(progress);\n },\n destroy() {\n track?.destroy();\n timeline.kill();\n clearStyles(items, STYLES);\n root.style.perspective = perspective;\n if (root.getAttribute('style') === '') root.removeAttribute('style');\n delete root.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { trackScroll, type ScrollTrack } from '../../core/scroll-track';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * video mask: the frame and the picture inside scale in opposite\n * directions. With e = (1 − progress)·(1 − open) + open, the frame is\n * (80 + 20e) % and the picture (130 − 20e) % (phones: 95 + 5e and 105 − 5e):\n * full as it enters at the bottom, it closes like a window while it crosses the\n * screen. open(true) brings it back\n * to full (1 s expo.out).\n */\n\nexport interface FrameZoomOptions {\n start?: string;\n end?: string;\n lerp?: number;\n scroll?: boolean;\n}\n\nexport interface FrameZoomInstance extends Instance {\n seek(progress: number): void;\n /** Full frame (true) or back to the scroll (false). */\n open(on: boolean): void;\n readonly state: { progress: number; open: number };\n}\n\nexport function createFrameZoom(root: HTMLElement | null, options: FrameZoomOptions = {}): FrameZoomInstance {\n const inner = (root?.firstElementChild as HTMLElement | null) ?? null;\n if (!root || !inner) {\n warnOnce('frame-zoom: needs a frame with a picture inside');\n return inert({ seek() {}, open() {}, state: { progress: 0, open: 0 } });\n }\n const t = TIMING.frameZoom;\n const { start = 'top bottom', end = 'bottom top', lerp = t.lerp, scroll = true } = options;\n registerMotion();\n const phone = typeof matchMedia === 'function' && matchMedia('(max-width: 767px)').matches;\n const [outerBase, outerRange] = phone ? t.phoneOuter : t.outer;\n const [innerBase, innerRange] = phone ? t.phoneInner : t.inner;\n // Not an entrance: it hides nothing, so only reduced motion stills it.\n const moving = !reduced();\n const state = { progress: 0, open: 0 };\n const originals = [root.style.transform, inner.style.transform, root.style.overflow];\n root.style.overflow = 'clip';\n\n const render = () => {\n const e = moving ? (1 - state.progress) * (1 - state.open) + state.open : 1;\n root.style.transform = `scale(${Number(((outerBase + outerRange * e) / 100).toFixed(4))})`;\n inner.style.transform = `scale(${Number(((innerBase - innerRange * e) / 100).toFixed(4))})`;\n };\n let track: ScrollTrack | null = null;\n if (moving && scroll)\n track = trackScroll(root, {\n start,\n end,\n lerp,\n onUpdate: (value) => {\n state.progress = value;\n render();\n },\n });\n else render();\n root.dataset.mkReady = '';\n\n return {\n state,\n seek(progress: number) {\n if (track) track.set(progress);\n else {\n state.progress = Math.min(1, Math.max(0, progress));\n render();\n }\n },\n open(on: boolean) {\n gsap.killTweensOf(state);\n if (!moving) return;\n gsap.to(state, { open: on ? 1 : 0, duration: t.open, ease: 'expo.out', onUpdate: render });\n },\n destroy() {\n track?.destroy();\n gsap.killTweensOf(state);\n root.style.transform = originals[0]!;\n inner.style.transform = originals[1]!;\n root.style.overflow = originals[2]!;\n for (const el of [root, inner]) if (el.getAttribute('style') === '') el.removeAttribute('style');\n delete root.dataset.mkReady;\n },\n };\n}\n","import { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * header contrast: sections say what they are (data-mk-tone=\"light\" or\n * \"dark\"); the section crossing the top 10 % of the screen gives its tone to\n * the header (data-mk-on), and the page's CSS turns the logo and links dark on\n * light sections and light on dark ones.\n */\n\nexport interface ContrastOptions {\n /** Sections to watch (default [data-mk-tone]). */\n sections?: string;\n /** Attribute written on the target (default data-mk-on). */\n attribute?: string;\n}\n\nexport interface ContrastInstance extends Instance {\n readonly tone: string | null;\n}\n\nexport function createContrast(target: HTMLElement | null, options: ContrastOptions = {}): ContrastInstance {\n if (!target) {\n warnOnce('contrast: missing element');\n return inert({ tone: null });\n }\n const { sections = '[data-mk-tone]', attribute = 'data-mk-on' } = options;\n const scope = createScope();\n const watched = [...document.querySelectorAll<HTMLElement>(sections)];\n // Under the band, in the order they came in: the newest wins.\n const under = new Set<HTMLElement>();\n let tone: string | null = target.getAttribute(attribute);\n\n const apply = () => {\n const current = [...under].at(-1);\n if (!current) return;\n tone = current.dataset.mkTone ?? null;\n scope.attr(target, attribute, tone);\n };\n\n if (typeof IntersectionObserver === 'function' && watched.length) {\n const observer = scope.observe(\n new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const section = entry.target as HTMLElement;\n under.delete(section);\n if (entry.isIntersecting) under.add(section);\n }\n apply();\n },\n { rootMargin: '0% 0% -90% 0%', threshold: 0 },\n ),\n );\n for (const section of watched) observer.observe(section);\n }\n target.dataset.mkReady = '';\n\n return {\n get tone() {\n return tone;\n },\n destroy() {\n scope.dispose();\n delete target.dataset.mkReady;\n },\n };\n}\n","import { entrances } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * marquee: the first child (the group) is copied until the strip is\n * full, plus one; every copy slides its own length in a linear loop, so the\n * strip never shows a seam. Speed: 2 s per item in the group (at most 14).\n * Copies are aria-hidden and inert: readers and keyboards meet the group once.\n */\n\nexport interface MarqueeOptions {\n /** 'x' (default) or 'y'. */\n axis?: 'x' | 'y';\n /** Seconds per item. */\n speed?: number;\n reverse?: boolean;\n}\n\nexport interface MarqueeInstance extends Instance {\n /** Recount the copies (after the content or size changed). */\n refresh(): void;\n}\n\nexport function createMarquee(root: HTMLElement | null, options: MarqueeOptions = {}): MarqueeInstance {\n const group = (root?.firstElementChild as HTMLElement | null) ?? null;\n if (!root || !group) {\n warnOnce('marquee: needs a group inside');\n return inert({ refresh() {} });\n }\n const t = TIMING.marquee;\n const { axis = 'x', speed = t.perItem, reverse = false } = options;\n const scope = createScope();\n const classes = ['mk-marquee', `mk-marquee--${axis}`, reverse && 'mk-marquee--reverse'].filter(Boolean).join(' ');\n scope.attr(root, 'class', [root.getAttribute('class'), classes].filter(Boolean).join(' '));\n const items = Math.min(group.children.length || 1, t.maxItems);\n root.style.setProperty('--mk-marquee-duration', `${items * speed}s`);\n scope.add(() => {\n root.style.removeProperty('--mk-marquee-duration');\n if (root.getAttribute('style') === '') root.removeAttribute('style');\n });\n let copies: HTMLElement[] = [];\n\n const refresh = () => {\n for (const copy of copies.splice(0)) copy.remove();\n if (!entrances()) return;\n const size = axis === 'x' ? group.offsetWidth : group.offsetHeight;\n const room = axis === 'x' ? root.clientWidth : root.clientHeight;\n // Unmeasurable (hidden, not laid out yet): five copies.\n const count = size > 0 ? Math.max(1, Math.ceil(room / size)) + 1 : 5;\n for (let i = 0; i < count; i++) {\n const copy = group.cloneNode(true) as HTMLElement;\n copy.setAttribute('aria-hidden', 'true');\n copy.inert = true;\n for (const el of copy.querySelectorAll('[id]')) el.removeAttribute('id');\n root.append(copy);\n copies.push(copy);\n }\n };\n refresh();\n scope.add(() => {\n for (const copy of copies.splice(0)) copy.remove();\n });\n root.dataset.mkReady = '';\n\n return {\n refresh,\n destroy() {\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n}\n","import { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * product dock: a stack of glass cards where the ones behind the front\n * card drop 90 % / 180 % / 270 % and shrink to .93 / .87 / .8. Hover or focus\n * spreads them out (0.8 s, cubic-bezier(.48,.01,0,1.08)), the card under the\n * pointer grows and its name slides out; leaving stacks them again (0.64 s).\n * The motion is CSS (card-dock.css); this adds the 1.6 s spread on load, the\n * first tap on touch tablets, Escape / outside click and manual control.\n */\n\nexport interface CardDockOptions {\n /** Milliseconds the cards stay spread out on load before stacking (default: 1600; 0 skips it). */\n intro?: number;\n}\n\nexport interface CardDockInstance extends Instance {\n expand(): void;\n collapse(): void;\n readonly expanded: boolean;\n}\n\nconst TABLET_TOUCH = '(min-width: 768px) and (max-width: 1024px) and (hover: none)';\n\nexport function createCardDock(root: HTMLElement | null, options: CardDockOptions = {}): CardDockInstance {\n if (!root) {\n warnOnce('card-dock: missing element');\n return inert({ expand() {}, collapse() {}, expanded: false });\n }\n const t = TIMING.cardDock;\n const intro = Math.max(0, options.intro ?? t.intro);\n const scope = createScope();\n let expanded = false;\n let resizeTimer: ReturnType<typeof setTimeout> | undefined;\n\n const set = (name: string, on: boolean) => scope.attr(root, name, on ? '' : null);\n const expand = () => {\n if (scope.disposed) return;\n expanded = true;\n set('data-mk-expanded', true);\n };\n const collapse = () => {\n if (scope.disposed) return;\n expanded = false;\n set('data-mk-expanded', false);\n };\n const settle = () => {\n set('data-mk-spread', false);\n set('data-mk-settled', true);\n };\n // Checked on each tap, so a window resized into the tablet range works too.\n const tablet = () => typeof matchMedia === 'function' && matchMedia(TABLET_TOUCH).matches;\n\n if (intro > 0 && !reduced()) {\n set('data-mk-spread', true);\n scope.timeout(settle, intro);\n } else settle();\n\n // Touch tablets have no hover: the first tap opens the stack, the next one follows the link.\n scope.on(\n root,\n 'click',\n (event) => {\n if (expanded || !tablet()) return;\n event.preventDefault();\n event.stopPropagation();\n expand();\n },\n true,\n );\n scope.on(document, 'click', (event) => {\n if (expanded && !root.contains(event.target as Node)) collapse();\n });\n scope.on(document, 'keydown', (event) => {\n if (expanded && (event as KeyboardEvent).key === 'Escape') collapse();\n });\n scope.on(window, 'resize', () => {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(() => {\n if (!tablet()) collapse();\n }, t.resizeDebounce);\n });\n scope.add(() => clearTimeout(resizeTimer));\n scope.attr(root, 'data-mk-ready', '');\n\n return {\n expand,\n collapse,\n get expanded() {\n return expanded;\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * phone cards: a native scroll-snap strip that moves on by one card\n * every 5 s while it is on screen (starting `delay` ms after it shows), waits\n * 2 s after a touch, drag or wheel before carrying on, and wraps from the last\n * card to the first. Uses the browser's native scrolling and snapping.\n */\n\nexport interface SnapStripOptions {\n autoplay?: boolean;\n /** Milliseconds between cards (default: 5000). */\n interval?: number;\n /** Milliseconds to wait after the reader touches it (default: 2000). */\n resume?: number;\n /** Milliseconds after it shows before autoplay starts. */\n delay?: number;\n}\n\nexport interface SnapStripInstance extends Instance {\n next(): void;\n previous(): void;\n /** Index of the card nearest the start edge. */\n readonly index: number;\n}\n\nexport function createSnapStrip(root: HTMLElement | null, options: SnapStripOptions = {}): SnapStripInstance {\n if (!root || root.children.length < 2) {\n warnOnce('snap-strip: needs a strip with at least two cards');\n return inert({ next() {}, previous() {}, index: 0 });\n }\n const t = TIMING.snapStrip;\n const { autoplay = true, interval = t.interval, resume = t.resume, delay = t.delay } = options;\n const scope = createScope();\n const items = () => [...root.children] as HTMLElement[];\n const startScroll = root.scrollLeft;\n let timer: ReturnType<typeof setInterval> | undefined;\n let waiting: ReturnType<typeof setTimeout> | undefined;\n let visible = typeof IntersectionObserver !== 'function';\n let touching = false;\n\n const offsetOf = (item: HTMLElement) => item.getBoundingClientRect().left - root.getBoundingClientRect().left;\n const nearest = () => {\n let best = 0;\n items().forEach((item, i, all) => {\n if (Math.abs(offsetOf(item)) < Math.abs(offsetOf(all[best]!))) best = i;\n });\n return best;\n };\n const move = (step: number) => {\n if (scope.disposed) return;\n const all = items();\n const target = all[(nearest() + step + all.length) % all.length]!;\n root.scrollTo({ left: offsetOf(target) + root.scrollLeft, behavior: reduced() ? 'instant' : 'smooth' });\n };\n\n const stop = () => {\n clearInterval(timer);\n timer = undefined;\n };\n const start = () => {\n if (scope.disposed || !autoplay || reduced() || !visible || touching || document.hidden || timer) return;\n timer = setInterval(() => move(1), interval);\n };\n const later = (fn: () => void, ms: number) => {\n clearTimeout(waiting);\n waiting = setTimeout(fn, ms);\n };\n scope.add(() => {\n stop();\n clearTimeout(waiting);\n });\n\n const hold = () => {\n touching = true;\n stop();\n };\n const release = () => {\n if (!touching) return;\n later(() => {\n touching = false;\n start();\n }, resume);\n };\n scope.on(root, 'pointerdown', hold, { passive: true });\n scope.on(root, 'touchstart', hold, { passive: true });\n scope.on(window, 'pointerup', release, { passive: true });\n scope.on(window, 'pointercancel', release, { passive: true });\n scope.on(window, 'touchend', release, { passive: true });\n scope.on(\n root,\n 'wheel',\n () => {\n hold();\n release();\n },\n { passive: true },\n );\n scope.on(document, 'visibilitychange', () => {\n stop();\n start();\n });\n\n if (typeof IntersectionObserver === 'function') {\n const observer = scope.observe(\n new IntersectionObserver(([entry]) => {\n visible = Boolean(entry?.isIntersecting);\n stop();\n if (visible) later(start, delay);\n else clearTimeout(waiting);\n }),\n );\n observer.observe(root);\n } else later(start, delay);\n\n scope.add(() => {\n root.scrollLeft = startScroll;\n });\n scope.attr(root, 'data-mk-ready', '');\n\n return {\n next: () => move(1),\n previous: () => move(-1),\n get index() {\n return nearest();\n },\n destroy: () => scope.dispose(),\n };\n}\n","import { gsap, SplitText, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { trackScroll, type ScrollTrack } from '../../core/scroll-track';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * fill-text: the letters start at 20 % and fill in one after another,\n * tied to the scroll, from when the text's top reaches 90 % of the screen until\n * its centre reaches 40 % (each letter 0.5 s of a linear timeline, 0.1 s apart).\n */\n\nexport interface FillTextOptions {\n /** Opacity the letters start at. */\n from?: number;\n /** ScrollTrigger-style positions, as in trackScroll. */\n start?: string;\n end?: string;\n /** Follow the scroll (default). Off: only seek() moves it. */\n scroll?: boolean;\n}\n\nexport interface FillTextInstance extends Instance {\n /** Show the state at progress 0…1. */\n seek(progress: number): void;\n readonly progress: number;\n}\n\nexport function createFillText(el: HTMLElement | null, options: FillTextOptions = {}): FillTextInstance {\n if (!el) {\n warnOnce('fill-text: missing element');\n return inert({ seek() {}, progress: 1 });\n }\n const t = TIMING.fillText;\n const { from = t.from, start = t.start, end = t.end, scroll = true } = options;\n registerMotion();\n // Not an entrance: the text stays readable, so only reduced motion stills it.\n if (reduced()) {\n el.dataset.mkReady = '';\n return {\n seek() {},\n progress: 1,\n destroy() {\n delete el.dataset.mkReady;\n },\n };\n }\n\n let timeline: gsap.core.Timeline | null = null;\n let progress = 0;\n const build = (chars: Element[]) => {\n timeline?.kill();\n timeline = gsap\n .timeline({ paused: true })\n .fromTo(chars, { opacity: from }, { opacity: 1, ease: 'none', duration: t.duration, stagger: t.stagger });\n timeline.progress(progress);\n };\n const split = SplitText.create(el, {\n type: 'words,chars',\n aria: 'auto',\n autoSplit: true,\n wordsClass: 'mk-fill-word',\n charsClass: 'mk-fill-char',\n // A new split (resize, fonts) keeps the place it was at.\n onSplit: (self: SplitText) => build(self.chars),\n });\n if (!timeline) build(split.chars);\n\n const render = (value: number) => {\n progress = value;\n timeline?.progress(value);\n };\n let track: ScrollTrack | null = scroll ? trackScroll(el, { start, end, onUpdate: render }) : null;\n if (!track) render(0);\n el.dataset.mkReady = '';\n\n return {\n seek(value: number) {\n if (track) track.set(value);\n else render(Math.min(1, Math.max(0, value)));\n },\n get progress() {\n return progress;\n },\n destroy() {\n track?.destroy();\n track = null;\n timeline?.kill();\n split.revert();\n delete el.dataset.mkReady;\n },\n };\n}\n","import { createMenu, type MenuInstance, type MenuOptions } from '../../components/menu/engine';\n\nexport type TicketMenuOptions = Omit<MenuOptions, 'ticket'>;\nexport type TicketMenuInstance = MenuInstance;\nexport const createTicketMenu = (root: HTMLElement | null, options: TicketMenuOptions = {}): TicketMenuInstance =>\n createMenu(root, { ...options, ticket: true });\n","import { whileVisible } from '../../core/loop';\nimport { wrap } from '../../core/math';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface InfiniteReelOptions { speed?: number; friction?: number; axis?: 'x' | 'y'; }\nexport interface InfiniteReelInstance extends Instance {\n moveBy(pixels: number): void;\n pause(): void;\n resume(): void;\n readonly position: number;\n}\n\nexport function createInfiniteReel(root: HTMLElement | null, options: InfiniteReelOptions = {}): InfiniteReelInstance {\n const track = root?.querySelector<HTMLElement>('[data-mk-reel-track]');\n if (!root || !track) return inert({ moveBy() {}, pause() {}, resume() {}, position: 0 });\n const scope = createScope();\n const still = reduced();\n const vertical = options.axis === 'y';\n scope.attr(root, 'data-mk-axis', vertical ? 'y' : 'x');\n scope.attr(root, 'tabindex', root.getAttribute('tabindex') ?? '0');\n scope.attr(track, 'style', track.getAttribute('style'));\n const copies: HTMLElement[] = [];\n let length = 0;\n let position = 0;\n let velocity = 0;\n let paused = false;\n let focused = false;\n let drag: { point: number; id: number; moved: number } | null = null;\n let suppressClick = false;\n const coordinate = (event: PointerEvent) => vertical ? event.clientY : event.clientX;\n const draw = () => {\n if (still) {\n if (vertical) root.scrollTop = position;\n else root.scrollLeft = position;\n return;\n }\n [track, ...copies].forEach((group, index) => {\n const offset = index * length - position;\n group.style.transform = vertical ? `translateY(${offset}px)` : `translateX(${offset}px)`;\n });\n };\n const measure = () => {\n copies.splice(0).forEach((copy) => copy.remove());\n const rect = track.getBoundingClientRect();\n length = vertical ? track.scrollHeight || rect.height : track.scrollWidth || rect.width;\n if (!still && length > 0) {\n const viewport = root.getBoundingClientRect();\n const count = Math.min(30, Math.ceil((vertical ? viewport.height : viewport.width) / length) + 1);\n for (let index = 0; index < count; index++) {\n const copy = track.cloneNode(true) as HTMLElement;\n copy.removeAttribute('id');\n copy.removeAttribute('data-mk-reel-track');\n copy.removeAttribute('data-mk');\n copy.setAttribute('data-mk-reel-copy', '');\n copy.setAttribute('aria-hidden', 'true');\n copy.setAttribute('inert', '');\n copy.querySelectorAll('[id]').forEach((child) => child.removeAttribute('id'));\n copy.querySelectorAll('[data-mk]').forEach((child) => child.removeAttribute('data-mk'));\n root.append(copy);\n copies.push(copy);\n }\n }\n position = length > 0 ? wrap(position, length) : 0;\n draw();\n };\n const moveBy = (pixels: number) => {\n if (scope.disposed || !Number.isFinite(pixels) || length <= 0) return;\n position = wrap(position + pixels, length);\n draw();\n };\n scope.on(root, 'wheel', (event) => {\n if (still || !length) return;\n event.preventDefault();\n const units = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? (vertical ? root.clientHeight : root.clientWidth) : 1;\n velocity += (vertical ? event.deltaY : event.deltaX || event.deltaY) * units * TIMING.infiniteReel.wheel;\n }, { passive: false });\n scope.on(root, 'pointerdown', (event) => {\n if (event.button !== 0 || drag || still) return;\n velocity = 0;\n suppressClick = false;\n drag = { point: coordinate(event), id: event.pointerId, moved: 0 };\n });\n scope.on(window, 'pointermove', (event) => {\n if (!drag || event.pointerId !== drag.id) return;\n const delta = drag.point - coordinate(event);\n drag.moved += Math.abs(delta);\n drag.point = coordinate(event);\n if (drag.moved > TIMING.infiniteReel.dragThreshold) {\n suppressClick = true;\n root.setPointerCapture?.(event.pointerId);\n moveBy(delta);\n velocity = delta;\n }\n });\n const release = (event: PointerEvent) => {\n if (!drag || drag.id !== event.pointerId) return;\n drag = null;\n if (root.hasPointerCapture?.(event.pointerId)) root.releasePointerCapture(event.pointerId);\n };\n scope.on(window, 'pointerup', release);\n scope.on(window, 'pointercancel', (event) => { velocity = 0; release(event); });\n scope.on(root, 'lostpointercapture', release);\n scope.on(root, 'click', (event) => {\n if (suppressClick) { event.preventDefault(); event.stopPropagation(); suppressClick = false; }\n }, true);\n scope.on(root, 'focusin', () => { focused = true; });\n scope.on(root, 'focusout', (event) => { focused = root.contains(event.relatedTarget as Node | null); });\n scope.on(root, 'keydown', (event) => {\n if (event.target !== root) return;\n const next = vertical ? 'ArrowDown' : 'ArrowRight';\n const previous = vertical ? 'ArrowUp' : 'ArrowLeft';\n if (![next, previous, ' '].includes(event.key)) return;\n event.preventDefault();\n moveBy((event.key === previous ? -1 : 1) * length / Math.max(1, track.children.length));\n });\n if (typeof ResizeObserver === 'function') {\n const observer = scope.observe(new ResizeObserver(measure));\n observer.observe(root);\n observer.observe(track);\n }\n scope.on(window, 'resize', measure);\n scope.on(track, 'load', measure, true);\n const scroll = { left: root.scrollLeft, top: root.scrollTop };\n scope.add(() => {\n copies.forEach((copy) => copy.remove());\n if (drag && root.hasPointerCapture?.(drag.id)) root.releasePointerCapture(drag.id);\n root.scrollLeft = scroll.left;\n root.scrollTop = scroll.top;\n });\n measure();\n if (!still) scope.add(whileVisible(root, (dt) => {\n if (paused || focused || drag || document.hidden) return;\n moveBy(((options.speed ?? 0) + velocity) * dt);\n velocity *= Math.pow(Math.max(0, Math.min(0.999, options.friction ?? TIMING.infiniteReel.friction)), dt);\n }));\n return { moveBy, pause() { paused = true; }, resume() { paused = false; }, get position() { return position; }, destroy: () => scope.dispose() };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { motionSpring } from '../../core/physics-spring';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { clearStyles } from '../../core/styles';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface RepelBentoOptions { distance?: number; breakpoint?: number; }\nexport interface RepelBentoInstance extends Instance { play(): void; reset(): void; }\n\nexport function createRepelBento(root: HTMLElement | null, options: RepelBentoOptions = {}): RepelBentoInstance {\n if (!root || reduced()) return inert({ play() {}, reset() {} });\n registerMotion();\n const scope = createScope();\n const items = [...root.children] as HTMLElement[];\n const animations = new Map<HTMLElement, gsap.core.Tween>();\n const defaults = TIMING.repelBento;\n const enabled = () => innerWidth >= (options.breakpoint ?? defaults.breakpoint) && !matchMedia('(pointer: coarse)').matches;\n items.forEach((item) => scope.attr(item, 'style', item.getAttribute('style')));\n const animate = (item: HTMLElement, vars: gsap.TweenVars) => {\n animations.get(item)?.kill();\n animations.set(item, gsap.to(item, { ...vars, overwrite: true }));\n };\n const reset = () => {\n if (scope.disposed) return;\n items.forEach((item) => animate(item, { x: 0, y: 0, scale: 1, opacity: 1, ...motionSpring(...TIMING.springs.bentoRepel) }));\n };\n const play = () => {\n if (scope.disposed || !enabled()) return;\n items.forEach((item, index) => {\n const rect = item.getBoundingClientRect();\n gsap.set(item, { x: (rect.left + rect.width / 2 - innerWidth / 2) * defaults.offset, y: (rect.top + rect.height / 2 - innerHeight / 2) * defaults.offset, opacity: 0 });\n animate(item, { x: 0, y: 0, opacity: 1, delay: index * defaults.stagger, ...motionSpring(...TIMING.springs.bentoEnter) });\n });\n };\n items.forEach((hovered) => scope.on(hovered, 'pointerenter', () => {\n if (!enabled()) return;\n const origin = hovered.getBoundingClientRect();\n items.forEach((item) => {\n if (item === hovered) { animate(item, { x: 0, y: 0, scale: 1.02, opacity: 1, ...motionSpring(...TIMING.springs.bentoRepel) }); return; }\n const rect = item.getBoundingClientRect();\n const deltaX = rect.left + rect.width / 2 - origin.left - origin.width / 2;\n const deltaY = rect.top + rect.height / 2 - origin.top - origin.height / 2;\n const distance = Math.hypot(deltaX, deltaY);\n const magnitude = distance > 0 ? Math.min(defaults.strength / distance, options.distance ?? defaults.distance) : 0;\n animate(item, { x: distance ? deltaX / distance * magnitude : 0, y: distance ? deltaY / distance * magnitude : 0, scale: 1, opacity: 1, ...motionSpring(...TIMING.springs.bentoRepel) });\n });\n }));\n scope.on(root, 'pointerleave', reset);\n scope.on(window, 'resize', reset);\n scope.add(() => {\n animations.forEach((animation) => animation.kill());\n clearStyles(items, ['transform', 'translate', 'rotate', 'scale', 'opacity']);\n });\n if (typeof IntersectionObserver === 'function') {\n const observer = scope.observe(new IntersectionObserver(([entry]) => {\n if (!entry?.isIntersecting) return;\n play();\n observer.disconnect();\n }, { threshold: 0.15 }));\n observer.observe(root);\n } else play();\n return { play, reset, destroy: () => scope.dispose() };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { wrap } from '../../core/math';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { clearStyles } from '../../core/styles';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface RotatorOptions {\n interval?: number;\n autoplay?: boolean;\n index?: number;\n onChange?: (index: number) => void;\n}\nexport interface RotatorInstance extends Instance {\n select(index: number): void;\n next(): void;\n previous(): void;\n readonly index: number;\n}\n\nexport function createRotator(root: HTMLElement | null, options: RotatorOptions = {}): RotatorInstance {\n const items = root ? [...root.children] as HTMLElement[] : [];\n if (!root || !items.length) return inert({ select() {}, next() {}, previous() {}, index: 0 });\n registerMotion();\n const scope = createScope();\n const still = reduced();\n let index = 0;\n let hovered = false;\n let focused = false;\n let timer: ReturnType<typeof setInterval> | undefined;\n let animation: gsap.core.Tween | undefined;\n for (const item of items) scope.attr(item, 'style', item.getAttribute('style'));\n const select = (next: number, notify = true) => {\n if (scope.disposed || !Number.isFinite(next)) return;\n index = wrap(Math.round(next), items.length);\n animation?.kill();\n for (const [position, item] of items.entries()) {\n scope.attr(item, 'hidden', position === index ? null : '');\n scope.attr(item, 'inert', position === index ? null : '');\n }\n if (!still) animation = gsap.fromTo(items[index]!, { opacity: 0, y: TIMING.rotator.y }, { opacity: 1, y: 0, duration: TIMING.rotator.duration, overwrite: true });\n if (notify) {\n options.onChange?.(index);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { index } }));\n }\n };\n const restart = () => {\n clearInterval(timer);\n if (scope.disposed || still || options.autoplay === false || hovered || focused || document.hidden || items.length < 2) return;\n timer = setInterval(() => select(index + 1), Math.max(100, options.interval ?? TIMING.rotator.interval));\n };\n const move = (next: number) => { select(next); restart(); };\n scope.on(root, 'pointerenter', () => { hovered = true; restart(); });\n scope.on(root, 'pointerleave', () => { hovered = false; restart(); });\n scope.on(root, 'focusin', () => { focused = true; restart(); });\n scope.on(root, 'focusout', (event) => {\n focused = root.contains(event.relatedTarget as Node | null);\n restart();\n });\n scope.on(document, 'visibilitychange', restart);\n scope.add(() => { clearInterval(timer); animation?.kill(); clearStyles(items, ['transform', 'translate', 'rotate', 'scale', 'opacity']); });\n select(options.index ?? 0, false);\n restart();\n return { select: move, next: () => move(index + 1), previous: () => move(index - 1), get index() { return index; }, destroy: () => scope.dispose() };\n}\n","import { clamp } from '../../core/math';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface DragRulerOptions {\n min?: number;\n max?: number;\n step?: number;\n value?: number;\n pixelsPerUnit?: number;\n onChange?: (value: number) => void;\n}\n\nexport interface DragRulerInstance extends Instance {\n set(value: number): void;\n readonly value: number;\n}\n\nexport function createDragRuler(root: HTMLElement | null, options: DragRulerOptions = {}): DragRulerInstance {\n if (!root) return inert({ set() {}, value: 0 });\n const scope = createScope();\n const defaults = TIMING.dragRuler;\n const min = Number.isFinite(options.min) ? options.min! : defaults.min;\n const max = Math.max(min, Number.isFinite(options.max) ? options.max! : defaults.max);\n const step = Number.isFinite(options.step) && options.step! > 0 ? options.step! : defaults.step;\n const pixels = Number.isFinite(options.pixelsPerUnit) && options.pixelsPerUnit! > 0 ? options.pixelsPerUnit! : defaults.pixelsPerUnit;\n let value = min;\n let drag: { x: number; value: number; id: number } | null = null;\n const track = document.createElement('span');\n track.className = 'mk-drag-ruler__track';\n track.setAttribute('aria-hidden', 'true');\n const count = Math.min(500, Math.ceil((max - min) / step));\n for (let index = 0; index <= count; index++) {\n const tick = document.createElement('span');\n const tickValue = min + index * ((max - min) / Math.max(1, count));\n tick.className = 'mk-drag-ruler__tick';\n tick.style.left = `${(tickValue - min) * pixels}px`;\n if (index % 10 === 0) tick.textContent = String(Number(tickValue.toFixed(2)));\n track.append(tick);\n }\n root.append(track);\n scope.add(() => track.remove());\n scope.attr(root, 'role', 'slider');\n scope.attr(root, 'tabindex', root.getAttribute('tabindex') ?? '0');\n scope.attr(root, 'aria-orientation', 'horizontal');\n scope.attr(root, 'aria-valuemin', String(min));\n scope.attr(root, 'aria-valuemax', String(max));\n const set = (next: number, notify = true) => {\n if (scope.disposed || !Number.isFinite(next)) return;\n const snapped = clamp(Number((min + Math.round((next - min) / step) * step).toFixed(8)), min, max);\n const changed = snapped !== value;\n value = snapped;\n scope.attr(root, 'aria-valuenow', String(value));\n track.style.transform = `translateX(${-(value - min) * pixels - 3}px)`;\n if (changed && notify) {\n options.onChange?.(value);\n root.dispatchEvent(new CustomEvent('mk:change', { bubbles: true, detail: { value } }));\n }\n };\n scope.on(root, 'keydown', (event) => {\n const keys: Record<string, number> = {\n ArrowLeft: value - step, ArrowDown: value - step, ArrowRight: value + step, ArrowUp: value + step,\n PageDown: value - step * 10, PageUp: value + step * 10, Home: min, End: max,\n };\n if (!(event.key in keys)) return;\n event.preventDefault();\n set(keys[event.key]!);\n });\n scope.on(root, 'pointerdown', (event) => {\n if (event.button !== 0 || drag) return;\n drag = { x: event.clientX, value, id: event.pointerId };\n root.setPointerCapture?.(event.pointerId);\n scope.attr(root, 'data-mk-dragging', '');\n root.focus({ preventScroll: true });\n });\n scope.on(window, 'pointermove', (event) => {\n if (!drag || event.pointerId !== drag.id) return;\n set(drag.value - (event.clientX - drag.x) / pixels);\n });\n const release = (event: PointerEvent) => {\n if (!drag || event.pointerId !== drag.id) return;\n if (root.hasPointerCapture?.(drag.id)) root.releasePointerCapture(drag.id);\n drag = null;\n scope.attr(root, 'data-mk-dragging', null);\n };\n scope.on(window, 'pointerup', release);\n scope.on(window, 'pointercancel', release);\n scope.on(root, 'lostpointercapture', release);\n scope.add(() => {\n if (drag && root.hasPointerCapture?.(drag.id)) root.releasePointerCapture(drag.id);\n });\n set(options.value ?? max, false);\n return { set, get value() { return value; }, destroy: () => scope.dispose() };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { motionSpring } from '../../core/physics-spring';\nimport { reduced } from '../../core/reduced';\nimport { wrap } from '../../core/math';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, type Instance } from '../../core/types';\n\nexport interface DockPillOptions { index?: number; onSelect?: (index: number, item: HTMLElement) => void; }\nexport interface DockPillInstance extends Instance { select(index: number): void; readonly index: number; }\n\nexport function createDockPill(root: HTMLElement | null, options: DockPillOptions = {}): DockPillInstance {\n const items = root ? [...root.querySelectorAll<HTMLElement>('[data-mk-dock-item]')] : [];\n if (!root || !items.length) return inert({ select() {}, index: 0 });\n registerMotion();\n const scope = createScope();\n const indicator = document.createElement('span');\n indicator.className = 'mk-dock-pill__indicator';\n indicator.setAttribute('aria-hidden', 'true');\n root.prepend(indicator);\n scope.add(() => indicator.remove());\n let index = Math.max(0, items.findIndex((item) => item.getAttribute('aria-current') === 'page'));\n let animation: gsap.core.Tween | undefined;\n const measure = (animate = true) => {\n if (scope.disposed) return;\n const item = items[index]!;\n const target = { x: item.offsetLeft, y: item.offsetTop, width: item.offsetWidth, height: item.offsetHeight };\n animation?.kill();\n if (animate && !reduced()) animation = gsap.to(indicator, { ...target, ...motionSpring(...TIMING.springs.dockPill), overwrite: true });\n else gsap.set(indicator, target);\n };\n const select = (next: number, notify = true) => {\n if (scope.disposed || !Number.isFinite(next)) return;\n const candidate = wrap(Math.round(next), items.length);\n if (items[candidate]!.matches(':disabled, [aria-disabled=\"true\"]')) return;\n index = candidate;\n items.forEach((item, position) => scope.attr(item, 'aria-current', position === index ? 'page' : null));\n measure(notify);\n if (notify) {\n options.onSelect?.(index, items[index]!);\n root.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { index, item: items[index] } }));\n }\n };\n scope.on(root, 'click', (event) => {\n const item = (event.target as Element).closest<HTMLElement>('[data-mk-dock-item]');\n if (item && items.includes(item)) select(items.indexOf(item));\n });\n scope.on(root, 'keydown', (event) => {\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (current < 0) return;\n const direction = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0;\n if (!direction && event.key !== 'Home' && event.key !== 'End') return;\n event.preventDefault();\n let next = event.key === 'Home' ? 0 : event.key === 'End' ? items.length - 1 : wrap(current + direction, items.length);\n for (let tries = 0; tries < items.length && items[next]!.matches(':disabled, [aria-disabled=\"true\"]'); tries++) next = wrap(next + (direction || 1), items.length);\n select(next);\n items[index]!.focus();\n });\n if (typeof ResizeObserver === 'function') {\n const observer = scope.observe(new ResizeObserver(() => measure(false)));\n observer.observe(root);\n items.forEach((item) => observer.observe(item));\n }\n scope.on(window, 'resize', () => measure(false));\n scope.add(() => animation?.kill());\n select(options.index ?? index, false);\n return { select, get index() { return index; }, destroy: () => scope.dispose() };\n}\n"],"mappings":"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","names":["rand","letters","origin","finish","pointer","origin","face","STYLES","build","origin"]}