@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,4 +1,5 @@
1
1
  import {
2
+ CustomEase,
2
3
  EASE,
3
4
  ELASTIC,
4
5
  Flip,
@@ -14,9 +15,10 @@ import {
14
15
  pointer,
15
16
  registerMotion,
16
17
  revealFrom,
18
+ slideIndicator,
17
19
  splitGraphemes,
18
20
  takeMovement
19
- } from "./chunk-JQMJQSXD.js";
21
+ } from "./chunk-CU6SXW3E.js";
20
22
  import {
21
23
  clamp,
22
24
  damp,
@@ -152,31 +154,6 @@ function installDetailsMotion(root = document) {
152
154
  return () => root.removeEventListener("click", onClick);
153
155
  }
154
156
 
155
- // src/motion/indicator.ts
156
- function slideIndicator(indicator, target, options = {}) {
157
- registerMotion();
158
- const { immediate = false, duration = TIMING.indicator, scroller, orientation = "horizontal" } = options;
159
- gsap.killTweensOf(indicator);
160
- if (!target) {
161
- gsap.set(indicator, { opacity: 0 });
162
- return null;
163
- }
164
- const box = { x: target.offsetLeft, y: target.offsetTop, width: target.offsetWidth, height: target.offsetHeight, opacity: 1 };
165
- if (scroller) {
166
- const horizontal = orientation === "horizontal";
167
- const overflow = horizontal ? scroller.scrollWidth > scroller.clientWidth : scroller.scrollHeight > scroller.clientHeight;
168
- if (overflow && typeof scroller.scrollTo === "function") {
169
- const offset = horizontal ? box.x - (scroller.clientWidth - box.width) / 2 : box.y - (scroller.clientHeight - box.height) / 2;
170
- scroller.scrollTo({ [horizontal ? "left" : "top"]: offset, behavior: immediate || reduced() ? "auto" : "smooth" });
171
- }
172
- }
173
- if (immediate || reduced()) {
174
- gsap.set(indicator, box);
175
- return null;
176
- }
177
- return gsap.to(indicator, { ...box, duration, ease: EASE.signature });
178
- }
179
-
180
157
  // src/motion/layout.ts
181
158
  function captureLayout(root, selector) {
182
159
  registerMotion();
@@ -3271,11 +3248,1197 @@ function createDockPill(root, options = {}) {
3271
3248
  }, destroy: () => scope.dispose() };
3272
3249
  }
3273
3250
 
