@yewdiel21/motion-kit 0.9.0 → 0.10.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.
- package/NOTICE +3 -35
- package/README.md +93 -81
- package/dist/auto/index.d.ts +22 -3
- package/dist/auto/index.js +43 -5
- package/dist/auto/index.js.map +1 -1
- package/dist/{chunk-KLY5BRRI.js → chunk-34EZ7DF4.js} +1 -1
- package/dist/chunk-34EZ7DF4.js.map +1 -0
- package/dist/{chunk-RFDIZYFX.js → chunk-DOOMULVV.js} +20 -20
- package/dist/chunk-DOOMULVV.js.map +1 -0
- package/dist/{chunk-ABNRDDO7.js → chunk-I3DXF2KQ.js} +2 -2
- package/dist/{chunk-Q4LVFNLN.js → chunk-IKQ5FODN.js} +4 -4
- package/dist/chunk-IKQ5FODN.js.map +1 -0
- package/dist/{chunk-2BQGFOA7.js → chunk-J6OCFNGU.js} +2 -2
- package/dist/chunk-J6OCFNGU.js.map +1 -0
- package/dist/{chunk-6OJAP6ZL.js → chunk-QFBOHPWZ.js} +3 -3
- package/dist/chunk-QFBOHPWZ.js.map +1 -0
- package/dist/{chunk-J27KH2A2.js → chunk-RVSKEBIC.js} +1 -1
- package/dist/chunk-RVSKEBIC.js.map +1 -0
- package/dist/{chunk-34XYOXHG.js → chunk-TFNRIZHU.js} +1615 -12
- package/dist/chunk-TFNRIZHU.js.map +1 -0
- package/dist/{chunk-FS2HJVVY.js → chunk-XAKC2QY7.js} +1204 -5
- package/dist/chunk-XAKC2QY7.js.map +1 -0
- package/dist/css/components/calendar.css +159 -0
- package/dist/css/components/chat-background.css +2 -2
- package/dist/css/components/chat.css +1 -1
- package/dist/css/components/cursor.css +3 -3
- package/dist/css/components/dialog.css +3 -3
- package/dist/css/components/hover-card.css +14 -0
- package/dist/css/components/input-otp.css +10 -0
- package/dist/css/components/island.css +1 -1
- package/dist/css/components/menu.css +1 -1
- package/dist/css/components/nav.css +1 -5
- package/dist/css/components/pagination.css +11 -0
- package/dist/css/components/quantity.css +16 -0
- package/dist/css/components/slot-picker.css +126 -0
- package/dist/css/components/steps.css +2 -2
- package/dist/css/components/studio-dock.css +35 -0
- package/dist/css/components/theme-picker.css +1 -1
- package/dist/css/components/toast.css +1 -1
- package/dist/css/components/trailer.css +37 -0
- package/dist/css/controls.css +78 -13
- package/dist/css/effects.css +8 -8
- package/dist/css/fonts.css +1 -1
- package/dist/css/themes/black-green.css +1 -1
- package/dist/css/themes/black.css +1 -1
- package/dist/css/themes/blue.css +1 -1
- package/dist/css/themes/brown.css +1 -1
- package/dist/css/themes/cold-blue.css +1 -1
- package/dist/css/themes/funny.css +1 -1
- package/dist/css/themes/gray.css +1 -1
- package/dist/css/themes/green.css +1 -1
- package/dist/css/themes/modern-1.css +1 -1
- package/dist/css/themes/neogreen.css +1 -1
- package/dist/css/themes/new.css +1 -1
- package/dist/css/themes/new2.css +1 -1
- package/dist/css/themes/oled.css +1 -1
- package/dist/css/themes/orange.css +1 -1
- package/dist/css/themes/pastel-pink.css +1 -1
- package/dist/css/themes/pink.css +1 -1
- package/dist/css/themes/purple.css +1 -1
- package/dist/css/themes/red.css +1 -1
- package/dist/css/themes/super-blue.css +1 -1
- package/dist/css/themes.css +19 -19
- package/dist/css/tokens.css +9 -9
- package/dist/elements/index.d.ts +75 -7
- package/dist/elements/index.js +172 -6
- package/dist/elements/index.js.map +1 -1
- package/dist/{engine-CUr9QijM.d.ts → engine-GDGwQnJE.d.ts} +2 -2
- package/dist/gl/index.js +3 -3
- package/dist/index.css +1076 -63
- package/dist/index.d.ts +17 -17
- package/dist/index.js +49 -7
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +139 -40
- package/dist/react/index.js +355 -8
- package/dist/react/index.js.map +1 -1
- package/dist/{reduced-BM4Ls0g5.d.ts → reduced-BmBzKH94.d.ts} +215 -18
- package/dist/{reveal-WFUWDrei.d.ts → reveal-jsX-uwUz.d.ts} +233 -24
- package/dist/{store-Bqy_obnD.d.ts → store-DYb3tTsZ.d.ts} +5 -5
- package/dist/theme/generate.d.ts +1 -1
- package/dist/theme/generate.js +2 -2
- package/dist/theme/generate.js.map +1 -1
- package/dist/theme/index.d.ts +2 -2
- package/dist/theme/index.js +2 -2
- package/dist/{theme-BFMoCzi6.d.ts → theme-Bjf9qIIy.d.ts} +1 -1
- package/package.json +2 -2
- package/registry.json +230 -156
- package/skills/motion-kit/SKILL.md +209 -189
- package/skills/motion-kit/reference/components.md +5 -5
- package/skills/motion-kit/reference/design.md +14 -14
- package/skills/motion-kit/reference/recipes.md +48 -49
- package/src/auto/auto-init.ts +38 -0
- package/src/components/calendar/README.md +82 -0
- package/src/components/calendar/calendar.css +158 -0
- package/src/components/calendar/element.ts +27 -0
- package/src/components/calendar/engine.ts +412 -0
- package/src/components/calendar/react.tsx +69 -0
- package/src/components/chat/README.md +1 -3
- package/src/components/chat/chat.css +1 -1
- package/src/components/chat/engine.ts +1 -1
- package/src/components/chat/react.tsx +1 -1
- package/src/components/chat-background/README.md +1 -3
- package/src/components/chat-background/audio.ts +1 -1
- package/src/components/chat-background/chat-background.css +2 -2
- package/src/components/chat-background/engine.ts +1 -1
- package/src/components/chat-background/react.tsx +1 -1
- package/src/components/cursor/README.md +3 -5
- package/src/components/cursor/cursor.css +3 -3
- package/src/components/cursor/element.ts +2 -2
- package/src/components/cursor/engine.ts +5 -5
- package/src/components/cursor/react.tsx +1 -1
- package/src/components/dialog/README.md +4 -8
- package/src/components/dialog/dialog.css +3 -3
- package/src/components/dialog/engine.ts +2 -2
- package/src/components/dialog/react.tsx +1 -1
- package/src/components/hover-card/README.md +16 -0
- package/src/components/hover-card/element.ts +8 -0
- package/src/components/hover-card/engine.ts +69 -0
- package/src/components/hover-card/hover-card.css +13 -0
- package/src/components/hover-card/react.tsx +19 -0
- package/src/components/input-otp/README.md +18 -0
- package/src/components/input-otp/element.ts +14 -0
- package/src/components/input-otp/engine.ts +106 -0
- package/src/components/input-otp/input-otp.css +9 -0
- package/src/components/input-otp/react.tsx +21 -0
- package/src/components/island/README.md +7 -7
- package/src/components/island/engine.ts +3 -3
- package/src/components/island/island.css +1 -1
- package/src/components/island/react.tsx +3 -3
- package/src/components/menu/README.md +2 -4
- package/src/components/menu/engine.ts +1 -1
- package/src/components/menu/menu.css +1 -1
- package/src/components/menu/react.tsx +1 -1
- package/src/components/nav/README.md +12 -14
- package/src/components/nav/engine.ts +5 -5
- package/src/components/nav/nav.css +1 -5
- package/src/components/nav/react.tsx +3 -3
- package/src/components/pagination/README.md +17 -0
- package/src/components/pagination/element.ts +14 -0
- package/src/components/pagination/engine.ts +102 -0
- package/src/components/pagination/pagination.css +10 -0
- package/src/components/pagination/react.tsx +22 -0
- package/src/components/quantity/README.md +20 -0
- package/src/components/quantity/element.ts +14 -0
- package/src/components/quantity/engine.ts +85 -0
- package/src/components/quantity/quantity.css +15 -0
- package/src/components/quantity/react.tsx +21 -0
- package/src/components/slot-picker/README.md +68 -0
- package/src/components/slot-picker/element.ts +27 -0
- package/src/components/slot-picker/engine.ts +412 -0
- package/src/components/slot-picker/react.tsx +76 -0
- package/src/components/slot-picker/slot-picker.css +125 -0
- package/src/components/steps/README.md +1 -3
- package/src/components/steps/engine.ts +3 -3
- package/src/components/steps/react.tsx +2 -2
- package/src/components/steps/steps.css +2 -2
- package/src/components/studio-dock/README.md +44 -0
- package/src/components/studio-dock/element.ts +11 -0
- package/src/components/studio-dock/engine.ts +212 -0
- package/src/components/studio-dock/react.tsx +23 -0
- package/src/components/studio-dock/studio-dock.css +34 -0
- package/src/components/theme-picker/README.md +3 -5
- package/src/components/theme-picker/engine.ts +2 -2
- package/src/components/theme-picker/react.tsx +1 -1
- package/src/components/theme-picker/theme-picker.css +1 -1
- package/src/components/toast/README.md +1 -3
- package/src/components/toast/engine.ts +2 -2
- package/src/components/toast/react.tsx +1 -1
- package/src/components/toast/store.ts +1 -2
- package/src/components/toast/toast.css +1 -1
- package/src/components/trailer/README.md +28 -0
- package/src/components/trailer/element.ts +13 -0
- package/src/components/trailer/engine.ts +189 -0
- package/src/components/trailer/react.tsx +16 -0
- package/src/components/trailer/trailer.css +36 -0
- package/src/core/channels.ts +3 -3
- package/src/core/curves.ts +3 -3
- package/src/core/dates.ts +98 -0
- package/src/core/gsap.ts +2 -2
- package/src/core/loop.ts +1 -1
- package/src/core/math.ts +1 -1
- package/src/core/physics-spring.ts +2 -2
- package/src/core/scroll-track.ts +2 -4
- package/src/core/spring.ts +1 -1
- package/src/core/timing.ts +21 -22
- package/src/css/controls/README.md +24 -20
- package/src/css/controls/burger.css +1 -1
- package/src/css/controls/button.css +4 -4
- package/src/css/controls/checkbox.css +1 -1
- package/src/css/controls/chip.css +1 -1
- package/src/css/controls/field.css +2 -2
- package/src/css/controls/glass.css +4 -4
- package/src/css/controls/status.css +63 -0
- package/src/css/default-theme.css +1 -1
- package/src/css/effects/README.md +19 -21
- package/src/css/effects/anim.css +1 -1
- package/src/css/effects/fade.css +1 -1
- package/src/css/effects/float.css +1 -1
- package/src/css/effects/frost.css +1 -1
- package/src/css/effects/grain.css +1 -1
- package/src/css/effects/loading.css +1 -1
- package/src/css/effects/success.css +1 -1
- package/src/css/effects/text.css +1 -1
- package/src/css/fonts.css +1 -1
- package/src/css/states.css +1 -1
- package/src/css/themes/black-green.css +1 -1
- package/src/css/themes/black.css +1 -1
- package/src/css/themes/blue.css +1 -1
- package/src/css/themes/brown.css +1 -1
- package/src/css/themes/cold-blue.css +1 -1
- package/src/css/themes/funny.css +1 -1
- package/src/css/themes/gray.css +1 -1
- package/src/css/themes/green.css +1 -1
- package/src/css/themes/modern-1.css +1 -1
- package/src/css/themes/neogreen.css +1 -1
- package/src/css/themes/new.css +1 -1
- package/src/css/themes/new2.css +1 -1
- package/src/css/themes/oled.css +1 -1
- package/src/css/themes/orange.css +1 -1
- package/src/css/themes/pastel-pink.css +1 -1
- package/src/css/themes/pink.css +1 -1
- package/src/css/themes/purple.css +1 -1
- package/src/css/themes/red.css +1 -1
- package/src/css/themes/super-blue.css +1 -1
- package/src/css/tokens.css +8 -8
- package/src/elements/index.ts +24 -0
- package/src/gl/liquid-blend/README.md +3 -3
- package/src/gl/matcap/README.md +3 -3
- package/src/gl/particle-hero/README.md +1 -1
- package/src/gl/particle-hero/create-particle-hero.ts +3 -5
- package/src/gl/particle-hero/shaders.ts +1 -1
- package/src/gl/shader-blur/README.md +3 -3
- package/src/gl/shader-grain/README.md +3 -3
- package/src/index.ts +25 -0
- package/src/motion/chat.ts +2 -2
- package/src/motion/confetti.ts +1 -1
- package/src/motion/count.ts +1 -1
- package/src/motion/details.ts +1 -1
- package/src/motion/drag-dismiss.ts +1 -1
- package/src/motion/effects.ts +1 -1
- package/src/motion/entrances.ts +1 -1
- package/src/motion/floating.ts +1 -1
- package/src/motion/flow.ts +2 -2
- package/src/motion/indicator.ts +1 -1
- package/src/motion/layout.ts +1 -1
- package/src/motion/liquid.ts +1 -1
- package/src/motion/morph.ts +2 -2
- package/src/motion/reveal.ts +1 -1
- package/src/motion/sheet.ts +1 -1
- package/src/motion/surface.ts +1 -1
- package/src/react/animated-number.tsx +2 -2
- package/src/react/flip-group.tsx +1 -1
- package/src/react/frost.tsx +1 -1
- package/src/react/index.ts +21 -0
- package/src/react/slot-text.tsx +1 -1
- package/src/react/use-action-button.ts +6 -0
- package/src/react/use-card-dock.ts +1 -1
- package/src/react/use-cascade.ts +1 -1
- package/src/react/use-contrast.ts +1 -1
- package/src/react/use-depth-grid.ts +1 -1
- package/src/react/use-editorial-reveal.ts +7 -0
- package/src/react/use-fill-text.ts +1 -1
- package/src/react/use-film-hero.ts +6 -0
- package/src/react/use-font-cycle.ts +7 -0
- package/src/react/use-frame-zoom.ts +1 -1
- package/src/react/use-image-zoom.ts +5 -0
- package/src/react/use-joined-cta.ts +5 -0
- package/src/react/use-letters.ts +1 -1
- package/src/react/use-local-clock.ts +5 -0
- package/src/react/use-marquee.ts +1 -1
- package/src/react/use-mask-text.ts +1 -1
- package/src/react/use-parallax.ts +1 -1
- package/src/react/use-particle-hero.ts +1 -1
- package/src/react/use-scroll-dock.ts +5 -0
- package/src/react/use-snap-strip.ts +1 -1
- package/src/react/use-sticker.ts +5 -0
- package/src/react/use-studio-dock.ts +8 -0
- package/src/react/use-text-roll.ts +1 -1
- package/src/react/use-thumbnail-nav.ts +7 -0
- package/src/react/use-trailer.ts +6 -0
- package/src/react/use-weight-hover.ts +5 -0
- package/src/recipes/action-button/README.md +31 -0
- package/src/recipes/action-button/action-button.css +113 -0
- package/src/recipes/action-button/create-action-button.ts +56 -0
- package/src/recipes/card-dock/README.md +1 -1
- package/src/recipes/card-dock/card-dock.css +1 -1
- package/src/recipes/card-dock/create-card-dock.ts +2 -2
- package/src/recipes/cascade/README.md +1 -3
- package/src/recipes/cascade/create-cascade.ts +3 -3
- package/src/recipes/contrast/README.md +0 -2
- package/src/recipes/contrast/create-contrast.ts +1 -1
- package/src/recipes/counter/README.md +0 -2
- package/src/recipes/counter/create-counter.ts +1 -1
- package/src/recipes/curved-carousel/README.md +0 -2
- package/src/recipes/curved-carousel/create-curved-carousel.ts +2 -2
- package/src/recipes/curved-carousel/curved-carousel.css +1 -1
- package/src/recipes/depth-grid/README.md +0 -2
- package/src/recipes/depth-grid/create-depth-grid.ts +3 -4
- package/src/recipes/details/README.md +0 -2
- package/src/recipes/details/create-details.ts +1 -1
- package/src/recipes/dock-pill/README.md +3 -3
- package/src/recipes/drag-ruler/README.md +3 -3
- package/src/recipes/editorial-reveal/README.md +35 -0
- package/src/recipes/editorial-reveal/create-editorial-reveal.ts +91 -0
- package/src/recipes/editorial-reveal/editorial-reveal.css +17 -0
- package/src/recipes/fill-text/README.md +1 -1
- package/src/recipes/fill-text/create-fill-text.ts +1 -1
- package/src/recipes/film-hero/README.md +23 -0
- package/src/recipes/film-hero/create-film-hero.ts +65 -0
- package/src/recipes/film-hero/film-hero.css +29 -0
- package/src/recipes/fit-text/README.md +0 -2
- package/src/recipes/flow/README.md +0 -2
- package/src/recipes/flow/create-flow.ts +1 -1
- package/src/recipes/font-cycle/README.md +11 -0
- package/src/recipes/font-cycle/create-font-cycle.ts +126 -0
- package/src/recipes/font-cycle/font-cycle.css +36 -0
- package/src/recipes/frame-zoom/README.md +1 -3
- package/src/recipes/frame-zoom/create-frame-zoom.ts +2 -2
- package/src/recipes/image-zoom/README.md +16 -0
- package/src/recipes/image-zoom/create-image-zoom.ts +27 -0
- package/src/recipes/image-zoom/image-zoom.css +7 -0
- package/src/recipes/infinite-reel/README.md +3 -3
- package/src/recipes/joined-cta/README.md +13 -0
- package/src/recipes/joined-cta/create-joined-cta.ts +22 -0
- package/src/recipes/joined-cta/joined-cta.css +17 -0
- package/src/recipes/letters/README.md +2 -4
- package/src/recipes/letters/create-letters.ts +3 -3
- package/src/recipes/local-clock/README.md +31 -0
- package/src/recipes/local-clock/create-local-clock.ts +61 -0
- package/src/recipes/marquee/README.md +0 -2
- package/src/recipes/marquee/create-marquee.ts +3 -3
- package/src/recipes/marquee/marquee.css +1 -1
- package/src/recipes/mask-text/README.md +3 -5
- package/src/recipes/mask-text/create-mask-text.ts +4 -4
- package/src/recipes/parallax/README.md +1 -3
- package/src/recipes/parallax/create-parallax.ts +1 -1
- package/src/recipes/pile/README.md +0 -2
- package/src/recipes/pile/create-pile.ts +1 -1
- package/src/recipes/pile/pile-math.ts +1 -1
- package/src/recipes/pile/pile.css +1 -1
- package/src/recipes/pill/README.md +0 -2
- package/src/recipes/pill/pill.css +2 -2
- package/src/recipes/pop/README.md +0 -2
- package/src/recipes/pop/create-pop.ts +1 -1
- package/src/recipes/radial-menu/README.md +0 -2
- package/src/recipes/radial-menu/create-radial-menu.ts +1 -1
- package/src/recipes/radial-menu/radial-menu.css +1 -1
- package/src/recipes/reflow/README.md +3 -5
- package/src/recipes/reflow/create-reflow.ts +1 -1
- package/src/recipes/repel-bento/README.md +3 -3
- package/src/recipes/reveal/README.md +0 -2
- package/src/recipes/reveal/create-reveal.ts +1 -1
- package/src/recipes/rotator/README.md +3 -3
- package/src/recipes/scroll-dock/README.md +46 -0
- package/src/recipes/scroll-dock/create-scroll-dock.ts +72 -0
- package/src/recipes/scroll-dock/scroll-dock.css +70 -0
- package/src/recipes/slot-text/README.md +0 -2
- package/src/recipes/slot-text/create-slot-text.ts +1 -1
- package/src/recipes/snap-strip/README.md +1 -1
- package/src/recipes/snap-strip/create-snap-strip.ts +5 -6
- package/src/recipes/snap-strip/snap-strip.css +1 -1
- package/src/recipes/sortable/README.md +3 -5
- package/src/recipes/sortable/create-sortable.ts +4 -4
- package/src/recipes/sortable/sortable.css +1 -1
- package/src/recipes/spring-cards/README.md +0 -2
- package/src/recipes/spring-cards/create-spring-cards.ts +1 -1
- package/src/recipes/spring-cards/spring-cards.css +1 -1
- package/src/recipes/sticker/README.md +59 -0
- package/src/recipes/sticker/create-sticker.ts +490 -0
- package/src/recipes/sticker/sticker.css +112 -0
- package/src/recipes/stretch-footer/README.md +0 -2
- package/src/recipes/stretch-footer/create-stretch-footer.ts +1 -1
- package/src/recipes/stretch-footer/stretch-footer.css +1 -1
- package/src/recipes/tabs/README.md +0 -2
- package/src/recipes/tabs/create-tabs.ts +1 -1
- package/src/recipes/text-roll/README.md +1 -3
- package/src/recipes/text-roll/create-text-roll.ts +3 -3
- package/src/recipes/text-roll/text-roll.css +1 -1
- package/src/recipes/thumbnail-nav/README.md +16 -0
- package/src/recipes/thumbnail-nav/create-thumbnail-nav.ts +165 -0
- package/src/recipes/thumbnail-nav/thumbnail-nav.css +108 -0
- package/src/recipes/ticket-menu/README.md +3 -3
- package/src/recipes/weight-hover/README.md +37 -0
- package/src/recipes/weight-hover/create-weight-hover.ts +136 -0
- package/src/recipes/weight-hover/weight-hover.css +7 -0
- package/src/recipes/words/README.md +0 -2
- package/src/recipes/words/create-words.ts +1 -1
- package/src/theme/generate.ts +1 -1
- package/src/theme/presets.ts +2 -2
- package/src/theme/theme.ts +1 -2
- package/dist/chunk-2BQGFOA7.js.map +0 -1
- package/dist/chunk-34XYOXHG.js.map +0 -1
- package/dist/chunk-6OJAP6ZL.js.map +0 -1
- package/dist/chunk-FS2HJVVY.js.map +0 -1
- package/dist/chunk-J27KH2A2.js.map +0 -1
- package/dist/chunk-KLY5BRRI.js.map +0 -1
- package/dist/chunk-Q4LVFNLN.js.map +0 -1
- package/dist/chunk-RFDIZYFX.js.map +0 -1
- /package/dist/{chunk-ABNRDDO7.js.map → chunk-I3DXF2KQ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/motion/chat.ts","../src/components/theme-picker/engine.ts","../src/components/toast/store.ts","../src/components/icons.ts","../src/components/toast/engine.ts","../src/components/chat-background/engine.ts","../src/components/chat/engine.ts","../src/components/nav/engine.ts","../src/components/steps/engine.ts","../src/components/cursor/engine.ts","../src/components/island/engine.ts"],"sourcesContent":["import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { splitWords } from '../core/split';\n\n/*\n * chat (PrettyChat): new bubbles grow from their speaker's side\n * (scale .5, 24 px blur, 0.7 s, 60 ms apart) while their words rise into place\n * (16 px, 6 px blur, 0.25 s, 50 ms apart, back.out). Words are split only for\n * the animation; tables and code stay whole; if splitting would reflow the text\n * by more than half a line, the text block moves as one.\n */\n\nexport interface EnterMessagesOptions {\n /** Text inside each bubble whose words rise. */\n textSelector?: string;\n}\n\nconst isUser = (bubble: HTMLElement) => bubble.dataset.mkRole === 'user' || bubble.classList.contains('user');\n\nexport function enterMessages(bubbles: HTMLElement[], { textSelector = '[data-mk-text], .message-text' }: EnterMessagesOptions = {}) {\n if (!bubbles.length || reduced()) return null;\n registerMotion();\n const reverts: Array<() => void> = [];\n const cleanup = () => {\n for (const revert of reverts.splice(0)) revert();\n };\n const timeline = gsap.timeline({ onComplete: cleanup, onInterrupt: cleanup });\n bubbles.forEach((bubble, index) => {\n gsap.set(bubble, { transformOrigin: isUser(bubble) ? '100% 50%' : '0% 50%' });\n timeline.fromTo(\n bubble,\n { scale: 0.5, autoAlpha: 0, filter: 'blur(24px)' },\n { scale: 1, autoAlpha: 1, filter: 'blur(0px)', duration: TIMING.bubble, ease: EASE.signature, clearProps: 'transform,opacity,visibility,filter' },\n index * TIMING.bubbleStagger,\n );\n const text = bubble.querySelector<HTMLElement>(textSelector);\n if (!text) return;\n const before = text.offsetHeight;\n const split = splitWords(text);\n const lineHeight = parseFloat(getComputedStyle(text).lineHeight) || 0;\n let targets: HTMLElement[] = split.parts;\n if (!split.parts.length || text.offsetHeight - before > lineHeight / 2) {\n split.revert();\n targets = [text];\n } else reverts.push(() => split.revert());\n timeline.fromTo(\n targets,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.wordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n },\n index * TIMING.bubbleStagger,\n );\n });\n return timeline;\n}\n\n/** A message box grows or shrinks to its text (0.18 s, power2.out), from `min` px. */\nexport function fitComposer(field: HTMLTextAreaElement, min = 64) {\n const from = field.offsetHeight;\n field.style.height = 'auto';\n const to = Math.max(min, field.scrollHeight);\n field.style.height = `${from}px`;\n if (from === to || reduced()) {\n field.style.height = `${to}px`;\n return null;\n }\n registerMotion();\n return gsap.to(field, { height: to, duration: TIMING.composer, ease: 'power2.out', overwrite: 'auto' });\n}\n\n/** Scroll a conversation to its newest message. */\nexport function scrollToLatest(scroller: HTMLElement) {\n const top = scroller.scrollHeight - scroller.clientHeight;\n if (reduced()) {\n scroller.scrollTop = top;\n return null;\n }\n registerMotion();\n const state = { top: scroller.scrollTop };\n return gsap.to(state, {\n top,\n duration: TIMING.chatScroll,\n ease: EASE.chatScroll,\n overwrite: 'auto',\n onUpdate: () => {\n scroller.scrollTop = state.top;\n },\n });\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { entrances } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { flowInPalette } from '../../motion/entrances';\nimport { THEMES } from '../../theme/presets';\nimport { THEME_EVENT, getTheme, setTheme } from '../../theme/theme';\n\n/*\n * theme picker: colour balls pop in (scale .5, blur 4, 10 ms apart);\n * a ball rounds into a squircle on hover and into a rounded square when chosen\n * (0.5 s, cubic(.38,.49,0,1.5)), with two blurred lights drifting inside.\n * Clicking one applies the theme (setTheme); external changes keep it in sync.\n */\n\nexport interface ThemePickerOptions {\n /** Theme ids to show, in order. Default: visible presets, or all with showHidden. */\n themes?: string[];\n showHidden?: boolean;\n labels?: { group?: string };\n onChange?: (id: string) => void;\n}\n\nexport interface ThemePickerInstance extends Instance {\n select(id: string): void;\n}\n\nexport function createThemePicker(root: HTMLElement | null, options: ThemePickerOptions = {}): ThemePickerInstance {\n if (!root) {\n warnOnce('theme-picker: missing root');\n return inert({ select() {} });\n }\n registerMotion();\n const scope = createScope();\n const ctx = gsap.context(() => {});\n const generated: HTMLElement[] = [];\n\n let swatches = [...root.querySelectorAll<HTMLElement>('[data-mk-swatch]')];\n if (!swatches.length) {\n const byId = new Map(THEMES.map((theme) => [theme.id as string, theme]));\n const ids = options.themes ?? THEMES.filter((theme) => options.showHidden || !theme.hidden).map((theme) => theme.id);\n for (const id of ids) {\n const theme = byId.get(id);\n if (!theme) {\n warnOnce(`theme-picker: unknown theme \"${id}\"`);\n continue;\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'mk-swatch';\n button.dataset.mkSwatch = theme.id;\n button.title = theme.name;\n button.setAttribute('aria-label', theme.name);\n button.style.setProperty('--mk-swatch', theme.seed);\n root.append(button);\n generated.push(button);\n }\n swatches = generated;\n }\n\n scope.attr(root, 'role', 'group');\n if (!root.hasAttribute('aria-label')) scope.attr(root, 'aria-label', options.labels?.group ?? 'Tema');\n\n const sync = () => {\n const current = getTheme().id;\n for (const swatch of swatches) scope.attr(swatch, 'aria-pressed', String(swatch.dataset.mkSwatch === current));\n };\n const select = (id: string) => {\n setTheme(id);\n options.onChange?.(id);\n };\n\n scope.on(root, 'click', (event) => {\n const swatch = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-swatch]');\n if (swatch && root.contains(swatch) && swatch.dataset.mkSwatch) select(swatch.dataset.mkSwatch);\n });\n scope.on(document, THEME_EVENT, sync);\n sync();\n if (entrances()) ctx.add(() => flowInPalette(swatches));\n root.dataset.mkReady = '';\n\n return {\n select,\n destroy() {\n scope.dispose();\n ctx.revert();\n for (const button of generated.splice(0)) button.remove();\n delete root.dataset.mkReady;\n },\n };\n}\n","/*\n * The toasts on screen and their timers. Framework-agnostic: any number of toasters (vanilla, element, React)\n * render the same list. A timer pauses while the deck is open and resumes with\n * what was left. Never put a secret in a message: toasts confirm an action.\n */\n\nexport type ToastTone = 'success' | 'error' | 'info' | 'neutral';\n\nexport interface ToastAction {\n label: string;\n onClick: () => void;\n}\n\nexport interface ToastOptions {\n /** The control the toast grows out of. */\n origin?: HTMLElement | null;\n /** ms on screen; 0 keeps it until dismissed. */\n duration?: number;\n tone?: ToastTone;\n action?: ToastAction;\n /** Show the tone's icon (default). */\n icon?: boolean;\n}\n\nexport interface ToastItem {\n id: number;\n message: string;\n origin: HTMLElement | null;\n duration: number;\n tone: ToastTone;\n action: ToastAction | null;\n icon: boolean;\n closing: boolean;\n}\n\n/** At most this many live toasts; older ones leave to make room. */\nexport const TOAST_LIMIT = 5;\n\nlet items: ToastItem[] = [];\nlet nextId = 1;\nconst listeners = new Set<() => void>();\nconst emit = () => {\n for (const listener of listeners) listener();\n};\n\nexport const getToasts = () => items;\n\nexport function subscribeToasts(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction show(message: string, { origin = null, duration = 4000, tone = 'success', action, icon = true }: ToastOptions = {}) {\n const id = nextId++;\n const live = items.filter((item) => !item.closing);\n const extra = new Set(live.slice(0, Math.max(0, live.length - TOAST_LIMIT + 1)).map((item) => item.id));\n items = [\n ...items.map((item) => (extra.has(item.id) ? { ...item, closing: true } : item)),\n { id, message, origin, duration, tone, action: action ?? null, icon, closing: false },\n ];\n emit();\n return id;\n}\n\n/** Start the closing animation of a toast. */\nexport function dismissToast(id: number) {\n const item = items.find((entry) => entry.id === id);\n if (!item || item.closing) return;\n items = items.map((entry) => (entry.id === id ? { ...entry, closing: true } : entry));\n emit();\n}\n\n/** Take a toast out of the list (after its exit animation). */\nexport function removeToast(id: number) {\n toastTimers.clear(id);\n items = items.filter((entry) => entry.id !== id);\n emit();\n}\n\n/** Remove every toast at once (no animation). */\nexport function clearToasts() {\n for (const item of items) toastTimers.clear(item.id);\n items = [];\n emit();\n}\n\n/** Show a toast: `toast('Copiado', { origin: button })`. Returns its id. */\nexport const toast = Object.assign(show, { dismiss: dismissToast, clear: clearToasts });\n\nconst running = new Map<number, { handle: ReturnType<typeof setTimeout> | null; remaining: number; started: number }>();\n\nexport const toastTimers = {\n start(id: number, duration: number) {\n if (duration <= 0 || running.has(id)) return;\n running.set(id, { handle: setTimeout(() => dismissToast(id), duration), remaining: duration, started: Date.now() });\n },\n pause(id: number) {\n const timer = running.get(id);\n if (!timer?.handle) return;\n clearTimeout(timer.handle);\n timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.started));\n timer.handle = null;\n },\n resume(id: number) {\n const timer = running.get(id);\n if (!timer || timer.handle) return;\n if (timer.remaining <= 0) {\n dismissToast(id);\n return;\n }\n timer.started = Date.now();\n timer.handle = setTimeout(() => dismissToast(id), timer.remaining);\n },\n clear(id: number) {\n const timer = running.get(id);\n if (timer?.handle) clearTimeout(timer.handle);\n running.delete(id);\n },\n};\n","/*\n * The few icons the components draw themselves (close, float, dock, tones), as\n * 24 × 24 stroke paths, so no component depends on the Material Symbols font.\n */\n\nexport const ICON_PATHS = {\n close: 'M6 6l12 12M18 6L6 18',\n expand: 'M14 4h6v6M10 20H4v-6M20 4l-7 7M4 20l7-7',\n shrink: 'M4 14h6v6M20 10h-6V4M10 14l-7 7M14 10l7-7',\n check: 'M5 12.5l4.5 4.5L19 7.5',\n alert: 'M12 8v5M12 16.5v.01M10.3 3.9L2.6 17.3a2 2 0 001.7 3h15.4a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z',\n info: 'M12 11v6M12 7.5v.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z',\n send: 'M12 19V5M5.5 11.5L12 5l6.5 6.5',\n mic: 'M12 3a3 3 0 00-3 3v6a3 3 0 006 0V6a3 3 0 00-3-3zM5.5 11a6.5 6.5 0 0013 0M12 17.5V21',\n sparkle: 'M12 3l1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9z',\n grip: 'M9 6h.01M15 6h.01M9 12h.01M15 12h.01M9 18h.01M15 18h.01',\n} as const;\n\nexport type IconName = keyof typeof ICON_PATHS;\n\n/** An inline SVG string (aria-hidden), for vanilla engines and custom elements. */\nexport function iconSvg(name: IconName, size = 20) {\n return `<svg aria-hidden=\"true\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"${ICON_PATHS[name]}\"/></svg>`;\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { bezier, channels, easeInCubic, easeOut, easeOutCubic, eased, spring, springEase } from '../../core/channels';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { splitGraphemes } from '../../core/split';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { iconSvg, type IconName } from '../icons';\nimport { dismissToast, getToasts, removeToast, subscribeToasts, toastTimers, type ToastItem, type ToastTone } from './store';\n\n/*\n * toast deck:\n * - toasts stack at the top; older ones peek out 16 px below, 5 % smaller each,\n * three drawn; hovering opens the deck (spring .55, 60 ms cascade) and pauses\n * the timers, leaving closes it after 150 ms;\n * - a toast with an origin grows out of that control (spring travel 144/14 with\n * a 2400 px/s kick, size 0.32 s, content zooming in from twice its size);\n * otherwise it slides in 12 px out of a 6 px blur; its letters rise one by one;\n * - it leaves 24 px up into a 4 px blur (0.3 s) and can be swiped up (48 px) or\n * wheeled away (80 px).\n */\n\nconst STACK = { peek: 16, scaleStep: 0.05, minScale: 0.7, maxVisible: 3, gap: 8, baseZ: 1000 };\nconst DISTANCE = { enter: 12, enterBlur: 6, exit: 24, exitBlur: 4, fade: 120 };\nconst GESTURE = { swipe: 48, wheel: 80, expandDrag: 24, resistance: 0.15, wheelEndMs: 140 };\nconst TONE_ICONS: Record<ToastTone, IconName | null> = { success: 'check', error: 'alert', info: 'info', neutral: null };\n\nexport interface ToasterLabels {\n dismiss?: string;\n}\n\nexport interface ToasterOptions {\n labels?: ToasterLabels;\n}\n\nexport type ToasterInstance = Instance;\n\ninterface Card {\n card: HTMLElement;\n shell: HTMLElement;\n body: HTMLElement;\n message: HTMLElement;\n}\n\n/** Where each live toast rests: index 0 is the newest, on top. */\nfunction layout(count: number, expanded: boolean, heights: number[]) {\n let offset = 0;\n return Array.from({ length: count }, (_, index) => {\n if (expanded) {\n const slot = { y: offset, scale: 1, opacity: 1, visible: true, zIndex: STACK.baseZ - index };\n offset += (heights[index] ?? 0) + STACK.gap;\n return slot;\n }\n const visible = index < STACK.maxVisible;\n return {\n y: index * STACK.peek,\n scale: Math.max(STACK.minScale, 1 - index * STACK.scaleStep),\n opacity: visible ? 1 : 0,\n visible,\n zIndex: STACK.baseZ - index,\n };\n });\n}\n\n/** A message's letters rise into place (graphemes, words kept together, at most 64). */\nfunction revealLetters(element: HTMLElement) {\n const text = element.textContent ?? '';\n const T = TIMING.toast;\n if (!text || text.length > 64 || reduced()) return;\n const letters = splitGraphemes(text, 64);\n const original = element.innerHTML;\n const width = element.getBoundingClientRect().width;\n const fragment = document.createDocumentFragment();\n const chars: HTMLSpanElement[] = [];\n let word: HTMLSpanElement | null = null;\n for (const letter of letters) {\n if (!letter.trim()) {\n word = null;\n fragment.append(document.createTextNode(letter));\n continue;\n }\n if (!word) {\n word = document.createElement('span');\n word.style.display = 'inline-block';\n word.style.whiteSpace = 'nowrap';\n fragment.append(word);\n }\n const char = document.createElement('span');\n char.textContent = letter;\n char.style.display = 'inline-block';\n word.append(char);\n chars.push(char);\n }\n if (width) element.style.width = `${width}px`;\n element.textContent = '';\n element.append(fragment);\n gsap.fromTo(\n chars,\n { opacity: 0, yPercent: 40, filter: 'blur(4px)' },\n {\n opacity: 1,\n yPercent: 0,\n filter: 'blur(0px)',\n duration: T.chars,\n ease: easeOutCubic,\n delay: (index: number) => T.charsDelay + index * T.charsStagger,\n onComplete: () => {\n element.innerHTML = original;\n element.style.width = '';\n },\n },\n );\n}\n\n/** Grow a toast's shell out of `origin`. Returns a function that settles it now. */\nfunction morphFrom(card: HTMLElement, shell: HTMLElement, body: HTMLElement, origin: HTMLElement) {\n const T = TIMING.toast;\n const box = shell.getBoundingClientRect();\n const start = origin.getBoundingClientRect();\n const look = getComputedStyle(origin);\n const own = getComputedStyle(shell);\n const endRadius = parseFloat(own.borderTopLeftRadius) || 20;\n const startRadius = Math.min(parseFloat(look.borderTopLeftRadius) || 0, start.height / 2);\n card.style.width = `${box.width}px`;\n card.style.height = `${box.height}px`;\n body.style.width = `${body.getBoundingClientRect().width}px`;\n const towardX = start.left + start.width / 2 < innerWidth / 2 ? 1 : -1;\n const towardY = start.top + start.height / 2 < innerHeight / 2 ? 1 : -1;\n const offset = { x: start.left - box.left, y: start.top - box.top };\n Object.assign(shell.style, {\n position: 'absolute',\n top: '0px',\n left: '0px',\n width: `${start.width}px`,\n height: `${start.height}px`,\n borderRadius: `${startRadius}px`,\n background: look.backgroundColor,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n transition: 'none',\n });\n Object.assign(body.style, { transform: 'scale(2)', transformOrigin: 'center center', filter: 'blur(8px)', opacity: '0' });\n // The control steps aside while its toast leaves it.\n origin.style.transition = 'opacity 160ms ease';\n origin.style.opacity = '0';\n void shell.offsetWidth;\n shell.style.transition = `background ${T.morphColor}s ease-out ${T.morphColorDelay}s, box-shadow ${T.morphShadow}s ease-out ${T.morphShadowDelay}s`;\n shell.style.background = '';\n body.style.transition = `opacity ${T.morphColor}s ease-out ${T.morphColorDelay}s`;\n body.style.opacity = '1';\n const motion = channels(\n { x: offset.x, y: offset.y, width: start.width, height: start.height, radius: startRadius, scale: 2, blur: 8 },\n (name, value) => {\n if (name === 'x') offset.x = value;\n else if (name === 'y') offset.y = value;\n else if (name === 'width') shell.style.width = `${value}px`;\n else if (name === 'height') shell.style.height = `${value}px`;\n else if (name === 'radius') shell.style.borderRadius = `${value}px`;\n else if (name === 'scale') body.style.transform = `scale(${value})`;\n else if (name === 'blur') body.style.filter = `blur(${value}px)`;\n if (name === 'x' || name === 'y') shell.style.transform = `translate(${offset.x}px, ${offset.y}px)`;\n },\n );\n void motion.animate(\n { x: 0, y: 0, width: box.width, height: box.height, radius: endRadius, scale: 1, blur: 0 },\n {\n x: spring(144, 14, { velocity: 2400, direction: towardX }),\n y: spring(144, 14, { velocity: 2400, direction: towardY }),\n width: eased(T.morphSize, bezier(0.8, 0.3, 0.5, 0.8)),\n height: eased(T.morphSize, bezier(0.8, 0.3, 0.5, 0.8)),\n radius: eased(T.morphRadius, easeOut),\n scale: eased(T.morphContent, easeOut),\n blur: eased(T.morphContent, easeOut),\n },\n );\n let settled = false;\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n motion.stop();\n for (const name of ['position', 'top', 'left', 'width', 'height', 'border-radius', 'background', 'transform', 'transition']) shell.style.removeProperty(name);\n card.style.removeProperty('width');\n card.style.removeProperty('height');\n for (const name of ['transform', 'transform-origin', 'filter', 'opacity', 'width', 'transition']) body.style.removeProperty(name);\n origin.style.transition = 'opacity 300ms ease';\n origin.style.opacity = '';\n setTimeout(() => {\n origin.style.transition = '';\n }, 320);\n };\n const timer = setTimeout(settle, T.safetyMs);\n return settle;\n}\n\nfunction buildCard(item: ToastItem, dismissLabel: string): Card {\n const card = document.createElement('div');\n card.className = 'mk-toast';\n card.dataset.mkToast = String(item.id);\n card.dataset.mkTone = item.tone;\n const shell = document.createElement('div');\n shell.className = 'mk-toast__shell';\n const body = document.createElement('div');\n body.className = 'mk-toast__body';\n const icon = item.icon ? TONE_ICONS[item.tone] : null;\n if (icon) {\n const holder = document.createElement('span');\n holder.className = 'mk-toast__icon';\n holder.innerHTML = iconSvg(icon, 18);\n body.append(holder);\n }\n const message = document.createElement('span');\n message.className = 'mk-toast__message';\n message.textContent = item.message;\n body.append(message);\n if (item.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.className = 'mk-toast__action';\n action.dataset.mkToastAction = '';\n action.textContent = item.action.label;\n body.append(action);\n }\n const dismiss = document.createElement('button');\n dismiss.type = 'button';\n dismiss.className = 'mk-toast__dismiss';\n dismiss.dataset.mkToastDismiss = '';\n dismiss.setAttribute('aria-label', dismissLabel);\n dismiss.innerHTML = iconSvg('close', 14);\n body.append(dismiss);\n shell.append(body);\n card.append(shell);\n return { card, shell, body, message };\n}\n\n/** Render the toast list into `host` (a fixed layer at the top of the screen). */\nexport function createToaster(host: HTMLElement | null, options: ToasterOptions = {}): ToasterInstance {\n if (!host) {\n warnOnce('toaster: missing host');\n return inert();\n }\n registerMotion();\n const dismissLabel = options.labels?.dismiss ?? 'Cerrar';\n const scope = createScope();\n const cards = new Map<number, Card>();\n const entered = new Set<number>();\n const leaving = new Set<number>();\n const dragging = new Set<number>();\n const settles = new Map<number, () => void>();\n let expanded = false;\n let collapse: ReturnType<typeof setTimeout> | undefined;\n const popover = typeof host.showPopover === 'function';\n\n scope.attr(host, 'role', 'status');\n scope.attr(host, 'aria-live', 'polite');\n if (popover) scope.attr(host, 'popover', 'manual');\n\n const live = () =>\n getToasts()\n .filter((item) => !item.closing)\n .reverse()\n .map((item) => ({ item, entry: cards.get(item.id) }))\n .filter((pair): pair is { item: ToastItem; entry: Card } => pair.entry !== undefined);\n\n const slotsFor = () => {\n const entries = live();\n return { entries, slots: layout(entries.length, expanded, entries.map(({ entry }) => entry.card.offsetHeight)) };\n };\n\n const relayout = (duration: number = TIMING.toast.relayout, ease: gsap.EaseFunction = easeOutCubic, stagger = 0) => {\n const { entries, slots } = slotsFor();\n entries.forEach(({ item, entry }, index) => {\n const slot = slots[index];\n if (!slot) return;\n entry.card.style.zIndex = String(slot.zIndex);\n entry.card.style.pointerEvents = slot.visible ? 'auto' : 'none';\n entry.card.setAttribute('aria-hidden', slot.visible ? 'false' : 'true');\n if (dragging.has(item.id) || !entered.has(item.id)) return;\n gsap.to(entry.card, {\n xPercent: -50,\n y: slot.y,\n scale: slot.scale,\n opacity: slot.opacity,\n duration: reduced() ? 0 : duration,\n ease,\n delay: stagger * index,\n overwrite: 'auto',\n });\n });\n };\n const restingY = (id: number) => {\n const { entries, slots } = slotsFor();\n return slots[entries.findIndex(({ item }) => item.id === id)]?.y ?? 0;\n };\n\n const openDeck = () => {\n clearTimeout(collapse);\n if (expanded) return;\n expanded = true;\n for (const { item } of live()) toastTimers.pause(item.id);\n relayout(TIMING.toast.expand, springEase(0.55), TIMING.toast.expandStagger);\n };\n const closeDeck = () => {\n clearTimeout(collapse);\n collapse = setTimeout(() => {\n if (!expanded) return;\n expanded = false;\n for (const { item } of live()) toastTimers.resume(item.id);\n relayout(TIMING.toast.expand, springEase(0.55), TIMING.toast.expandStagger);\n }, TIMING.toast.collapseDelayMs);\n };\n\n const showLayer = (visible: boolean) => {\n if (!popover) return;\n try {\n if (host.matches(':popover-open')) host.hidePopover();\n if (visible) host.showPopover();\n } catch {\n // :popover-open unsupported (no popover API): nothing to toggle.\n }\n };\n\n const attachGestures = (item: ToastItem, card: HTMLElement) => {\n let start: { y: number; type: string } | null = null;\n let wheel: { offset: number; end: ReturnType<typeof setTimeout> | undefined } | null = null;\n const move = (offset: number) => gsap.set(card, { y: restingY(item.id) + offset, opacity: Math.max(0, 1 + Math.min(0, offset) / DISTANCE.fade) });\n const cancel = () => {\n dragging.delete(item.id);\n gsap.to(card, { y: restingY(item.id), opacity: 1, duration: 0.25, ease: easeOutCubic });\n if (!expanded) toastTimers.resume(item.id);\n };\n card.addEventListener('mouseenter', openDeck);\n card.addEventListener('mouseleave', closeDeck);\n card.addEventListener('pointerdown', (event) => {\n if (event.button !== 0 || (event.target as Element).closest('button, a, input, textarea, select, [role=\"button\"]')) return;\n start = { y: event.clientY, type: event.pointerType };\n card.setPointerCapture?.(event.pointerId);\n dragging.add(item.id);\n gsap.killTweensOf(card);\n toastTimers.pause(item.id);\n });\n card.addEventListener('pointermove', (event) => {\n if (!start) return;\n const dy = event.clientY - start.y;\n move(dy < 0 ? dy : start.type === 'touch' ? dy * GESTURE.resistance : 0);\n });\n const up = (event: PointerEvent) => {\n if (!start) return;\n const dy = event.clientY - start.y;\n const type = start.type;\n start = null;\n if (dy < -GESTURE.swipe) {\n dragging.delete(item.id);\n dismissToast(item.id);\n } else if (type === 'touch' && dy > GESTURE.expandDrag) {\n cancel();\n if (expanded) closeDeck();\n else openDeck();\n } else cancel();\n };\n card.addEventListener('pointerup', up);\n card.addEventListener('pointercancel', up);\n card.addEventListener(\n 'wheel',\n (event) => {\n const delta = event.deltaMode === 1 ? event.deltaY * 16 : event.deltaMode === 2 ? event.deltaY * innerHeight : event.deltaY;\n if (!wheel) {\n wheel = { offset: 0, end: undefined };\n dragging.add(item.id);\n toastTimers.pause(item.id);\n }\n wheel.offset = Math.min(0, wheel.offset - delta);\n move(wheel.offset);\n clearTimeout(wheel.end);\n wheel.end = setTimeout(() => {\n const offset = wheel?.offset ?? 0;\n wheel = null;\n if (offset < -GESTURE.wheel) {\n dragging.delete(item.id);\n dismissToast(item.id);\n } else cancel();\n }, GESTURE.wheelEndMs);\n },\n { passive: true },\n );\n card.addEventListener('click', (event) => {\n const target = event.target as Element;\n if (target.closest('[data-mk-toast-dismiss]')) dismissToast(item.id);\n else if (target.closest('[data-mk-toast-action]')) {\n item.action?.onClick();\n dismissToast(item.id);\n }\n });\n };\n\n const finishCard = (id: number) => {\n settles.get(id)?.();\n settles.delete(id);\n const entry = cards.get(id);\n if (entry) {\n gsap.killTweensOf(entry.card);\n entry.card.remove();\n }\n cards.delete(id);\n entered.delete(id);\n leaving.delete(id);\n dragging.delete(id);\n };\n\n const render = () => {\n const list = getToasts();\n const ids = new Set(list.map((item) => item.id));\n for (const id of [...cards.keys()]) if (!ids.has(id)) finishCard(id);\n for (const item of list) {\n if (!cards.has(item.id) && !item.closing) {\n const entry = buildCard(item, dismissLabel);\n cards.set(item.id, entry);\n host.append(entry.card);\n gsap.set(entry.card, { xPercent: -50 });\n attachGestures(item, entry.card);\n }\n }\n showLayer(list.some((item) => !item.closing) || leaving.size > 0);\n for (const item of list) {\n const entry = cards.get(item.id);\n if (!entry) continue;\n if (!entered.has(item.id) && !item.closing) {\n entered.add(item.id);\n toastTimers.start(item.id, item.duration);\n relayout();\n gsap.killTweensOf(entry.card);\n gsap.set(entry.card, { xPercent: -50, y: restingY(item.id), scale: 1, opacity: 1 });\n if (expanded) toastTimers.pause(item.id);\n revealLetters(entry.message);\n if (reduced()) continue;\n if (item.origin?.isConnected) settles.set(item.id, morphFrom(entry.card, entry.shell, entry.body, item.origin));\n else {\n const y = restingY(item.id);\n gsap.fromTo(\n entry.card,\n { y: y - DISTANCE.enter, opacity: 0, filter: `blur(${DISTANCE.enterBlur}px)` },\n { y, opacity: 1, filter: 'blur(0px)', duration: TIMING.toast.enter, ease: springEase(0.58, -3.5), clearProps: 'filter' },\n );\n }\n }\n if (item.closing && !leaving.has(item.id)) {\n leaving.add(item.id);\n toastTimers.clear(item.id);\n entry.card.style.zIndex = String(STACK.baseZ + 1);\n const done = () => {\n finishCard(item.id);\n removeToast(item.id);\n };\n if (reduced()) done();\n else {\n gsap.to(entry.card, {\n y: Number(gsap.getProperty(entry.card, 'y')) - DISTANCE.exit,\n opacity: 0,\n filter: `blur(${DISTANCE.exitBlur}px)`,\n duration: TIMING.toast.exit,\n ease: easeInCubic,\n overwrite: 'auto',\n onComplete: done,\n });\n }\n relayout();\n }\n }\n };\n\n scope.add(subscribeToasts(render));\n render();\n host.dataset.mkReady = '';\n\n return {\n destroy() {\n clearTimeout(collapse);\n for (const id of [...cards.keys()]) finishCard(id);\n showLayer(false);\n scope.dispose();\n delete host.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * Chat background: two soft blobs (primary-container and\n * tertiary-container, 800 px radial gradients, saturate 150 %) orbit behind the\n * chat and a grain sits on top. Energy (0…1, e.g. the microphone's) speeds the\n * orbits up (10 − 3.5·e s and 15 − 4.5·e s), brightens the blobs (.5 + .15·e) and\n * scales them ((1 + .1·e)·scale). Onboarding's \"busy\" state pushes it to energy\n * 1.6 and scale 1.8 in 0.8 s (power2.out) and back in 0.6 s (power2.inOut).\n */\n\nexport interface ChatBackgroundOptions {\n energy?: number;\n scale?: number;\n}\n\nexport interface ChatBackgroundInstance extends Instance {\n setEnergy(energy: number): void;\n setScale(scale: number): void;\n /** Onboarding's busy state: energy 1.6 / scale 1.8, or back to rest. */\n busy(on: boolean): void;\n readonly energy: number;\n readonly scale: number;\n}\n\nconst VARS = ['--mk-chat-orbit-1', '--mk-chat-orbit-2', '--mk-chat-blob-opacity', '--mk-chat-scale'];\nconst instances = new WeakMap<Element, ChatBackgroundInstance>();\n\n/** The background instance running on `el` (steps and chat use it to drive the energy). */\nexport const chatBackgroundOf = (el: Element | null | undefined) => (el ? (instances.get(el) ?? null) : null);\n\nexport function createChatBackground(root: HTMLElement | null, options: ChatBackgroundOptions = {}): ChatBackgroundInstance {\n if (!root) {\n warnOnce('chat-background: missing root');\n return inert({ setEnergy() {}, setScale() {}, busy() {}, energy: 0, scale: 1 });\n }\n registerMotion();\n const scope = createScope();\n const state = { energy: options.energy ?? 0, scale: options.scale ?? 1 };\n let noise = root.querySelector<HTMLElement>(':scope > .mk-chat-background__noise');\n if (!noise) {\n noise = document.createElement('div');\n noise.className = 'mk-chat-background__noise';\n noise.setAttribute('aria-hidden', 'true');\n root.append(noise);\n const created = noise;\n scope.add(() => created.remove());\n }\n scope.attr(root, 'aria-hidden', 'true');\n\n const paint = () => {\n const e = Math.max(0, state.energy);\n root.style.setProperty('--mk-chat-orbit-1', `${Math.max(1, 10 - 3.5 * e).toFixed(3)}s`);\n root.style.setProperty('--mk-chat-orbit-2', `${Math.max(1, 15 - 4.5 * e).toFixed(3)}s`);\n root.style.setProperty('--mk-chat-blob-opacity', (0.5 + 0.15 * e).toFixed(3));\n root.style.setProperty('--mk-chat-scale', ((1 + 0.1 * e) * state.scale).toFixed(3));\n };\n scope.add(() => {\n gsap.killTweensOf(state);\n for (const name of VARS) root.style.removeProperty(name);\n if (root.getAttribute('style') === '') root.removeAttribute('style');\n });\n paint();\n\n const instance: ChatBackgroundInstance = {\n setEnergy(energy: number) {\n state.energy = Number.isFinite(energy) ? energy : 0;\n paint();\n },\n setScale(scale: number) {\n state.scale = Number.isFinite(scale) ? scale : 1;\n paint();\n },\n busy(on: boolean) {\n const to = on ? { energy: 1.6, scale: 1.8 } : { energy: 0, scale: 1 };\n gsap.killTweensOf(state);\n if (reduced()) {\n Object.assign(state, to);\n paint();\n return;\n }\n gsap.to(state, {\n ...to,\n duration: on ? TIMING.onboarding.busy : TIMING.onboarding.idle,\n ease: on ? 'power2.out' : 'power2.inOut',\n onUpdate: paint,\n });\n },\n get energy() {\n return state.energy;\n },\n get scale() {\n return state.scale;\n },\n destroy() {\n instances.delete(root);\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n instances.set(root, instance);\n root.dataset.mkReady = '';\n return instance;\n}\n","import { gsap, Flip, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { splitWords } from '../../core/split';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { enterMessages, fitComposer, scrollToLatest } from '../../motion/chat';\nimport { flowIn } from '../../motion/flow';\nimport { iconSvg } from '../icons';\n\n/*\n * Chat: new bubbles grow from their speaker's side while their\n * words rise (enterMessages); the conversation scrolls to the newest one\n * (0.35 s). A \"Pensando…\" placeholder shows only if the answer takes more than\n * 500 ms, and then morphs (Flip, 0.7 s, no scaling of the text) into the reply.\n * The composer grows with its text (0.18 s, from 64 px); Enter sends.\n * Parts: [data-mk-part] messages, composer, input, mic, send.\n * Messages: [data-mk-message] with data-mk-role=\"user|assistant|system\" and a [data-mk-text].\n */\n\nexport type ChatRole = 'user' | 'assistant' | 'system';\n\nexport interface ChatLabels {\n thinking?: string;\n}\n\nexport interface ChatOptions {\n /** Animate the messages already there when the chat starts (default: no, history stays still). */\n animateExisting?: boolean;\n /** Clear the input after sending (default). */\n clearOnSend?: boolean;\n labels?: ChatLabels;\n onSend?: (text: string) => void;\n}\n\nexport interface ChatInstance extends Instance {\n /** Append a plain-text message (vanilla convenience); it enters on its own. */\n add(role: ChatRole, text: string): HTMLElement;\n /** Show the thinking placeholder after 500 ms (a fast answer never shows it). */\n pending(): void;\n /** Add the answer: it morphs out of the placeholder if that was showing, else it enters. */\n reply(message: HTMLElement | string): HTMLElement;\n /** A confirmation bar flows in and its words rise. */\n confirm(bar: HTMLElement): void;\n setRecording(on: boolean): void;\n scrollToLatest(): void;\n /** Mark a message as already shown (a framework animates it itself). */\n adopt(message: Element): void;\n readonly messages: HTMLElement;\n}\n\nconst MESSAGE = '[data-mk-message]';\n/** data-flip-id of the thinking placeholder; a framework's own placeholder must carry it. */\nexport const PENDING_ID = 'mk-chat-pending';\nconst part = (root: HTMLElement, name: string) => root.querySelector<HTMLElement>(`[data-mk-part=\"${name}\"]`);\n\n/** The thinking placeholder's geometry, taken before the DOM changes (for frameworks). */\nexport const capturePending = (placeholder: Element | null) => {\n registerMotion();\n return placeholder ? Flip.getState(placeholder) : null;\n};\n\n/** Morph a captured placeholder into the reply (after the DOM shows the reply). */\nexport function morphPendingToReply(state: ReturnType<typeof Flip.getState> | null, reply: HTMLElement, scroller?: HTMLElement | null) {\n registerMotion();\n if (!state || reduced()) {\n if (!reduced()) enterMessages([reply]);\n return null;\n }\n const text = reply.querySelector<HTMLElement>('[data-mk-text], .message-text');\n if (text) text.style.width = `${text.getBoundingClientRect().width}px`;\n // Flip pairs the reply with the placeholder by this id (the placeholder carries it too).\n reply.setAttribute('data-flip-id', PENDING_ID);\n const words = text && !text.querySelector('table, pre') ? splitWords(text) : null;\n if (words?.parts.length) {\n gsap.fromTo(\n words.parts,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.wordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n onComplete: () => words.revert(),\n },\n );\n }\n return Flip.from(state, {\n targets: reply,\n duration: TIMING.bubble,\n scale: false,\n ease: EASE.signature,\n onUpdate: () => {\n if (scroller) scroller.scrollTop = scroller.scrollHeight;\n },\n onComplete: () => {\n reply.removeAttribute('data-flip-id');\n if (text) text.style.width = '';\n },\n });\n}\n\n/** A message bubble element (plain text). */\nexport function chatMessage(role: ChatRole, text: string) {\n const message = document.createElement('div');\n message.dataset.mkMessage = '';\n message.dataset.mkRole = role;\n const body = document.createElement('span');\n body.dataset.mkText = '';\n body.textContent = text;\n message.append(body);\n return message;\n}\n\nexport function createChat(root: HTMLElement | null, options: ChatOptions = {}): ChatInstance {\n const messages = root ? part(root, 'messages') : null;\n if (!root || !messages) {\n warnOnce('chat: needs a [data-mk-part=\"messages\"] container');\n return inert({\n add: () => document.createElement('div'),\n pending() {},\n reply: () => document.createElement('div'),\n confirm() {},\n setRecording() {},\n scrollToLatest() {},\n adopt() {},\n messages: null as unknown as HTMLElement,\n });\n }\n registerMotion();\n const { clearOnSend = true } = options;\n const thinking = options.labels?.thinking ?? 'Pensando...';\n const scope = createScope();\n const composer = part(root, 'composer');\n const input = composer?.querySelector<HTMLTextAreaElement>('[data-mk-part=\"input\"], textarea') ?? null;\n const mic = part(root, 'mic');\n const seen = new WeakSet<Element>();\n let placeholder: HTMLElement | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | undefined;\n let waiting = false;\n\n scope.attr(messages, 'role', 'log');\n scope.attr(messages, 'aria-live', 'polite');\n const existing = [...messages.querySelectorAll<HTMLElement>(MESSAGE)];\n if (options.animateExisting) enterMessages(existing);\n for (const message of existing) seen.add(message);\n\n // New bubbles (from the app, a framework or add()) enter on their own.\n const observer = scope.observe(\n new MutationObserver((records) => {\n const fresh: HTMLElement[] = [];\n for (const record of records) {\n for (const node of record.addedNodes) {\n if (!(node instanceof HTMLElement) || !node.matches(MESSAGE) || seen.has(node)) continue;\n seen.add(node);\n fresh.push(node);\n }\n }\n if (!fresh.length) return;\n enterMessages(fresh);\n scrollToLatest(messages);\n }),\n );\n observer.observe(messages, { childList: true });\n\n const clearPending = () => {\n clearTimeout(pendingTimer);\n pendingTimer = undefined;\n waiting = false;\n };\n\n const add = (role: ChatRole, text: string) => {\n const message = chatMessage(role, text);\n messages.append(message);\n return message;\n };\n\n const pending = () => {\n clearPending();\n waiting = true;\n pendingTimer = setTimeout(() => {\n pendingTimer = undefined;\n if (!waiting || placeholder) return;\n placeholder = document.createElement('div');\n placeholder.dataset.mkMessage = '';\n placeholder.dataset.mkRole = 'assistant';\n placeholder.dataset.mkPending = '';\n placeholder.setAttribute('data-flip-id', PENDING_ID);\n placeholder.innerHTML = `<span class=\"mk-chat__thinking\">${iconSvg('sparkle', 18)}<span></span></span>`;\n placeholder.querySelector('span span')!.textContent = thinking;\n seen.add(placeholder);\n messages.append(placeholder);\n enterMessages([placeholder]);\n scrollToLatest(messages);\n }, TIMING.chat.pendingDelayMs);\n };\n\n const reply = (content: HTMLElement | string) => {\n const message = typeof content === 'string' ? chatMessage('assistant', content) : content;\n clearPending();\n seen.add(message);\n const was = placeholder;\n placeholder = null;\n if (was?.isConnected) {\n const state = capturePending(was);\n was.replaceWith(message);\n morphPendingToReply(state, message, messages);\n } else {\n if (!message.isConnected) messages.append(message);\n enterMessages([message]);\n scrollToLatest(messages);\n }\n return message;\n };\n\n const confirm = (bar: HTMLElement) => {\n if (reduced()) return;\n flowIn(bar);\n const words = splitWords(bar);\n if (!words.parts.length) return;\n gsap.fromTo(\n words.parts,\n { y: 16, autoAlpha: 0, filter: 'blur(6px)' },\n {\n y: 0,\n autoAlpha: 1,\n filter: 'blur(0px)',\n duration: TIMING.word,\n ease: 'back.out(1)',\n stagger: TIMING.chat.confirmWordStagger,\n clearProps: 'transform,opacity,visibility,filter',\n onComplete: () => words.revert(),\n },\n );\n };\n\n const send = () => {\n if (!input) return;\n const text = input.value.trim();\n if (!text) return;\n const allowed = root.dispatchEvent(new CustomEvent('mk:send', { bubbles: true, cancelable: true, detail: { text } }));\n if (!allowed) return;\n options.onSend?.(text);\n if (clearOnSend) {\n input.value = '';\n fitComposer(input);\n }\n };\n\n if (input) {\n scope.on(input, 'input', () => fitComposer(input));\n scope.on(input, 'keydown', (event) => {\n const key = event as KeyboardEvent;\n if (key.key !== 'Enter' || key.shiftKey || key.isComposing) return;\n event.preventDefault();\n send();\n });\n }\n if (composer) {\n scope.on(composer, 'submit', (event) => {\n event.preventDefault();\n send();\n });\n const sendButton = part(root, 'send');\n if (sendButton && !composer.matches('form')) scope.on(sendButton, 'click', send);\n }\n scope.add(() => {\n clearPending();\n placeholder?.remove();\n placeholder = null;\n });\n if (input) fitComposer(input);\n root.dataset.mkReady = '';\n\n return {\n add,\n pending,\n reply,\n confirm,\n setRecording(on: boolean) {\n if (mic) scope.attr(mic, 'data-mk-recording', on ? '' : null);\n },\n scrollToLatest: () => scrollToLatest(messages),\n adopt: (message: Element) => seen.add(message),\n messages,\n destroy() {\n scope.dispose();\n if (input) input.style.removeProperty('height');\n delete root.dataset.mkReady;\n },\n };\n}\n","import { entrances } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { revealFrom, type RevealHandle } from '../../motion/reveal';\n\n/*\n * navigation: seven desktop styles (Clásica, Bonita, Dock, Guapa,\n * Tasks, Melon, Tunnel) and one glass bar on phones, all in CSS (nav.css). The\n * engine marks the current page (aria-current=\"page\"), switches styles (and can\n * remember the choice), and on start can reveal the\n * app shell from the first button.\n * Parts: .mk-nav__buttons .mk-nav__button (data-mk-value or href), .mk-nav__button--first.\n */\n\nexport const NAV_STYLES = ['clasica', 'bonita', 'dock', 'guapa', 'tasks', 'melon', 'tunnel'] as const;\nexport type NavStyle = (typeof NAV_STYLES)[number];\n\nexport interface NavOptions {\n /** Default: the saved one (storageKey), else the mk-nav--<style> class in the markup, else 'bonita' (Money's default). */\n style?: NavStyle;\n /** The accent variant: the current page in primary-container. */\n accent?: boolean;\n /** Reveal the shell from the first button when the nav starts (off by default). */\n reveal?: boolean;\n /** Remember the chosen style in localStorage under this key. */\n storageKey?: string;\n labels?: { nav?: string };\n onSelect?: (index: number, value: string | undefined, item: HTMLElement) => void;\n}\n\nexport interface NavInstance extends Instance {\n /** Mark a page as current, by index or value (silent: no event). */\n select(target: number | string): void;\n setStyle(style: NavStyle): void;\n setAccent(on: boolean): void;\n readonly index: number;\n readonly style: NavStyle;\n readonly items: HTMLElement[];\n}\n\nexport interface NavigateDetail {\n index: number;\n value: string | undefined;\n item: HTMLElement;\n /** The click: call its preventDefault() to stop a link (single-page apps). */\n originalEvent: MouseEvent;\n}\n\nconst ITEM = '.mk-nav__buttons .mk-nav__button';\nconst isStyle = (value: unknown): value is NavStyle => NAV_STYLES.includes(value as NavStyle);\nconst valueOf = (item: HTMLElement) => item.dataset.mkValue ?? item.getAttribute('href') ?? undefined;\n\nconst read = (key: string) => {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n};\nconst write = (key: string, value: string) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n // Private mode or blocked storage: the style still changes for this page.\n }\n};\n\n/** nav entrance: the app shell is uncovered from the nav's first button. */\nexport function revealShell(nav: HTMLElement): RevealHandle | null {\n if (!entrances()) return null;\n const shell = nav.closest<HTMLElement>('.mk-shell') ?? nav.parentElement;\n if (!shell) return null;\n const origin = nav.querySelector<HTMLElement>('.mk-nav__button--first') ?? nav.querySelector<HTMLElement>(ITEM) ?? nav;\n return revealFrom(shell, { origin });\n}\n\nexport function createNav(root: HTMLElement | null, options: NavOptions = {}): NavInstance {\n if (!root) {\n warnOnce('nav: missing root');\n return inert({ select() {}, setStyle() {}, setAccent() {}, index: -1, style: 'bonita', items: [] });\n }\n const scope = createScope();\n const items = () => [...root.querySelectorAll<HTMLElement>(ITEM)];\n const fromClass = NAV_STYLES.find((name) => root.classList.contains(`mk-nav--${name}`));\n const saved = options.storageKey ? read(options.storageKey) : null;\n let style: NavStyle = options.style ?? (isStyle(saved) ? saved : undefined) ?? fromClass ?? 'bonita';\n\n const paint = (accent: boolean) => {\n const classes = new Set(root.classList);\n for (const name of NAV_STYLES) classes.delete(`mk-nav--${name}`);\n classes.add('mk-nav');\n classes.add(`mk-nav--${style}`);\n if (accent) classes.add('mk-nav--accent');\n else classes.delete('mk-nav--accent');\n scope.attr(root, 'class', [...classes].join(' '));\n };\n let accent = options.accent ?? root.classList.contains('mk-nav--accent');\n paint(accent);\n\n if (root.localName !== 'nav') scope.attr(root, 'role', 'navigation');\n if (!root.hasAttribute('aria-label') && !root.hasAttribute('aria-labelledby')) scope.attr(root, 'aria-label', options.labels?.nav ?? 'Principal');\n\n const mark = (current: HTMLElement | undefined) => {\n for (const item of items()) scope.attr(item, 'aria-current', item === current ? 'page' : null);\n };\n const find = (target: number | string) => {\n const list = items();\n return typeof target === 'number' ? list[target] : list.find((item) => valueOf(item) === target);\n };\n\n scope.on(root, 'click', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);\n if (!item || !root.contains(item)) return;\n const index = items().indexOf(item);\n const value = valueOf(item);\n const detail: NavigateDetail = { index, value, item, originalEvent: event as MouseEvent };\n if (!root.dispatchEvent(new CustomEvent('mk:navigate', { bubbles: true, cancelable: true, detail }))) {\n event.preventDefault();\n return;\n }\n mark(item);\n options.onSelect?.(index, value, item);\n });\n\n let reveal: RevealHandle | null = null;\n if (options.reveal) reveal = revealShell(root);\n root.dataset.mkReady = '';\n\n return {\n select(target) {\n const item = find(target);\n if (!item) warnOnce(`nav: no item ${JSON.stringify(target)}`);\n else mark(item);\n },\n setStyle(next) {\n if (!isStyle(next)) {\n warnOnce(`nav: unknown style \"${String(next)}\" (use ${NAV_STYLES.join(', ')})`);\n return;\n }\n style = next;\n paint(accent);\n if (options.storageKey) write(options.storageKey, next);\n },\n setAccent(on) {\n accent = on;\n paint(accent);\n },\n get index() {\n return items().findIndex((item) => item.getAttribute('aria-current') === 'page');\n },\n get style() {\n return style;\n },\n get items() {\n return items();\n },\n destroy() {\n reveal?.cancel();\n reveal = null;\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { nextFrame } from '../../core/frame';\nimport { entrances, reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { clearStyles } from '../../core/styles';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { revealCounter } from '../../motion/count';\nimport { flowIn, flowOut } from '../../motion/flow';\nimport { chatBackgroundOf } from '../chat-background/engine';\n\n/*\n * onboarding: one step at a time. Changing step flows the current\n * step's items out (down into a 16 px blur, 0.5 s, 50 ms apart), swaps the step,\n * waits a frame and flows the next one's items in from above. A counter rolls\n * to the step number (0.9 s), focus moves to the new step's title, and while a\n * step works (busy) the chat background inside speeds up and grows (energy 1.6,\n * scale 1.8 in 0.8 s; back in 0.6 s).\n * Parts: [data-mk-step] (items: [data-mk-flow-item], else its children),\n * [data-mk-step-title], [data-mk-counter], [data-mk-step-next|prev|goto=\"n\"].\n */\n\nexport interface StepsOptions {\n /** First step shown (0-based). Default: the one marked data-mk-current, else 0. */\n index?: number;\n duration?: number;\n /** Flow the first step in on start. */\n animateFirst?: boolean;\n /** Items of a step that flow (default [data-mk-flow-item], else the step's children). */\n target?: string;\n onChange?: (index: number, previous: number) => void;\n}\n\nexport interface StepsInstance extends Instance {\n next(): Promise<void>;\n prev(): Promise<void>;\n goTo(index: number): Promise<void>;\n /** A step is working: drives the chat background inside. */\n busy(on: boolean): void;\n readonly index: number;\n readonly count: number;\n readonly steps: HTMLElement[];\n}\n\nexport interface StepDetail {\n index: number;\n previous: number;\n step: HTMLElement;\n}\n\nconst STEP = '[data-mk-step]';\nconst ITEM_STYLES = ['transform', 'translate', 'rotate', 'scale', 'filter', 'opacity', 'visibility'];\n\nexport function createSteps(root: HTMLElement | null, options: StepsOptions = {}): StepsInstance {\n // Steps of this root only, not those of a nested one.\n const steps = root\n ? [...root.querySelectorAll<HTMLElement>(STEP)].filter((step) => {\n const outer = step.parentElement?.closest(STEP);\n return !outer || !root.contains(outer);\n })\n : [];\n if (!root || !steps.length) {\n warnOnce('steps: needs [data-mk-step] children');\n return inert({ next: async () => {}, prev: async () => {}, goTo: async () => {}, busy() {}, index: -1, count: 0, steps: [] });\n }\n registerMotion();\n const scope = createScope();\n const { duration = TIMING.onboarding.step, animateFirst = true, target = '[data-mk-flow-item]' } = options;\n const clamp = (value: number) => Math.min(steps.length - 1, Math.max(0, Math.round(value)));\n const marked = steps.findIndex((step) => step.hasAttribute('data-mk-current'));\n let index = clamp(options.index ?? (marked >= 0 ? marked : 0));\n let wanted = index;\n let running: Promise<void> | null = null;\n let stopCounter = () => {};\n\n const itemsOf = (step: HTMLElement) => {\n const marked = [...step.querySelectorAll<HTMLElement>(target)];\n return marked.length ? marked : ([...step.children] as HTMLElement[]);\n };\n const show = (current: number) => {\n steps.forEach((step, i) => {\n scope.attr(step, 'hidden', i === current ? null : '');\n scope.attr(step, 'data-mk-current', i === current ? '' : null);\n });\n };\n const counter = () => {\n const el = root.querySelector<HTMLElement>('[data-mk-counter]');\n if (!el) return;\n stopCounter();\n stopCounter = revealCounter(el, index + 1, { duration: TIMING.onboarding.counter });\n };\n const focusTitle = (step: HTMLElement) => {\n const title = step.querySelector<HTMLElement>('[data-mk-step-title]') ?? step.querySelector<HTMLElement>('h1, h2, h3, h4, h5, h6');\n if (!title) return;\n if (!title.hasAttribute('tabindex') && title.tabIndex < 0) scope.attr(title, 'tabindex', '-1');\n title.focus({ preventScroll: true });\n };\n\n // One loop at a time; it follows `wanted` until it settles. `running` is cleared\n // in the same tick the loop ends, so a goTo right after starts a new one.\n const change = async () => {\n try {\n while (wanted !== index && !scope.disposed) {\n const previous = index;\n const next = wanted;\n const out = reduced() ? null : flowOut(itemsOf(steps[previous]!), { duration });\n if (out) await out;\n if (scope.disposed) return;\n index = next;\n show(index);\n const step = steps[index]!;\n await nextFrame();\n if (scope.disposed) return;\n // Opacity only: a visibility-hidden title could not take the focus.\n const items = itemsOf(step);\n clearStyles(items, ['visibility']);\n flowIn(items, { duration, autoAlpha: false });\n counter();\n focusTitle(step);\n root.dispatchEvent(new CustomEvent<StepDetail>('mk:step', { bubbles: true, detail: { index, previous, step } }));\n options.onChange?.(index, previous);\n }\n } finally {\n running = null;\n }\n };\n\n const goTo = (to: number) => {\n wanted = clamp(to);\n if (wanted === index && !running) return Promise.resolve();\n running ??= change();\n return running;\n };\n\n show(index);\n scope.add(() => {\n stopCounter();\n for (const step of steps) {\n const items = itemsOf(step);\n gsap.killTweensOf(items);\n clearStyles(items, ITEM_STYLES);\n }\n });\n scope.on(root, 'click', (event) => {\n const trigger = (event.target as Element | null)?.closest<HTMLElement>('[data-mk-step-next], [data-mk-step-prev], [data-mk-step-goto]');\n if (!trigger || !root.contains(trigger)) return;\n if (trigger.hasAttribute('data-mk-step-next')) void goTo(wanted + 1);\n else if (trigger.hasAttribute('data-mk-step-prev')) void goTo(wanted - 1);\n else void goTo(Number(trigger.dataset.mkStepGoto) - 1);\n });\n const counterEl = root.querySelector<HTMLElement>('[data-mk-counter]');\n if (counterEl) {\n const text = counterEl.textContent;\n counterEl.textContent = String(index + 1);\n scope.add(() => {\n counterEl.textContent = text;\n });\n }\n if (animateFirst && entrances()) flowIn(itemsOf(steps[index]!), { duration });\n root.dataset.mkReady = '';\n\n return {\n next: () => goTo(wanted + 1),\n prev: () => goTo(wanted - 1),\n goTo,\n busy(on: boolean) {\n scope.attr(root, 'aria-busy', on ? 'true' : null);\n const background = root.querySelector('.mk-chat-background, mk-chat-background');\n chatBackgroundOf(background)?.busy(on);\n },\n get index() {\n return index;\n },\n get count() {\n return steps.length;\n },\n get steps() {\n return steps;\n },\n destroy() {\n scope.dispose();\n delete root.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { subscribe } from '../../core/loop';\nimport { motionSpring } from '../../core/physics-spring';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\nimport { ICON_PATHS } from '../icons';\n\n/*\n * Two cursors.\n * chip: the system cursor stays; over [data-mk-cursor=\"Label\"] a glass\n * chip with the label follows the pointer on a Motion 800/35 spring, popping in\n * from scale .8 (500/30); data-mk-cursor-shape=\"circle\" makes it a 96 px disc;\n * it stays 10 px inside the window; its ink is the accent on light backgrounds\n * and white on dark ones.\n * dot: inside its zone a disc replaces the cursor and eases after it\n * (lerp .2 a frame) with a word (data-mk-cursor or `text`); pressing shrinks it\n * to .7, drops the word and slides two arrows in; [data-mk-cursor-hide] hides it.\n * Off on touch screens and with reduced motion.\n */\n\nexport type CursorVariant = 'chip' | 'dot';\n\nexport interface CursorOptions {\n variant?: CursorVariant;\n /** Where it works. chip: the document; dot: the host's parent. */\n zone?: Element | null;\n /** dot: the word when nothing under the pointer gives one. */\n text?: string;\n /** dot: arrows shown while pressed. */\n arrows?: 'x' | 'y' | 'none';\n}\n\nexport interface CursorInstance extends Instance {\n readonly visible: boolean;\n readonly label: string;\n readonly position: { x: number; y: number };\n readonly tone: 'light' | 'dark';\n /** One frame (dt = 1 at 60 Hz); the shared ticker calls it. */\n update(dt?: number): void;\n}\n\nconst svg = (extra = '') =>\n `<svg aria-hidden=\"true\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${extra}><path d=\"${ICON_PATHS.send}\"/></svg>`;\n\n/** the first background with alpha > .1 up the tree; light when (299R + 587G + 114B) / 1000 > 180. */\nfunction backgroundTone(el: Element | null): 'light' | 'dark' {\n if (!el) return 'light';\n if (el.closest('img, video, picture, canvas')) return 'dark';\n for (let node: Element | null = el; node; node = node.parentElement) {\n const match = getComputedStyle(node).backgroundColor.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/);\n if (!match) continue;\n const alpha = match[4] === undefined ? 1 : parseFloat(match[4]);\n if (alpha <= 0.1) continue;\n const luminance = (Number(match[1]) * 299 + Number(match[2]) * 587 + Number(match[3]) * 114) / 1000;\n return luminance > TIMING.cursor.light ? 'light' : 'dark';\n }\n return 'light';\n}\n\nexport function createCursor(host: HTMLElement | null, options: CursorOptions = {}): CursorInstance {\n const variant = options.variant ?? 'chip';\n const idle = inert<CursorInstance>({ visible: false, label: '', position: { x: 0, y: 0 }, tone: 'light', update() {} });\n if (!host) {\n warnOnce('cursor: missing element');\n return idle;\n }\n const coarse = typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches;\n if (coarse || reduced()) return idle;\n registerMotion();\n const scope = createScope();\n const t = TIMING.cursor;\n const zone = options.zone ?? (variant === 'dot' ? (host.parentElement ?? document.body) : document.documentElement);\n scope.attr(host, 'class', [host.getAttribute('class'), 'mk-cursor', `mk-cursor--${variant}`].filter(Boolean).join(' '));\n scope.attr(host, 'aria-hidden', 'true');\n\n const pointer = { x: -100, y: -100, placed: false };\n const position = { x: -100, y: -100 };\n const velocity = { x: 0, y: 0 };\n let visible = false;\n let label = '';\n let tone: 'light' | 'dark' = 'light';\n const made: Element[] = [];\n\n // ── Markup ────────────────────────────────────────────────────────────────\n let chip: HTMLElement | null = null;\n let chipLabel: HTMLElement | null = null;\n let chipIcon: HTMLElement | null = null;\n let word: HTMLElement | null = null;\n const size = { width: 0, height: 0 };\n if (variant === 'chip') {\n chip = document.createElement('span');\n chip.className = 'mk-cursor__chip mk-glass';\n chip.innerHTML =\n '<span class=\"mk-glass__shadow\" aria-hidden=\"true\"></span><span class=\"mk-cursor__icon mk-icon\"></span><span class=\"mk-cursor__label\"></span>';\n chipIcon = chip.querySelector('.mk-cursor__icon');\n chipLabel = chip.querySelector('.mk-cursor__label');\n host.append(chip);\n made.push(chip);\n gsap.set(chip, { autoAlpha: 0, scale: 0.8 });\n } else {\n const arrows = options.arrows ?? 'y';\n scope.attr(host, 'data-mk-arrows', arrows);\n scope.attr(zone, 'data-mk-cursor-zone', '');\n const dot = document.createElement('span');\n dot.className = 'mk-cursor__dot';\n dot.innerHTML =\n arrows === 'none'\n ? '<span class=\"mk-cursor__circle\"></span><span class=\"mk-cursor__text\"><span class=\"mk-cursor__word\"></span></span>'\n : `<span class=\"mk-cursor__circle\"></span><span class=\"mk-cursor__arrow mk-cursor__arrow--start\">${svg()}</span><span class=\"mk-cursor__text\"><span class=\"mk-cursor__word\"></span></span><span class=\"mk-cursor__arrow mk-cursor__arrow--end\">${svg()}</span>`;\n word = dot.querySelector('.mk-cursor__word');\n if (word) word.textContent = options.text ?? '';\n host.append(dot);\n made.push(dot);\n scope.attr(host, 'data-mk-hidden', '');\n }\n\n // ── Chip ──────────────────────────────────────────────────────────────────\n const appear = motionSpring(...TIMING.springs.cursorAppear);\n const showChip = (next: HTMLElement | null) => {\n if (!chip || !chipLabel || !chipIcon) return;\n const text = next?.dataset.mkCursor ?? '';\n if (text) {\n label = text;\n chipLabel.textContent = text;\n chipIcon.textContent = next?.dataset.mkCursorIcon ?? '';\n chip.classList.toggle('mk-cursor__chip--circle', next?.dataset.mkCursorShape === 'circle');\n const box = chip.getBoundingClientRect();\n size.width = box.width;\n size.height = box.height;\n }\n if (Boolean(text) === visible) return;\n visible = Boolean(text);\n if (!visible) label = '';\n gsap.to(chip, {\n autoAlpha: visible ? 1 : 0,\n scale: visible ? 1 : 0.8,\n duration: appear.duration,\n ease: appear.ease,\n overwrite: 'auto',\n });\n };\n\n // ── Dot ───────────────────────────────────────────────────────────────────\n let inZone = false;\n let overHide = false;\n const syncDot = () => scope.attr(host, 'data-mk-hidden', inZone && !overHide ? null : '');\n const wordFor = (target: Element | null) => {\n if (!word) return;\n const source = target?.closest<HTMLElement>('[data-mk-cursor]');\n word.textContent = source && zone.contains(source) ? (source.dataset.mkCursor ?? '') : (options.text ?? '');\n };\n\n // ── Events ────────────────────────────────────────────────────────────────\n const place = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n pointer.x = event.clientX;\n pointer.y = event.clientY;\n if (!pointer.placed) {\n pointer.placed = true;\n if (variant === 'dot') {\n position.x = pointer.x;\n position.y = pointer.y;\n }\n }\n };\n scope.on(window, 'pointermove', (event) => place(event as PointerEvent), { passive: true });\n const overTarget = variant === 'chip' ? document : zone;\n scope.on(overTarget, 'pointerover', (event) => {\n const target = event.target as Element | null;\n if (variant === 'chip') {\n const source = target?.closest<HTMLElement>('[data-mk-cursor]') ?? null;\n showChip(source && zone.contains(source) ? source : null);\n return;\n }\n overHide = Boolean(target?.closest('[data-mk-cursor-hide]'));\n wordFor(target);\n syncDot();\n });\n if (variant === 'dot') {\n scope.on(zone, 'pointerenter', (event) => {\n place(event as PointerEvent);\n inZone = true;\n visible = true;\n syncDot();\n });\n scope.on(zone, 'pointerleave', () => {\n inZone = false;\n visible = false;\n scope.attr(host, 'data-mk-pressed', null);\n syncDot();\n });\n scope.on(zone, 'pointerdown', () => scope.attr(host, 'data-mk-pressed', ''));\n scope.on(window, 'pointerup', () => scope.attr(host, 'data-mk-pressed', null));\n }\n\n // ── Frame ─────────────────────────────────────────────────────────────────\n const [stiffness, damping] = TIMING.springs.cursorFollow;\n const update = (dt = 1) => {\n if (variant === 'chip') {\n // Keeps the chip inside the window, 10 px from its edges.\n const halfW = size.width / 2 + t.gutter;\n const halfH = size.height / 2 + t.gutter;\n const tx = size.width ? Math.min(Math.max(pointer.x, halfW), innerWidth - halfW) : pointer.x;\n const ty = size.height ? Math.min(Math.max(pointer.y, halfH), innerHeight - halfH) : pointer.y;\n // Motion's spring, integrated in small steps.\n const steps = Math.max(1, Math.ceil(dt * 4));\n const h = dt / 60 / steps;\n for (let i = 0; i < steps; i++) {\n velocity.x += (stiffness * (tx - position.x) - damping * velocity.x) * h;\n velocity.y += (stiffness * (ty - position.y) - damping * velocity.y) * h;\n position.x += velocity.x * h;\n position.y += velocity.y * h;\n }\n if (visible && typeof document.elementFromPoint === 'function') {\n tone = backgroundTone(document.elementFromPoint(pointer.x, pointer.y));\n if (chip && chip.dataset.mkTone !== tone) chip.dataset.mkTone = tone;\n }\n } else {\n const step = 1 - Math.pow(1 - t.dotLerp, dt);\n position.x += (pointer.x - position.x) * step;\n position.y += (pointer.y - position.y) * step;\n }\n host.style.transform = `translate3d(${position.x.toFixed(2)}px, ${position.y.toFixed(2)}px, 0) translate(-50%, -50%)`;\n };\n scope.add(subscribe(update));\n update(0);\n host.dataset.mkReady = '';\n\n return {\n get visible() {\n return visible;\n },\n get label() {\n return label;\n },\n get position() {\n return { ...position };\n },\n get tone() {\n return tone;\n },\n update,\n destroy() {\n if (chip) gsap.killTweensOf(chip);\n scope.dispose();\n for (const node of made.splice(0)) node.remove();\n host.style.removeProperty('transform');\n if (host.getAttribute('style') === '') host.removeAttribute('style');\n delete host.dataset.mkReady;\n },\n };\n}\n","import { gsap, registerMotion } from '../../core/gsap';\nimport { entrances, reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Instance } from '../../core/types';\n\n/*\n * floating navbar: a frosted glass pill centred at the top that grows\n * into a rounded panel (CSS grid rows 0fr → 1fr, 0.6 s cubic-bezier(.625,.05,0,1),\n * 0.125 s late; radius 3em → 2em) while the page behind darkens to .4 and the\n * panel's rows rise in 0.15 s + 0.025 s apart. Several triggers share the shell:\n * the same one closes, another switches straight to its panel. Escape, the\n * backdrop, a link inside and scrolling after a wheel/touch close it. On load it\n * drops in from −300 % over 1.8 s.\n *\n * Markup: [data-mk-island-toggle=\"name\"] buttons, [data-mk-island-panel=\"name\"]\n * sections, [data-mk-island-item] rows, [data-mk-island-close] backdrop,\n * .mk-island__shell and .mk-island__cta (hidden while open).\n */\n\nexport interface IslandOptions {\n /** Drop in from above on load (true), wait for ready() ('manual') or not at all. */\n entrance?: boolean | 'manual';\n /** Close when the page scrolls after a wheel or touch. */\n closeOnScroll?: boolean;\n /** Close when a link inside a panel is followed. */\n closeOnNavigate?: boolean;\n /** Focus the first control of the panel that opens. */\n focusOnOpen?: boolean;\n /** The open panel's name, or null when it closes. */\n onChange?: (active: string | null) => void;\n}\n\nexport interface IslandInstance extends Instance {\n open(name?: string): void;\n close(returnFocus?: boolean): void;\n toggle(name?: string): void;\n /** Play the entrance (entrance: 'manual'). */\n ready(): void;\n readonly active: string | null;\n}\n\nlet sequence = 0;\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nexport function createIsland(root: HTMLElement | null, options: IslandOptions = {}): IslandInstance {\n const shell = root?.querySelector<HTMLElement>('.mk-island__shell') ?? null;\n const panels = root ? [...root.querySelectorAll<HTMLElement>('[data-mk-island-panel]')] : [];\n if (!root || !shell || !panels.length) {\n warnOnce('island: needs .mk-island__shell and at least one [data-mk-island-panel]');\n return inert({ open() {}, close() {}, toggle() {}, ready() {}, active: null });\n }\n const t = TIMING.island;\n const { entrance = true, closeOnScroll = true, closeOnNavigate = true, focusOnOpen = true, onChange } = options;\n registerMotion();\n const scope = createScope();\n const toggles = [...root.querySelectorAll<HTMLElement>('[data-mk-island-toggle]')];\n const cta = root.querySelector<HTMLElement>('.mk-island__cta');\n const backdrops = [...root.querySelectorAll<HTMLElement>('[data-mk-island-close]')];\n let active: string | null = null;\n let trigger: HTMLElement | null = null;\n let scrollStart = 0;\n let armed = false;\n let focusTimer: ReturnType<typeof setTimeout> | undefined;\n let entered = false;\n let entry: gsap.core.Tween | null = null;\n\n const flag = (el: Element | null, name: string, on: boolean) => {\n if (el) scope.attr(el, name, on ? '' : null);\n };\n const sync = () => {\n for (const panel of panels) {\n const on = panel.dataset.mkIslandPanel === active;\n // A closing panel stays in the collapsing grid for its exit.\n if (active) flag(panel, 'hidden', !on);\n scope.attr(panel, 'aria-hidden', String(!on));\n flag(panel, 'inert', !on);\n }\n for (const button of toggles) scope.attr(button, 'aria-expanded', String(button.dataset.mkIslandToggle === active));\n flag(cta, 'inert', Boolean(active));\n for (const backdrop of backdrops) {\n flag(backdrop, 'inert', !active);\n scope.attr(backdrop, 'aria-hidden', String(!active));\n }\n flag(root, 'data-mk-open', Boolean(active));\n scope.attr(root, 'data-mk-active', active);\n };\n const stagger = (opening: boolean) => {\n root.querySelectorAll<HTMLElement>('[data-mk-island-item]').forEach((item, index) => {\n // Saves the original style once, so destroy() puts it back.\n scope.attr(item, 'style', item.getAttribute('style'));\n item.style.setProperty('--mk-island-delay', opening ? `${Number((t.delay + index * t.step).toFixed(3))}s` : '0s');\n });\n };\n\n const close = (returnFocus = true) => {\n if (scope.disposed || !active) return;\n clearTimeout(focusTimer);\n active = null;\n stagger(false);\n sync();\n onChange?.(null);\n if (returnFocus && trigger?.isConnected) trigger.focus({ preventScroll: true });\n };\n const open = (name = panels[0]!.dataset.mkIslandPanel!, source?: HTMLElement) => {\n if (scope.disposed) return;\n const panel = panels.find((el) => el.dataset.mkIslandPanel === name);\n if (!panel) return;\n const wasClosed = !active;\n clearTimeout(focusTimer);\n active = name;\n trigger = source ?? toggles.find((el) => el.dataset.mkIslandToggle === name) ?? trigger;\n if (wasClosed) {\n scrollStart = window.scrollY;\n armed = false;\n stagger(true);\n }\n sync();\n onChange?.(name);\n if (focusOnOpen)\n focusTimer = setTimeout(\n () => {\n if (active !== name) return;\n const first = [...panel.querySelectorAll<HTMLElement>(FOCUSABLE)].find((el) => !el.closest('[hidden], [inert]'));\n (first ?? panel).focus({ preventScroll: true });\n },\n reduced() ? 0 : t.focus,\n );\n };\n const toggle = (name = panels[0]!.dataset.mkIslandPanel!, source?: HTMLElement) => (active === name ? close(false) : open(name, source));\n\n for (const panel of panels) {\n if (!panel.id) scope.attr(panel, 'id', `mk-island-panel-${++sequence}`);\n if (!panel.hasAttribute('tabindex')) scope.attr(panel, 'tabindex', '-1');\n if (!panel.hasAttribute('role')) scope.attr(panel, 'role', 'region');\n }\n for (const button of toggles) {\n const panel = panels.find((el) => el.dataset.mkIslandPanel === button.dataset.mkIslandToggle);\n if (panel) scope.attr(button, 'aria-controls', panel.id);\n scope.on(button, 'click', () => toggle(button.dataset.mkIslandToggle, button));\n }\n for (const backdrop of backdrops) scope.on(backdrop, 'click', () => close(true));\n scope.on(document, 'keydown', (event) => {\n if (active && (event as KeyboardEvent).key === 'Escape') {\n event.preventDefault();\n close(true);\n }\n });\n if (closeOnNavigate)\n scope.on(root, 'click', (event) => {\n const link = (event.target as Element | null)?.closest?.('a[href]');\n if (active && link?.closest('[data-mk-island-panel]')) close(false);\n });\n if (closeOnScroll) {\n const arm = () => {\n if (active) armed = true;\n };\n scope.on(window, 'wheel', arm, { passive: true });\n scope.on(window, 'touchmove', arm, { passive: true });\n scope.on(\n window,\n 'scroll',\n () => {\n if (active && armed && Math.abs(window.scrollY - scrollStart) > 1) close(false);\n },\n { passive: true },\n );\n }\n scope.add(() => clearTimeout(focusTimer));\n\n // The entrance uses GSAP's default ease (power1.out).\n const moving = entrance !== false && entrances();\n if (moving) gsap.set(shell, { yPercent: t.offset });\n const ready = () => {\n if (scope.disposed || entered || !moving) return;\n entered = true;\n entry = gsap.to(shell, { yPercent: 0, duration: t.entrance });\n };\n scope.add(() => {\n entry?.kill();\n if (moving) gsap.set(shell, { clearProps: 'transform,translate' });\n if (shell.getAttribute('style') === '') shell.removeAttribute('style');\n });\n\n sync();\n if (entrance === true) ready();\n scope.attr(root, 'data-mk-ready', '');\n\n return {\n open: (name?: string) => open(name),\n close,\n toggle: (name?: string) => toggle(name),\n ready,\n get active() {\n return active;\n },\n destroy: () => scope.dispose(),\n };\n}\n"],"mappings":"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","names":["items","accent","running","marked","show","items"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TIMING,
|
|
3
3
|
reduced
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-DOOMULVV.js";
|
|
5
5
|
import {
|
|
6
6
|
warnOnce
|
|
7
7
|
} from "./chunk-TGV27ZWM.js";
|
|
@@ -174,4 +174,4 @@ export {
|
|
|
174
174
|
leave,
|
|
175
175
|
confetti
|
|
176
176
|
};
|
|
177
|
-
//# sourceMappingURL=chunk-
|
|
177
|
+
//# sourceMappingURL=chunk-J6OCFNGU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/motion/effects.ts","../src/motion/confetti.ts"],"sourcesContent":["import { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { warnOnce } from '../core/types';\n\n/*\n * Play utility animations (css/effects/anim.css) from code: animate()\n * restarts one even when it is already playing and resolves when it ends;\n * leave() plays an exit and then removes (or hides) the element.\n */\n\nexport const ANIMATIONS = [\n 'out',\n 'out-left',\n 'out-bottom',\n 'collapse',\n 'highlight',\n 'shake',\n 'shake-strong',\n 'fade',\n 'wipe',\n 'progress-in',\n] as const;\nexport type AnimationName = (typeof ANIMATIONS)[number];\nexport type ExitName = 'out' | 'out-left' | 'out-bottom' | 'collapse';\n\nconst EXITS = new Set<AnimationName>(['out', 'out-left', 'out-bottom', 'collapse']);\n\nexport interface AnimateOptions {\n signal?: AbortSignal;\n}\n\nexport function animate(el: Element, name: AnimationName, { signal }: AnimateOptions = {}): Promise<void> {\n const className = `mk-anim-${name}`;\n if (!ANIMATIONS.includes(name)) {\n warnOnce(`animate: unknown animation \"${String(name)}\" (use ${ANIMATIONS.join(', ')})`);\n return Promise.resolve();\n }\n if (reduced()) return Promise.resolve();\n const element = el as HTMLElement;\n if (name === 'collapse') element.style.setProperty('--mk-collapse-from', `${element.offsetHeight}px`);\n // Off, reflow, on: the browser starts the animation over.\n element.classList.remove(className);\n void element.offsetWidth;\n element.classList.add(className);\n return new Promise((resolve) => {\n const finish = (keep: boolean) => {\n element.removeEventListener('animationend', onEnd);\n signal?.removeEventListener('abort', onAbort);\n clearTimeout(timer);\n if (!keep) element.classList.remove(className);\n resolve();\n };\n const onEnd = (event: Event) => {\n if ((event as AnimationEvent).animationName === `mk-${name}`) finish(EXITS.has(name));\n };\n const onAbort = () => finish(false);\n element.addEventListener('animationend', onEnd);\n signal?.addEventListener('abort', onAbort, { once: true });\n const timer = setTimeout(() => finish(EXITS.has(name)), TIMING.effects[name] * 1000 + 100);\n if (signal?.aborted) onAbort();\n });\n}\n\nexport interface LeaveOptions {\n /** Remove the element (default) or hide it. */\n remove?: boolean;\n}\n\nexport async function leave(el: Element, name: ExitName, { remove = true }: LeaveOptions = {}): Promise<void> {\n const focused = el.contains(document.activeElement) ? (document.activeElement as HTMLElement) : null;\n await animate(el, name);\n focused?.blur();\n if (remove) {\n el.remove();\n return;\n }\n (el as HTMLElement).hidden = true;\n el.classList.remove(`mk-anim-${name}`);\n (el as HTMLElement).style.removeProperty('--mk-collapse-from');\n if (el.getAttribute('style') === '') el.removeAttribute('style');\n}\n","import { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * success confetti: 45 paper pieces burst from a point (2–8 px a\n * frame, a little upward), fall with gravity .15, slow by .98 a frame, spin and\n * fade (.015–.03 a frame). Physics per 60 fps frame, scaled by the real frame\n * time. The canvas is decorative and removes itself when the last piece fades.\n */\n\nexport interface ConfettiOptions {\n count?: number;\n /** Default: the theme's primary, tertiary, secondary and containers. */\n colors?: string[];\n /** Draw inside this (positioned) element instead of over the whole window. */\n container?: HTMLElement | null;\n}\n\nexport interface ConfettiHandle {\n stop(): void;\n finished: Promise<void>;\n}\n\nconst FALLBACK = ['#3DDC84', '#A3E8C1', '#E8D0A3', '#1A73E8', '#8AB4F8'];\nconst ROLES = ['primary', 'tertiary', 'secondary', 'primary-container', 'tertiary-container'];\nconst between = ([min, max]: readonly [number, number]) => min + Math.random() * (max - min);\n\nfunction themeColors(from: Element) {\n const style = getComputedStyle(from);\n const colors = ROLES.map((role) => style.getPropertyValue(`--md-sys-color-${role}`).trim()).filter(Boolean);\n return colors.length ? colors : FALLBACK;\n}\n\nexport function confetti(origin?: Element | { x: number; y: number } | null, options: ConfettiOptions = {}): ConfettiHandle {\n const idle: ConfettiHandle = { stop() {}, finished: Promise.resolve() };\n if (typeof document === 'undefined' || reduced()) return idle;\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return idle;\n const config = TIMING.confetti;\n const container = options.container ?? null;\n const box = container ? container.getBoundingClientRect() : { left: 0, top: 0, width: innerWidth, height: innerHeight };\n const ratio = window.devicePixelRatio || 1;\n canvas.width = Math.max(1, Math.round(box.width * ratio));\n canvas.height = Math.max(1, Math.round(box.height * ratio));\n canvas.setAttribute('aria-hidden', 'true');\n canvas.dataset.mkConfetti = '';\n Object.assign(canvas.style, {\n position: container ? 'absolute' : 'fixed',\n inset: '0',\n width: container ? '100%' : '100vw',\n height: container ? '100%' : '100vh',\n zIndex: '2147483647',\n pointerEvents: 'none',\n });\n context.scale(ratio, ratio);\n\n let x = box.width / 2;\n let y = box.height / 2;\n if (origin instanceof Element) {\n const rect = origin.getBoundingClientRect();\n x = rect.left + rect.width / 2 - box.left;\n y = rect.top + rect.height / 2 - box.top;\n } else if (origin) {\n x = origin.x - box.left;\n y = origin.y - box.top;\n }\n const colors = options.colors?.length\n ? options.colors\n : themeColors(origin instanceof Element ? origin : (container ?? document.documentElement));\n const pieces = Array.from({ length: options.count ?? config.count }, () => {\n const angle = Math.random() * Math.PI * 2;\n const speed = between(config.speed);\n return {\n x,\n y,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed - config.lift,\n radius: between(config.radius),\n color: colors[Math.floor(Math.random() * colors.length)]!,\n alpha: 1,\n decay: between(config.decay),\n rotation: Math.random() * 360,\n spin: (Math.random() * 2 - 1) * config.spin,\n };\n });\n\n let frame = 0;\n let last = 0;\n let stopped = false;\n let resolve!: () => void;\n const finished = new Promise<void>((done) => (resolve = done));\n const stop = () => {\n if (stopped) return;\n stopped = true;\n cancelAnimationFrame(frame);\n canvas.remove();\n resolve();\n };\n const draw = (now: number) => {\n const f = last ? Math.min((now - last) / (1000 / 60), 3) : 1;\n last = now;\n context.clearRect(0, 0, box.width, box.height);\n let alive = false;\n const drag = Math.pow(config.drag, f);\n for (const piece of pieces) {\n if (piece.alpha <= 0) continue;\n alive = true;\n piece.x += piece.vx * f;\n piece.y += piece.vy * f;\n piece.vy += config.gravity * f;\n piece.vx *= drag;\n piece.vy *= drag;\n piece.alpha -= piece.decay * f;\n piece.rotation += piece.spin * f;\n context.save();\n context.translate(piece.x, piece.y);\n context.rotate((piece.rotation * Math.PI) / 180);\n context.globalAlpha = Math.max(0, piece.alpha);\n context.fillStyle = piece.color;\n context.fillRect(-piece.radius, -piece.radius / 2, piece.radius * 2, piece.radius);\n context.restore();\n }\n if (alive && !stopped) frame = requestAnimationFrame(draw);\n else stop();\n };\n (container ?? document.body).append(canvas);\n frame = requestAnimationFrame(draw);\n return { stop, finished };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
clamp
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-34EZ7DF4.js";
|
|
4
4
|
import {
|
|
5
5
|
TIMING,
|
|
6
6
|
createScope,
|
|
7
7
|
reduced,
|
|
8
8
|
whileVisible
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-DOOMULVV.js";
|
|
10
10
|
import {
|
|
11
11
|
inert,
|
|
12
12
|
warnOnce
|
|
@@ -829,4 +829,4 @@ export {
|
|
|
829
829
|
createShaderBlur,
|
|
830
830
|
createParticleHero
|
|
831
831
|
};
|
|
832
|
-
//# sourceMappingURL=chunk-
|
|
832
|
+
//# sourceMappingURL=chunk-QFBOHPWZ.js.map
|
|
@@ -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: 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 * particle-hero: 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 * Simulates size² points (16 384 by default), with words drawn 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 (default: 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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/presets.ts","../src/theme/theme.ts"],"sourcesContent":["// Theme preset metadata; keep in sync with the CSS palettes.\n\n/** The 37 Material 3 colour roles every theme defines (`--md-sys-color-<role>`). */\nexport const ROLES = [\n 'background',\n 'on-background',\n 'surface',\n 'surface-dim',\n 'surface-bright',\n 'surface-container-lowest',\n 'surface-container-low',\n 'surface-container',\n 'surface-container-high',\n 'surface-container-highest',\n 'on-surface',\n 'surface-variant',\n 'on-surface-variant',\n 'inverse-surface',\n 'inverse-on-surface',\n 'outline',\n 'outline-variant',\n 'shadow',\n 'scrim',\n 'surface-tint',\n 'primary',\n 'on-primary',\n 'primary-container',\n 'on-primary-container',\n 'inverse-primary',\n 'secondary',\n 'on-secondary',\n 'secondary-container',\n 'on-secondary-container',\n 'tertiary',\n 'on-tertiary',\n 'tertiary-container',\n 'on-tertiary-container',\n 'error',\n 'on-error',\n 'error-container',\n 'on-error-container',\n] as const;\nexport type Role = (typeof ROLES)[number];\n\nexport interface ThemePreset {\n readonly id: string;\n readonly name: string;\n /** Hidden from the picker unless showHidden is enabled. */\n readonly hidden: boolean;\n /** Modes with their own palette. OLED is dark-only and uses Black in light mode. */\n readonly modes: readonly ('light' | 'dark')[];\n /** Representative colour (dark surface-tint): swatch and generator seed. */\n readonly seed: string;\n}\n\nexport const THEMES = [\n { id: 'black', name: 'Black', hidden: true, modes: ['light', 'dark'], seed: '#b4c7ed' },\n { id: 'blue', name: 'Blue', hidden: false, modes: ['light', 'dark'], seed: '#b3c5ff' },\n { id: 'purple', name: 'Purple', hidden: false, modes: ['light', 'dark'], seed: '#d2bcff' },\n { id: 'neogreen', name: 'Neogreen', hidden: false, modes: ['light', 'dark'], seed: '#00e563' },\n { id: 'green', name: 'Green', hidden: true, modes: ['light', 'dark'], seed: '#53e081' },\n { id: 'red', name: 'Red', hidden: false, modes: ['light', 'dark'], seed: '#ffb4ac' },\n { id: 'orange', name: 'Orange', hidden: true, modes: ['light', 'dark'], seed: '#ffc988' },\n { id: 'pink', name: 'Pink', hidden: false, modes: ['light', 'dark'], seed: '#f7acff' },\n { id: 'pastel-pink', name: 'Pastel Pink', hidden: false, modes: ['light', 'dark'], seed: '#ffcee8' },\n { id: 'brown', name: 'Brown', hidden: false, modes: ['light', 'dark'], seed: '#ffb783' },\n { id: 'super-blue', name: 'Super Blue', hidden: false, modes: ['light', 'dark'], seed: '#bcc2ff' },\n { id: 'cold-blue', name: 'Cold Blue', hidden: true, modes: ['light', 'dark'], seed: '#87ceff' },\n { id: 'modern-1', name: 'Modern', hidden: true, modes: ['light', 'dark'], seed: '#b3c5ff' },\n { id: 'gray', name: 'Gray', hidden: false, modes: ['light', 'dark'], seed: '#c6c6c6' },\n { id: 'oled', name: 'Oled', hidden: false, modes: ['dark'], seed: '#9fb8e4' },\n { id: 'funny', name: 'Funny', hidden: true, modes: ['light', 'dark'], seed: '#22d3ee' },\n { id: 'new', name: 'New', hidden: true, modes: ['light', 'dark'], seed: '#c4a68d' },\n { id: 'new2', name: 'New 2', hidden: true, modes: ['light', 'dark'], seed: '#a3ffb7' },\n { id: 'black-green', name: 'Black Green', hidden: true, modes: ['light', 'dark'], seed: '#a0d499' },\n] as const satisfies readonly ThemePreset[];\n\nexport type ThemeId = (typeof THEMES)[number]['id'];\nexport const DEFAULT_THEME: ThemeId = 'neogreen';\n","import { DEFAULT_THEME, THEMES, type ThemeId } from './presets';\nimport { warnOnce } from '../core/types';\n\n/*\n * Theme and mode on <html data-mk-theme=\"neogreen\" data-mk-mode=\"system|light|dark\">,\n * remembered in localStorage; the mode can follow the system or an explicit choice. Nothing runs at import time.\n */\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\nexport interface ThemeState {\n id: string;\n mode: ThemeMode;\n /** The mode actually shown (system resolved through prefers-color-scheme). */\n resolved: 'light' | 'dark';\n}\n\nexport interface InitThemeOptions {\n /** Theme when nothing is stored or set on the root. Default: neogreen. */\n default?: ThemeId | (string & {});\n mode?: ThemeMode;\n storageKey?: string;\n root?: HTMLElement;\n}\n\nexport const THEME_EVENT = 'mk:theme';\nconst MODES: ThemeMode[] = ['light', 'dark', 'system'];\nconst known = new Set<string>(THEMES.map((theme) => theme.id));\nconst settings = { storageKey: 'mk-theme', root: null as HTMLElement | null };\nlet watching = false;\n\n/** Accept an extra theme id in setTheme (generated or project themes). */\nexport function registerTheme(id: string) {\n known.add(id);\n}\n\nconst rootOf = () => settings.root ?? document.documentElement;\nconst systemDark = () => typeof matchMedia === 'function' && matchMedia('(prefers-color-scheme: dark)').matches;\n\nfunction read(): Partial<Pick<ThemeState, 'id' | 'mode'>> | null {\n try {\n const raw = localStorage.getItem(settings.storageKey);\n return raw ? (JSON.parse(raw) as Partial<ThemeState>) : null;\n } catch {\n return null;\n }\n}\n\nfunction write(state: Pick<ThemeState, 'id' | 'mode'>) {\n try {\n localStorage.setItem(settings.storageKey, JSON.stringify({ id: state.id, mode: state.mode }));\n } catch {\n // Private mode or blocked storage: the choice simply isn't remembered.\n }\n}\n\nexport function getTheme(): ThemeState {\n const root = rootOf();\n const id = root.getAttribute('data-mk-theme') ?? DEFAULT_THEME;\n const attr = root.getAttribute('data-mk-mode') as ThemeMode | null;\n const mode = attr && MODES.includes(attr) ? attr : 'system';\n return { id, mode, resolved: mode === 'system' ? (systemDark() ? 'dark' : 'light') : mode };\n}\n\nfunction apply(id: string, mode: ThemeMode, persist: boolean) {\n const root = rootOf();\n root.setAttribute('data-mk-theme', id);\n root.setAttribute('data-mk-mode', mode);\n if (persist) write({ id, mode });\n const state = getTheme();\n document.dispatchEvent(new CustomEvent<ThemeState>(THEME_EVENT, { detail: state }));\n return state;\n}\n\n/** Apply the stored (or default) theme and mode. Call once on startup. */\nexport function initTheme(options: InitThemeOptions = {}): ThemeState {\n if (options.storageKey) settings.storageKey = options.storageKey;\n if (options.root) settings.root = options.root;\n const root = rootOf();\n const stored = read();\n const id = stored?.id ?? root.getAttribute('data-mk-theme') ?? options.default ?? DEFAULT_THEME;\n const storedMode = stored?.mode && MODES.includes(stored.mode) ? stored.mode : null;\n const mode = storedMode ?? (root.getAttribute('data-mk-mode') as ThemeMode | null) ?? options.mode ?? 'system';\n if (!watching && typeof matchMedia === 'function') {\n watching = true;\n // In system mode the resolved scheme follows the OS; tell listeners when it flips.\n matchMedia('(prefers-color-scheme: dark)').addEventListener?.('change', () => {\n if (getTheme().mode === 'system') document.dispatchEvent(new CustomEvent<ThemeState>(THEME_EVENT, { detail: getTheme() }));\n });\n }\n return apply(id, MODES.includes(mode) ? mode : 'system', false);\n}\n\nexport function setTheme(id: ThemeId | (string & {})): ThemeState {\n if (!known.has(id)) {\n warnOnce(`setTheme: unknown theme \"${id}\" (register it with registerTheme or applyTheme)`);\n return getTheme();\n }\n return apply(id, getTheme().mode, true);\n}\n\nexport function setMode(mode: ThemeMode): ThemeState {\n if (!MODES.includes(mode)) {\n warnOnce(`setMode: unknown mode \"${mode}\"`);\n return getTheme();\n }\n return apply(getTheme().id, mode, true);\n}\n\n/** Inline script for <head>: applies the stored choice before the first paint (no flash). */\nexport function themeHeadScript({ storageKey = 'mk-theme', default: fallback = DEFAULT_THEME, mode = 'system' }: Omit<InitThemeOptions, 'root'> = {}) {\n return (\n `(function(){var r=document.documentElement,s=null;try{s=JSON.parse(localStorage.getItem(${JSON.stringify(storageKey)})||'null')}catch(e){}` +\n `r.setAttribute('data-mk-theme',(s&&s.id)||r.getAttribute('data-mk-theme')||${JSON.stringify(fallback)});` +\n `r.setAttribute('data-mk-mode',(s&&s.mode)||r.getAttribute('data-mk-mode')||${JSON.stringify(mode)})})();`\n );\n}\n\nexport const MK_THEME_HEAD_SCRIPT = themeHeadScript();\n"],"mappings":"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","names":[]}
|