@yewdiel21/motion-kit 0.0.0-stage → 0.9.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 (391) hide show
  1. package/NOTICE +38 -0
  2. package/README.md +80 -2
  3. package/bin/motion-kit.mjs +242 -0
  4. package/css.d.ts +2 -0
  5. package/dist/auto/index.d.ts +63 -0
  6. package/dist/auto/index.js +207 -0
  7. package/dist/auto/index.js.map +1 -0
  8. package/dist/chunk-2BQGFOA7.js +177 -0
  9. package/dist/chunk-2BQGFOA7.js.map +1 -0
  10. package/dist/chunk-34XYOXHG.js +2374 -0
  11. package/dist/chunk-34XYOXHG.js.map +1 -0
  12. package/dist/chunk-6OJAP6ZL.js +832 -0
  13. package/dist/chunk-6OJAP6ZL.js.map +1 -0
  14. package/dist/chunk-ABNRDDO7.js +28 -0
  15. package/dist/chunk-ABNRDDO7.js.map +1 -0
  16. package/dist/chunk-FS2HJVVY.js +3320 -0
  17. package/dist/chunk-FS2HJVVY.js.map +1 -0
  18. package/dist/chunk-J27KH2A2.js +157 -0
  19. package/dist/chunk-J27KH2A2.js.map +1 -0
  20. package/dist/chunk-KLY5BRRI.js +18 -0
  21. package/dist/chunk-KLY5BRRI.js.map +1 -0
  22. package/dist/chunk-Q4LVFNLN.js +1617 -0
  23. package/dist/chunk-Q4LVFNLN.js.map +1 -0
  24. package/dist/chunk-RFDIZYFX.js +304 -0
  25. package/dist/chunk-RFDIZYFX.js.map +1 -0
  26. package/dist/chunk-TGV27ZWM.js +17 -0
  27. package/dist/chunk-TGV27ZWM.js.map +1 -0
  28. package/dist/confetti-BSX1CLLV.d.ts +41 -0
  29. package/dist/css/components/chat-background.css +87 -0
  30. package/dist/css/components/chat.css +237 -0
  31. package/dist/css/components/cursor.css +178 -0
  32. package/dist/css/components/dialog.css +259 -0
  33. package/dist/css/components/island.css +301 -0
  34. package/dist/css/components/menu.css +105 -0
  35. package/dist/css/components/nav.css +1054 -0
  36. package/dist/css/components/steps.css +50 -0
  37. package/dist/css/components/theme-picker.css +115 -0
  38. package/dist/css/components/toast.css +115 -0
  39. package/dist/css/controls.css +950 -0
  40. package/dist/css/effects.css +587 -0
  41. package/dist/css/fonts.css +3 -0
  42. package/dist/css/themes/black-green.css +126 -0
  43. package/dist/css/themes/black.css +126 -0
  44. package/dist/css/themes/blue.css +126 -0
  45. package/dist/css/themes/brown.css +126 -0
  46. package/dist/css/themes/cold-blue.css +126 -0
  47. package/dist/css/themes/funny.css +126 -0
  48. package/dist/css/themes/gray.css +126 -0
  49. package/dist/css/themes/green.css +126 -0
  50. package/dist/css/themes/modern-1.css +126 -0
  51. package/dist/css/themes/neogreen.css +126 -0
  52. package/dist/css/themes/new.css +126 -0
  53. package/dist/css/themes/new2.css +126 -0
  54. package/dist/css/themes/oled.css +126 -0
  55. package/dist/css/themes/orange.css +126 -0
  56. package/dist/css/themes/pastel-pink.css +126 -0
  57. package/dist/css/themes/pink.css +126 -0
  58. package/dist/css/themes/purple.css +126 -0
  59. package/dist/css/themes/red.css +126 -0
  60. package/dist/css/themes/super-blue.css +126 -0
  61. package/dist/css/themes.css +2431 -0
  62. package/dist/css/tokens.css +452 -0
  63. package/dist/elements/index.d.ts +183 -0
  64. package/dist/elements/index.js +472 -0
  65. package/dist/elements/index.js.map +1 -0
  66. package/dist/engine-CUr9QijM.d.ts +46 -0
  67. package/dist/gl/index.d.ts +61 -0
  68. package/dist/gl/index.js +18 -0
  69. package/dist/gl/index.js.map +1 -0
  70. package/dist/index.css +5296 -0
  71. package/dist/index.d.ts +440 -0
  72. package/dist/index.js +390 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/react/index.d.ts +476 -0
  75. package/dist/react/index.js +969 -0
  76. package/dist/react/index.js.map +1 -0
  77. package/dist/reduced-BM4Ls0g5.d.ts +566 -0
  78. package/dist/reveal-WFUWDrei.d.ts +416 -0
  79. package/dist/store-Bqy_obnD.d.ts +195 -0
  80. package/dist/theme/generate.d.ts +18 -0
  81. package/dist/theme/generate.js +64 -0
  82. package/dist/theme/generate.js.map +1 -0
  83. package/dist/theme/index.d.ts +17 -0
  84. package/dist/theme/index.js +32 -0
  85. package/dist/theme/index.js.map +1 -0
  86. package/dist/theme-BFMoCzi6.d.ts +158 -0
  87. package/dist/types-BkS_raL8.d.ts +7 -0
  88. package/package.json +114 -3
  89. package/registry.json +469 -0
  90. package/skills/motion-kit/SKILL.md +189 -0
  91. package/skills/motion-kit/reference/components.md +86 -0
  92. package/skills/motion-kit/reference/design.md +92 -0
  93. package/skills/motion-kit/reference/recipes.md +172 -0
  94. package/src/auto/auto-init.ts +151 -0
  95. package/src/auto/index.ts +3 -0
  96. package/src/auto/parse-options.ts +68 -0
  97. package/src/components/chat/README.md +90 -0
  98. package/src/components/chat/chat.css +236 -0
  99. package/src/components/chat/element.ts +98 -0
  100. package/src/components/chat/engine.ts +295 -0
  101. package/src/components/chat/react.tsx +196 -0
  102. package/src/components/chat-background/README.md +50 -0
  103. package/src/components/chat-background/audio.ts +56 -0
  104. package/src/components/chat-background/chat-background.css +86 -0
  105. package/src/components/chat-background/element.ts +31 -0
  106. package/src/components/chat-background/engine.ts +108 -0
  107. package/src/components/chat-background/react.tsx +36 -0
  108. package/src/components/cursor/README.md +53 -0
  109. package/src/components/cursor/cursor.css +177 -0
  110. package/src/components/cursor/element.ts +23 -0
  111. package/src/components/cursor/engine.ts +254 -0
  112. package/src/components/cursor/react.tsx +26 -0
  113. package/src/components/dialog/README.md +106 -0
  114. package/src/components/dialog/dialog.css +258 -0
  115. package/src/components/dialog/element.ts +118 -0
  116. package/src/components/dialog/engine.ts +432 -0
  117. package/src/components/dialog/react.tsx +200 -0
  118. package/src/components/icon.tsx +10 -0
  119. package/src/components/icons.ts +24 -0
  120. package/src/components/island/README.md +91 -0
  121. package/src/components/island/element.ts +45 -0
  122. package/src/components/island/engine.ts +200 -0
  123. package/src/components/island/island.css +300 -0
  124. package/src/components/island/react.tsx +115 -0
  125. package/src/components/menu/README.md +67 -0
  126. package/src/components/menu/element.ts +55 -0
  127. package/src/components/menu/engine.ts +142 -0
  128. package/src/components/menu/menu.css +104 -0
  129. package/src/components/menu/react.tsx +82 -0
  130. package/src/components/nav/README.md +85 -0
  131. package/src/components/nav/element.ts +39 -0
  132. package/src/components/nav/engine.ts +164 -0
  133. package/src/components/nav/nav.css +1053 -0
  134. package/src/components/nav/react.tsx +90 -0
  135. package/src/components/steps/README.md +70 -0
  136. package/src/components/steps/element.ts +43 -0
  137. package/src/components/steps/engine.ts +185 -0
  138. package/src/components/steps/react.tsx +91 -0
  139. package/src/components/steps/steps.css +49 -0
  140. package/src/components/theme-picker/README.md +57 -0
  141. package/src/components/theme-picker/element.ts +20 -0
  142. package/src/components/theme-picker/engine.ts +91 -0
  143. package/src/components/theme-picker/react.tsx +31 -0
  144. package/src/components/theme-picker/theme-picker.css +114 -0
  145. package/src/components/toast/README.md +60 -0
  146. package/src/components/toast/element.ts +25 -0
  147. package/src/components/toast/engine.ts +483 -0
  148. package/src/components/toast/react.tsx +22 -0
  149. package/src/components/toast/store.ts +122 -0
  150. package/src/components/toast/toast.css +114 -0
  151. package/src/core/channels.ts +165 -0
  152. package/src/core/curves.ts +35 -0
  153. package/src/core/frame.ts +12 -0
  154. package/src/core/gsap.ts +65 -0
  155. package/src/core/loop.ts +44 -0
  156. package/src/core/math.ts +9 -0
  157. package/src/core/physics-spring.ts +59 -0
  158. package/src/core/pointer.ts +63 -0
  159. package/src/core/reduced.ts +21 -0
  160. package/src/core/scope.ts +70 -0
  161. package/src/core/scroll-track.ts +106 -0
  162. package/src/core/split.ts +68 -0
  163. package/src/core/spring.ts +22 -0
  164. package/src/core/styles.ts +31 -0
  165. package/src/core/timing.ts +204 -0
  166. package/src/core/types.ts +20 -0
  167. package/src/core/visible.ts +19 -0
  168. package/src/css/base.css +142 -0
  169. package/src/css/controls/README.md +122 -0
  170. package/src/css/controls/burger.css +67 -0
  171. package/src/css/controls/button.css +226 -0
  172. package/src/css/controls/checkbox.css +53 -0
  173. package/src/css/controls/chip.css +85 -0
  174. package/src/css/controls/field.css +124 -0
  175. package/src/css/controls/glass.css +220 -0
  176. package/src/css/controls/icon.css +26 -0
  177. package/src/css/controls/segmented.css +60 -0
  178. package/src/css/controls/switch.css +72 -0
  179. package/src/css/default-theme.css +123 -0
  180. package/src/css/effects/README.md +134 -0
  181. package/src/css/effects/anim.css +224 -0
  182. package/src/css/effects/fade.css +15 -0
  183. package/src/css/effects/float.css +64 -0
  184. package/src/css/effects/frost.css +62 -0
  185. package/src/css/effects/grain.css +58 -0
  186. package/src/css/effects/loading.css +60 -0
  187. package/src/css/effects/success.css +22 -0
  188. package/src/css/effects/text.css +67 -0
  189. package/src/css/fonts.css +3 -0
  190. package/src/css/states.css +51 -0
  191. package/src/css/themes/black-green.css +126 -0
  192. package/src/css/themes/black.css +126 -0
  193. package/src/css/themes/blue.css +126 -0
  194. package/src/css/themes/brown.css +126 -0
  195. package/src/css/themes/cold-blue.css +126 -0
  196. package/src/css/themes/funny.css +126 -0
  197. package/src/css/themes/gray.css +126 -0
  198. package/src/css/themes/green.css +126 -0
  199. package/src/css/themes/modern-1.css +126 -0
  200. package/src/css/themes/neogreen.css +126 -0
  201. package/src/css/themes/new.css +126 -0
  202. package/src/css/themes/new2.css +126 -0
  203. package/src/css/themes/oled.css +126 -0
  204. package/src/css/themes/orange.css +126 -0
  205. package/src/css/themes/pastel-pink.css +126 -0
  206. package/src/css/themes/pink.css +126 -0
  207. package/src/css/themes/purple.css +126 -0
  208. package/src/css/themes/red.css +126 -0
  209. package/src/css/themes/super-blue.css +126 -0
  210. package/src/css/tokens.css +182 -0
  211. package/src/elements/base.ts +76 -0
  212. package/src/elements/index.ts +48 -0
  213. package/src/gl/index.ts +15 -0
  214. package/src/gl/liquid-blend/README.md +23 -0
  215. package/src/gl/liquid-blend/create-liquid-blend.ts +7 -0
  216. package/src/gl/liquid-blend/shader.ts +9 -0
  217. package/src/gl/matcap/README.md +23 -0
  218. package/src/gl/matcap/create-matcap.ts +7 -0
  219. package/src/gl/matcap/shader.ts +16 -0
  220. package/src/gl/particle-hero/README.md +41 -0
  221. package/src/gl/particle-hero/create-particle-hero.ts +544 -0
  222. package/src/gl/particle-hero/particle-hero.css +19 -0
  223. package/src/gl/particle-hero/shaders.ts +84 -0
  224. package/src/gl/shader-blur/README.md +23 -0
  225. package/src/gl/shader-blur/create-shader-blur.ts +7 -0
  226. package/src/gl/shader-blur/shader.ts +11 -0
  227. package/src/gl/shader-grain/README.md +23 -0
  228. package/src/gl/shader-grain/create-shader-grain.ts +7 -0
  229. package/src/gl/shader-grain/shader.ts +6 -0
  230. package/src/gl/shared/create-shader-effect.ts +186 -0
  231. package/src/gl/shared/shader.css +3 -0
  232. package/src/gl/shared/shaders.ts +30 -0
  233. package/src/index.ts +177 -0
  234. package/src/motion/anchor.ts +45 -0
  235. package/src/motion/chat.ts +97 -0
  236. package/src/motion/confetti.ts +130 -0
  237. package/src/motion/count.ts +95 -0
  238. package/src/motion/details.ts +70 -0
  239. package/src/motion/drag-dismiss.ts +231 -0
  240. package/src/motion/effects.ts +81 -0
  241. package/src/motion/entrances.ts +27 -0
  242. package/src/motion/floating.ts +389 -0
  243. package/src/motion/flow.ts +115 -0
  244. package/src/motion/indicator.ts +44 -0
  245. package/src/motion/layout.ts +39 -0
  246. package/src/motion/liquid.ts +227 -0
  247. package/src/motion/morph.ts +540 -0
  248. package/src/motion/reveal.ts +112 -0
  249. package/src/motion/sheet.ts +65 -0
  250. package/src/motion/surface.ts +108 -0
  251. package/src/react/animated-number.tsx +30 -0
  252. package/src/react/flip-group.tsx +44 -0
  253. package/src/react/frost.tsx +33 -0
  254. package/src/react/index.ts +80 -0
  255. package/src/react/slot-text.tsx +44 -0
  256. package/src/react/theme-provider.tsx +42 -0
  257. package/src/react/use-card-dock.ts +9 -0
  258. package/src/react/use-cascade.ts +9 -0
  259. package/src/react/use-contrast.ts +9 -0
  260. package/src/react/use-counter.ts +8 -0
  261. package/src/react/use-curved-carousel.ts +10 -0
  262. package/src/react/use-depth-grid.ts +9 -0
  263. package/src/react/use-details.ts +7 -0
  264. package/src/react/use-dock-pill.ts +10 -0
  265. package/src/react/use-drag-ruler.ts +10 -0
  266. package/src/react/use-fill-text.ts +9 -0
  267. package/src/react/use-fit-text.ts +8 -0
  268. package/src/react/use-flow.ts +8 -0
  269. package/src/react/use-frame-zoom.ts +9 -0
  270. package/src/react/use-infinite-reel.ts +8 -0
  271. package/src/react/use-letters.ts +9 -0
  272. package/src/react/use-liquid-blend.ts +8 -0
  273. package/src/react/use-marquee.ts +9 -0
  274. package/src/react/use-mask-text.ts +9 -0
  275. package/src/react/use-matcap.ts +8 -0
  276. package/src/react/use-parallax.ts +9 -0
  277. package/src/react/use-particle-hero.ts +9 -0
  278. package/src/react/use-pile.ts +8 -0
  279. package/src/react/use-pop.ts +8 -0
  280. package/src/react/use-radial-menu.ts +10 -0
  281. package/src/react/use-recipe.ts +38 -0
  282. package/src/react/use-reflow.ts +9 -0
  283. package/src/react/use-repel-bento.ts +8 -0
  284. package/src/react/use-reveal.ts +8 -0
  285. package/src/react/use-rotator.ts +10 -0
  286. package/src/react/use-shader-blur.ts +8 -0
  287. package/src/react/use-shader-grain.ts +8 -0
  288. package/src/react/use-slot-text.ts +17 -0
  289. package/src/react/use-snap-strip.ts +9 -0
  290. package/src/react/use-sortable.ts +14 -0
  291. package/src/react/use-spring-cards.ts +8 -0
  292. package/src/react/use-stretch-footer.ts +20 -0
  293. package/src/react/use-tabs.ts +10 -0
  294. package/src/react/use-text-roll.ts +9 -0
  295. package/src/react/use-ticket-menu.ts +15 -0
  296. package/src/react/use-words.ts +8 -0
  297. package/src/recipes/card-dock/README.md +36 -0
  298. package/src/recipes/card-dock/card-dock.css +178 -0
  299. package/src/recipes/card-dock/create-card-dock.ts +97 -0
  300. package/src/recipes/cascade/README.md +33 -0
  301. package/src/recipes/cascade/create-cascade.ts +111 -0
  302. package/src/recipes/contrast/README.md +29 -0
  303. package/src/recipes/contrast/create-contrast.ts +68 -0
  304. package/src/recipes/counter/README.md +42 -0
  305. package/src/recipes/counter/create-counter.ts +84 -0
  306. package/src/recipes/curved-carousel/README.md +50 -0
  307. package/src/recipes/curved-carousel/carousel-math.ts +20 -0
  308. package/src/recipes/curved-carousel/create-curved-carousel.ts +257 -0
  309. package/src/recipes/curved-carousel/curved-carousel.css +50 -0
  310. package/src/recipes/depth-grid/README.md +30 -0
  311. package/src/recipes/depth-grid/create-depth-grid.ts +120 -0
  312. package/src/recipes/details/README.md +31 -0
  313. package/src/recipes/details/create-details.ts +27 -0
  314. package/src/recipes/dock-pill/README.md +23 -0
  315. package/src/recipes/dock-pill/create-dock-pill.ts +68 -0
  316. package/src/recipes/dock-pill/dock-pill.css +5 -0
  317. package/src/recipes/drag-ruler/README.md +21 -0
  318. package/src/recipes/drag-ruler/create-drag-ruler.ts +95 -0
  319. package/src/recipes/drag-ruler/drag-ruler.css +16 -0
  320. package/src/recipes/fill-text/README.md +27 -0
  321. package/src/recipes/fill-text/create-fill-text.ts +93 -0
  322. package/src/recipes/fit-text/README.md +37 -0
  323. package/src/recipes/fit-text/create-fit-text.ts +55 -0
  324. package/src/recipes/fit-text/fit-text.css +6 -0
  325. package/src/recipes/flow/README.md +46 -0
  326. package/src/recipes/flow/create-flow.ts +55 -0
  327. package/src/recipes/frame-zoom/README.md +29 -0
  328. package/src/recipes/frame-zoom/create-frame-zoom.ts +91 -0
  329. package/src/recipes/infinite-reel/README.md +23 -0
  330. package/src/recipes/infinite-reel/create-infinite-reel.ts +140 -0
  331. package/src/recipes/infinite-reel/infinite-reel.css +8 -0
  332. package/src/recipes/letters/README.md +30 -0
  333. package/src/recipes/letters/create-letters.ts +113 -0
  334. package/src/recipes/marquee/README.md +32 -0
  335. package/src/recipes/marquee/create-marquee.ts +74 -0
  336. package/src/recipes/marquee/marquee.css +41 -0
  337. package/src/recipes/mask-text/README.md +39 -0
  338. package/src/recipes/mask-text/create-mask-text.ts +134 -0
  339. package/src/recipes/parallax/README.md +31 -0
  340. package/src/recipes/parallax/create-parallax.ts +74 -0
  341. package/src/recipes/pile/README.md +48 -0
  342. package/src/recipes/pile/create-pile.ts +50 -0
  343. package/src/recipes/pile/pile-math.ts +27 -0
  344. package/src/recipes/pile/pile.css +63 -0
  345. package/src/recipes/pill/README.md +30 -0
  346. package/src/recipes/pill/pill.css +48 -0
  347. package/src/recipes/pop/README.md +36 -0
  348. package/src/recipes/pop/create-pop.ts +52 -0
  349. package/src/recipes/radial-menu/README.md +44 -0
  350. package/src/recipes/radial-menu/create-radial-menu.ts +96 -0
  351. package/src/recipes/radial-menu/radial-menu.css +45 -0
  352. package/src/recipes/reflow/README.md +47 -0
  353. package/src/recipes/reflow/create-reflow.ts +49 -0
  354. package/src/recipes/repel-bento/README.md +21 -0
  355. package/src/recipes/repel-bento/create-repel-bento.ts +65 -0
  356. package/src/recipes/repel-bento/repel-bento.css +3 -0
  357. package/src/recipes/reveal/README.md +36 -0
  358. package/src/recipes/reveal/create-reveal.ts +48 -0
  359. package/src/recipes/rotator/README.md +21 -0
  360. package/src/recipes/rotator/create-rotator.ts +66 -0
  361. package/src/recipes/rotator/rotator.css +3 -0
  362. package/src/recipes/slot-text/README.md +44 -0
  363. package/src/recipes/slot-text/create-slot-text.ts +244 -0
  364. package/src/recipes/slot-text/slot-text.css +42 -0
  365. package/src/recipes/snap-strip/README.md +31 -0
  366. package/src/recipes/snap-strip/create-snap-strip.ts +133 -0
  367. package/src/recipes/snap-strip/snap-strip.css +23 -0
  368. package/src/recipes/sortable/README.md +88 -0
  369. package/src/recipes/sortable/create-sortable.ts +863 -0
  370. package/src/recipes/sortable/sortable.css +40 -0
  371. package/src/recipes/spring-cards/README.md +48 -0
  372. package/src/recipes/spring-cards/create-spring-cards.ts +140 -0
  373. package/src/recipes/spring-cards/spring-cards.css +23 -0
  374. package/src/recipes/stretch-footer/README.md +44 -0
  375. package/src/recipes/stretch-footer/create-stretch-footer.ts +69 -0
  376. package/src/recipes/stretch-footer/stretch-footer.css +28 -0
  377. package/src/recipes/tabs/README.md +39 -0
  378. package/src/recipes/tabs/create-tabs.ts +91 -0
  379. package/src/recipes/tabs/tabs.css +19 -0
  380. package/src/recipes/text-roll/README.md +35 -0
  381. package/src/recipes/text-roll/create-text-roll.ts +137 -0
  382. package/src/recipes/text-roll/text-roll.css +21 -0
  383. package/src/recipes/ticket-menu/README.md +24 -0
  384. package/src/recipes/ticket-menu/create-ticket-menu.ts +6 -0
  385. package/src/recipes/words/README.md +43 -0
  386. package/src/recipes/words/create-words.ts +114 -0
  387. package/src/theme/css-format.ts +32 -0
  388. package/src/theme/generate.ts +72 -0
  389. package/src/theme/index.ts +15 -0
  390. package/src/theme/presets.ts +79 -0
  391. package/src/theme/theme.ts +119 -0
