@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 @@
1
+ {"version":3,"sources":["../src/gl/shared/shaders.ts","../src/gl/shared/create-shader-effect.ts","../src/gl/liquid-blend/shader.ts","../src/gl/liquid-blend/create-liquid-blend.ts","../src/gl/matcap/shader.ts","../src/gl/matcap/create-matcap.ts","../src/gl/shader-grain/shader.ts","../src/gl/shader-grain/create-shader-grain.ts","../src/gl/shader-blur/shader.ts","../src/gl/shader-blur/create-shader-blur.ts","../src/gl/particle-hero/shaders.ts","../src/gl/particle-hero/create-particle-hero.ts"],"sourcesContent":["export const fullscreenVertex = `\nattribute vec2 position;\nvarying vec2 vUv;\nvoid main() {\n vUv = position * .5 + .5;\n gl_Position = vec4(position, 0., 1.);\n}`;\n\nexport const fragmentHeader = `\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uImage0;\nuniform sampler2D uImage1;\nuniform vec2 uSize;\nuniform vec2 uImageSize0;\nuniform vec2 uImageSize1;\nuniform float uTime;\nuniform float uProgress;\nuniform float uAmount;\nuniform float uHasImage;\nvec2 cover(vec2 uv, vec2 imageSize) {\n float aspect = uSize.x / uSize.y;\n float imageAspect = imageSize.x / imageSize.y;\n vec2 scale = vec2(min(aspect / imageAspect, 1.), min(imageAspect / aspect, 1.));\n return (uv - .5) * scale + .5;\n}\nfloat noise(vec2 point) {\n return fract(sin(dot(point, vec2(12.9898, 78.233))) * 43758.5453);\n}\n`;\n","import { whileVisible } from '../../core/loop';\nimport { clamp } from '../../core/math';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { fragmentHeader, fullscreenVertex } from './shaders';\n\nexport interface ShaderEffectOptions {\n images?: HTMLImageElement[];\n progress?: number;\n amount?: number;\n maxDpr?: number;\n}\nexport interface ShaderEffectInstance extends Instance {\n readonly mode: 'webgl' | 'none';\n setProgress(progress: number): void;\n setAmount(amount: number): void;\n pause(): void;\n resume(): void;\n}\n\ninterface Renderer {\n draw(time: number, progress: number, amount: number): void;\n upload(): boolean;\n destroy(): void;\n}\n\nfunction createRenderer(canvas: HTMLCanvasElement, fragment: string, images: HTMLImageElement[]): Renderer {\n const gl = canvas.getContext('webgl', { alpha: true, antialias: false, premultipliedAlpha: false });\n if (!gl) throw new Error('WebGL unavailable');\n const releases: Array<() => void> = [];\n const destroy = () => { releases.splice(0).reverse().forEach((release) => release()); };\n try {\n const compile = (type: number, source: string) => {\n const shader = gl.createShader(type);\n if (!shader) throw new Error('Shader allocation failed');\n releases.push(() => gl.deleteShader(shader));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader) ?? 'Shader failed');\n return shader;\n };\n const vertex = compile(gl.VERTEX_SHADER, fullscreenVertex);\n const pixel = compile(gl.FRAGMENT_SHADER, fragmentHeader + fragment);\n const program = gl.createProgram();\n if (!program) throw new Error('Program allocation failed');\n releases.push(() => gl.deleteProgram(program));\n gl.attachShader(program, vertex);\n gl.attachShader(program, pixel);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(program) ?? 'Link failed');\n gl.useProgram(program);\n const buffer = gl.createBuffer();\n if (!buffer) throw new Error('Buffer allocation failed');\n releases.push(() => gl.deleteBuffer(buffer));\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n const attribute = gl.getAttribLocation(program, 'position');\n gl.enableVertexAttribArray(attribute);\n gl.vertexAttribPointer(attribute, 2, gl.FLOAT, false, 0, 0);\n const names = ['uSize', 'uImageSize0', 'uImageSize1', 'uTime', 'uProgress', 'uAmount', 'uImage0', 'uImage1', 'uHasImage'] as const;\n const uniforms = Object.fromEntries(names.map((name) => [name, gl.getUniformLocation(program, name)]));\n const textures = [0, 1].map((index) => {\n const texture = gl.createTexture();\n if (!texture) throw new Error('Texture allocation failed');\n releases.push(() => gl.deleteTexture(texture));\n gl.activeTexture(gl.TEXTURE0 + index);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([26, 40, 55, 255]));\n gl.uniform1i(uniforms[`uImage${index}`]!, index);\n return texture;\n });\n const upload = () => {\n if (images.some((image) => !image.complete || !image.naturalWidth)) return false;\n gl.useProgram(program);\n images.slice(0, 2).forEach((image, index) => {\n gl.activeTexture(gl.TEXTURE0 + index);\n gl.bindTexture(gl.TEXTURE_2D, textures[index]!);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n });\n return true;\n };\n return {\n upload,\n draw(time, progress, amount) {\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.useProgram(program);\n gl.uniform2f(uniforms.uSize!, canvas.width, canvas.height);\n [0, 1].forEach((index) => gl.uniform2f(uniforms[`uImageSize${index}`]!, images[index]?.naturalWidth || 1, images[index]?.naturalHeight || 1));\n gl.uniform1f(uniforms.uTime!, time);\n gl.uniform1f(uniforms.uProgress!, progress);\n gl.uniform1f(uniforms.uAmount!, amount);\n gl.uniform1f(uniforms.uHasImage!, images.length ? 1 : 0);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n },\n destroy,\n };\n } catch (error) {\n destroy();\n throw error;\n }\n}\n\nexport function createShaderEffect(root: HTMLElement | null, fragment: string, options: ShaderEffectOptions = {}): ShaderEffectInstance {\n if (!root) return inert({ mode: 'none' as const, setProgress() {}, setAmount() {}, pause() {}, resume() {} });\n const scope = createScope();\n const canvas = document.createElement('canvas');\n canvas.className = 'mk-shader__canvas';\n canvas.setAttribute('aria-hidden', 'true');\n canvas.hidden = true;\n const images = (options.images ?? [...root.querySelectorAll('img')]).slice(0, 2);\n if (images.length === 1) images.push(images[0]!);\n let renderer: Renderer | null = null;\n let mode: ShaderEffectInstance['mode'] = 'none';\n let progress = clamp(options.progress ?? 0, 0, 1);\n let amount = clamp(options.amount ?? 1, 0, 100);\n let time = 0;\n let paused = false;\n let ready = false;\n const draw = () => {\n if (!scope.disposed && ready && renderer && mode === 'webgl') renderer.draw(time, progress, amount);\n };\n const fallback = () => {\n mode = 'none';\n ready = false;\n canvas.hidden = true;\n };\n const load = () => {\n if (scope.disposed || !renderer) return;\n try {\n ready = renderer.upload();\n canvas.hidden = !ready;\n if (ready) mode = 'webgl';\n draw();\n } catch { fallback(); }\n };\n const resize = (render = true) => {\n if (scope.disposed) return;\n const rect = root.getBoundingClientRect();\n const dpr = Math.min(typeof devicePixelRatio === 'number' ? devicePixelRatio : 1, Math.max(0.5, options.maxDpr ?? 1.5));\n canvas.width = Math.max(1, Math.round(rect.width * dpr));\n canvas.height = Math.max(1, Math.round(rect.height * dpr));\n if (render) draw();\n };\n const initialize = () => {\n renderer?.destroy();\n renderer = null;\n try {\n renderer = createRenderer(canvas, fragment, images);\n mode = 'webgl';\n resize(false);\n load();\n return true;\n } catch { fallback(); return false; }\n };\n if (!initialize()) { scope.dispose(); return inert({ mode: 'none' as const, setProgress() {}, setAmount() {}, pause() {}, resume() {} }); }\n scope.attr(root, 'class', `${root.className} mk-shader`.trim());\n root.append(canvas);\n scope.add(() => { renderer?.destroy(); renderer = null; canvas.remove(); mode = 'none'; });\n images.forEach((image) => {\n scope.on(image, 'load', load);\n scope.on(image, 'error', fallback);\n });\n scope.on(canvas, 'webglcontextlost', (event) => { event.preventDefault(); fallback(); });\n scope.on(canvas, 'webglcontextrestored', initialize);\n if (typeof ResizeObserver === 'function') scope.observe(new ResizeObserver(() => resize())).observe(root);\n scope.on(window, 'resize', () => resize());\n if (!reduced()) scope.add(whileVisible(root, (dt) => {\n if (paused || document.hidden || mode === 'none') return;\n time += dt / 60;\n draw();\n }));\n return {\n get mode() { return mode; },\n setProgress(value) { if (scope.disposed || !Number.isFinite(value)) return; progress = clamp(value, 0, 1); draw(); },\n setAmount(value) { if (scope.disposed || !Number.isFinite(value)) return; amount = clamp(value, 0, 100); draw(); },\n pause() { paused = true; },\n resume() { paused = false; },\n destroy: () => scope.dispose(),\n };\n}\n","export const liquidFragment = `\nvoid main() {\n float center = 1. - smoothstep(0., .5, distance(vUv, vec2(.5)));\n vec2 wave = vec2(sin(vUv.y * 18. + uTime), cos(vUv.x * 20. - uTime));\n vec2 distortion = wave * center * uAmount;\n vec2 currentUv = cover(vUv + distortion * uProgress, uImageSize0);\n vec2 nextUv = cover(vUv - distortion * (1. - uProgress), uImageSize1);\n gl_FragColor = mix(texture2D(uImage0, currentUv), texture2D(uImage1, nextUv), uProgress);\n}`;\n","import { createShaderEffect, type ShaderEffectInstance, type ShaderEffectOptions } from '../shared/create-shader-effect';\nimport { liquidFragment } from './shader';\n\nexport type LiquidBlendOptions = ShaderEffectOptions;\nexport type LiquidBlendInstance = ShaderEffectInstance;\nexport const createLiquidBlend = (root: HTMLElement | null, options: LiquidBlendOptions = {}): LiquidBlendInstance =>\n createShaderEffect(root, liquidFragment, { amount: 0.15, ...options });\n","export const matcapFragment = `\nvoid main() {\n vec2 point = (vUv - .5) * 2.5;\n point.x *= uSize.x / uSize.y;\n float radius = length(point);\n if (radius > 1.) { gl_FragColor = vec4(.04, .06, .08, 1.); return; }\n vec3 normal = normalize(vec3(point, sqrt(max(0., 1. - dot(point, point)))));\n float angle = uTime * .2 + uProgress * 6.28318;\n vec2 rotated = mat2(cos(angle), -sin(angle), sin(angle), cos(angle)) * normal.xy;\n vec2 matcapUv = rotated * .495 + .5;\n float hemisphere = clamp(1. - dot(normalize(vec3(1., -1., 1.)), normal), 0., 1.);\n vec3 metal = mix(vec3(.1), vec3(1.), hemisphere) + pow(normal.z, 24.) * uAmount;\n vec3 mapped = texture2D(uImage0, matcapUv).rgb;\n metal = mix(metal, mapped + metal * .15, uHasImage);\n gl_FragColor = vec4(metal, 1.);\n}`;\n","import { createShaderEffect, type ShaderEffectInstance, type ShaderEffectOptions } from '../shared/create-shader-effect';\nimport { matcapFragment } from './shader';\n\nexport type MatcapOptions = ShaderEffectOptions;\nexport type MatcapInstance = ShaderEffectInstance;\nexport const createMatcap = (root: HTMLElement | null, options: MatcapOptions = {}): MatcapInstance =>\n createShaderEffect(root, matcapFragment, { amount: 0.15, ...options });\n","export const grainFragment = `\nvoid main() {\n vec4 color = texture2D(uImage0, cover(vUv, uImageSize0));\n float grain = noise(floor(vUv * uSize) + floor(uTime * 24.)) - .5;\n gl_FragColor = vec4(color.rgb + grain * uAmount, color.a);\n}`;\n","import { createShaderEffect, type ShaderEffectInstance, type ShaderEffectOptions } from '../shared/create-shader-effect';\nimport { grainFragment } from './shader';\n\nexport type ShaderGrainOptions = ShaderEffectOptions;\nexport type ShaderGrainInstance = ShaderEffectInstance;\nexport const createShaderGrain = (root: HTMLElement | null, options: ShaderGrainOptions = {}): ShaderGrainInstance =>\n createShaderEffect(root, grainFragment, { amount: 0.07, ...options });\n","export const blurFragment = `\nvoid main() {\n vec2 uv = cover(vUv, uImageSize0);\n float angle = uProgress * 1.5707963;\n vec2 delta = vec2(cos(angle), sin(angle)) * uAmount / uImageSize0;\n vec4 color = texture2D(uImage0, uv) * .1964825501511404;\n color += (texture2D(uImage0, uv + delta * 1.411764705882353) + texture2D(uImage0, uv - delta * 1.411764705882353)) * .2969069646728344;\n color += (texture2D(uImage0, uv + delta * 3.2941176470588234) + texture2D(uImage0, uv - delta * 3.2941176470588234)) * .09447039785044732;\n color += (texture2D(uImage0, uv + delta * 5.176470588235294) + texture2D(uImage0, uv - delta * 5.176470588235294)) * .010381362401148057;\n gl_FragColor = color;\n}`;\n","import { createShaderEffect, type ShaderEffectInstance, type ShaderEffectOptions } from '../shared/create-shader-effect';\nimport { blurFragment } from './shader';\n\nexport type ShaderBlurOptions = ShaderEffectOptions;\nexport type ShaderBlurInstance = ShaderEffectInstance;\nexport const createShaderBlur = (root: HTMLElement | null, options: ShaderBlurOptions = {}): ShaderBlurInstance =>\n createShaderEffect(root, blurFragment, { amount: 5, ...options });\n","/*\n * Shaders for the particle hero. Own GLSL (not iyo's): state texture XY = position,\n * ZW = velocity; the simulation pulls each point toward the zero lines of a\n * radial / grid / square field mixed with a Chladni plate (four Newton-like\n * projections, step .4) or toward a word, and pushes it away from the pointer.\n */\n\nexport const fullscreenVertex = `#version 300 es\nprecision highp float;\nout vec2 vUv;\nvoid main() {\n vec2 p = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2);\n vUv = p;\n gl_Position = vec4(p * 2. - 1., 0., 1.);\n}`;\n\nexport const simulationFragment = `#version 300 es\nprecision highp float;\nin vec2 vUv;\nuniform sampler2D uState, uMask;\nuniform float uTime, uDt, uMix, uFrequency, uDistortion, uNoise, uJitter, uMouseSpeed, uAspect;\nuniform vec2 uModes, uMouse;\nuniform int uPattern;\nout vec4 outState;\nfloat hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123); }\nfloat field(vec2 p) {\n float base = sin(length(p) * uFrequency * .35);\n if (uPattern == 1) base = sin(p.x * uFrequency * .35) * sin(p.y * uFrequency * .35);\n if (uPattern == 2) base = sin(max(abs(p.x), abs(p.y)) * uFrequency * .35);\n float chladni = sin(uModes.x * 3.14159265 * (p.x + 1.) * .5) * sin(uModes.y * 3.14159265 * (p.y + 1.) * .5);\n float spots = (hash(floor(p * 12.)) - .5) * uNoise * .08;\n float jitter = sin(uTime * 42. + hash(p * 30.) * 6.283) * uJitter * .015;\n return mix(base, chladni, clamp(uDistortion * .2, 0., .85)) + spots + jitter;\n}\nvoid main() {\n vec4 state = texture(uState, vUv);\n vec2 pos = state.xy;\n vec2 vel = state.zw;\n vec2 p = (vUv - .5) * 2.;\n for (int i = 0; i < 4; i++) {\n float f = field(p);\n float e = .003;\n vec2 g = vec2(field(p + vec2(e, 0.)) - field(p - vec2(e, 0.)), field(p + vec2(0., e)) - field(p - vec2(0., e))) / (2. * e);\n float q = dot(g, g);\n if (q > .00001) p -= f * g / q * .4;\n }\n vec2 word = texture(uMask, vUv).xy;\n float text = step(hash(vUv), uMix);\n vec2 target = mix(p * .88, word, text);\n target.x *= max(uAspect, 1.);\n float dt60 = uDt * 60.;\n vel *= pow(.91, dt60);\n vec2 delta = target - pos;\n float dist = length(delta);\n if (dist > .004 * (1. - text)) vel += delta / max(dist, .00001) * mix(.0016, .0009, text) * dt60;\n vec2 away = pos - uMouse;\n float r = length(away);\n vel += away / max(r, .0001) * (1. - smoothstep(0., .28, r)) * uMouseSpeed * .017 * dt60;\n vel += vec2(sin(uTime + vUv.x * 400.), cos(uTime + vUv.y * 400.)) * .00003 * dt60;\n pos += vel * dt60;\n outState = vec4(pos, vel);\n}`;\n\nexport const pointsVertex = `#version 300 es\nprecision highp float;\nuniform sampler2D uState;\nuniform int uSize;\nuniform float uAspect, uDpr, uPointSize;\nvoid main() {\n ivec2 uv = ivec2(gl_VertexID % uSize, gl_VertexID / uSize);\n vec2 p = texelFetch(uState, uv, 0).xy;\n gl_Position = vec4(p.x / max(uAspect, 1.), p.y, 0., 1.);\n gl_PointSize = uPointSize * uDpr;\n}`;\n\nexport const pointsFragment = `#version 300 es\nprecision highp float;\nuniform vec3 uColor;\nuniform float uOpacity;\nout vec4 outColor;\nvoid main() {\n float a = (1. - smoothstep(.12, .5, length(gl_PointCoord - .5))) * .44 * uOpacity;\n outColor = vec4(uColor, a);\n}`;\n","import { whileVisible } from '../../core/loop';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { warnOnce, type Instance } from '../../core/types';\nimport { fullscreenVertex, pointsFragment, pointsVertex, simulationFragment } from './shaders';\n\n/*\n * iyo.ai's hero, adapted: a cloud of points simulated on the GPU (two RGBA32F\n * textures, position + velocity, ping-pong) that settles on the zero lines of a\n * shifting interference pattern — Chladni modes from [3, 5, 7] every 6–12 s, a\n * frequency of 20–45 every 5–10 s, a distortion tween of 1.2–3 s — while part of\n * the points (40–80 %, eased) leave to draw a word, then return. The pointer\n * pushes them away in proportion to its speed. It fades in over 1 s after 0.3 s.\n *\n * iyo runs 1 638 400 points on Three.js with its own word pictures; this is a\n * smaller own implementation (size² points, 16 384 by default) with words drawn\n * locally. Without WebGL2 float targets it falls back to ~1800 points on a 2D\n * canvas; with no canvas at all it does nothing. Reduced motion draws one still\n * frame. The canvas is decorative (aria-hidden): the hero's text lives in HTML.\n */\n\nexport type ParticleHeroMode = 'webgl2' | 'canvas2d' | 'none';\n\nexport interface ParticleHeroOptions {\n /** Words the points draw in turn. */\n words?: string[];\n /** The state texture's side: size² points (32–256). */\n size?: number;\n /** Point size in CSS pixels (1–8). */\n pointSize?: number;\n /** RGB, 0–1 each. */\n color?: [number, number, number];\n seed?: number;\n /** Skip WebGL (to try the fallback). */\n forceFallback?: boolean;\n onMode?: (mode: ParticleHeroMode) => void;\n}\n\nexport interface ParticleHeroInstance extends Instance {\n readonly mode: ParticleHeroMode;\n /** Draw this word next (the cycle carries on afterwards). */\n setWord(word: string): void;\n /** Share of points on the word, 0–1; null gives control back to the cycle. */\n setTextureMix(value: number | null): void;\n /** Base field: 0 circles, 1 grid, 2 squares. */\n setPattern(value: number): void;\n pause(): void;\n resume(): void;\n}\n\ninterface State {\n time: number;\n dt: number;\n mix: number;\n frequency: number;\n distortion: number;\n noise: number;\n jitter: number;\n m: number;\n n: number;\n mouseX: number;\n mouseY: number;\n mouseSpeed: number;\n pattern: number;\n aspect: number;\n dpr: number;\n opacity: number;\n}\n\ninterface Renderer {\n mode: Exclude<ParticleHeroMode, 'none'>;\n render(state: State, steps?: number): void;\n setMask(data: Float32Array): void;\n destroy(): void;\n}\n\nconst instances = new WeakMap<HTMLElement, ParticleHeroInstance>();\nconst clamp = (x: number, a: number, b: number) => Math.max(a, Math.min(b, x));\nconst mix = (a: number, b: number, t: number) => a + (b - a) * t;\n/** power2.inOut-like cubic. */\nconst inOut = (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2);\n\nfunction random(seed: number) {\n let s = seed >>> 0;\n return () => {\n s = (1664525 * s + 1013904223) >>> 0;\n return s / 4294967296;\n };\n}\n\n/** Points sampled from the dark pixels of a word drawn on a 640 × 320 canvas (iyo: red < 120). */\nfunction wordMask(word: string, count: number, rng: () => number) {\n const result = new Float32Array(count * 4);\n const canvas = document.createElement('canvas');\n canvas.width = 640;\n canvas.height = 320;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n const dark: Array<[number, number]> = [];\n if (ctx) {\n ctx.fillStyle = '#fff';\n ctx.fillRect(0, 0, 640, 320);\n ctx.fillStyle = '#000';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n let size = 140;\n ctx.font = `600 ${size}px system-ui, sans-serif`;\n while (ctx.measureText(word).width > 590 && size > 16) {\n size -= 4;\n ctx.font = `600 ${size}px system-ui, sans-serif`;\n }\n ctx.fillText(word, 320, 160);\n const pixels = ctx.getImageData(0, 0, 640, 320).data;\n for (let y = 0; y < 320; y += 2) for (let x = 0; x < 640; x += 2) if (pixels[(y * 640 + x) * 4]! < 120) dark.push([x, y]);\n }\n for (let i = 0; i < count; i++) {\n const [x, y] = dark.length ? dark[Math.floor(rng() * dark.length)]! : [320, 160];\n result[i * 4] = (x / 640 - 0.5) * 1.75 + (rng() - 0.5) * 0.004;\n result[i * 4 + 1] = (0.5 - y / 320) * 0.9 + (rng() - 0.5) * 0.004;\n }\n return result;\n}\n\nfunction gpuRenderer(\n canvas: HTMLCanvasElement,\n size: number,\n pointSize: number,\n color: number[],\n initial: Float32Array,\n mask: Float32Array,\n): Renderer {\n const gl = canvas.getContext('webgl2', { alpha: true, antialias: false, powerPreference: 'high-performance', premultipliedAlpha: true });\n if (!gl || !gl.getExtension('EXT_color_buffer_float')) throw new Error('WebGL2 float render targets unavailable');\n const releases: Array<() => void> = [];\n const release = () => {\n for (const fn of releases.reverse()) fn();\n releases.length = 0;\n };\n try {\n const shader = (type: number, source: string) => {\n const s = gl.createShader(type)!;\n releases.push(() => gl.deleteShader(s));\n gl.shaderSource(s, source);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(s) ?? 'shader');\n return s;\n };\n const program = (vs: string, fs: string) => {\n const p = gl.createProgram()!;\n releases.push(() => gl.deleteProgram(p));\n gl.attachShader(p, shader(gl.VERTEX_SHADER, vs));\n gl.attachShader(p, shader(gl.FRAGMENT_SHADER, fs));\n gl.linkProgram(p);\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(p) ?? 'program');\n return p;\n };\n const texture = (data: Float32Array) => {\n const tex = gl.createTexture()!;\n releases.push(() => gl.deleteTexture(tex));\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, size, size, 0, gl.RGBA, gl.FLOAT, data);\n return tex;\n };\n const sim = program(fullscreenVertex, simulationFragment);\n const draw = program(pointsVertex, pointsFragment);\n const states = [texture(initial), texture(initial)];\n const maskTexture = texture(mask);\n const buffers = states.map((tex) => {\n const fb = gl.createFramebuffer()!;\n releases.push(() => gl.deleteFramebuffer(fb));\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) throw new Error('incomplete float framebuffer');\n return fb;\n });\n const vao = gl.createVertexArray()!;\n releases.push(() => gl.deleteVertexArray(vao));\n const uniforms = (p: WebGLProgram, names: string[]) => Object.fromEntries(names.map((name) => [name, gl.getUniformLocation(p, name)]));\n const simU = uniforms(sim, [\n 'uState',\n 'uMask',\n 'uTime',\n 'uDt',\n 'uMix',\n 'uFrequency',\n 'uDistortion',\n 'uNoise',\n 'uJitter',\n 'uMouseSpeed',\n 'uAspect',\n 'uModes',\n 'uMouse',\n 'uPattern',\n ]);\n const drawU = uniforms(draw, ['uState', 'uSize', 'uAspect', 'uDpr', 'uPointSize', 'uColor', 'uOpacity']);\n const bind = (unit: number, tex: WebGLTexture) => {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n };\n let read = 0;\n return {\n mode: 'webgl2',\n render(s, steps = 1) {\n gl.bindVertexArray(vao);\n gl.disable(gl.BLEND);\n gl.useProgram(sim);\n gl.uniform1i(simU.uState!, 0);\n gl.uniform1i(simU.uMask!, 1);\n gl.uniform1f(simU.uTime!, s.time);\n gl.uniform1f(simU.uDt!, s.dt);\n gl.uniform1f(simU.uMix!, s.mix);\n gl.uniform1f(simU.uFrequency!, s.frequency);\n gl.uniform1f(simU.uDistortion!, s.distortion);\n gl.uniform1f(simU.uNoise!, s.noise);\n gl.uniform1f(simU.uJitter!, s.jitter);\n gl.uniform1f(simU.uMouseSpeed!, s.mouseSpeed);\n gl.uniform1f(simU.uAspect!, s.aspect);\n gl.uniform2f(simU.uModes!, s.m, s.n);\n gl.uniform2f(simU.uMouse!, s.mouseX, s.mouseY);\n gl.uniform1i(simU.uPattern!, s.pattern);\n bind(1, maskTexture);\n for (let i = 0; i < steps; i++) {\n bind(0, states[read]!);\n gl.bindFramebuffer(gl.FRAMEBUFFER, buffers[1 - read]!);\n gl.viewport(0, 0, size, size);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n read = 1 - read;\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.useProgram(draw);\n bind(0, states[read]!);\n gl.uniform1i(drawU.uState!, 0);\n gl.uniform1i(drawU.uSize!, size);\n gl.uniform1f(drawU.uAspect!, s.aspect);\n gl.uniform1f(drawU.uDpr!, s.dpr);\n gl.uniform1f(drawU.uPointSize!, pointSize);\n gl.uniform3fv(drawU.uColor!, color);\n gl.uniform1f(drawU.uOpacity!, s.opacity);\n gl.enable(gl.BLEND);\n // RGB premultiplied, coverage accumulated once, for the page's compositing.\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.drawArrays(gl.POINTS, 0, size * size);\n },\n setMask(data) {\n bind(1, maskTexture);\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, size, size, gl.RGBA, gl.FLOAT, data);\n },\n destroy: release,\n };\n } catch (error) {\n release();\n throw error;\n }\n}\n\n/** ~1800 points eased toward a breathing circle or the word: no Chladni field. */\nfunction canvasRenderer(\n canvas: HTMLCanvasElement,\n size: number,\n pointSize: number,\n color: number[],\n initial: Float32Array,\n mask: Float32Array,\n): Renderer {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('no 2D context');\n const stride = Math.max(1, Math.floor((size * size) / 1800));\n const ids: number[] = [];\n for (let i = 0; i < size * size; i += stride) ids.push(i);\n const points = Float32Array.from(initial);\n let target = mask;\n const rgb = color.map((c) => Math.round(c * 255)).join(',');\n return {\n mode: 'canvas2d',\n setMask(data) {\n target = data;\n },\n render(s, steps = 1) {\n for (let step = 0; step < steps; step++)\n for (const i of ids) {\n const o = i * 4;\n const angle = i * 2.3999632297;\n const radius = 0.3 + 0.52 * Math.sin(angle * 0.025 + s.time * 0.07);\n let x = Math.cos(angle) * radius;\n let y = Math.sin(angle) * radius;\n if (((i * 137) % 1000) / 1000 < s.mix) {\n x = target[o]!;\n y = target[o + 1]!;\n }\n points[o] = points[o]! + (x - points[o]!) * 0.075;\n points[o + 1] = points[o + 1]! + (y - points[o + 1]!) * 0.075;\n }\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = `rgba(${rgb},${0.4 * s.opacity})`;\n for (const i of ids) {\n const x = (points[i * 4]! * 0.5 + 0.5) * canvas.width;\n const y = (0.5 - points[i * 4 + 1]! * 0.5) * canvas.height;\n ctx.beginPath();\n ctx.arc(x, y, pointSize * s.dpr * 0.55, 0, Math.PI * 2);\n ctx.fill();\n }\n },\n destroy() {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n },\n };\n}\n\nconst NONE: ParticleHeroInstance = {\n mode: 'none',\n setWord() {},\n setTextureMix() {},\n setPattern() {},\n pause() {},\n resume() {},\n destroy() {},\n};\n\nexport function createParticleHero(root: HTMLElement | null, options: ParticleHeroOptions = {}): ParticleHeroInstance {\n if (!root) {\n warnOnce('particle-hero: missing element');\n return NONE;\n }\n const existing = instances.get(root);\n if (existing) return existing;\n const t = TIMING.particleHero;\n const rng = random(options.seed ?? 1907);\n const size = Math.round(clamp(options.size ?? t.size, 32, 256));\n const pointSize = clamp(options.pointSize ?? t.pointSize, 1, 8);\n const color = options.color ?? [1, 1, 1];\n const words = options.words?.length ? options.words.map(String) : ['CREATE', 'NATURAL', 'IDEAS'];\n const count = size * size;\n const still = reduced();\n\n const initial = new Float32Array(count * 4);\n for (let i = 0; i < count; i++) {\n initial[i * 4] = (rng() - 0.5) * 1.7;\n initial[i * 4 + 1] = (rng() - 0.5) * 1.7;\n }\n let mask = wordMask(words[0]!, count, rng);\n\n const makeCanvas = () => {\n const canvas = document.createElement('canvas');\n canvas.className = 'mk-particle-hero__canvas';\n canvas.setAttribute('aria-hidden', 'true');\n return canvas;\n };\n let canvas = makeCanvas();\n let renderer: Renderer | null = null;\n if (!options.forceFallback) {\n try {\n renderer = gpuRenderer(canvas, size, pointSize, color, initial, mask);\n } catch {\n canvas = makeCanvas();\n }\n }\n if (!renderer) {\n try {\n renderer = canvasRenderer(canvas, size, pointSize, color, initial, mask);\n } catch {\n warnOnce('particle-hero: no WebGL2 and no 2D canvas — nothing drawn');\n return NONE;\n }\n }\n const draw = renderer;\n\n const scope = createScope();\n if (!root.classList.contains('mk-particle-hero')) {\n root.classList.add('mk-particle-hero');\n scope.add(() => {\n root.classList.remove('mk-particle-hero');\n if (root.getAttribute('class') === '') root.removeAttribute('class');\n });\n }\n root.append(canvas);\n scope.add(() => canvas.remove());\n scope.attr(root, 'data-mk-mode', draw.mode);\n scope.add(() => draw.destroy());\n\n const state: State = {\n time: 0,\n dt: 1 / 60,\n mix: still ? 0.8 : 0,\n frequency: 35,\n distortion: 2.4,\n noise: 0.2,\n jitter: 0.08,\n m: 3,\n n: 5,\n mouseX: 9,\n mouseY: 9,\n mouseSpeed: 0,\n pattern: 0,\n aspect: 1,\n dpr: 1,\n opacity: still ? 1 : 0,\n };\n let paused = false;\n let age = 0;\n let wordIndex = 0;\n let manualMix: number | null = null;\n let nextFrequency = 5;\n let nextModes = 6;\n let distortion = { from: 2.4, to: rng() * 5, start: 0, end: 2.5 };\n // Word cycle: points gather on the word, shift share, leave, next word.\n let cycle = { stage: 0, start: 0, duration: 4.2, from: 0, to: 0.65 };\n let pointer = { x: 9, y: 9 };\n let previous = { x: 9, y: 9 };\n\n const drawStill = () => {\n state.opacity = 1;\n state.mix = manualMix ?? 0.8;\n state.mouseSpeed = 0;\n state.dt = 1 / 60;\n draw.render(state, t.stillSteps);\n };\n const isStill = () => still || paused;\n const resize = () => {\n const box = root.getBoundingClientRect();\n const w = Math.max(1, box.width);\n const h = Math.max(1, box.height);\n state.dpr = Math.min(window.devicePixelRatio || 1, t.maxDpr);\n state.aspect = w / h;\n canvas.width = Math.round(w * state.dpr);\n canvas.height = Math.round(h * state.dpr);\n if (isStill()) drawStill();\n };\n const setWord = (word: string) => {\n if (scope.disposed) return;\n mask = wordMask(String(word), count, rng);\n draw.setMask(mask);\n if (isStill()) drawStill();\n };\n\n const tick = (frames: number) => {\n if (paused || scope.disposed) return;\n const dt = clamp(frames / 60, 0, 0.05);\n age += dt;\n state.time = age * 4;\n state.dt = dt;\n state.opacity = clamp((age - t.fadeDelay) / t.fadeIn, 0, 1);\n state.mouseX = mix(state.mouseX, pointer.x, 0.1);\n state.mouseY = mix(state.mouseY, pointer.y, 0.1);\n const speed = Math.min(Math.hypot(state.mouseX - previous.x, state.mouseY - previous.y) * 5, 1);\n state.mouseSpeed = mix(state.mouseSpeed, speed, 0.2);\n previous = { x: state.mouseX, y: state.mouseY };\n if (age >= nextFrequency) {\n state.frequency = 20 + rng() * 25;\n state.jitter = rng() * 0.3;\n state.noise = rng() * 0.5;\n nextFrequency = age + 5 + rng() * 5;\n }\n if (age >= nextModes) {\n const modes = [3, 5, 7];\n state.m = modes[Math.floor(rng() * 3)]!;\n state.n = modes[Math.floor(rng() * 3)]!;\n nextModes = age + 6 + rng() * 6;\n }\n if (age >= distortion.end) distortion = { from: state.distortion, to: rng() * 5, start: age, end: age + 1.2 + rng() * 1.8 };\n state.distortion = mix(\n distortion.from,\n distortion.to,\n inOut(clamp((age - distortion.start) / (distortion.end - distortion.start), 0, 1)),\n );\n if (age - cycle.start >= cycle.duration) {\n const stage = (cycle.stage + 1) % 3;\n cycle = { stage, start: age, from: cycle.to, to: 0, duration: 2 + rng() };\n if (stage === 0) {\n wordIndex = (wordIndex + 1) % words.length;\n setWord(words[wordIndex]!);\n }\n if (stage !== 2) {\n cycle.to = 0.4 + rng() * 0.4;\n cycle.duration = 2 + rng() * 2;\n }\n }\n state.mix = manualMix ?? mix(cycle.from, cycle.to, inOut(clamp((age - cycle.start) / cycle.duration, 0, 1)));\n draw.render(state);\n };\n\n scope.on(\n root,\n 'pointermove',\n (event) => {\n const box = root.getBoundingClientRect();\n const e = event as PointerEvent;\n pointer = {\n x: (((e.clientX - box.left) / Math.max(box.width, 1)) * 2 - 1) * Math.max(state.aspect, 1),\n y: 1 - ((e.clientY - box.top) / Math.max(box.height, 1)) * 2,\n };\n },\n { passive: true },\n );\n scope.on(root, 'pointerleave', () => (pointer = { x: 9, y: 9 }), { passive: true });\n scope.on(canvas, 'webglcontextlost', (event) => {\n event.preventDefault();\n paused = true;\n scope.attr(root, 'data-mk-mode', 'context-lost');\n });\n if (typeof ResizeObserver === 'function') scope.observe(new ResizeObserver(resize)).observe(root);\n else scope.on(window, 'resize', resize);\n // The shared ticker runs while the hero is near the screen and the tab is visible.\n if (!still) scope.add(whileVisible(root, tick, '100px'));\n\n const instance: ParticleHeroInstance = {\n mode: draw.mode,\n setWord,\n setTextureMix(value) {\n if (scope.disposed) return;\n manualMix = value === null ? null : clamp(Number(value) || 0, 0, 1);\n if (isStill()) drawStill();\n },\n setPattern(value) {\n if (scope.disposed) return;\n state.pattern = clamp(Math.round(Number(value) || 0), 0, 2);\n if (isStill()) drawStill();\n },\n pause() {\n if (!scope.disposed) paused = true;\n },\n resume() {\n if (scope.disposed) return;\n paused = false;\n if (still) drawStill();\n },\n destroy() {\n if (scope.disposed) return;\n scope.dispose();\n instances.delete(root);\n },\n };\n instances.set(root, instance);\n resize();\n if (still) drawStill();\n options.onMode?.(draw.mode);\n return instance;\n}\n"],"mappings":"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","names":["fullscreenVertex","clamp","fullscreenVertex","canvas"]}
@@ -0,0 +1,28 @@
1
+ import {
2
+ ROLES
3
+ } from "./chunk-J27KH2A2.js";
4
+
5
+ // src/theme/css-format.ts
6
+ function block(selectors, scheme, palette, indent = "") {
7
+ const lines = [`${indent}${selectors.join(`,
8
+ ${indent}`)} {`, `${indent} color-scheme: ${scheme};`];
9
+ for (const role of ROLES) lines.push(`${indent} --md-sys-color-${role}: ${palette[role]};`);
10
+ lines.push(`${indent}}`);
11
+ return lines.join("\n");
12
+ }
13
+ function themeCss(id, { light, dark }) {
14
+ const self = `[data-mk-theme="${id}"]`;
15
+ return [
16
+ block([self], "light", light),
17
+ block([`${self}[data-mk-mode="dark"]`, `[data-mk-mode="dark"] ${self}`], "dark", dark),
18
+ "@media (prefers-color-scheme: dark) {",
19
+ block([`:root:not([data-mk-mode="light"])${self}`, `:root:not([data-mk-mode="light"]) ${self}`], "dark", dark, " "),
20
+ "}",
21
+ ""
22
+ ].join("\n");
23
+ }
24
+
25
+ export {
26
+ themeCss
27
+ };
28
+ //# sourceMappingURL=chunk-ABNRDDO7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/css-format.ts"],"sourcesContent":["import { ROLES, type Role } from './presets';\n\nexport type Palette = Record<Role, string>;\nexport interface ThemePalettes {\n light: Palette;\n dark: Palette;\n}\n\nfunction block(selectors: string[], scheme: 'light' | 'dark', palette: Palette, indent = '') {\n const lines = [`${indent}${selectors.join(`,\\n${indent}`)} {`, `${indent} color-scheme: ${scheme};`];\n for (const role of ROLES) lines.push(`${indent} --md-sys-color-${role}: ${palette[role]};`);\n lines.push(`${indent}}`);\n return lines.join('\\n');\n}\n\n/**\n * A theme's stylesheet: light on `[data-mk-theme=\"<id>\"]`, dark when the element\n * or an ancestor has `data-mk-mode=\"dark\"`, and dark under the system's dark\n * scheme unless the page forces light. Same format as css/themes/*.css\n * (scripts/import-themes.mjs keeps a copy of this function; a test checks they agree).\n */\nexport function themeCss(id: string, { light, dark }: ThemePalettes): string {\n const self = `[data-mk-theme=\"${id}\"]`;\n return [\n block([self], 'light', light),\n block([`${self}[data-mk-mode=\"dark\"]`, `[data-mk-mode=\"dark\"] ${self}`], 'dark', dark),\n '@media (prefers-color-scheme: dark) {',\n block([`:root:not([data-mk-mode=\"light\"])${self}`, `:root:not([data-mk-mode=\"light\"]) ${self}`], 'dark', dark, ' '),\n '}',\n '',\n ].join('\\n');\n}\n"],"mappings":";;;;;AAQA,SAAS,MAAM,WAAqB,QAA0B,SAAkB,SAAS,IAAI;AAC3F,QAAM,QAAQ,CAAC,GAAG,MAAM,GAAG,UAAU,KAAK;AAAA,EAAM,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,mBAAmB,MAAM,GAAG;AACpG,aAAW,QAAQ,MAAO,OAAM,KAAK,GAAG,MAAM,oBAAoB,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG;AAC3F,QAAM,KAAK,GAAG,MAAM,GAAG;AACvB,SAAO,MAAM,KAAK,IAAI;AACxB;AAQO,SAAS,SAAS,IAAY,EAAE,OAAO,KAAK,GAA0B;AAC3E,QAAM,OAAO,mBAAmB,EAAE;AAClC,SAAO;AAAA,IACL,MAAM,CAAC,IAAI,GAAG,SAAS,KAAK;AAAA,IAC5B,MAAM,CAAC,GAAG,IAAI,yBAAyB,yBAAyB,IAAI,EAAE,GAAG,QAAQ,IAAI;AAAA,IACrF;AAAA,IACA,MAAM,CAAC,oCAAoC,IAAI,IAAI,qCAAqC,IAAI,EAAE,GAAG,QAAQ,MAAM,IAAI;AAAA,IACnH;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;","names":[]}