@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
@@ -0,0 +1,201 @@
1
+ import { gsap, EASE, registerMotion } from '../../core/gsap';
2
+ import { reduced } from '../../core/reduced';
3
+ import { createScope } from '../../core/scope';
4
+ import { inert, type Instance } from '../../core/types';
5
+ import { press, shake } from '../../motion/micro';
6
+
7
+ /*
8
+ * Loading button: a button that shows its work. Pressed (or run()), it gives
9
+ * Melon Mind's press, its label blurs out and a spinner draws in while the
10
+ * button glides to its new width (.4 s, swing); success turns it to the
11
+ * success colour with a check that draws itself (.35 s) and pops; error turns
12
+ * it to the error colour, shakes it and draws a cross; after `resetAfter` it
13
+ * glides back to its label. `compact` (default) shows only the icon while
14
+ * working; otherwise the state's text sits beside it. While loading it stays
15
+ * focusable but inert (aria-disabled, aria-busy) and a polite status beside it
16
+ * says what happened. data-mk-state carries the state for CSS.
17
+ */
18
+
19
+ export type LoadingState = 'idle' | 'loading' | 'success' | 'error';
20
+
21
+ export interface LoadingButtonOptions {
22
+ /** Runs on click; its promise drives the states (resolve → success, reject → error). */
23
+ action?: () => unknown;
24
+ /** Texts for the states (announced; shown beside the icon when not compact). */
25
+ labels?: { loading?: string; success?: string; error?: string };
26
+ /** Icon only while working (default true). */
27
+ compact?: boolean;
28
+ /** ms in success or error before going back to the label (default 1800; 0 stays). */
29
+ resetAfter?: number;
30
+ onStateChange?: (state: LoadingState) => void;
31
+ }
32
+
33
+ export interface LoadingButtonInstance extends Instance {
34
+ setState(state: LoadingState): void;
35
+ /** Runs `action` (or the option) and walks the states; resolves true on success. */
36
+ run(action?: () => unknown): Promise<boolean>;
37
+ readonly state: LoadingState;
38
+ }
39
+
40
+ const LABELS = { loading: 'Cargando…', success: 'Listo', error: 'Error' };
41
+ const SVG = 'http://www.w3.org/2000/svg';
42
+ const ICONS: Record<Exclude<LoadingState, 'idle'>, string> = {
43
+ loading: '<circle cx="12" cy="12" r="8.5" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-dasharray="40 14" data-mk-loading-spinner/>',
44
+ success: '<path d="M6 12.5l4 4L18 8" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" data-mk-loading-draw/>',
45
+ error: '<path d="M7.5 7.5l9 9M16.5 7.5l-9 9" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" data-mk-loading-draw/>',
46
+ };
47
+
48
+ export function createLoadingButton(root: HTMLElement | null, options: LoadingButtonOptions = {}): LoadingButtonInstance {
49
+ const button = root ? (root.matches('button') ? root : root.querySelector<HTMLElement>('button')) : null;
50
+ if (!root || !button) return inert({ setState() {}, run: async () => false, state: 'idle' });
51
+ registerMotion();
52
+ const scope = createScope();
53
+ const labels = { ...LABELS, ...options.labels };
54
+ const compact = options.compact !== false;
55
+ const resetAfter = Number.isFinite(options.resetAfter) ? Math.max(0, options.resetAfter!) : 1800;
56
+ const effects = new Set<gsap.core.Animation>();
57
+ const keep = (animation: gsap.core.Animation | null) => {
58
+ if (!animation) return;
59
+ effects.add(animation);
60
+ // Finished ones leave as new ones arrive: the animation's own onComplete stays untouched.
61
+ for (const effect of effects) if (effect.totalProgress() === 1) effects.delete(effect);
62
+ };
63
+ scope.add(() => {
64
+ for (const effect of effects) effect.kill();
65
+ effects.clear();
66
+ });
67
+
68
+ // The authored content becomes the label (an authored [data-mk-loading-label] is used as it is: React owns its
69
+ // children); the icon and the state's text sit beside it.
70
+ const authored = button.querySelector<HTMLElement>(':scope > [data-mk-loading-label]');
71
+ const label = authored ?? document.createElement('span');
72
+ label.dataset.mkLoadingLabel = '';
73
+ const original = authored ? [] : [...button.childNodes];
74
+ label.append(...original);
75
+ const icon = document.createElement('span');
76
+ icon.dataset.mkLoadingIcon = '';
77
+ icon.setAttribute('aria-hidden', 'true');
78
+ icon.hidden = true;
79
+ const text = document.createElement('span');
80
+ text.dataset.mkLoadingText = '';
81
+ text.setAttribute('aria-hidden', 'true');
82
+ text.hidden = true;
83
+ if (authored) button.prepend(icon, text);
84
+ else button.append(icon, text, label);
85
+ const status = document.createElement('span');
86
+ status.className = 'mk-sr-only';
87
+ status.dataset.mkLoadingStatus = '';
88
+ status.setAttribute('role', 'status');
89
+ button.after(status);
90
+ scope.add(() => {
91
+ gsap.killTweensOf([button, label, icon, text]);
92
+ status.remove();
93
+ icon.remove();
94
+ text.remove();
95
+ if (authored) {
96
+ label.hidden = false;
97
+ return;
98
+ }
99
+ label.remove();
100
+ button.append(...original);
101
+ });
102
+ scope.attr(button, 'style', button.getAttribute('style'));
103
+ scope.attr(button, 'data-mk-state', 'idle');
104
+ scope.attr(button, 'aria-busy', null);
105
+ scope.attr(button, 'aria-disabled', button.getAttribute('aria-disabled'));
106
+ scope.attr(root, 'data-mk-ready', '');
107
+
108
+ let state: LoadingState = 'idle';
109
+ let timer: ReturnType<typeof setTimeout> | undefined;
110
+ scope.add(() => clearTimeout(timer));
111
+
112
+ const drawIcon = (next: Exclude<LoadingState, 'idle'>) => {
113
+ const svg = document.createElementNS(SVG, 'svg');
114
+ svg.setAttribute('viewBox', '0 0 24 24');
115
+ svg.setAttribute('width', '20');
116
+ svg.setAttribute('height', '20');
117
+ svg.innerHTML = ICONS[next];
118
+ icon.replaceChildren(svg);
119
+ if (reduced()) return;
120
+ keep(gsap.fromTo(icon, { scale: 0.6, opacity: 0, filter: 'blur(4px)' }, { scale: 1, opacity: 1, filter: 'blur(0px)', duration: 0.3, ease: EASE.pop, clearProps: 'scale,opacity,filter,transform' }));
121
+ const path = svg.querySelector<SVGGeometryElement>('[data-mk-loading-draw]');
122
+ if (path) {
123
+ const length = typeof path.getTotalLength === 'function' ? path.getTotalLength() || 20 : 20;
124
+ keep(gsap.fromTo(path, { strokeDasharray: length, strokeDashoffset: length }, { strokeDashoffset: 0, duration: 0.35, delay: 0.05, ease: EASE.wipe }));
125
+ }
126
+ };
127
+
128
+ const setState = (next: LoadingState) => {
129
+ if (scope.disposed || next === state) return;
130
+ clearTimeout(timer);
131
+ const from = button.offsetWidth;
132
+ state = next;
133
+ button.setAttribute('data-mk-state', next);
134
+ if (next === 'loading') {
135
+ button.setAttribute('aria-busy', 'true');
136
+ button.setAttribute('aria-disabled', 'true');
137
+ } else {
138
+ button.removeAttribute('aria-busy');
139
+ button.removeAttribute('aria-disabled');
140
+ }
141
+ status.textContent = next === 'idle' ? '' : labels[next];
142
+ const working = next !== 'idle';
143
+ // Content: the label for idle; the icon (and the state's text unless compact) otherwise.
144
+ label.hidden = working;
145
+ icon.hidden = !working;
146
+ text.hidden = !working || compact;
147
+ text.textContent = working ? labels[next] : '';
148
+ if (working) drawIcon(next);
149
+ else icon.replaceChildren();
150
+ // The width glides from the old content's to the new one's.
151
+ if (!reduced() && from > 0) {
152
+ gsap.killTweensOf(button, 'width');
153
+ button.style.width = '';
154
+ const to = button.offsetWidth;
155
+ if (Math.abs(to - from) > 1) keep(gsap.fromTo(button, { width: from }, { width: to, duration: 0.4, ease: EASE.swatch, clearProps: 'width' }));
156
+ const entering = working ? (compact ? [icon] : [icon, text]) : [label];
157
+ keep(gsap.fromTo(entering.filter((part) => part !== icon), { opacity: 0, filter: 'blur(6px)', y: 4 }, { opacity: 1, filter: 'blur(0px)', y: 0, duration: 0.25, ease: 'power2.out', clearProps: 'opacity,filter,transform' }));
158
+ }
159
+ if (next === 'error') keep(shake(button));
160
+ if (next === 'success' || next === 'error') {
161
+ if (resetAfter) timer = setTimeout(() => setState('idle'), resetAfter);
162
+ }
163
+ options.onStateChange?.(next);
164
+ root.dispatchEvent(new CustomEvent('mk:state-change', { bubbles: true, detail: { state: next } }));
165
+ };
166
+
167
+ const run = async (action = options.action) => {
168
+ if (state === 'loading' || scope.disposed) return false;
169
+ setState('loading');
170
+ try {
171
+ await action?.();
172
+ if (scope.disposed) return true;
173
+ setState('success');
174
+ return true;
175
+ } catch {
176
+ if (scope.disposed) return false;
177
+ setState('error');
178
+ return false;
179
+ }
180
+ };
181
+
182
+ scope.on(button, 'click', (event) => {
183
+ if (state === 'loading') {
184
+ // Inert while working, but still focusable (aria-disabled, not disabled).
185
+ event.preventDefault();
186
+ event.stopImmediatePropagation();
187
+ return;
188
+ }
189
+ keep(press(button));
190
+ if (options.action) void run();
191
+ });
192
+
193
+ return {
194
+ setState,
195
+ run,
196
+ get state() {
197
+ return state;
198
+ },
199
+ destroy: () => scope.dispose(),
200
+ };
201
+ }
@@ -0,0 +1,76 @@
1
+ /* loading-button — the button keeps its own look (.mk-button or yours); this adds the state colours, the icon slot and
2
+ the spinner. Success uses --mk-loading-success (a green that reads on both modes), error --mk-error. */
3
+ .mk-loading-button,
4
+ mk-loading-button button,
5
+ mk-loading-button {
6
+ --mk-loading-success: #1f9d5b;
7
+ }
8
+
9
+ mk-loading-button {
10
+ display: inline-flex;
11
+ }
12
+
13
+ :is(.mk-loading-button, mk-loading-button button) {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ gap: 0.5rem;
18
+ overflow: hidden;
19
+ white-space: nowrap;
20
+ transition: background-color 0.25s ease, color 0.25s ease, box-shadow 0.25s ease;
21
+ }
22
+
23
+ :is(.mk-loading-button, mk-loading-button button)[data-mk-state='loading'] {
24
+ cursor: progress;
25
+ }
26
+
27
+ /* Working is not disabled: keep the button's colour (beats .mk-button[aria-disabled] whatever the order). */
28
+ :is(.mk-loading-button, mk-loading-button button)[data-mk-state='loading'][aria-busy='true'] {
29
+ opacity: 1;
30
+ }
31
+
32
+ :is(.mk-loading-button, mk-loading-button button)[data-mk-state='success'] {
33
+ background: var(--mk-loading-success);
34
+ color: #fff;
35
+ }
36
+
37
+ :is(.mk-loading-button, mk-loading-button button)[data-mk-state='error'] {
38
+ background: var(--mk-error, #c62828);
39
+ color: var(--mk-on-error, #fff);
40
+ }
41
+
42
+ :is(.mk-loading-button, mk-loading-button button) [data-mk-loading-icon] {
43
+ display: inline-grid;
44
+ place-items: center;
45
+ flex: none;
46
+ width: 20px;
47
+ height: 20px;
48
+ }
49
+
50
+ :is(.mk-loading-button, mk-loading-button button) [data-mk-loading-icon][hidden],
51
+ :is(.mk-loading-button, mk-loading-button button) [data-mk-loading-text][hidden],
52
+ :is(.mk-loading-button, mk-loading-button button) [data-mk-loading-label][hidden] {
53
+ display: none;
54
+ }
55
+
56
+ :is(.mk-loading-button, mk-loading-button button) [data-mk-loading-spinner] {
57
+ transform-origin: 50% 50%;
58
+ animation: mk-loading-spin 0.8s linear infinite;
59
+ }
60
+
61
+ @keyframes mk-loading-spin {
62
+ to {
63
+ transform: rotate(360deg);
64
+ }
65
+ }
66
+
67
+ /* Without motion the spinner stands still: a partial ring still reads as "working". */
68
+ @media (prefers-reduced-motion: reduce) {
69
+ :is(.mk-loading-button, mk-loading-button button) {
70
+ transition: none;
71
+ }
72
+
73
+ :is(.mk-loading-button, mk-loading-button button) [data-mk-loading-spinner] {
74
+ animation: none;
75
+ }
76
+ }
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+ import { useRef, type ButtonHTMLAttributes } from 'react';
3
+ import { useIsomorphicLayoutEffect, useLatest } from '../../react/use-recipe';
4
+ import { createLoadingButton, type LoadingButtonInstance, type LoadingButtonOptions, type LoadingState } from './engine';
5
+
6
+ export interface LoadingButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'>, Omit<LoadingButtonOptions, 'action'> {
7
+ /** Runs on click; its promise drives loading → success / error. */
8
+ action?: () => unknown;
9
+ /** Controlled state (optional): drive it yourself instead of `action`. */
10
+ state?: LoadingState;
11
+ }
12
+
13
+ /** <LoadingButton action={save} className="mk-button">Guardar</LoadingButton>. */
14
+ export function LoadingButton({ action, state, labels, compact, resetAfter, onStateChange, className, children, type = 'button', ...props }: LoadingButtonProps) {
15
+ const ref = useRef<HTMLButtonElement>(null);
16
+ const instance = useRef<LoadingButtonInstance | null>(null);
17
+ const run = useLatest(action);
18
+ const change = useLatest(onStateChange);
19
+ const key = JSON.stringify(labels ?? null);
20
+ useIsomorphicLayoutEffect(() => {
21
+ const created = createLoadingButton(ref.current, {
22
+ labels,
23
+ compact,
24
+ resetAfter,
25
+ action: action ? () => run.current?.() : undefined,
26
+ onStateChange: (next) => change.current?.(next),
27
+ });
28
+ instance.current = created;
29
+ return () => {
30
+ created.destroy();
31
+ instance.current = null;
32
+ };
33
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34
+ }, [key, compact, resetAfter, Boolean(action)]);
35
+ useIsomorphicLayoutEffect(() => {
36
+ if (state && instance.current && instance.current.state !== state) instance.current.setState(state);
37
+ }, [state]);
38
+ return (
39
+ <button {...props} type={type} ref={ref} className={['mk-loading-button', className].filter(Boolean).join(' ')}>
40
+ <span data-mk-loading-label="">{children}</span>
41
+ </button>
42
+ );
43
+ }
@@ -0,0 +1,48 @@
1
+ # multi-select
2
+
3
+ Selección múltiple con chips y búsqueda: un campo combobox que guarda lo elegido como chips y deja escribir para filtrar. Al escribir, la lista se filtra (letras en orden, sin importar tildes ni mayúsculas) y marca las letras que coinciden. La lista sale del campo (desde 96 % y un blur de 6 px, .22 s, curva pop) y la opción activa es una píldora que se desliza (.3 s, curva swing). Enter o un clic marcan o desmarcan una opción, y su casilla se dibuja sola.
4
+
5
+ Los chips aparecen con un pop y se pliegan al quitarlos mientras los demás se recolocan. Retroceso con la búsqueda vacía marca el último chip (un anillo) y la segunda vez lo quita; ← llega a los chips y Supr quita el enfocado. Con `max`, al llegar al límite el campo se sacude y las demás opciones se desactivan.
6
+
7
+ ## HTML / Astro
8
+
9
+ ```html
10
+ <!-- Con un <select multiple> escrito: da las opciones y se mantiene sincronizado, así el formulario envía como siempre. -->
11
+ <mk-multi-select class="mk-multi-select" label="Equipo">
12
+ <select multiple name="equipo">
13
+ <optgroup label="Diseño"><option value="ana">Ana Gómez</option><option value="luis" selected>Luis Peña</option></optgroup>
14
+ <optgroup label="Código"><option value="sofia">Sofía Ruiz</option></optgroup>
15
+ </select>
16
+ </mk-multi-select>
17
+
18
+ <!-- O con opciones en JSON (y name para los campos ocultos name[]): -->
19
+ <mk-multi-select options='[{"value":"mx","label":"México"},{"value":"es","label":"España"}]' value="mx" name="paises" max="3"></mk-multi-select>
20
+ ```
21
+
22
+ ## React
23
+
24
+ ```tsx
25
+ <MultiSelect options={people} value={chosen} onChange={setChosen} label="Responsables" max={3} />
26
+ ```
27
+
28
+ ## Opciones
29
+
30
+ | Opción | Atributo | Por defecto | Qué hace |
31
+ |---|---|---|---|
32
+ | `options` | `options` (JSON) | el `<select multiple>` | `{ value, label, group?, hint?, disabled? }[]`. |
33
+ | `value` | `value` (lista con comas) | lo seleccionado | Valores elegidos. |
34
+ | `placeholder` | `placeholder` | `'Buscar…'` | Texto de la búsqueda vacía. |
35
+ | `label` | `label` | el `<label>` escrito | Nombre accesible. |
36
+ | `name` | `name` | — | Campos ocultos `name[]` (sin `<select>` escrito). |
37
+ | `max` | `max` | sin límite | Máximo de opciones. |
38
+ | `closeOnSelect` | `close-on-select` | `false` | Cerrar la lista tras cada elección. |
39
+ | `disabled` | `disabled` | `false` | Desactivado. |
40
+ | `onChange(values)` | — | — | Cada cambio. |
41
+
42
+ ## API y eventos
43
+
44
+ `setValue(values, notify = false)`, `setOptions(options)`, `open()`, `close()`, `value`, `destroy()`. Evento `mk:change` con `{ value }`.
45
+
46
+ ## Accesibilidad
47
+
48
+ Combobox con `aria-expanded`, `aria-controls` y `aria-activedescendant`; lista `role="listbox"` con `aria-multiselectable`; los botones de los chips dicen «Quitar <nombre>» y un estado discreto anuncia cada cambio. La lista vive en la capa superior, así que ningún `overflow` la recorta. Con movimiento reducido todo cambia sin animación.
@@ -0,0 +1,28 @@
1
+ import { MkElement, defineElement, type OptionType } from '../../elements/base';
2
+ import { createMultiSelect, type MultiSelectInstance } from './engine';
3
+
4
+ /**
5
+ * <mk-multi-select class="mk-multi-select" label="Etiquetas">
6
+ * <select multiple name="etiquetas"><option>Diseño</option><option selected>Código</option></select>
7
+ * </mk-multi-select>
8
+ * Or options='[{"value":"ana","label":"Ana"}]' value="ana" name="personas". Emits mk:change ({value}).
9
+ */
10
+ export class MkMultiSelectElement extends MkElement<MultiSelectInstance> {
11
+ static options: Record<string, OptionType> = { options: 'json', value: 'list', placeholder: 'string', label: 'string', name: 'string', max: 'number', closeOnSelect: 'boolean', disabled: 'boolean' };
12
+
13
+ protected create(options: Record<string, unknown>) {
14
+ return createMultiSelect(this, options);
15
+ }
16
+
17
+ attributeChangedCallback(name: string, previous: string | null, next: string | null) {
18
+ if (previous === next || !this.instance) return;
19
+ if (name === 'value') this.instance.setValue((next ?? '').split(',').map((item) => item.trim()).filter(Boolean));
20
+ else super.attributeChangedCallback(name, previous, next);
21
+ }
22
+
23
+ get value() {
24
+ return this.instance?.value ?? [];
25
+ }
26
+ }
27
+
28
+ export const defineMultiSelect = () => defineElement('mk-multi-select', MkMultiSelectElement);