@@ -0,0 +1,472 @@
1
+ import {
2
+ createChat,
3
+ createChatBackground,
4
+ createCursor,
5
+ createIsland,
6
+ createNav,
7
+ createSteps,
8
+ createThemePicker,
9
+ createToaster,
10
+ iconSvg,
11
+ toast
12
+ } from "../chunk-Q4LVFNLN.js";
13
+ import {
14
+ createDialog,
15
+ createMenu
16
+ } from "../chunk-34XYOXHG.js";
17
+ import "../chunk-J27KH2A2.js";
18
+ import "../chunk-RFDIZYFX.js";
19
+ import "../chunk-TGV27ZWM.js";
20
+
21
+ // src/elements/base.ts
22
+ var SafeHTMLElement = typeof HTMLElement === "undefined" ? class {
23
+ } : HTMLElement;
24
+ var kebab = (name) => name.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
25
+ var MkElement = class extends SafeHTMLElement {
26
+ /** Option name (camelCase) → how to read its attribute. */
27
+ static options = {};
28
+ static get observedAttributes() {
29
+ return Object.keys(this.options).map(kebab);
30
+ }
31
+ /** The live engine (null while disconnected). */
32
+ instance = null;
33
+ /** Options read from the attributes now. */
34
+ get options() {
35
+ const types = this.constructor.options;
36
+ const options = {};
37
+ for (const [name, type] of Object.entries(types)) {
38
+ const raw = this.getAttribute(kebab(name));
39
+ if (type === "boolean") {
40
+ if (raw !== null) options[name] = raw !== "false";
41
+ continue;
42
+ }
43
+ if (raw === null) continue;
44
+ if (type === "number") {
45
+ const value = Number(raw);
46
+ if (Number.isFinite(value)) options[name] = value;
47
+ } else if (type === "list") options[name] = raw.split(",").map((item) => item.trim()).filter(Boolean);
48
+ else if (type === "json") {
49
+ try {
50
+ options[name] = JSON.parse(raw);
51
+ } catch {
52
+ }
53
+ } else options[name] = raw;
54
+ }
55
+ return options;
56
+ }
57
+ connectedCallback() {
58
+ if (!this.instance) this.instance = this.create(this.options);
59
+ }
60
+ disconnectedCallback() {
61
+ this.instance?.destroy();
62
+ this.instance = null;
63
+ }
64
+ attributeChangedCallback(_name, previous, next) {
65
+ if (previous === next || !this.isConnected || !this.instance) return;
66
+ this.instance.destroy();
67
+ this.instance = this.create(this.options);
68
+ }
69
+ };
70
+ function defineElement(name, ctor) {
71
+ if (typeof customElements === "undefined" || customElements.get(name)) return;
72
+ customElements.define(name, ctor);
73
+ }
74
+
75
+ // src/components/theme-picker/element.ts
76
+ var MkThemePickerElement = class extends MkElement {
77
+ static options = { showHidden: "boolean", themes: "list" };
78
+ create(options) {
79
+ return createThemePicker(this, options);
80
+ }
81
+ select(id) {
82
+ this.instance?.select(id);
83
+ }
84
+ };
85
+
86
+ // src/components/dialog/element.ts
87
+ var MkDialogElement = class extends MkElement {
88
+ static options = {
89
+ variant: "string",
90
+ placement: "string",
91
+ size: "string",
92
+ heading: "string",
93
+ description: "string",
94
+ float: "string",
95
+ noBackdrop: "boolean",
96
+ persistent: "boolean",
97
+ noDrag: "boolean",
98
+ closeLabel: "string",
99
+ shared: "string"
100
+ };
101
+ dialog = null;
102
+ create(options) {
103
+ const original = [...this.childNodes];
104
+ const dialog = document.createElement("dialog");
105
+ dialog.className = "mk-dialog";
106
+ if (options.size && options.size !== "md") dialog.classList.add(`mk-dialog--${options.size}`);
107
+ const hasParts = original.some((node) => node instanceof Element && node.matches("[data-mk-part]"));
108
+ const closeLabel = options.closeLabel ?? "Cerrar";
109
+ if (options.heading) {
110
+ const header = document.createElement("header");
111
+ header.dataset.mkPart = "header";
112
+ const text = document.createElement("div");
113
+ const title = document.createElement("h2");
114
+ title.dataset.mkPart = "title";
115
+ title.textContent = options.heading;
116
+ if (options.shared) title.dataset.mkShared = options.shared;
117
+ text.append(title);
118
+ if (options.description) {
119
+ const description = document.createElement("p");
120
+ description.dataset.mkPart = "description";
121
+ description.textContent = options.description;
122
+ text.append(description);
123
+ }
124
+ const actions = document.createElement("div");
125
+ actions.dataset.mkPart = "actions";
126
+ if (options.float) {
127
+ const handle = document.createElement("button");
128
+ handle.type = "button";
129
+ handle.dataset.mkPart = "handle";
130
+ handle.innerHTML = iconSvg("expand", 18);
131
+ actions.append(handle);
132
+ }
133
+ const close = document.createElement("button");
134
+ close.type = "button";
135
+ close.dataset.mkPart = "close";
136
+ close.setAttribute("aria-label", closeLabel);
137
+ close.innerHTML = iconSvg("close");
138
+ actions.append(close);
139
+ header.append(text, actions);
140
+ const body = document.createElement("div");
141
+ body.dataset.mkPart = "body";
142
+ const isFooter = (node) => node instanceof Element && node.matches('[data-mk-part="footer"]');
143
+ body.append(...original.filter((node) => !isFooter(node)));
144
+ dialog.append(header, body, ...original.filter(isFooter));
145
+ } else if (hasParts) {
146
+ dialog.append(...original);
147
+ } else {
148
+ const body = document.createElement("div");
149
+ body.dataset.mkPart = "body";
150
+ body.append(...original);
151
+ dialog.append(body);
152
+ }
153
+ this.append(dialog);
154
+ const engine = createDialog(dialog, {
155
+ variant: options.variant ?? "morph",
156
+ placement: options.placement ?? "center",
157
+ backdrop: !options.noBackdrop,
158
+ closeOnBackdrop: !options.persistent,
159
+ drag: !options.noDrag,
160
+ float: options.float || false,
161
+ triggers: this.id || false,
162
+ labels: { close: closeLabel }
163
+ });
164
+ this.dialog = engine;
165
+ return {
166
+ destroy: () => {
167
+ engine.destroy();
168
+ this.append(...original);
169
+ dialog.remove();
170
+ this.dialog = null;
171
+ }
172
+ };
173
+ }
174
+ open(origin) {
175
+ this.dialog?.open(origin);
176
+ }
177
+ close() {
178
+ this.dialog?.close();
179
+ }
180
+ get isOpen() {
181
+ return this.dialog?.isOpen ?? false;
182
+ }
183
+ };
184
+
185
+ // src/components/menu/element.ts
186
+ var MkMenuElement = class extends MkElement {
187
+ static options = { variant: "string", keepOpen: "boolean", label: "string", ticket: "boolean" };
188
+ menu = null;
189
+ create(options) {
190
+ const original = [...this.childNodes];
191
+ const dialog = document.createElement("dialog");
192
+ dialog.className = "mk-dialog mk-menu";
193
+ if (options.label) dialog.setAttribute("aria-label", options.label);
194
+ dialog.append(...original);
195
+ this.append(dialog);
196
+ const menu = createMenu(dialog, {
197
+ ticket: Boolean(options.ticket),
198
+ variant: options.variant ?? "morph",
199
+ closeOnSelect: !options.keepOpen,
200
+ triggers: this.id || false
201
+ });
202
+ this.menu = menu;
203
+ return {
204
+ destroy: () => {
205
+ menu.destroy();
206
+ this.append(...original);
207
+ dialog.remove();
208
+ this.menu = null;
209
+ }
210
+ };
211
+ }
212
+ open(origin) {
213
+ this.menu?.open(origin);
214
+ }
215
+ close() {
216
+ this.menu?.close();
217
+ }
218
+ get isOpen() {
219
+ return this.menu?.isOpen ?? false;
220
+ }
221
+ };
222
+
223
+ // src/components/toast/element.ts
224
+ var MkToasterElement = class extends MkElement {
225
+ static options = { dismissLabel: "string" };
226
+ create(options) {
227
+ const host = document.createElement("div");
228
+ host.className = "mk-toaster";
229
+ this.append(host);
230
+ const toaster = createToaster(host, { labels: { dismiss: options.dismissLabel } });
231
+ return {
232
+ destroy: () => {
233
+ toaster.destroy();
234
+ host.remove();
235
+ }
236
+ };
237
+ }
238
+ };
239
+
240
+ // src/components/chat-background/element.ts
241
+ var MkChatBackgroundElement = class extends MkElement {
242
+ static options = {};
243
+ static get observedAttributes() {
244
+ return ["energy", "scale"];
245
+ }
246
+ create() {
247
+ return createChatBackground(this, { energy: Number(this.getAttribute("energy")) || 0, scale: Number(this.getAttribute("scale")) || 1 });
248
+ }
249
+ // Energy changes every frame while recording: update the engine instead of rebuilding it.
250
+ attributeChangedCallback(name, previous, next) {
251
+ if (previous === next || !this.instance) return;
252
+ if (name === "energy") this.instance.setEnergy(Number(next) || 0);
253
+ if (name === "scale") this.instance.setScale(Number(next) || 1);
254
+ }
255
+ setEnergy(energy) {
256
+ this.instance?.setEnergy(energy);
257
+ }
258
+ busy(on) {
259
+ this.instance?.busy(on);
260
+ }
261
+ };
262
+ var defineChatBackground = () => defineElement("mk-chat-background", MkChatBackgroundElement);
263
+
264
+ // src/components/chat/element.ts
265
+ var MkChatElement = class extends MkElement {
266
+ static options = {
267
+ placeholder: "string",
268
+ background: "boolean",
269
+ mic: "boolean",
270
+ animateExisting: "boolean",
271
+ thinking: "string"
272
+ };
273
+ chat = null;
274
+ create(options) {
275
+ const made = [];
276
+ if (!this.querySelector('[data-mk-part="messages"]')) {
277
+ if (options.background && !this.querySelector(".mk-chat-background, mk-chat-background")) {
278
+ defineChatBackground();
279
+ const background = document.createElement("mk-chat-background");
280
+ this.prepend(background);
281
+ made.push(background);
282
+ }
283
+ const messages = document.createElement("div");
284
+ messages.dataset.mkPart = "messages";
285
+ messages.append(...[...this.children].filter((child) => child.matches("[data-mk-message]")));
286
+ const composer = document.createElement("form");
287
+ composer.dataset.mkPart = "composer";
288
+ const input = document.createElement("textarea");
289
+ input.dataset.mkPart = "input";
290
+ input.rows = 1;
291
+ input.placeholder = options.placeholder ?? "Escribe un mensaje...";
292
+ input.setAttribute("aria-label", input.placeholder);
293
+ const buttons = document.createElement("div");
294
+ buttons.dataset.mkPart = "buttons";
295
+ if (options.mic) {
296
+ const mic = document.createElement("button");
297
+ mic.type = "button";
298
+ mic.dataset.mkPart = "mic";
299
+ mic.setAttribute("aria-label", "Micr\xF3fono");
300
+ mic.innerHTML = iconSvg("mic", 22);
301
+ buttons.append(mic);
302
+ }
303
+ const send = document.createElement("button");
304
+ send.type = "submit";
305
+ send.dataset.mkPart = "send";
306
+ send.setAttribute("aria-label", "Enviar");
307
+ send.innerHTML = iconSvg("send", 22);
308
+ buttons.append(send);
309
+ composer.append(input, buttons);
310
+ this.append(messages, composer);
311
+ made.push(messages, composer);
312
+ }
313
+ const chat = createChat(this, {
314
+ animateExisting: Boolean(options.animateExisting),
315
+ labels: { thinking: options.thinking }
316
+ });
317
+ this.chat = chat;
318
+ return {
319
+ destroy: () => {
320
+ chat.destroy();
321
+ const messages = made.find((node) => node instanceof HTMLElement && node.dataset.mkPart === "messages");
322
+ if (messages) this.append(...[...messages.children]);
323
+ for (const node of made) node.remove();
324
+ this.chat = null;
325
+ }
326
+ };
327
+ }
328
+ add(role, text) {
329
+ return this.chat?.add(role, text);
330
+ }
331
+ pending() {
332
+ this.chat?.pending();
333
+ }
334
+ reply(message) {
335
+ return this.chat?.reply(message);
336
+ }
337
+ setRecording(on) {
338
+ this.chat?.setRecording(on);
339
+ }
340
+ };
341
+
342
+ // src/components/nav/element.ts
343
+ var MkNavElement = class extends MkElement {
344
+ static options = { navStyle: "string", accent: "boolean", reveal: "boolean", storageKey: "string" };
345
+ create(options) {
346
+ return createNav(this, {
347
+ style: options.navStyle,
348
+ accent: options.accent,
349
+ reveal: Boolean(options.reveal),
350
+ storageKey: options.storageKey
351
+ });
352
+ }
353
+ // Style and accent change in place: rebuilding would replay the reveal.
354
+ attributeChangedCallback(name, previous, next) {
355
+ if (previous === next || !this.instance) return;
356
+ if (name === "nav-style" && next) this.instance.setStyle(next);
357
+ else if (name === "accent") this.instance.setAccent(next !== null && next !== "false");
358
+ else super.attributeChangedCallback(name, previous, next);
359
+ }
360
+ select(target) {
361
+ this.instance?.select(target);
362
+ }
363
+ setStyle(style) {
364
+ this.instance?.setStyle(style);
365
+ }
366
+ };
367
+
368
+ // src/components/steps/element.ts
369
+ var MkStepsElement = class extends MkElement {
370
+ static options = { index: "number", duration: "number", animateFirst: "boolean" };
371
+ create(options) {
372
+ return createSteps(this, options);
373
+ }
374
+ // A new index moves to that step; rebuilding would jump without the flow.
375
+ attributeChangedCallback(name, previous, next) {
376
+ if (previous === next || !this.instance) return;
377
+ if (name === "index") void this.instance.goTo(Number(next) || 0);
378
+ else super.attributeChangedCallback(name, previous, next);
379
+ }
380
+ next() {
381
+ return this.instance?.next();
382
+ }
383
+ prev() {
384
+ return this.instance?.prev();
385
+ }
386
+ goTo(index) {
387
+ return this.instance?.goTo(index);
388
+ }
389
+ busy(on) {
390
+ this.instance?.busy(on);
391
+ }
392
+ };
393
+
394
+ // src/components/cursor/element.ts
395
+ var MkCursorElement = class extends MkElement {
396
+ static options = { variant: "string", text: "string", arrows: "string", zone: "string" };
397
+ create(options) {
398
+ const zone = typeof options.zone === "string" ? document.querySelector(options.zone) : void 0;
399
+ return createCursor(this, {
400
+ variant: options.variant,
401
+ text: options.text,
402
+ arrows: options.arrows,
403
+ zone
404
+ });
405
+ }
406
+ };
407
+
408
+ // src/components/island/element.ts
409
+ var MkIslandElement = class extends MkElement {
410
+ static options = {
411
+ entrance: "string",
412
+ closeOnScroll: "boolean",
413
+ closeOnNavigate: "boolean",
414
+ focusOnOpen: "boolean"
415
+ };
416
+ create(options) {
417
+ const entrance = options.entrance === "false" ? false : options.entrance === "manual" ? "manual" : true;
418
+ return createIsland(this, {
419
+ entrance,
420
+ closeOnScroll: options.closeOnScroll,
421
+ closeOnNavigate: options.closeOnNavigate,
422
+ focusOnOpen: options.focusOnOpen,
423
+ onChange: (active) => this.dispatchEvent(new CustomEvent("mk:island", { detail: { active }, bubbles: true }))
424
+ });
425
+ }
426
+ open(name) {
427
+ this.instance?.open(name);
428
+ }
429
+ close() {
430
+ this.instance?.close();
431
+ }
432
+ ready() {
433
+ this.instance?.ready();
434
+ }
435
+ };
436
+
437
+ // src/elements/index.ts
438
+ var ELEMENTS = {
439
+ "mk-theme-picker": MkThemePickerElement,
440
+ "mk-dialog": MkDialogElement,
441
+ "mk-menu": MkMenuElement,
442
+ "mk-toaster": MkToasterElement,
443
+ "mk-chat-background": MkChatBackgroundElement,
444
+ "mk-chat": MkChatElement,
445
+ "mk-nav": MkNavElement,
446
+ "mk-steps": MkStepsElement,
447
+ "mk-cursor": MkCursorElement,
448
+ "mk-island": MkIslandElement
449
+ // new-component:entries
450
+ };
451
+ function defineElements(names = Object.keys(ELEMENTS)) {
452
+ for (const name of names) defineElement(name, ELEMENTS[name]);
453
+ }
454
+ export {
455
+ ELEMENTS,
456
+ MkChatBackgroundElement,
457
+ MkChatElement,
458
+ MkCursorElement,
459
+ MkDialogElement,
460
+ MkElement,
461
+ MkIslandElement,
462
+ MkMenuElement,
463
+ MkNavElement,
464
+ MkStepsElement,
465
+ MkThemePickerElement,
466
+ MkToasterElement,
467
+ SafeHTMLElement,
468
+ defineElement,
469
+ defineElements,
470
+ toast
471
+ };
472
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/elements/base.ts","../../src/components/theme-picker/element.ts","../../src/components/dialog/element.ts","../../src/components/menu/element.ts","../../src/components/toast/element.ts","../../src/components/chat-background/element.ts","../../src/components/chat/element.ts","../../src/components/nav/element.ts","../../src/components/steps/element.ts","../../src/components/cursor/element.ts","../../src/components/island/element.ts","../../src/elements/index.ts"],"sourcesContent":["import type { Instance } from '../core/types';\n\n/*\n * Base for motion-kit custom elements (Astro / plain HTML). Light DOM only, so\n * themes and project CSS reach the markup. Attributes map to engine options\n * (kebab-case → camelCase); the engine is created on connect, recreated when an\n * observed attribute changes, and destroyed on disconnect.\n */\n\nexport type OptionType = 'string' | 'number' | 'boolean' | 'list' | 'json';\n\n/** `HTMLElement` in the browser; an empty class during SSR so importing never throws. */\nexport const SafeHTMLElement = (typeof HTMLElement === 'undefined' ? class {} : HTMLElement) as typeof HTMLElement;\n\nconst kebab = (name: string) => name.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nexport abstract class MkElement<I extends Instance = Instance> extends SafeHTMLElement {\n /** Option name (camelCase) → how to read its attribute. */\n static options: Record<string, OptionType> = {};\n\n static get observedAttributes() {\n return Object.keys(this.options).map(kebab);\n }\n\n /** The live engine (null while disconnected). */\n instance: I | null = null;\n\n protected abstract create(options: Record<string, unknown>): I;\n\n /** Options read from the attributes now. */\n get options(): Record<string, unknown> {\n const types = (this.constructor as typeof MkElement).options;\n const options: Record<string, unknown> = {};\n for (const [name, type] of Object.entries(types)) {\n const raw = this.getAttribute(kebab(name));\n if (type === 'boolean') {\n if (raw !== null) options[name] = raw !== 'false';\n continue;\n }\n if (raw === null) continue;\n if (type === 'number') {\n const value = Number(raw);\n if (Number.isFinite(value)) options[name] = value;\n } else if (type === 'list') options[name] = raw.split(',').map((item) => item.trim()).filter(Boolean);\n else if (type === 'json') {\n try {\n options[name] = JSON.parse(raw);\n } catch {\n // Ignore malformed JSON: the engine keeps its default.\n }\n } else options[name] = raw;\n }\n return options;\n }\n\n connectedCallback() {\n if (!this.instance) this.instance = this.create(this.options);\n }\n\n disconnectedCallback() {\n this.instance?.destroy();\n this.instance = null;\n }\n\n attributeChangedCallback(_name: string, previous: string | null, next: string | null) {\n if (previous === next || !this.isConnected || !this.instance) return;\n this.instance.destroy();\n this.instance = this.create(this.options);\n }\n}\n\n/** customElements.define once; later calls with the same name are ignored. */\nexport function defineElement(name: string, ctor: CustomElementConstructor) {\n if (typeof customElements === 'undefined' || customElements.get(name)) return;\n customElements.define(name, ctor);\n}\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport { createThemePicker, type ThemePickerInstance } from './engine';\n\n/**\n * <mk-theme-picker show-hidden themes=\"neogreen,pink\"></mk-theme-picker>\n * Emits `mk:theme` on document when a theme is chosen (from setTheme).\n */\nexport class MkThemePickerElement extends MkElement<ThemePickerInstance> {\n static options: Record<string, OptionType> = { showHidden: 'boolean', themes: 'list' };\n\n protected create(options: Record<string, unknown>) {\n return createThemePicker(this, options);\n }\n\n select(id: string) {\n this.instance?.select(id);\n }\n}\n\nexport const defineThemePicker = () => defineElement('mk-theme-picker', MkThemePickerElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport type { Instance } from '../../core/types';\nimport { iconSvg } from '../icons';\nimport { createDialog, type DialogInstance, type DialogPlacement, type DialogVariant } from './engine';\n\n/**\n * <mk-dialog id=\"crear\" heading=\"Crear proyecto\" [description] [shared=\"id\"] [variant=\"liquid\"]\n * [placement=\"anchor|side\"] [size=\"sm|lg|xl\"] [float=\"key\"] [no-backdrop] [persistent] [no-drag]>…</mk-dialog>\n * Any [data-mk-open=\"crear\"] opens it from that button. On connect its children\n * move into a <dialog class=\"mk-dialog\"> (with `heading`, a header with title and\n * close button and a body are made for them); on disconnect they move back.\n */\nexport class MkDialogElement extends MkElement<Instance> {\n static options: Record<string, OptionType> = {\n variant: 'string',\n placement: 'string',\n size: 'string',\n heading: 'string',\n description: 'string',\n float: 'string',\n noBackdrop: 'boolean',\n persistent: 'boolean',\n noDrag: 'boolean',\n closeLabel: 'string',\n shared: 'string',\n };\n\n dialog: DialogInstance | null = null;\n\n protected create(options: Record<string, unknown>): Instance {\n const original = [...this.childNodes];\n const dialog = document.createElement('dialog');\n dialog.className = 'mk-dialog';\n if (options.size && options.size !== 'md') dialog.classList.add(`mk-dialog--${options.size}`);\n const hasParts = original.some((node) => node instanceof Element && node.matches('[data-mk-part]'));\n const closeLabel = (options.closeLabel as string | undefined) ?? 'Cerrar';\n if (options.heading) {\n const header = document.createElement('header');\n header.dataset.mkPart = 'header';\n const text = document.createElement('div');\n const title = document.createElement('h2');\n title.dataset.mkPart = 'title';\n title.textContent = options.heading as string;\n if (options.shared) title.dataset.mkShared = options.shared as string;\n text.append(title);\n if (options.description) {\n const description = document.createElement('p');\n description.dataset.mkPart = 'description';\n description.textContent = options.description as string;\n text.append(description);\n }\n const actions = document.createElement('div');\n actions.dataset.mkPart = 'actions';\n if (options.float) {\n const handle = document.createElement('button');\n handle.type = 'button';\n handle.dataset.mkPart = 'handle';\n handle.innerHTML = iconSvg('expand', 18);\n actions.append(handle);\n }\n const close = document.createElement('button');\n close.type = 'button';\n close.dataset.mkPart = 'close';\n close.setAttribute('aria-label', closeLabel);\n close.innerHTML = iconSvg('close');\n actions.append(close);\n header.append(text, actions);\n const body = document.createElement('div');\n body.dataset.mkPart = 'body';\n // A footer stays out of the scrolling body.\n const isFooter = (node: Node) => node instanceof Element && node.matches('[data-mk-part=\"footer\"]');\n body.append(...original.filter((node) => !isFooter(node)));\n dialog.append(header, body, ...original.filter(isFooter));\n } else if (hasParts) {\n dialog.append(...original);\n } else {\n const body = document.createElement('div');\n body.dataset.mkPart = 'body';\n body.append(...original);\n dialog.append(body);\n }\n this.append(dialog);\n\n const engine = createDialog(dialog, {\n variant: (options.variant as DialogVariant) ?? 'morph',\n placement: (options.placement as DialogPlacement) ?? 'center',\n backdrop: !options.noBackdrop,\n closeOnBackdrop: !options.persistent,\n drag: !options.noDrag,\n float: (options.float as string) || false,\n triggers: this.id || false,\n labels: { close: closeLabel },\n });\n this.dialog = engine;\n return {\n destroy: () => {\n engine.destroy();\n this.append(...original);\n dialog.remove();\n this.dialog = null;\n },\n };\n }\n\n open(origin?: HTMLElement | null) {\n this.dialog?.open(origin);\n }\n\n close() {\n this.dialog?.close();\n }\n\n get isOpen() {\n return this.dialog?.isOpen ?? false;\n }\n}\n\nexport const defineDialog = () => defineElement('mk-dialog', MkDialogElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport type { Instance } from '../../core/types';\nimport type { DialogVariant } from '../dialog/engine';\nimport { createMenu, type MenuInstance } from './engine';\n\n/**\n * <mk-menu id=\"opciones\" [variant=\"liquid\"] [keep-open]>\n * <button data-mk-item data-mk-value=\"ajustes\">Ajustes</button> …\n * </mk-menu>\n * Any [data-mk-open=\"opciones\"] opens it from that button; choosing an option\n * emits `mk:select` (detail.value, detail.item).\n */\nexport class MkMenuElement extends MkElement<Instance> {\n static options: Record<string, OptionType> = { variant: 'string', keepOpen: 'boolean', label: 'string', ticket: 'boolean' };\n\n menu: MenuInstance | null = null;\n\n protected create(options: Record<string, unknown>): Instance {\n const original = [...this.childNodes];\n const dialog = document.createElement('dialog');\n dialog.className = 'mk-dialog mk-menu';\n if (options.label) dialog.setAttribute('aria-label', options.label as string);\n dialog.append(...original);\n this.append(dialog);\n const menu = createMenu(dialog, {\n ticket: Boolean(options.ticket),\n variant: (options.variant as DialogVariant) ?? 'morph',\n closeOnSelect: !options.keepOpen,\n triggers: this.id || false,\n });\n this.menu = menu;\n return {\n destroy: () => {\n menu.destroy();\n this.append(...original);\n dialog.remove();\n this.menu = null;\n },\n };\n }\n\n open(origin?: HTMLElement | null) {\n this.menu?.open(origin);\n }\n\n close() {\n this.menu?.close();\n }\n\n get isOpen() {\n return this.menu?.isOpen ?? false;\n }\n}\n\nexport const defineMenu = () => defineElement('mk-menu', MkMenuElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport { createToaster, type ToasterInstance } from './engine';\n\n/**\n * <mk-toaster dismiss-label=\"Cerrar\"></mk-toaster> — mount once; then call\n * `toast('Copiado', { origin: button })` from anywhere.\n */\nexport class MkToasterElement extends MkElement<ToasterInstance> {\n static options: Record<string, OptionType> = { dismissLabel: 'string' };\n\n protected create(options: Record<string, unknown>) {\n const host = document.createElement('div');\n host.className = 'mk-toaster';\n this.append(host);\n const toaster = createToaster(host, { labels: { dismiss: options.dismissLabel as string | undefined } });\n return {\n destroy: () => {\n toaster.destroy();\n host.remove();\n },\n };\n }\n}\n\nexport const defineToaster = () => defineElement('mk-toaster', MkToasterElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport { createChatBackground, type ChatBackgroundInstance } from './engine';\n\n/** <mk-chat-background energy=\"0\" scale=\"1\"></mk-chat-background> inside any positioned container. */\nexport class MkChatBackgroundElement extends MkElement<ChatBackgroundInstance> {\n static options: Record<string, OptionType> = {};\n static get observedAttributes() {\n return ['energy', 'scale'];\n }\n\n protected create() {\n return createChatBackground(this, { energy: Number(this.getAttribute('energy')) || 0, scale: Number(this.getAttribute('scale')) || 1 });\n }\n\n // Energy changes every frame while recording: update the engine instead of rebuilding it.\n attributeChangedCallback(name: string, previous: string | null, next: string | null) {\n if (previous === next || !this.instance) return;\n if (name === 'energy') this.instance.setEnergy(Number(next) || 0);\n if (name === 'scale') this.instance.setScale(Number(next) || 1);\n }\n\n setEnergy(energy: number) {\n this.instance?.setEnergy(energy);\n }\n\n busy(on: boolean) {\n this.instance?.busy(on);\n }\n}\n\nexport const defineChatBackground = () => defineElement('mk-chat-background', MkChatBackgroundElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport type { Instance } from '../../core/types';\nimport { iconSvg } from '../icons';\nimport { defineChatBackground } from '../chat-background/element';\nimport { createChat, type ChatInstance, type ChatRole } from './engine';\n\n/**\n * <mk-chat placeholder=\"Escribe un mensaje...\" [background] [mic] [animate-existing]>\n * (optional) your own [data-mk-part=\"messages\"] / composer markup\n * </mk-chat>\n * Empty, it builds the messages list and the composer. Listen to `mk:send`\n * (detail.text) and answer with `element.reply(text)` after `element.pending()`.\n */\nexport class MkChatElement extends MkElement<Instance> {\n static options: Record<string, OptionType> = {\n placeholder: 'string',\n background: 'boolean',\n mic: 'boolean',\n animateExisting: 'boolean',\n thinking: 'string',\n };\n\n chat: ChatInstance | null = null;\n\n protected create(options: Record<string, unknown>): Instance {\n const made: Element[] = [];\n if (!this.querySelector('[data-mk-part=\"messages\"]')) {\n if (options.background && !this.querySelector('.mk-chat-background, mk-chat-background')) {\n defineChatBackground();\n const background = document.createElement('mk-chat-background');\n this.prepend(background);\n made.push(background);\n }\n const messages = document.createElement('div');\n messages.dataset.mkPart = 'messages';\n // Messages written inside the element (history) move into the list.\n messages.append(...[...this.children].filter((child) => child.matches('[data-mk-message]')));\n const composer = document.createElement('form');\n composer.dataset.mkPart = 'composer';\n const input = document.createElement('textarea');\n input.dataset.mkPart = 'input';\n input.rows = 1;\n input.placeholder = (options.placeholder as string | undefined) ?? 'Escribe un mensaje...';\n input.setAttribute('aria-label', input.placeholder);\n const buttons = document.createElement('div');\n buttons.dataset.mkPart = 'buttons';\n if (options.mic) {\n const mic = document.createElement('button');\n mic.type = 'button';\n mic.dataset.mkPart = 'mic';\n mic.setAttribute('aria-label', 'Micrófono');\n mic.innerHTML = iconSvg('mic', 22);\n buttons.append(mic);\n }\n const send = document.createElement('button');\n send.type = 'submit';\n send.dataset.mkPart = 'send';\n send.setAttribute('aria-label', 'Enviar');\n send.innerHTML = iconSvg('send', 22);\n buttons.append(send);\n composer.append(input, buttons);\n this.append(messages, composer);\n made.push(messages, composer);\n }\n const chat = createChat(this, {\n animateExisting: Boolean(options.animateExisting),\n labels: { thinking: options.thinking as string | undefined },\n });\n this.chat = chat;\n return {\n destroy: () => {\n chat.destroy();\n const messages = made.find((node) => node instanceof HTMLElement && node.dataset.mkPart === 'messages');\n if (messages) this.append(...[...messages.children]);\n for (const node of made) node.remove();\n this.chat = null;\n },\n };\n }\n\n add(role: ChatRole, text: string) {\n return this.chat?.add(role, text);\n }\n\n pending() {\n this.chat?.pending();\n }\n\n reply(message: HTMLElement | string) {\n return this.chat?.reply(message);\n }\n\n setRecording(on: boolean) {\n this.chat?.setRecording(on);\n }\n}\n\nexport const defineChat = () => defineElement('mk-chat', MkChatElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport { createNav, type NavInstance, type NavStyle } from './engine';\n\n/**\n * <mk-nav class=\"mk-nav mk-nav--bonita\" nav-style=\"bonita\" [accent] [reveal] [storage-key=\"mi-app-nav\"]>\n * <div class=\"mk-nav__buttons\"><a class=\"mk-nav__button\" href=\"/\">…</a></div>\n * </mk-nav>\n * Emits `mk:navigate` (detail: index, value, item, originalEvent) on click.\n */\nexport class MkNavElement extends MkElement<NavInstance> {\n static options: Record<string, OptionType> = { navStyle: 'string', accent: 'boolean', reveal: 'boolean', storageKey: 'string' };\n\n protected create(options: Record<string, unknown>) {\n return createNav(this, {\n style: options.navStyle as NavStyle | undefined,\n accent: options.accent as boolean | undefined,\n reveal: Boolean(options.reveal),\n storageKey: options.storageKey as string | undefined,\n });\n }\n\n // Style and accent change in place: rebuilding would replay the reveal.\n attributeChangedCallback(name: string, previous: string | null, next: string | null) {\n if (previous === next || !this.instance) return;\n if (name === 'nav-style' && next) this.instance.setStyle(next as NavStyle);\n else if (name === 'accent') this.instance.setAccent(next !== null && next !== 'false');\n else super.attributeChangedCallback(name, previous, next);\n }\n\n select(target: number | string) {\n this.instance?.select(target);\n }\n\n setStyle(style: NavStyle) {\n this.instance?.setStyle(style);\n }\n}\n\nexport const defineNav = () => defineElement('mk-nav', MkNavElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport { createSteps, type StepsInstance } from './engine';\n\n/**\n * <mk-steps index=\"0\">\n * <mk-chat-background></mk-chat-background>\n * <section data-mk-step><h2 data-mk-flow-item>Hola</h2><button data-mk-flow-item data-mk-step-next>Seguir</button></section>\n * <section data-mk-step>…</section>\n * </mk-steps>\n * Emits `mk:step` (detail: index, previous, step) after each change.\n */\nexport class MkStepsElement extends MkElement<StepsInstance> {\n static options: Record<string, OptionType> = { index: 'number', duration: 'number', animateFirst: 'boolean' };\n\n protected create(options: Record<string, unknown>) {\n return createSteps(this, options);\n }\n\n // A new index moves to that step; rebuilding would jump without the flow.\n attributeChangedCallback(name: string, previous: string | null, next: string | null) {\n if (previous === next || !this.instance) return;\n if (name === 'index') void this.instance.goTo(Number(next) || 0);\n else super.attributeChangedCallback(name, previous, next);\n }\n\n next() {\n return this.instance?.next();\n }\n\n prev() {\n return this.instance?.prev();\n }\n\n goTo(index: number) {\n return this.instance?.goTo(index);\n }\n\n busy(on: boolean) {\n this.instance?.busy(on);\n }\n}\n\nexport const defineSteps = () => defineElement('mk-steps', MkStepsElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport { createCursor, type CursorInstance, type CursorOptions, type CursorVariant } from './engine';\n\n/**\n * <mk-cursor></mk-cursor> Dousan's glass chip (once per page)\n * <mk-cursor variant=\"dot\" text=\"Scroll\" arrows=\"y\"></mk-cursor> Siena's dot, inside its parent\n * zone=\"#hero\" picks another zone.\n */\nexport class MkCursorElement extends MkElement<CursorInstance> {\n static options: Record<string, OptionType> = { variant: 'string', text: 'string', arrows: 'string', zone: 'string' };\n\n protected create(options: Record<string, unknown>) {\n const zone = typeof options.zone === 'string' ? document.querySelector(options.zone) : undefined;\n return createCursor(this, {\n variant: options.variant as CursorVariant | undefined,\n text: options.text as string | undefined,\n arrows: options.arrows as CursorOptions['arrows'],\n zone,\n });\n }\n}\n\nexport const defineCursor = () => defineElement('mk-cursor', MkCursorElement);\n","import { MkElement, defineElement, type OptionType } from '../../elements/base';\nimport { createIsland, type IslandInstance, type IslandOptions } from './engine';\n\n/**\n * <mk-island [entrance=\"false|manual\"] [close-on-scroll=\"false\"] [close-on-navigate=\"false\"] [focus-on-open=\"false\"]>\n * <button class=\"mk-island__backdrop\" data-mk-island-close tabindex=\"-1\" aria-label=\"Cerrar\"></button>\n * <div class=\"mk-island__shell\">…header with [data-mk-island-toggle=\"menu\"]…\n * <div class=\"mk-island__content\"><div><section data-mk-island-panel=\"menu\">…</section></div></div>\n * </div>\n * </mk-island>\n * Emits `mk:island` (detail: { active }) when a panel opens or closes.\n */\nexport class MkIslandElement extends MkElement<IslandInstance> {\n static options: Record<string, OptionType> = {\n entrance: 'string',\n closeOnScroll: 'boolean',\n closeOnNavigate: 'boolean',\n focusOnOpen: 'boolean',\n };\n\n protected create(options: Record<string, unknown>) {\n const entrance: IslandOptions['entrance'] = options.entrance === 'false' ? false : options.entrance === 'manual' ? 'manual' : true;\n return createIsland(this, {\n entrance,\n closeOnScroll: options.closeOnScroll as boolean | undefined,\n closeOnNavigate: options.closeOnNavigate as boolean | undefined,\n focusOnOpen: options.focusOnOpen as boolean | undefined,\n onChange: (active) => this.dispatchEvent(new CustomEvent('mk:island', { detail: { active }, bubbles: true })),\n });\n }\n\n open(name?: string) {\n this.instance?.open(name);\n }\n\n close() {\n this.instance?.close();\n }\n\n ready() {\n this.instance?.ready();\n }\n}\n\nexport const defineIsland = () => defineElement('mk-island', MkIslandElement);\n","import { defineElement } from './base';\nimport { MkThemePickerElement } from '../components/theme-picker/element';\nimport { MkDialogElement } from '../components/dialog/element';\nimport { MkMenuElement } from '../components/menu/element';\nimport { MkToasterElement } from '../components/toast/element';\nimport { MkChatBackgroundElement } from '../components/chat-background/element';\nimport { MkChatElement } from '../components/chat/element';\nimport { MkNavElement } from '../components/nav/element';\nimport { MkStepsElement } from '../components/steps/element';\nimport { MkCursorElement } from '../components/cursor/element';\nimport { MkIslandElement } from '../components/island/element';\n// new-component:imports (scripts/new-component.mjs inserts above this line)\n\nexport { MkElement, SafeHTMLElement, defineElement, type OptionType } from './base';\nexport { MkThemePickerElement } from '../components/theme-picker/element';\nexport { MkDialogElement } from '../components/dialog/element';\nexport { MkMenuElement } from '../components/menu/element';\nexport { MkToasterElement } from '../components/toast/element';\nexport { MkChatBackgroundElement } from '../components/chat-background/element';\nexport { MkChatElement } from '../components/chat/element';\nexport { MkNavElement } from '../components/nav/element';\nexport { MkStepsElement } from '../components/steps/element';\nexport { MkCursorElement } from '../components/cursor/element';\nexport { toast } from '../components/toast/store';\nexport { MkIslandElement } from '../components/island/element';\n// new-component:exports\n\n/** Tag name → element class, for every component. */\nexport const ELEMENTS = {\n 'mk-theme-picker': MkThemePickerElement,\n 'mk-dialog': MkDialogElement,\n 'mk-menu': MkMenuElement,\n 'mk-toaster': MkToasterElement,\n 'mk-chat-background': MkChatBackgroundElement,\n 'mk-chat': MkChatElement,\n 'mk-nav': MkNavElement,\n 'mk-steps': MkStepsElement,\n 'mk-cursor': MkCursorElement,\n 'mk-island': MkIslandElement,\n // new-component:entries\n} as const;\n\nexport type ElementName = keyof typeof ELEMENTS;\n\n/** Register every motion-kit element (or the ones named). Safe to call more than once. */\nexport function defineElements(names: ElementName[] = Object.keys(ELEMENTS) as ElementName[]) {\n for (const name of names) defineElement(name, ELEMENTS[name]);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,46 @@
1
+ import { I as Instance } from './types-BkS_raL8.js';
2
+
3
+ interface ChatBackgroundOptions {
4
+ energy?: number;
5
+ scale?: number;
6
+ }
7
+ interface ChatBackgroundInstance extends Instance {
8
+ setEnergy(energy: number): void;
9
+ setScale(scale: number): void;
10
+ /** Onboarding's busy state: energy 1.6 / scale 1.8, or back to rest. */
11
+ busy(on: boolean): void;
12
+ readonly energy: number;
13
+ readonly scale: number;
14
+ }
15
+ /** The background instance running on `el` (steps and chat use it to drive the energy). */
16
+ declare const chatBackgroundOf: (el: Element | null | undefined) => ChatBackgroundInstance | null;
17
+ declare function createChatBackground(root: HTMLElement | null, options?: ChatBackgroundOptions): ChatBackgroundInstance;
18
+
19
+ interface StepsOptions {
20
+ /** First step shown (0-based). Default: the one marked data-mk-current, else 0. */
21
+ index?: number;
22
+ duration?: number;
23
+ /** Flow the first step in on start (default, as Stepbro). */
24
+ animateFirst?: boolean;
25
+ /** Items of a step that flow (default [data-mk-flow-item], else the step's children). */
26
+ target?: string;
27
+ onChange?: (index: number, previous: number) => void;
28
+ }
29
+ interface StepsInstance extends Instance {
30
+ next(): Promise<void>;
31
+ prev(): Promise<void>;
32
+ goTo(index: number): Promise<void>;
33
+ /** A step is working: drives the chat background inside (Stepbro's onBusy). */
34
+ busy(on: boolean): void;
35
+ readonly index: number;
36
+ readonly count: number;
37
+ readonly steps: HTMLElement[];
38
+ }
39
+ interface StepDetail {
40
+ index: number;
41
+ previous: number;
42
+ step: HTMLElement;
43
+ }
44
+ declare function createSteps(root: HTMLElement | null, options?: StepsOptions): StepsInstance;
45
+
46
+ export { type ChatBackgroundInstance as C, type StepsInstance as S, type ChatBackgroundOptions as a, type StepDetail as b, type StepsOptions as c, chatBackgroundOf as d, createChatBackground as e, createSteps as f };
@@ -0,0 +1,61 @@
1
+ import { I as Instance } from '../types-BkS_raL8.js';
2
+
3
+ type ParticleHeroMode = 'webgl2' | 'canvas2d' | 'none';
4
+ interface ParticleHeroOptions {
5
+ /** Words the points draw in turn. */
6
+ words?: string[];
7
+ /** The state texture's side: size² points (32–256). */
8
+ size?: number;
9
+ /** Point size in CSS pixels (1–8). */
10
+ pointSize?: number;
11
+ /** RGB, 0–1 each. */
12
+ color?: [number, number, number];
13
+ seed?: number;
14
+ /** Skip WebGL (to try the fallback). */
15
+ forceFallback?: boolean;
16
+ onMode?: (mode: ParticleHeroMode) => void;
17
+ }
18
+ interface ParticleHeroInstance extends Instance {
19
+ readonly mode: ParticleHeroMode;
20
+ /** Draw this word next (the cycle carries on afterwards). */
21
+ setWord(word: string): void;
22
+ /** Share of points on the word, 0–1; null gives control back to the cycle. */
23
+ setTextureMix(value: number | null): void;
24
+ /** Base field: 0 circles, 1 grid, 2 squares. */
25
+ setPattern(value: number): void;
26
+ pause(): void;
27
+ resume(): void;
28
+ }
29
+ declare function createParticleHero(root: HTMLElement | null, options?: ParticleHeroOptions): ParticleHeroInstance;
30
+
31
+ interface ShaderEffectOptions {
32
+ images?: HTMLImageElement[];
33
+ progress?: number;
34
+ amount?: number;
35
+ maxDpr?: number;
36
+ }
37
+ interface ShaderEffectInstance extends Instance {
38
+ readonly mode: 'webgl' | 'none';
39
+ setProgress(progress: number): void;
40
+ setAmount(amount: number): void;
41
+ pause(): void;
42
+ resume(): void;
43
+ }
44
+
45
+ type LiquidBlendOptions = ShaderEffectOptions;
46
+ type LiquidBlendInstance = ShaderEffectInstance;
47
+ declare const createLiquidBlend: (root: HTMLElement | null, options?: LiquidBlendOptions) => LiquidBlendInstance;
48
+
49
+ type MatcapOptions = ShaderEffectOptions;
50
+ type MatcapInstance = ShaderEffectInstance;
51
+ declare const createMatcap: (root: HTMLElement | null, options?: MatcapOptions) => MatcapInstance;
52
+
53
+ type ShaderGrainOptions = ShaderEffectOptions;
54
+ type ShaderGrainInstance = ShaderEffectInstance;
55
+ declare const createShaderGrain: (root: HTMLElement | null, options?: ShaderGrainOptions) => ShaderGrainInstance;
56
+
57
+ type ShaderBlurOptions = ShaderEffectOptions;
58
+ type ShaderBlurInstance = ShaderEffectInstance;
59
+ declare const createShaderBlur: (root: HTMLElement | null, options?: ShaderBlurOptions) => ShaderBlurInstance;
60
+
61
+ export { type LiquidBlendInstance, type LiquidBlendOptions, type MatcapInstance, type MatcapOptions, type ParticleHeroInstance, type ParticleHeroMode, type ParticleHeroOptions, type ShaderBlurInstance, type ShaderBlurOptions, type ShaderEffectInstance, type ShaderEffectOptions, type ShaderGrainInstance, type ShaderGrainOptions, createLiquidBlend, createMatcap, createParticleHero, createShaderBlur, createShaderGrain };