3251
+ // src/recipes/joined-cta/create-joined-cta.ts
3252
+ function createJoinedCta(root, options = {}) {
3253
+ if (!root) return inert({ expand() {
3254
+ }, collapse() {
3255
+ }, expanded: false });
3256
+ const scope = createScope();
3257
+ let expanded = false;
3258
+ let pointer2 = false;
3259
+ scope.attr(root, "style", root.getAttribute("style"));
3260
+ scope.attr(root, "data-mk-ready", "");
3261
+ if (Number.isFinite(options.duration)) root.style.setProperty("--mk-joined-duration", `${Math.max(0, options.duration)}s`);
3262
+ const set = (value) => {
3263
+ if (!scope.disposed) {
3264
+ expanded = value;
3265
+ scope.attr(root, "data-mk-expanded", value ? "" : null);
3266
+ }
3267
+ };
3268
+ scope.on(root, "pointerenter", () => {
3269
+ pointer2 = true;
3270
+ set(true);
3271
+ });
3272
+ scope.on(root, "pointerleave", () => {
3273
+ pointer2 = false;
3274
+ if (!root.contains(document.activeElement)) set(false);
3275
+ });
3276
+ scope.on(root, "focusin", () => set(true));
3277
+ scope.on(root, "focusout", (event) => {
3278
+ if (!pointer2 && !root.contains(event.relatedTarget)) set(false);
3279
+ });
3280
+ return { expand: () => set(true), collapse: () => set(false), get expanded() {
3281
+ return expanded;
3282
+ }, destroy: () => scope.dispose() };
3283
+ }
3284
+
3285
+ // src/recipes/image-zoom/create-image-zoom.ts
3286
+ function createImageZoom(root, options = {}) {
3287
+ if (!root) return inert({ open() {
3288
+ }, active: false });
3289
+ const scope = createScope();
3290
+ let active = false;
3291
+ let pointer2 = false;
3292
+ scope.attr(root, "style", root.getAttribute("style"));
3293
+ scope.attr(root, "data-mk-ready", "");
3294
+ const setVariable = (name, value, suffix = "") => {
3295
+ if (Number.isFinite(value)) root.style.setProperty(name, `${Math.max(0, value)}${suffix}`);
3296
+ };
3297
+ setVariable("--mk-zoom-duration", options.duration, "s");
3298
+ setVariable("--mk-zoom-frame-scale", options.frameScale);
3299
+ setVariable("--mk-zoom-image-scale", options.imageScale);
3300
+ const set = (on) => {
3301
+ if (!scope.disposed) {
3302
+ active = on;
3303
+ scope.attr(root, "data-mk-active", on ? "" : null);
3304
+ }
3305
+ };
3306
+ scope.on(root, "pointerenter", () => {
3307
+ pointer2 = true;
3308
+ set(true);
3309
+ });
3310
+ scope.on(root, "pointerleave", () => {
3311
+ pointer2 = false;
3312
+ if (!root.contains(document.activeElement)) set(false);
3313
+ });
3314
+ scope.on(root, "focusin", () => set(true));
3315
+ scope.on(root, "focusout", (event) => {
3316
+ if (!pointer2 && !root.contains(event.relatedTarget)) set(false);
3317
+ });
3318
+ return { open: set, get active() {
3319
+ return active;
3320
+ }, destroy: () => scope.dispose() };
3321
+ }
3322
+
3323
+ // src/recipes/font-cycle/create-font-cycle.ts
3324
+ function applyFace(element, face2) {
3325
+ if (face2.family) element.style.fontFamily = face2.family;
3326
+ if (face2.weight !== void 0) element.style.fontWeight = String(face2.weight);
3327
+ if (face2.style) element.style.fontStyle = face2.style;
3328
+ const axes = Object.entries(face2.axes ?? {}).filter(([tag, value]) => /^[\w ]{4}$/.test(tag) && Number.isFinite(value));
3329
+ if (axes.length) element.style.fontVariationSettings = axes.map(([tag, value]) => `"${tag}" ${value}`).join(", ");
3330
+ }
3331
+ function createFontCycle(root, options = {}) {
3332
+ if (!root || typeof document === "undefined") return inert({ play() {
3333
+ }, reset() {
3334
+ }, active: false });
3335
+ registerMotion();
3336
+ const scope = createScope();
3337
+ const original = [...root.childNodes];
3338
+ const text = options.text ?? root.textContent ?? "";
3339
+ const faces = options.faces ?? [
3340
+ { weight: 500, axes: { wght: 500, wdth: 75 } },
3341
+ { family: root.dataset.mkFontAlternate, weight: 900, axes: { wght: 900, wdth: 125 } }
3342
+ ];
3343
+ const duration = Math.max(0, options.duration ?? 0.6);
3344
+ const stagger = Math.max(0, options.stagger ?? 0.035);
3345
+ const tracks = [];
3346
+ let animation;
3347
+ let active = false;
3348
+ let hovered = false;
3349
+ let focused = false;
3350
+ const copy = document.createElement("span");
3351
+ copy.className = "mk-font-cycle__accessible";
3352
+ copy.textContent = text;
3353
+ const visual = document.createElement("span");
3354
+ visual.className = "mk-font-cycle__visual";
3355
+ visual.setAttribute("aria-hidden", "true");
3356
+ for (const [index, letter] of splitGraphemes(text, Number.MAX_SAFE_INTEGER).entries()) {
3357
+ const character = document.createElement("span");
3358
+ character.className = "mk-font-cycle__char";
3359
+ const track = document.createElement("span");
3360
+ track.className = "mk-font-cycle__track";
3361
+ for (let side = 0; side < 2; side++) {
3362
+ const face2 = document.createElement("span");
3363
+ face2.className = "mk-font-cycle__face";
3364
+ face2.textContent = letter === " " ? "\xA0" : letter;
3365
+ applyFace(face2, faces[(index + side) % 2]);
3366
+ const sizer = face2.cloneNode(true);
3367
+ sizer.className = "mk-font-cycle__sizer";
3368
+ character.append(sizer);
3369
+ track.append(face2);
3370
+ }
3371
+ character.append(track);
3372
+ visual.append(character);
3373
+ tracks.push(track);
3374
+ }
3375
+ root.replaceChildren(copy, visual);
3376
+ const overlaySrc = options.overlaySrc ?? root.dataset.mkFontOverlay;
3377
+ if (overlaySrc) {
3378
+ const overlay = document.createElement("img");
3379
+ overlay.className = "mk-font-cycle__overlay";
3380
+ overlay.alt = "";
3381
+ overlay.setAttribute("aria-hidden", "true");
3382
+ scope.attr(root, "data-mk-font-overlay-ready", null);
3383
+ const loaded = () => {
3384
+ if (!scope.disposed) scope.attr(root, "data-mk-font-overlay-ready", overlay.naturalWidth > 0 ? "" : null);
3385
+ };
3386
+ scope.on(overlay, "load", loaded);
3387
+ scope.on(overlay, "error", () => {
3388
+ if (!scope.disposed) scope.attr(root, "data-mk-font-overlay-ready", null);
3389
+ });
3390
+ overlay.src = overlaySrc;
3391
+ root.append(overlay);
3392
+ if (overlay.complete) loaded();
3393
+ }
3394
+ scope.add(() => root.replaceChildren(...original));
3395
+ scope.attr(root, "class", `${root.className} mk-font-cycle`.trim());
3396
+ scope.attr(root, "data-mk-ready", "");
3397
+ const setActive = (next) => {
3398
+ if (scope.disposed || next === active) return;
3399
+ active = next;
3400
+ scope.attr(root, "data-mk-active", next ? "" : null);
3401
+ animation?.kill();
3402
+ if (reduced() || duration === 0) gsap.set(tracks, { yPercent: next ? -50 : 0 });
3403
+ else animation = gsap.to(tracks, { yPercent: next ? -50 : 0, duration, stagger, ease: "power3.out", overwrite: true });
3404
+ };
3405
+ scope.on(root, "mouseenter", () => {
3406
+ hovered = true;
3407
+ setActive(true);
3408
+ });
3409
+ scope.on(root, "mouseleave", () => {
3410
+ hovered = false;
3411
+ setActive(focused);
3412
+ });
3413
+ scope.on(root, "focusin", () => {
3414
+ focused = true;
3415
+ setActive(true);
3416
+ });
3417
+ scope.on(root, "focusout", (event) => {
3418
+ if (event.relatedTarget instanceof Node && root.contains(event.relatedTarget)) return;
3419
+ focused = false;
3420
+ setActive(hovered);
3421
+ });
3422
+ scope.add(() => animation?.kill());
3423
+ return { play: () => setActive(true), reset: () => setActive(false), get active() {
3424
+ return active;
3425
+ }, destroy: () => scope.dispose() };
3426
+ }
3427
+
3428
+ // src/recipes/thumbnail-nav/create-thumbnail-nav.ts
3429
+ var panelSequence = 0;
3430
+ function createThumbnailNav(root, options = {}) {
3431
+ const items = root ? [...root.querySelectorAll("[data-mk-thumbnail-item]")] : [];
3432
+ if (!root || !items.length || typeof document === "undefined") return inert({ open() {
3433
+ }, close() {
3434
+ }, toggle() {
3435
+ }, select() {
3436
+ }, index: 0, expanded: false });
3437
+ registerMotion();
3438
+ const scope = createScope();
3439
+ const original = [...root.childNodes];
3440
+ const duration = Math.max(0, options.duration ?? 0.5);
3441
+ const disabled = (item) => item.matches(':disabled, [aria-disabled="true"]');
3442
+ const name = (item) => item.dataset.mkLabel ?? item.textContent?.trim() ?? "";
3443
+ let index = 0;
3444
+ let expanded = false;
3445
+ let animation;
3446
+ const button = document.createElement("button");
3447
+ button.type = "button";
3448
+ button.className = "mk-thumbnail-nav__toggle";
3449
+ button.setAttribute("aria-expanded", "false");
3450
+ const preview = document.createElement("span");
3451
+ preview.className = "mk-thumbnail-nav__preview";
3452
+ preview.setAttribute("aria-hidden", "true");
3453
+ const copy = document.createElement("span");
3454
+ copy.className = "mk-thumbnail-nav__copy";
3455
+ const kicker = document.createElement("span");
3456
+ kicker.className = "mk-thumbnail-nav__kicker";
3457
+ kicker.textContent = options.label ?? root.dataset.mkLabel ?? "Categor\xEDa";
3458
+ const label = document.createElement("span");
3459
+ label.className = "mk-thumbnail-nav__label";
3460
+ copy.append(kicker, label);
3461
+ const arrow = document.createElement("span");
3462
+ arrow.className = "mk-thumbnail-nav__chevron";
3463
+ arrow.setAttribute("aria-hidden", "true");
3464
+ arrow.textContent = "\u2304";
3465
+ button.append(preview, copy, arrow);
3466
+ const panel = document.createElement("div");
3467
+ panel.className = "mk-thumbnail-nav__panel";
3468
+ panel.id = `mk-thumbnail-panel-${++panelSequence}`;
3469
+ while (document.getElementById(panel.id)) panel.id = `mk-thumbnail-panel-${++panelSequence}`;
3470
+ panel.hidden = true;
3471
+ panel.inert = true;
3472
+ button.setAttribute("aria-controls", panel.id);
3473
+ panel.append(...original);
3474
+ root.replaceChildren(button, panel);
3475
+ scope.add(() => root.replaceChildren(...original));
3476
+ scope.attr(root, "class", `${root.className} mk-thumbnail-nav`.trim());
3477
+ scope.attr(root, "style", root.getAttribute("style"));
3478
+ root.style.setProperty("--mk-thumbnail-nav-duration", `${duration}s`);
3479
+ scope.attr(root, "data-mk-ready", "");
3480
+ const updatePreview = () => {
3481
+ label.textContent = name(items[index]);
3482
+ button.setAttribute("aria-label", `${kicker.textContent}: ${label.textContent}`);
3483
+ preview.replaceChildren();
3484
+ for (let offset = 0; offset < Math.min(3, items.length); offset++) {
3485
+ const item = items[wrap(index + offset, items.length)];
3486
+ const thumb = document.createElement("span");
3487
+ thumb.className = "mk-thumbnail-nav__thumb";
3488
+ thumb.style.setProperty("--mk-thumbnail-order", String(offset));
3489
+ const source = item.querySelector("img");
3490
+ if (source) {
3491
+ const image = source.cloneNode(false);
3492
+ image.removeAttribute("id");
3493
+ image.alt = "";
3494
+ thumb.append(image);
3495
+ } else thumb.textContent = name(item).slice(0, 1);
3496
+ preview.append(thumb);
3497
+ }
3498
+ };
3499
+ const focusItem = (candidate, direction = 1) => {
3500
+ for (let attempt = 0; attempt < items.length; attempt++) {
3501
+ const current = items[wrap(candidate, items.length)];
3502
+ if (!disabled(current)) {
3503
+ current.focus();
3504
+ return;
3505
+ }
3506
+ candidate += direction;
3507
+ }
3508
+ };
3509
+ const close = (restoreFocus = panel.contains(document.activeElement)) => {
3510
+ if (scope.disposed || !expanded) return;
3511
+ expanded = false;
3512
+ button.setAttribute("aria-expanded", "false");
3513
+ scope.attr(root, "data-mk-expanded", null);
3514
+ panel.inert = true;
3515
+ animation?.kill();
3516
+ if (restoreFocus) button.focus();
3517
+ if (reduced() || duration === 0) panel.hidden = true;
3518
+ else animation = gsap.to(panel, { autoAlpha: 0, y: 10, scale: 0.98, duration: duration * 0.6, ease: "power3.out", overwrite: true, onComplete: () => {
3519
+ panel.hidden = true;
3520
+ } });
3521
+ };
3522
+ const open = () => {
3523
+ if (scope.disposed || expanded) return;
3524
+ expanded = true;
3525
+ panel.hidden = false;
3526
+ panel.inert = false;
3527
+ button.setAttribute("aria-expanded", "true");
3528
+ scope.attr(root, "data-mk-expanded", "");
3529
+ animation?.kill();
3530
+ if (reduced() || duration === 0) gsap.set(panel, { autoAlpha: 1, y: 0, scale: 1 });
3531
+ else animation = gsap.fromTo(panel, { autoAlpha: 0, y: 12, scale: 0.96 }, { autoAlpha: 1, y: 0, scale: 1, duration, ease: "power3.out", overwrite: true });
3532
+ };
3533
+ const select = (next, notify = true) => {
3534
+ if (scope.disposed || !Number.isFinite(next)) return false;
3535
+ const candidate = wrap(Math.round(next), items.length);
3536
+ const item = items[candidate];
3537
+ if (disabled(item)) return false;
3538
+ if (notify && !root.dispatchEvent(new CustomEvent("mk:select", { bubbles: true, cancelable: true, detail: { index: candidate, item } }))) return false;
3539
+ index = candidate;
3540
+ items.forEach((entry, position) => scope.attr(entry, "aria-current", position === index ? "page" : null));
3541
+ updatePreview();
3542
+ if (notify) options.onSelect?.(index, item);
3543
+ return true;
3544
+ };
3545
+ scope.on(button, "click", () => {
3546
+ if (expanded) close();
3547
+ else open();
3548
+ });
3549
+ scope.on(root, "click", (event) => {
3550
+ const item = event.target.closest("[data-mk-thumbnail-item]");
3551
+ if (!item || !items.includes(item)) return;
3552
+ if (!select(items.indexOf(item))) {
3553
+ event.preventDefault();
3554
+ return;
3555
+ }
3556
+ close(true);
3557
+ });
3558
+ scope.on(root, "keydown", (event) => {
3559
+ if (event.key === "Escape" && expanded) {
3560
+ event.preventDefault();
3561
+ event.stopPropagation();
3562
+ close(true);
3563
+ return;
3564
+ }
3565
+ const current = items.indexOf(document.activeElement);
3566
+ const onTrigger = document.activeElement === button;
3567
+ const direction = event.key === "ArrowDown" || event.key === "ArrowRight" ? 1 : event.key === "ArrowUp" || event.key === "ArrowLeft" ? -1 : 0;
3568
+ if (!direction && event.key !== "Home" && event.key !== "End" || !onTrigger && current < 0) return;
3569
+ event.preventDefault();
3570
+ open();
3571
+ const candidate = event.key === "Home" ? 0 : event.key === "End" ? items.length - 1 : onTrigger ? index : current + direction;
3572
+ focusItem(candidate, event.key === "End" ? -1 : direction || 1);
3573
+ });
3574
+ scope.on(root, "focusout", (event) => {
3575
+ if (event.relatedTarget instanceof Node && root.contains(event.relatedTarget)) return;
3576
+ scope.timeout(() => {
3577
+ if (!scope.disposed && !root.contains(document.activeElement)) close(false);
3578
+ }, 0);
3579
+ });
3580
+ scope.on(document, "pointerdown", (event) => {
3581
+ if (event.target instanceof Node && !root.contains(event.target)) close(false);
3582
+ });
3583
+ scope.add(() => animation?.kill());
3584
+ const initial = options.index ?? Math.max(0, items.findIndex((item) => item.getAttribute("aria-current") === "page"));
3585
+ const enabled = items.findIndex((item) => !disabled(item));
3586
+ if (!select(initial, false)) {
3587
+ if (enabled >= 0) select(enabled, false);
3588
+ else {
3589
+ updatePreview();
3590
+ button.disabled = true;
3591
+ }
3592
+ }
3593
+ return { open, close: () => close(), toggle: () => {
3594
+ if (expanded) close();
3595
+ else open();
3596
+ }, select: (next) => {
3597
+ select(next);
3598
+ }, get index() {
3599
+ return index;
3600
+ }, get expanded() {
3601
+ return expanded;
3602
+ }, destroy: () => scope.dispose() };
3603
+ }
3604
+
3605
+ // src/recipes/action-button/create-action-button.ts
3606
+ function createActionButton(root, options = {}) {
3607
+ if (!root) return inert({ setPressed() {
3608
+ }, pressed: false });
3609
+ const scope = createScope();
3610
+ const variant = options.variant ?? root.getAttribute("data-mk-action-variant") ?? "primary";
3611
+ scope.attr(root, "data-mk-action-variant", variant);
3612
+ scope.attr(root, "data-mk-action-ready", "");
3613
+ const label = root.querySelector("[data-mk-action-label]");
3614
+ if (label && variant === "film") {
3615
+ const nodes = [...label.childNodes];
3616
+ const line = document.createElement("span");
3617
+ line.className = "mk-action-button__line";
3618
+ line.append(...nodes);
3619
+ const copy = document.createElement("span");
3620
+ copy.className = "mk-action-button__copy";
3621
+ copy.setAttribute("aria-hidden", "true");
3622
+ copy.textContent = line.textContent;
3623
+ label.append(line, copy);
3624
+ scope.add(() => {
3625
+ label.replaceChildren(...nodes);
3626
+ });
3627
+ }
3628
+ let pressed = options.pressed ?? root.getAttribute("aria-pressed") === "true";
3629
+ if (options.toggle || options.pressed !== void 0) scope.attr(root, "aria-pressed", String(pressed));
3630
+ const setPressed = (next) => {
3631
+ if (scope.disposed || next === pressed) return;
3632
+ pressed = next;
3633
+ scope.attr(root, "aria-pressed", String(pressed));
3634
+ options.onPressedChange?.(pressed);
3635
+ root.dispatchEvent(new CustomEvent("mk:action-change", { bubbles: true, detail: { pressed } }));
3636
+ };
3637
+ scope.on(root, "click", (event) => {
3638
+ if (event.defaultPrevented) return;
3639
+ if (root.hasAttribute("disabled") || root.getAttribute("aria-disabled") === "true") {
3640
+ event.preventDefault();
3641
+ return;
3642
+ }
3643
+ if (options.toggle) setPressed(!pressed);
3644
+ });
3645
+ return { setPressed, get pressed() {
3646
+ return pressed;
3647
+ }, destroy: () => scope.dispose() };
3648
+ }
3649
+
3650
+ // src/recipes/film-hero/create-film-hero.ts
3651
+ function createFilmHero(root, options = {}) {
3652
+ if (!root) return inert({ replay() {
3653
+ }, refresh() {
3654
+ } });
3655
+ const scope = createScope();
3656
+ scope.attr(root, "data-mk-film-ready", "");
3657
+ scope.attr(root, "data-mk-film-edge", options.edge ?? "organic");
3658
+ scope.attr(root, "style", root.getAttribute("style"));
3659
+ const still = reduced();
3660
+ const lines = [...root.querySelectorAll("[data-mk-film-line]")];
3661
+ const rules = [...root.querySelectorAll("[data-mk-film-rule]")];
3662
+ [...lines, ...rules].forEach((element) => scope.attr(element, "style", element.getAttribute("style")));
3663
+ let timeline = null;
3664
+ const context = gsap.context(() => {
3665
+ }, root);
3666
+ const replay = () => {
3667
+ if (scope.disposed || !entrances()) return;
3668
+ registerMotion();
3669
+ context.add(() => {
3670
+ timeline?.kill();
3671
+ timeline = gsap.timeline();
3672
+ if (lines.length) timeline.fromTo(lines, { yPercent: 120 }, { yPercent: 0, duration: options.duration ?? 0.7, stagger: options.stagger ?? 0.08, ease: "power3.out" }, 0);
3673
+ if (rules.length) timeline.fromTo(rules, { scaleX: 0, transformOrigin: "left center" }, { scaleX: 1, duration: 0.9, stagger: 0.06, ease: "power3.out" }, 0.08);
3674
+ });
3675
+ };
3676
+ replay();
3677
+ const scroller = options.scroller ?? root.closest("[data-mk-scroll-root]") ?? window;
3678
+ let frame = 0;
3679
+ const refresh = () => {
3680
+ if (scope.disposed || still) return;
3681
+ const rect = root.getBoundingClientRect();
3682
+ const view = scroller instanceof HTMLElement ? scroller.getBoundingClientRect() : { top: 0, height: window.innerHeight };
3683
+ const progress = Math.max(0, Math.min(1, (view.top - rect.top) / Math.max(1, rect.height)));
3684
+ root.style.setProperty("--mk-film-shift", `${(progress * rect.height * (options.parallax ?? 0.12)).toFixed(2)}px`);
3685
+ root.style.setProperty("--mk-film-scale", String((options.scale ?? 1.08) - progress * Math.max(0, (options.scale ?? 1.08) - 1)));
3686
+ };
3687
+ if (!still) {
3688
+ const schedule = () => {
3689
+ if (frame) return;
3690
+ frame = requestAnimationFrame(() => {
3691
+ frame = 0;
3692
+ refresh();
3693
+ });
3694
+ };
3695
+ scope.on(scroller, "scroll", schedule, { passive: true });
3696
+ scope.on(window, "resize", schedule, { passive: true });
3697
+ if (typeof ResizeObserver === "function") scope.observe(new ResizeObserver(schedule)).observe(root);
3698
+ scope.add(() => cancelAnimationFrame(frame));
3699
+ refresh();
3700
+ }
3701
+ scope.add(() => {
3702
+ timeline?.kill();
3703
+ context.revert();
3704
+ });
3705
+ return { replay, refresh, destroy: () => scope.dispose() };
3706
+ }
3707
+
3708
+ // src/recipes/editorial-reveal/create-editorial-reveal.ts
3709
+ var nextScope = 0;
3710
+ function createEditorialReveal(root, options = {}) {
3711
+ if (!root) return inert({ play() {
3712
+ }, reset() {
3713
+ } });
3714
+ registerMotion();
3715
+ const scope = createScope();
3716
+ const context = gsap.context(() => {
3717
+ }, root);
3718
+ const trigger = options.trigger ?? "scroll";
3719
+ const duration = options.duration ?? 1.2;
3720
+ const stagger = options.stagger ?? 0.03;
3721
+ const hoverDuration = options.hoverDuration ?? 0.5;
3722
+ const ease = options.ease ?? "mk-editorial-reference";
3723
+ CustomEase.create("mk-editorial-reference", "M0,0 C0.6,0 0,1 1,1");
3724
+ const preserve = (el) => ["style", "data-mk-ready", "aria-label"].forEach((name) => scope.attr(el, name, el.getAttribute(name)));
3725
+ preserve(root);
3726
+ root.querySelectorAll("[data-mk-editorial-title],[data-mk-editorial-group],[data-mk-cascade],[data-mk-editorial-image],[data-mk-parallax-target],[data-mk-editorial-header],[data-mk-editorial-card-image],[data-mk-editorial-button-content]").forEach(preserve);
3727
+ const titles = [...root.querySelectorAll("[data-mk-editorial-title]")].map((el) => createMaskText(el, { by: "lines", trigger, once: true, y: options.y ?? 110, duration, stagger, ease, delay: 0 }));
3728
+ const groups = [...root.querySelectorAll("[data-mk-editorial-group]")].map((el) => createCascade(el, { trigger, duration, step: stagger, once: true }));
3729
+ const images = options.parallax === false ? [] : [...root.querySelectorAll("[data-mk-editorial-image]")].map((el) => createParallax(el, { amount: 0.25 }));
3730
+ const header = root.querySelector("[data-mk-editorial-header]");
3731
+ const sections = [...root.querySelectorAll("[data-mk-tone]")];
3732
+ const scopeId = String(++nextScope);
3733
+ sections.forEach((el) => scope.attr(el, "data-mk-editorial-scope", scopeId));
3734
+ const contrast = header ? createContrast(header, { sections: `[data-mk-editorial-scope="${scopeId}"]` }) : null;
3735
+ scope.add(() => {
3736
+ titles.forEach((instance) => instance.destroy());
3737
+ groups.forEach((instance) => instance.destroy());
3738
+ images.forEach((instance) => instance.destroy());
3739
+ contrast?.destroy();
3740
+ context.revert();
3741
+ });
3742
+ root.querySelectorAll("[data-mk-editorial-button]").forEach((button) => {
3743
+ const content = button.querySelector("[data-mk-editorial-button-content]");
3744
+ if (!content) return;
3745
+ let pointerInside = false;
3746
+ const render = () => {
3747
+ const active = pointerInside || button.contains(root.ownerDocument.activeElement);
3748
+ context.add(() => gsap.to(content, { x: active && !reduced() ? `${options.buttonShift ?? 2.25}em` : "0em", duration: reduced() ? 0 : hoverDuration, ease, overwrite: true }));
3749
+ };
3750
+ scope.on(button, "pointerenter", () => {
3751
+ pointerInside = true;
3752
+ render();
3753
+ });
3754
+ scope.on(button, "pointerleave", () => {
3755
+ pointerInside = false;
3756
+ render();
3757
+ });
3758
+ scope.on(button, "focusin", render);
3759
+ scope.on(button, "focusout", () => {
3760
+ scope.timeout(render, 0);
3761
+ });
3762
+ });
3763
+ const cursor = root.querySelector("[data-mk-editorial-cursor]");
3764
+ if (cursor) {
3765
+ preserve(cursor);
3766
+ scope.attr(cursor, "aria-hidden", "true");
3767
+ scope.attr(cursor, "hidden", "");
3768
+ }
3769
+ root.querySelectorAll("[data-mk-editorial-card]").forEach((card) => {
3770
+ const image = card.querySelector("[data-mk-editorial-card-image]");
3771
+ let pointerInside = false;
3772
+ const render = () => {
3773
+ const active = pointerInside || card.contains(root.ownerDocument.activeElement);
3774
+ scope.attr(card, "data-mk-editorial-active", active ? "" : null);
3775
+ if (image) context.add(() => gsap.to(image, { scale: active && !reduced() ? options.imageScale ?? 1.04 : 1, duration: reduced() ? 0 : hoverDuration, ease, overwrite: true }));
3776
+ };
3777
+ scope.on(card, "pointerenter", (event) => {
3778
+ pointerInside = true;
3779
+ render();
3780
+ if (cursor && !reduced() && event.pointerType !== "touch") scope.attr(cursor, "hidden", null);
3781
+ });
3782
+ scope.on(card, "pointerleave", () => {
3783
+ pointerInside = false;
3784
+ render();
3785
+ if (cursor) scope.attr(cursor, "hidden", "");
3786
+ });
3787
+ scope.on(card, "pointermove", (event) => {
3788
+ if (!cursor || reduced() || event.pointerType === "touch") return;
3789
+ const rect = root.getBoundingClientRect();
3790
+ cursor.style.transform = `translate(${event.clientX - rect.left + 16}px, ${event.clientY - rect.top + 16}px)`;
3791
+ });
3792
+ scope.on(card, "focusin", render);
3793
+ scope.on(card, "focusout", () => {
3794
+ scope.timeout(render, 0);
3795
+ });
3796
+ });
3797
+ scope.attr(root, "data-mk-ready", "");
3798
+ return {
3799
+ play() {
3800
+ if (!scope.disposed) {
3801
+ titles.forEach((instance) => instance.play());
3802
+ groups.forEach((instance) => instance.play());
3803
+ }
3804
+ },
3805
+ reset() {
3806
+ if (!scope.disposed) {
3807
+ titles.forEach((instance) => instance.hide());
3808
+ groups.forEach((instance) => instance.reset());
3809
+ }
3810
+ },
3811
+ destroy() {
3812
+ scope.dispose();
3813
+ }
3814
+ };
3815
+ }
3816
+
3817
+ // src/recipes/weight-hover/create-weight-hover.ts
3818
+ var FAR = -1e5;
3819
+ function createWeightHover(root, options = {}) {
3820
+ if (!root) return inert({ pointAt() {
3821
+ } });
3822
+ const scope = createScope();
3823
+ scope.attr(root, "data-mk-ready", "");
3824
+ if (reduced()) return { pointAt() {
3825
+ }, destroy: () => scope.dispose() };
3826
+ const num = (value, fallback) => Number.isFinite(value) ? value : fallback;
3827
+ const rest = num(options.rest, 900);
3828
+ const near = num(options.near, 200);
3829
+ const radius = Math.max(1, num(options.radius, 400));
3830
+ const lerp = Math.min(1, Math.max(0.01, num(options.lerp, 0.1)));
3831
+ const axis = /^[A-Za-z]{4}$/.test(options.axis ?? "") ? options.axis : "wght";
3832
+ const setting = (value) => `"${axis}" ${value.toFixed(1)}`;
3833
+ const original = [...root.childNodes];
3834
+ const copy = document.createElement("span");
3835
+ copy.className = "mk-sr-only";
3836
+ const spoken = root.cloneNode(true);
3837
+ spoken.querySelectorAll("br").forEach((br) => br.replaceWith(" "));
3838
+ copy.textContent = spoken.textContent?.replace(/\s+/g, " ").trim() ?? "";
3839
+ const visual = document.createElement("span");
3840
+ visual.className = "mk-weight-hover__visual";
3841
+ visual.setAttribute("aria-hidden", "true");
3842
+ visual.append(...original.map((node) => node.cloneNode(true)));
3843
+ const letters2 = [];
3844
+ const walker = document.createTreeWalker(visual, NodeFilter.SHOW_TEXT);
3845
+ const texts = [];
3846
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) texts.push(node);
3847
+ for (const text of texts) {
3848
+ const fragment = document.createDocumentFragment();
3849
+ for (const char of text.data) {
3850
+ if (/\s/.test(char)) {
3851
+ fragment.append(char);
3852
+ continue;
3853
+ }
3854
+ const span = document.createElement("span");
3855
+ span.dataset.mkWeightChar = "";
3856
+ span.textContent = char;
3857
+ span.style.fontVariationSettings = setting(rest);
3858
+ fragment.append(span);
3859
+ letters2.push({ span, value: rest, x: 0, y: 0 });
3860
+ }
3861
+ text.replaceWith(fragment);
3862
+ }
3863
+ root.replaceChildren(copy, visual);
3864
+ scope.add(() => root.replaceChildren(...original));
3865
+ const measure = () => {
3866
+ const box = root.getBoundingClientRect();
3867
+ for (const letter of letters2) {
3868
+ const r = letter.span.getBoundingClientRect();
3869
+ letter.x = r.left + r.width / 2 - box.left;
3870
+ letter.y = r.top + r.height / 2 - box.top;
3871
+ }
3872
+ };
3873
+ measure();
3874
+ if (typeof ResizeObserver === "function") scope.observe(new ResizeObserver(measure)).observe(root);
3875
+ document.fonts?.ready.then(() => {
3876
+ if (!scope.disposed) measure();
3877
+ });
3878
+ const pointer2 = { x: FAR, y: FAR };
3879
+ let frame = 0;
3880
+ const tick = () => {
3881
+ frame = 0;
3882
+ if (scope.disposed) return;
3883
+ const box = root.getBoundingClientRect();
3884
+ let moving = false;
3885
+ for (const letter of letters2) {
3886
+ const distance = Math.hypot(pointer2.x - (box.left + letter.x), pointer2.y - (box.top + letter.y));
3887
+ const d = Math.max(0, 1 - distance / radius);
3888
+ const target = rest + (near - rest) * d * d * (3 - 2 * d);
3889
+ letter.value += (target - letter.value) * lerp;
3890
+ if (Math.abs(target - letter.value) > 0.5) moving = true;
3891
+ else letter.value = target;
3892
+ letter.span.style.fontVariationSettings = setting(letter.value);
3893
+ }
3894
+ if (moving) frame = requestAnimationFrame(tick);
3895
+ };
3896
+ const wake = () => {
3897
+ if (!frame && !scope.disposed) frame = requestAnimationFrame(tick);
3898
+ };
3899
+ scope.add(() => cancelAnimationFrame(frame));
3900
+ scope.on(window, "pointermove", (event) => {
3901
+ const e = event;
3902
+ if (!options.anyPointer && e.pointerType && e.pointerType !== "mouse") return;
3903
+ pointer2.x = e.clientX;
3904
+ pointer2.y = e.clientY;
3905
+ wake();
3906
+ }, { passive: true });
3907
+ scope.on(document, "pointerleave", () => {
3908
+ pointer2.x = pointer2.y = FAR;
3909
+ wake();
3910
+ });
3911
+ return {
3912
+ pointAt(point) {
3913
+ if (scope.disposed) return;
3914
+ pointer2.x = point ? point.x : FAR;
3915
+ pointer2.y = point ? point.y : FAR;
3916
+ wake();
3917
+ },
3918
+ destroy: () => scope.dispose()
3919
+ };
3920
+ }
3921
+
3922
+ // src/recipes/sticker/create-sticker.ts
3923
+ var easeOutCubic = (t) => 1 - (1 - t) ** 3;
3924
+ var clamp2 = (v, min, max) => Math.min(max, Math.max(min, v));
3925
+ function clipHalfPlane(poly, m, n) {
3926
+ const side = (p) => (p.x - m.x) * n.x + (p.y - m.y) * n.y;
3927
+ const out = [];
3928
+ for (let i = 0; i < poly.length; i++) {
3929
+ const a = poly[i];
3930
+ const b = poly[(i + 1) % poly.length];
3931
+ const sa = side(a);
3932
+ const sb = side(b);
3933
+ if (sa >= 0) out.push(a);
3934
+ if (sa >= 0 !== sb >= 0) {
3935
+ const t = sa / (sa - sb);
3936
+ out.push({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });
3937
+ }
3938
+ }
3939
+ return out;
3940
+ }
3941
+ var area = (poly) => {
3942
+ let sum = 0;
3943
+ for (let i = 0; i < poly.length; i++) {
3944
+ const a = poly[i];
3945
+ const b = poly[(i + 1) % poly.length];
3946
+ sum += a.x * b.y - b.x * a.y;
3947
+ }
3948
+ return Math.abs(sum) / 2;
3949
+ };
3950
+ var polygon = (poly) => poly.length < 3 ? "polygon(0 0, 0 0, 0 0)" : `polygon(${poly.map((p) => `${p.x.toFixed(2)}px ${p.y.toFixed(2)}px`).join(", ")})`;
3951
+ function createSticker(root, options = {}) {
3952
+ if (!root) return inert({ state: "idle" });
3953
+ const scope = createScope();
3954
+ const still = reduced();
3955
+ const detachAt = clamp2(Number.isFinite(options.detachAt) ? options.detachAt : 0.3, 0.05, 1);
3956
+ const returnDelay = Math.max(0, Number.isFinite(options.returnDelay) ? options.returnDelay : 2500);
3957
+ let state = "idle";
3958
+ const frames = /* @__PURE__ */ new Set();
3959
+ const raf = (fn) => {
3960
+ const id = requestAnimationFrame((time) => {
3961
+ frames.delete(id);
3962
+ fn(time);
3963
+ });
3964
+ frames.add(id);
3965
+ };
3966
+ scope.add(() => {
3967
+ frames.forEach(cancelAnimationFrame);
3968
+ frames.clear();
3969
+ });
3970
+ scope.attr(root, "data-mk-ready", "");
3971
+ scope.attr(root, "style", root.getAttribute("style"));
3972
+ if (options.holo !== false) scope.attr(root, "data-mk-holo", "");
3973
+ const original = [...root.childNodes];
3974
+ const peelBox = document.createElement("div");
3975
+ peelBox.className = "mk-sticker__peel";
3976
+ const top = document.createElement("div");
3977
+ top.className = "mk-sticker__top";
3978
+ top.append(...original);
3979
+ peelBox.append(top);
3980
+ root.append(peelBox);
3981
+ scope.add(() => root.replaceChildren(...original));
3982
+ let back = null;
3983
+ if (options.holo !== false) {
3984
+ const holo = { x: 0.5, y: 0.5 };
3985
+ let mouse = null;
3986
+ let visible = typeof IntersectionObserver !== "function";
3987
+ const hoverless = typeof matchMedia === "function" && matchMedia("(hover: none)").matches;
3988
+ root.style.setProperty("--mk-sticker-x", "0.5");
3989
+ root.style.setProperty("--mk-sticker-y", "0.5");
3990
+ if (!still) {
3991
+ scope.on(window, "pointermove", (event) => {
3992
+ const e = event;
3993
+ if (e.pointerType === "mouse") mouse = { x: e.clientX, y: e.clientY };
3994
+ }, { passive: true });
3995
+ scope.on(document, "pointerleave", () => {
3996
+ mouse = null;
3997
+ });
3998
+ if (typeof IntersectionObserver === "function") {
3999
+ scope.observe(new IntersectionObserver(([entry]) => {
4000
+ const was = visible;
4001
+ visible = entry.isIntersecting;
4002
+ if (visible && !was) raf(loop);
4003
+ })).observe(root);
4004
+ }
4005
+ const loop = (time) => {
4006
+ if (scope.disposed || !visible) return;
4007
+ const box = top.getBoundingClientRect();
4008
+ let x;
4009
+ let y;
4010
+ if (mouse && !hoverless && box.width && box.height) {
4011
+ x = clamp2((mouse.x - box.left) / box.width, -0.5, 1.5);
4012
+ y = clamp2((mouse.y - box.top) / box.height, -0.5, 1.5);
4013
+ } else {
4014
+ x = 0.5 + Math.sin(time / 1600 + box.left / 200) * 0.6;
4015
+ y = 0.5 + Math.cos(time / 2100 + box.top / 200) * 0.6;
4016
+ }
4017
+ holo.x += (x - holo.x) * 0.08;
4018
+ holo.y += (y - holo.y) * 0.08;
4019
+ root.style.setProperty("--mk-sticker-x", holo.x.toFixed(4));
4020
+ root.style.setProperty("--mk-sticker-y", holo.y.toFixed(4));
4021
+ raf(loop);
4022
+ };
4023
+ if (visible) raf(loop);
4024
+ }
4025
+ }
4026
+ if (options.peel === false) return { get state() {
4027
+ return state;
4028
+ }, destroy: () => scope.dispose() };
4029
+ let w = 0;
4030
+ let h = 0;
4031
+ let corner = { x: 0, y: 0 };
4032
+ let current = { x: 0, y: 0 };
4033
+ let grabbed = { x: 0, y: 0 };
4034
+ let lifted = 0;
4035
+ let anchor = { x: 0, y: 0 };
4036
+ let reach = 0;
4037
+ let outward = { x: 1, y: 0 };
4038
+ let detachDistance = 80;
4039
+ let pose = { angle: 0, scale: 1, prop: 1 };
4040
+ let frozen = null;
4041
+ const readPose = () => {
4042
+ const style = getComputedStyle(root);
4043
+ const prop = parseFloat(style.scale) || 1;
4044
+ const matrix = /^matrix\(([^)]+)\)$/.exec(style.transform || "");
4045
+ if (matrix) {
4046
+ const [a, b] = matrix[1].split(",").map(Number);
4047
+ return { angle: Math.atan2(b, a), scale: Math.hypot(a, b) || 1, prop, transform: style.transform };
4048
+ }
4049
+ const angle = (parseFloat(style.getPropertyValue("--mk-sticker-rot")) || 0) * (Math.PI / 180);
4050
+ return { angle, scale: 1, prop, transform: `rotate(${angle}rad)` };
4051
+ };
4052
+ const freeze = () => {
4053
+ const now = readPose();
4054
+ pose = now;
4055
+ if (!frozen) frozen = { transform: root.style.transform, transition: root.style.transition };
4056
+ root.style.transition = "none";
4057
+ root.style.transform = now.transform;
4058
+ };
4059
+ const unfreeze = () => {
4060
+ if (!frozen) return;
4061
+ root.style.transform = frozen.transform;
4062
+ root.style.transition = frozen.transition;
4063
+ frozen = null;
4064
+ };
4065
+ scope.add(unfreeze);
4066
+ const toLocal = (clientX, clientY) => {
4067
+ const box = peelBox.getBoundingClientRect();
4068
+ const a = -pose.angle;
4069
+ const s = pose.scale * pose.prop;
4070
+ const dx = (clientX - (box.left + box.width / 2)) / s;
4071
+ const dy = (clientY - (box.top + box.height / 2)) / s;
4072
+ return { x: dx * Math.cos(a) - dy * Math.sin(a) + w / 2, y: dx * Math.sin(a) + dy * Math.cos(a) + h / 2 };
4073
+ };
4074
+ const CORNERS = () => [{ x: 0, y: 0 }, { x: w, y: 0 }, { x: w, y: h }, { x: 0, y: h }];
4075
+ const nearBorder = (p) => Math.min(p.x, w - p.x, p.y, h - p.y) < Math.min(w, h) * 0.35;
4076
+ const closestCorner = (p) => CORNERS().reduce((a, b) => Math.hypot(b.x - p.x, b.y - p.y) < Math.hypot(a.x - p.x, a.y - p.y) ? b : a);
4077
+ const cornerAgainst = (d) => CORNERS().reduce((a, b) => (b.x - w / 2) * -d.x + (b.y - h / 2) * -d.y > (a.x - w / 2) * -d.x + (a.y - h / 2) * -d.y + 1e-6 ? b : a);
4078
+ let choosing = false;
4079
+ const useCorner = (c) => {
4080
+ choosing = false;
4081
+ corner = c;
4082
+ anchor = { x: w - c.x, y: h - c.y };
4083
+ reach = Math.hypot(c.x - anchor.x, c.y - anchor.y);
4084
+ const ox = c.x - w / 2;
4085
+ const oy = c.y - h / 2;
4086
+ outward = { x: ox / (Math.hypot(ox, oy) || 1), y: oy / (Math.hypot(ox, oy) || 1) };
4087
+ current = { ...c };
4088
+ };
4089
+ const ensureBack = () => {
4090
+ if (back) return back;
4091
+ back = document.createElement("div");
4092
+ back.className = "mk-sticker__back";
4093
+ back.setAttribute("aria-hidden", "true");
4094
+ const face2 = document.createElement("div");
4095
+ face2.className = "mk-sticker__back-face";
4096
+ const copy = top.cloneNode(true);
4097
+ copy.querySelectorAll("[id]").forEach((el) => el.removeAttribute("id"));
4098
+ face2.append(...copy.childNodes);
4099
+ back.append(face2);
4100
+ peelBox.append(back);
4101
+ return back;
4102
+ };
4103
+ const flat = () => {
4104
+ top.style.clipPath = "";
4105
+ if (back) back.style.visibility = "hidden";
4106
+ root.removeAttribute("data-mk-peeling");
4107
+ lifted = 0;
4108
+ unfreeze();
4109
+ };
4110
+ scope.add(() => {
4111
+ top.style.clipPath = "";
4112
+ back?.remove();
4113
+ back = null;
4114
+ });
4115
+ const fold = (p) => {
4116
+ current = p;
4117
+ const dx = p.x - corner.x;
4118
+ const dy = p.y - corner.y;
4119
+ const length = Math.hypot(dx, dy);
4120
+ if (length < 0.5) {
4121
+ top.style.clipPath = "";
4122
+ if (back) back.style.visibility = "hidden";
4123
+ lifted = 0;
4124
+ return;
4125
+ }
4126
+ const n = { x: dx / length, y: dy / length };
4127
+ const m = { x: (corner.x + p.x) / 2, y: (corner.y + p.y) / 2 };
4128
+ const rect = [{ x: 0, y: 0 }, { x: w, y: 0 }, { x: w, y: h }, { x: 0, y: h }];
4129
+ const stuck = clipHalfPlane(rect, m, n);
4130
+ const flap = clipHalfPlane(rect, m, { x: -n.x, y: -n.y });
4131
+ lifted = area(flap) / (w * h || 1);
4132
+ top.style.clipPath = polygon(stuck);
4133
+ const b = ensureBack();
4134
+ const d = m.x * n.x + m.y * n.y;
4135
+ b.style.transform = `matrix(${1 - 2 * n.x * n.x}, ${-2 * n.x * n.y}, ${-2 * n.x * n.y}, ${1 - 2 * n.y * n.y}, ${2 * d * n.x}, ${2 * d * n.y})`;
4136
+ b.firstElementChild.style.clipPath = polygon(flap);
4137
+ b.style.setProperty("--mk-sticker-fold", `${Math.atan2(-n.x, n.y) * 180 / Math.PI}deg`);
4138
+ b.style.visibility = flap.length >= 3 ? "visible" : "hidden";
4139
+ };
4140
+ const NUDGE = 8;
4141
+ const pull = (at) => {
4142
+ const dx = at.x - grabbed.x;
4143
+ const dy = at.y - grabbed.y;
4144
+ const depth = Math.hypot(dx, dy);
4145
+ const perp = { x: -outward.y, y: outward.x };
4146
+ const side = clamp2(dx * perp.x + dy * perp.y, -depth * 0.7, depth * 0.7) * 0.6;
4147
+ let p = {
4148
+ x: corner.x - outward.x * (NUDGE + depth) + perp.x * side,
4149
+ y: corner.y - outward.y * (NUDGE + depth) + perp.y * side
4150
+ };
4151
+ const ax = p.x - anchor.x;
4152
+ const ay = p.y - anchor.y;
4153
+ const length = Math.hypot(ax, ay);
4154
+ if (length > reach) p = { x: anchor.x + ax * reach / length, y: anchor.y + ay * reach / length };
4155
+ return p;
4156
+ };
4157
+ let generation = 0;
4158
+ const settle = (from, duration, done) => {
4159
+ const start = performance.now();
4160
+ const mine = generation;
4161
+ const step = () => {
4162
+ if (scope.disposed || mine !== generation) return;
4163
+ const t = Math.min(1, (performance.now() - start) / duration);
4164
+ const e = easeOutCubic(t);
4165
+ fold({ x: from.x + (corner.x - from.x) * e, y: from.y + (corner.y - from.y) * e });
4166
+ if (t < 1) raf(step);
4167
+ else {
4168
+ flat();
4169
+ done?.();
4170
+ }
4171
+ };
4172
+ raf(step);
4173
+ };
4174
+ const velocity = { x: 0, y: 0 };
4175
+ let last = { x: 0, y: 0, t: 0 };
4176
+ const track = (e) => {
4177
+ const now = performance.now();
4178
+ const frames60 = Math.max(1, (now - last.t) / 16);
4179
+ velocity.x = velocity.x * 0.5 + (e.clientX - last.x) / frames60 * 0.5;
4180
+ velocity.y = velocity.y * 0.5 + (e.clientY - last.y) / frames60 * 0.5;
4181
+ last = { x: e.clientX, y: e.clientY, t: now };
4182
+ };
4183
+ let home = null;
4184
+ const carry = { x: 0, y: 0, tx: 0, ty: 0, offX: 0, offY: 0, lift: 0, tilt: 0, base: 0, from: 1, to: 1.08 };
4185
+ const carryScale = () => carry.from + (carry.to - carry.from) * carry.lift;
4186
+ const paint = () => {
4187
+ root.style.left = `${carry.x}px`;
4188
+ root.style.top = `${carry.y}px`;
4189
+ root.style.transform = `rotate(${carry.base + carry.tilt}deg) scale(${carryScale()})`;
4190
+ root.style.filter = `drop-shadow(0 ${8 + 14 * carry.lift}px ${14 + 12 * carry.lift}px rgb(0 0 0 / ${0.16 + 0.14 * carry.lift}))`;
4191
+ };
4192
+ const follow = () => {
4193
+ if (state !== "carried" || scope.disposed) return;
4194
+ carry.x += (carry.tx - carry.x) * 0.22;
4195
+ carry.y += (carry.ty - carry.y) * 0.22;
4196
+ carry.lift += (1 - carry.lift) * 0.15;
4197
+ carry.tilt += (clamp2(velocity.x * 1.2, -16, 16) - carry.tilt) * 0.15;
4198
+ paint();
4199
+ raf(follow);
4200
+ };
4201
+ const detach = (e) => {
4202
+ state = "carried";
4203
+ root.removeAttribute("data-mk-peeling");
4204
+ root.setAttribute("data-mk-carried", "");
4205
+ settle({ ...current }, 160);
4206
+ const box = root.getBoundingClientRect();
4207
+ unfreeze();
4208
+ carry.base = pose.angle * (180 / Math.PI);
4209
+ carry.from = pose.scale;
4210
+ carry.to = Math.max(1, pose.scale) + 0.08;
4211
+ home = { parent: root.parentNode, next: root.nextSibling, style: root.getAttribute("style") };
4212
+ const width = root.offsetWidth;
4213
+ const height = root.offsetHeight;
4214
+ document.body.append(root);
4215
+ Object.assign(root.style, { position: "fixed", right: "auto", bottom: "auto", margin: "0", translate: "none", scale: String(pose.prop), zIndex: "999", animation: "none", transition: "none" });
4216
+ carry.x = box.left + box.width / 2 - width / 2;
4217
+ carry.y = box.top + box.height / 2 - height / 2;
4218
+ carry.offX = e.clientX - carry.x;
4219
+ carry.offY = e.clientY - carry.y;
4220
+ carry.tx = carry.x;
4221
+ carry.ty = carry.y;
4222
+ carry.lift = 0;
4223
+ carry.tilt = 0;
4224
+ paint();
4225
+ options.onPeel?.();
4226
+ raf(follow);
4227
+ };
4228
+ const goHome = () => {
4229
+ if (!home) return;
4230
+ const { parent, next, style } = home;
4231
+ home = null;
4232
+ parent.insertBefore(root, next && next.parentNode === parent ? next : null);
4233
+ if (style === null) root.removeAttribute("style");
4234
+ else root.setAttribute("style", style);
4235
+ root.style.animationDelay = "0s";
4236
+ root.removeAttribute("data-mk-carried");
4237
+ root.removeAttribute("data-mk-away");
4238
+ state = "idle";
4239
+ options.onReturn?.();
4240
+ };
4241
+ scope.add(goHome);
4242
+ const away = () => {
4243
+ state = "away";
4244
+ root.setAttribute("data-mk-away", "");
4245
+ scope.timeout(goHome, returnDelay);
4246
+ };
4247
+ const fall = () => {
4248
+ state = "falling";
4249
+ root.style.pointerEvents = "none";
4250
+ if (still) {
4251
+ away();
4252
+ return;
4253
+ }
4254
+ let x = 0;
4255
+ let y = 0;
4256
+ let angle = carry.base + carry.tilt;
4257
+ let vx = clamp2(velocity.x * 40, -900, 900);
4258
+ let vy = clamp2(velocity.y * 40, -500, 600) - 120;
4259
+ const spin = vx * 0.35 + (Math.random() - 0.5) * 120;
4260
+ const startY = carry.y;
4261
+ let then = performance.now();
4262
+ const step = () => {
4263
+ if (scope.disposed || state !== "falling") return;
4264
+ const time = performance.now();
4265
+ const dt = Math.min(0.05, Math.max(0, time - then) / 1e3);
4266
+ then = time;
4267
+ vy += 1600 * dt;
4268
+ x += vx * dt;
4269
+ y += vy * dt;
4270
+ vx *= 1 - 0.6 * dt;
4271
+ angle += spin * dt;
4272
+ root.style.transform = `translate(${x}px, ${y}px) rotate(${angle}deg) scale(${carryScale()})`;
4273
+ if (startY + y < innerHeight + 40) raf(step);
4274
+ else away();
4275
+ };
4276
+ raf(step);
4277
+ };
4278
+ let pointerId = null;
4279
+ scope.on(root, "pointerdown", (event) => {
4280
+ const e = event;
4281
+ if (state !== "idle" || e.button !== 0) return;
4282
+ e.preventDefault();
4283
+ generation++;
4284
+ freeze();
4285
+ state = "peeling";
4286
+ root.setAttribute("data-mk-peeling", "");
4287
+ pointerId = e.pointerId;
4288
+ root.setPointerCapture?.(e.pointerId);
4289
+ w = top.offsetWidth;
4290
+ h = top.offsetHeight;
4291
+ peelBox.style.width = `${w}px`;
4292
+ peelBox.style.height = `${h}px`;
4293
+ const at = toLocal(e.clientX, e.clientY);
4294
+ grabbed = at;
4295
+ detachDistance = Number.isFinite(options.detachDistance) ? Math.max(1, options.detachDistance) : Math.max(80, Math.max(w, h) / 2);
4296
+ last = { x: e.clientX, y: e.clientY, t: performance.now() };
4297
+ velocity.x = velocity.y = 0;
4298
+ if (nearBorder(at)) {
4299
+ useCorner(closestCorner(at));
4300
+ fold(pull(at));
4301
+ } else {
4302
+ choosing = true;
4303
+ corner = current = { ...at };
4304
+ }
4305
+ });
4306
+ scope.on(root, "pointermove", (event) => {
4307
+ const e = event;
4308
+ if (state !== "peeling" || e.pointerId !== pointerId) return;
4309
+ track(e);
4310
+ const at = toLocal(e.clientX, e.clientY);
4311
+ if (choosing) {
4312
+ const dx = at.x - grabbed.x;
4313
+ const dy = at.y - grabbed.y;
4314
+ const moved = Math.hypot(dx, dy);
4315
+ if (moved < 4) return;
4316
+ useCorner(cornerAgainst({ x: dx / moved, y: dy / moved }));
4317
+ }
4318
+ fold(pull(at));
4319
+ if (lifted > detachAt || Math.hypot(at.x - grabbed.x, at.y - grabbed.y) > detachDistance) detach(e);
4320
+ });
4321
+ scope.on(document, "pointermove", (event) => {
4322
+ const e = event;
4323
+ if (state !== "carried" || e.pointerId !== pointerId) return;
4324
+ track(e);
4325
+ carry.tx = e.clientX - carry.offX;
4326
+ carry.ty = e.clientY - carry.offY;
4327
+ });
4328
+ const release = (event) => {
4329
+ const e = event;
4330
+ if (e.pointerId !== pointerId) return;
4331
+ if (state === "peeling") {
4332
+ state = "idle";
4333
+ settle({ ...current }, 380);
4334
+ } else if (state === "carried") fall();
4335
+ };
4336
+ scope.on(document, "pointerup", release);
4337
+ scope.on(document, "pointercancel", release);
4338
+ scope.add(() => {
4339
+ peelBox.style.width = "";
4340
+ peelBox.style.height = "";
4341
+ });
4342
+ return {
4343
+ get state() {
4344
+ return state;
4345
+ },
4346
+ destroy: () => scope.dispose()
4347
+ };
4348
+ }
4349
+
4350
+ // src/recipes/scroll-dock/create-scroll-dock.ts
4351
+ function createScrollDock(root, options = {}) {
4352
+ if (!root) return inert({ visible: false, update() {
4353
+ } });
4354
+ const scope = createScope();
4355
+ const threshold = Number.isFinite(options.threshold) ? Math.max(0, options.threshold) : 0.6;
4356
+ const hideOffset = Number.isFinite(options.hideOffset) ? options.hideOffset : 40;
4357
+ const scroller = typeof options.scroller === "string" ? root.closest(options.scroller) ?? document.querySelector(options.scroller) : options.scroller ?? null;
4358
+ const hideTarget = () => typeof options.hideWhen === "string" ? document.querySelector(options.hideWhen) : options.hideWhen ?? null;
4359
+ let visible = false;
4360
+ let queued = false;
4361
+ scope.attr(root, "data-mk-ready", "");
4362
+ const update = () => {
4363
+ queued = false;
4364
+ if (scope.disposed) return;
4365
+ const offset = scroller ? scroller.scrollTop : window.scrollY;
4366
+ const viewport = scroller ? scroller.clientHeight : window.innerHeight;
4367
+ const bottom = scroller ? scroller.getBoundingClientRect().bottom : window.innerHeight;
4368
+ const end = hideTarget();
4369
+ const reachedEnd = end ? end.getBoundingClientRect().top < bottom - hideOffset : false;
4370
+ const next = offset > viewport * threshold && !reachedEnd;
4371
+ if (next === visible) return;
4372
+ visible = next;
4373
+ scope.attr(root, "data-mk-visible", next ? "" : null);
4374
+ options.onChange?.(next);
4375
+ root.dispatchEvent(new CustomEvent("mk:change", { bubbles: true, detail: { visible: next } }));
4376
+ };
4377
+ const queue = () => {
4378
+ if (queued) return;
4379
+ queued = true;
4380
+ requestAnimationFrame(update);
4381
+ };
4382
+ scope.on(scroller ?? window, "scroll", queue, { passive: true });
4383
+ scope.on(window, "resize", queue, { passive: true });
4384
+ update();
4385
+ return {
4386
+ get visible() {
4387
+ return visible;
4388
+ },
4389
+ update,
4390
+ destroy: () => scope.dispose()
4391
+ };
4392
+ }
4393
+
4394
+ // src/recipes/local-clock/create-local-clock.ts
4395
+ function createLocalClock(root, options = {}) {
4396
+ if (!root) return inert({ text: "" });
4397
+ const scope = createScope();
4398
+ const original = [...root.childNodes];
4399
+ scope.add(() => root.replaceChildren(...original));
4400
+ scope.attr(root, "data-mk-ready", "");
4401
+ let formatter;
4402
+ try {
4403
+ formatter = new Intl.DateTimeFormat(options.locale ?? "es", options.format ?? {
4404
+ hour: "2-digit",
4405
+ minute: "2-digit",
4406
+ ...options.seconds ? { second: "2-digit" } : {},
4407
+ hour12: options.hour12 ?? false,
4408
+ timeZone: options.timeZone
4409
+ });
4410
+ } catch {
4411
+ formatter = new Intl.DateTimeFormat(void 0, { hour: "2-digit", minute: "2-digit", hour12: options.hour12 ?? false });
4412
+ }
4413
+ let text = "";
4414
+ const isTime = root instanceof HTMLTimeElement;
4415
+ const render = () => {
4416
+ const now = /* @__PURE__ */ new Date();
4417
+ text = formatter.format(now);
4418
+ if (root.textContent !== text) root.textContent = text;
4419
+ if (isTime) scope.attr(root, "datetime", now.toISOString());
4420
+ };
4421
+ const step = options.seconds || options.format?.second ? 1e3 : 6e4;
4422
+ const schedule = () => {
4423
+ const wait = step - Date.now() % step + 20;
4424
+ scope.timeout(() => {
4425
+ if (!scope.disposed) {
4426
+ render();
4427
+ schedule();
4428
+ }
4429
+ }, wait);
4430
+ };
4431
+ render();
4432
+ schedule();
4433
+ return { get text() {
4434
+ return text;
4435
+ }, destroy: () => scope.dispose() };
4436
+ }
4437
+
3274
4438
  export {
3275
4439
  trackScroll,
3276
4440
  toggleDetails,
3277
4441
  installDetailsMotion,
3278
- slideIndicator,
3279
4442
  captureLayout,
3280
4443
  reflowLayout,
3281
4444
  createSpring,
@@ -3315,6 +4478,17 @@ export {
3315
4478
  createRepelBento,
3316
4479
  createRotator,
3317
4480
  createDragRuler,
3318
- createDockPill
4481
+ createDockPill,
4482
+ createJoinedCta,
4483
+ createImageZoom,
4484
+ createFontCycle,
4485
+ createThumbnailNav,
4486
+ createActionButton,
4487
+ createFilmHero,
4488
+ createEditorialReveal,
4489
+ createWeightHover,
4490
+ createSticker,
4491
+ createScrollDock,
4492
+ createLocalClock
3319
4493
  };
3320
- //# sourceMappingURL=chunk-XDWBVFHQ.js.map
4494
+ //# sourceMappingURL=chunk-EY4BJKC4.js.map