motionary 7.9.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +1 -1
  3. package/README_ja.md +1 -1
  4. package/README_zh.md +1 -1
  5. package/dist/chunks/{audio-DcPvT2Kh.js → audio-CynhhWDi.js} +3 -3
  6. package/dist/chunks/{audio-DcPvT2Kh.js.map → audio-CynhhWDi.js.map} +1 -1
  7. package/dist/chunks/{audio-EXUoijsG.cjs → audio-cgWbDkoY.cjs} +3 -3
  8. package/dist/chunks/{audio-EXUoijsG.cjs.map → audio-cgWbDkoY.cjs.map} +1 -1
  9. package/dist/chunks/{base-2-yYc93C.js → base-CLuqlLfG.js} +63 -6
  10. package/dist/chunks/base-CLuqlLfG.js.map +1 -0
  11. package/dist/chunks/{base-BaQV-2ha.cjs → base-DoRUZBy-.cjs} +66 -5
  12. package/dist/chunks/base-DoRUZBy-.cjs.map +1 -0
  13. package/dist/chunks/{builtins-HlqAkK0f.js → builtins-Bs4smevg.js} +3 -3
  14. package/dist/chunks/{builtins-HlqAkK0f.js.map → builtins-Bs4smevg.js.map} +1 -1
  15. package/dist/chunks/{builtins-xalxV2d5.cjs → builtins-ClXshqj-.cjs} +3 -3
  16. package/dist/chunks/{builtins-xalxV2d5.cjs.map → builtins-ClXshqj-.cjs.map} +1 -1
  17. package/dist/chunks/{core-DuO-AVXL.js → core-C3Taz-ew.js} +2 -2
  18. package/dist/chunks/{core-DuO-AVXL.js.map → core-C3Taz-ew.js.map} +1 -1
  19. package/dist/chunks/{core-D5rU0CV6.js → core-CiN5sqxB.js} +2 -2
  20. package/dist/chunks/{core-D5rU0CV6.js.map → core-CiN5sqxB.js.map} +1 -1
  21. package/dist/chunks/{core-BGAyaY6L.cjs → core-CwO835Wm.cjs} +2 -2
  22. package/dist/chunks/{core-BGAyaY6L.cjs.map → core-CwO835Wm.cjs.map} +1 -1
  23. package/dist/chunks/{core-zq17EeCI.cjs → core-O4grKHSa.cjs} +2 -2
  24. package/dist/chunks/{core-zq17EeCI.cjs.map → core-O4grKHSa.cjs.map} +1 -1
  25. package/dist/chunks/{fx-lBGVtQO1.cjs → fx-C-XjLOTc.cjs} +2 -2
  26. package/dist/chunks/{fx-lBGVtQO1.cjs.map → fx-C-XjLOTc.cjs.map} +1 -1
  27. package/dist/chunks/{fx-CMxWNwH8.js → fx-CQv3IxMf.js} +2 -2
  28. package/dist/chunks/{fx-CMxWNwH8.js.map → fx-CQv3IxMf.js.map} +1 -1
  29. package/dist/chunks/{gpu-DLPghVWr.js → gpu-CB8frFOD.js} +2 -2
  30. package/dist/chunks/{gpu-DLPghVWr.js.map → gpu-CB8frFOD.js.map} +1 -1
  31. package/dist/chunks/{gpu-Dx0H875w.cjs → gpu-CcdA2D2i.cjs} +2 -2
  32. package/dist/chunks/{gpu-Dx0H875w.cjs.map → gpu-CcdA2D2i.cjs.map} +1 -1
  33. package/dist/chunks/{index-tags-C04JP8g4.js → index-tags-B-JBecYg.js} +2 -2
  34. package/dist/chunks/index-tags-B-JBecYg.js.map +1 -0
  35. package/dist/chunks/{index-tags-BTMwrfgV.cjs → index-tags-hLIF2Clq.cjs} +2 -2
  36. package/dist/chunks/index-tags-hLIF2Clq.cjs.map +1 -0
  37. package/dist/chunks/{player-PS6_FzNw.cjs → player-C2n17sdH.cjs} +4 -4
  38. package/dist/chunks/{player-PS6_FzNw.cjs.map → player-C2n17sdH.cjs.map} +1 -1
  39. package/dist/chunks/{player-DxvCYo7Q.js → player-YzQGkKaW.js} +4 -4
  40. package/dist/chunks/{player-DxvCYo7Q.js.map → player-YzQGkKaW.js.map} +1 -1
  41. package/dist/chunks/{registry-DehBVRDV.cjs → registry-BVklOepd.cjs} +2 -2
  42. package/dist/chunks/{registry-DehBVRDV.cjs.map → registry-BVklOepd.cjs.map} +1 -1
  43. package/dist/chunks/{registry-CyKExAmE.js → registry-CnO7ZVPK.js} +2 -2
  44. package/dist/chunks/{registry-CyKExAmE.js.map → registry-CnO7ZVPK.js.map} +1 -1
  45. package/dist/chunks/{spring-BK8DiezC.js → spring-BFKNHmfl.js} +2 -2
  46. package/dist/chunks/{spring-BK8DiezC.js.map → spring-BFKNHmfl.js.map} +1 -1
  47. package/dist/chunks/{spring-Dgx187Vh.cjs → spring-uQMVJTj9.cjs} +2 -2
  48. package/dist/chunks/{spring-Dgx187Vh.cjs.map → spring-uQMVJTj9.cjs.map} +1 -1
  49. package/dist/chunks/{variants-BQ6bhzn4.js → variants-B-zKORvt.js} +2 -2
  50. package/dist/chunks/{variants-BQ6bhzn4.js.map → variants-B-zKORvt.js.map} +1 -1
  51. package/dist/chunks/{variants-BhjyddG8.cjs → variants-DagykrKH.cjs} +2 -2
  52. package/dist/chunks/{variants-BhjyddG8.cjs.map → variants-DagykrKH.cjs.map} +1 -1
  53. package/dist/components/a11y.cjs +2 -2
  54. package/dist/components/a11y.d.cts +1 -1
  55. package/dist/components/a11y.d.ts +1 -1
  56. package/dist/components/a11y.js +3 -3
  57. package/dist/components/angular.cjs +9 -9
  58. package/dist/components/angular.d.cts +2 -18
  59. package/dist/components/angular.d.ts +2 -18
  60. package/dist/components/angular.js +9 -9
  61. package/dist/components/background.cjs +2 -2
  62. package/dist/components/background.js +2 -2
  63. package/dist/components/bridge.cjs +1 -1
  64. package/dist/components/bridge.js +1 -1
  65. package/dist/components/cards.cjs +2 -2
  66. package/dist/components/cards.js +2 -2
  67. package/dist/components/click.cjs +3 -3
  68. package/dist/components/click.js +3 -3
  69. package/dist/components/depth.cjs +3 -3
  70. package/dist/components/depth.js +3 -3
  71. package/dist/components/effects.cjs +7 -7
  72. package/dist/components/effects.js +9 -9
  73. package/dist/components/engine.cjs +266 -0
  74. package/dist/components/engine.cjs.map +1 -0
  75. package/dist/components/engine.d.cts +105 -0
  76. package/dist/components/engine.d.ts +105 -0
  77. package/dist/components/engine.js +255 -0
  78. package/dist/components/engine.js.map +1 -0
  79. package/dist/components/feedback.cjs +1 -1
  80. package/dist/components/feedback.js +1 -1
  81. package/dist/components/fx-3d.cjs +2 -2
  82. package/dist/components/fx-3d.js +2 -2
  83. package/dist/components/fx-ai.cjs +2 -2
  84. package/dist/components/fx-ai.js +2 -2
  85. package/dist/components/fx-chart.cjs +2 -2
  86. package/dist/components/fx-chart.js +2 -2
  87. package/dist/components/fx-festival.cjs +121 -0
  88. package/dist/components/fx-festival.cjs.map +1 -0
  89. package/dist/components/fx-festival.d.cts +69 -0
  90. package/dist/components/fx-festival.d.ts +69 -0
  91. package/dist/components/fx-festival.js +117 -0
  92. package/dist/components/fx-festival.js.map +1 -0
  93. package/dist/components/fx-focus.cjs +2 -2
  94. package/dist/components/fx-focus.js +2 -2
  95. package/dist/components/fx-form.cjs +2 -2
  96. package/dist/components/fx-form.js +2 -2
  97. package/dist/components/fx-game.cjs +2 -2
  98. package/dist/components/fx-game.js +2 -2
  99. package/dist/components/fx-geo.cjs +2 -2
  100. package/dist/components/fx-geo.js +2 -2
  101. package/dist/components/fx-gpu.cjs +3 -3
  102. package/dist/components/fx-gpu.js +3 -3
  103. package/dist/components/fx-light.cjs +2 -2
  104. package/dist/components/fx-light.js +2 -2
  105. package/dist/components/fx-morph.cjs +2 -2
  106. package/dist/components/fx-morph.js +2 -2
  107. package/dist/components/fx-music.cjs +3 -3
  108. package/dist/components/fx-music.js +3 -3
  109. package/dist/components/fx-physics.cjs +2 -2
  110. package/dist/components/fx-physics.js +2 -2
  111. package/dist/components/fx-shop.cjs +2 -2
  112. package/dist/components/fx-shop.js +2 -2
  113. package/dist/components/fx-social.cjs +2 -2
  114. package/dist/components/fx-social.js +2 -2
  115. package/dist/components/fx-text.cjs +2 -2
  116. package/dist/components/fx-text.js +2 -2
  117. package/dist/components/fx-transitions.cjs +3 -3
  118. package/dist/components/fx-transitions.js +3 -3
  119. package/dist/components/fx-weather.cjs +2 -2
  120. package/dist/components/fx-weather.js +2 -2
  121. package/dist/components/fx.cjs +5 -5
  122. package/dist/components/fx.js +6 -6
  123. package/dist/components/fx2.cjs +10 -4
  124. package/dist/components/fx2.cjs.map +1 -1
  125. package/dist/components/fx2.d.cts +26 -1
  126. package/dist/components/fx2.d.ts +26 -1
  127. package/dist/components/fx2.js +10 -6
  128. package/dist/components/fx2.js.map +1 -1
  129. package/dist/components/gesture.cjs +3 -3
  130. package/dist/components/gesture.js +4 -4
  131. package/dist/components/interaction.cjs +1 -1
  132. package/dist/components/interaction.js +1 -1
  133. package/dist/components/jsx.d.cts +1 -1
  134. package/dist/components/jsx.d.ts +1 -1
  135. package/dist/components/layout.cjs +1 -1
  136. package/dist/components/layout.js +1 -1
  137. package/dist/components/lazy.cjs +1 -1
  138. package/dist/components/lazy.d.cts +1 -1
  139. package/dist/components/lazy.d.ts +1 -1
  140. package/dist/components/lazy.js +1 -1
  141. package/dist/components/lite.cjs +151 -206
  142. package/dist/components/lite.cjs.map +1 -1
  143. package/dist/components/lite.js +152 -206
  144. package/dist/components/lite.js.map +1 -1
  145. package/dist/components/marketplace.cjs +2 -2
  146. package/dist/components/marketplace.js +2 -2
  147. package/dist/components/packs.cjs +1 -1
  148. package/dist/components/packs.js +1 -1
  149. package/dist/components/page.cjs +2 -2
  150. package/dist/components/page.js +3 -3
  151. package/dist/components/perf.cjs +2 -2
  152. package/dist/components/perf.d.cts +1 -1
  153. package/dist/components/perf.d.ts +1 -1
  154. package/dist/components/perf.js +3 -3
  155. package/dist/components/physics.cjs +2 -2
  156. package/dist/components/physics.js +3 -3
  157. package/dist/components/react.cjs +1 -1
  158. package/dist/components/react.js +1 -1
  159. package/dist/components/reveal.cjs +1 -1
  160. package/dist/components/reveal.js +1 -1
  161. package/dist/components/solid.cjs +9 -9
  162. package/dist/components/solid.d.cts +2 -18
  163. package/dist/components/solid.d.ts +2 -18
  164. package/dist/components/solid.js +9 -9
  165. package/dist/components/svelte.cjs +9 -9
  166. package/dist/components/svelte.d.cts +2 -18
  167. package/dist/components/svelte.d.ts +2 -18
  168. package/dist/components/svelte.js +9 -9
  169. package/dist/components/svg.cjs +1 -1
  170. package/dist/components/svg.js +1 -1
  171. package/dist/components/text.cjs +2 -2
  172. package/dist/components/text.js +2 -2
  173. package/dist/components/timeline.cjs +2 -2
  174. package/dist/components/timeline.js +3 -3
  175. package/dist/components/transitions.cjs +1 -1
  176. package/dist/components/transitions.js +1 -1
  177. package/dist/components/ui.cjs +17 -108
  178. package/dist/components/ui.cjs.map +1 -1
  179. package/dist/components/ui.css +0 -1
  180. package/dist/components/ui.d.cts +3 -20
  181. package/dist/components/ui.d.ts +3 -20
  182. package/dist/components/ui.js +19 -109
  183. package/dist/components/ui.js.map +1 -1
  184. package/dist/components/vue.cjs +9 -9
  185. package/dist/components/vue.d.cts +2 -18
  186. package/dist/components/vue.d.ts +2 -18
  187. package/dist/components/vue.js +9 -9
  188. package/dist/components/webgl.cjs +1 -1
  189. package/dist/components/webgl.js +1 -1
  190. package/dist/components/widgets.cjs +373 -146
  191. package/dist/components/widgets.cjs.map +1 -1
  192. package/dist/components/widgets.d.cts +110 -2
  193. package/dist/components/widgets.d.ts +110 -2
  194. package/dist/components/widgets.js +369 -147
  195. package/dist/components/widgets.js.map +1 -1
  196. package/dist/components.cjs +9 -10
  197. package/dist/components.cjs.map +1 -1
  198. package/dist/components.css +0 -1
  199. package/dist/components.d.cts +4 -21
  200. package/dist/components.d.ts +4 -21
  201. package/dist/components.js +12 -12
  202. package/dist/components.umd.js +2 -2
  203. package/dist/components.umd.js.map +1 -1
  204. package/dist/index.cjs +2 -2
  205. package/dist/index.js +2 -2
  206. package/dist/index.umd.js +2 -2
  207. package/dist/index.umd.js.map +1 -1
  208. package/dist/widgets.umd.js +1 -1
  209. package/dist/widgets.umd.js.map +1 -1
  210. package/docs/ROADMAP.md +14 -12
  211. package/docs/accessibility.md +1 -2
  212. package/docs/components.md +44 -1
  213. package/docs/deprecations.md +1 -1
  214. package/docs/upgrading-8.md +9 -6
  215. package/package.json +41 -1
  216. package/dist/chunks/base-2-yYc93C.js.map +0 -1
  217. package/dist/chunks/base-BaQV-2ha.cjs.map +0 -1
  218. package/dist/chunks/index-tags-BTMwrfgV.cjs.map +0 -1
  219. package/dist/chunks/index-tags-C04JP8g4.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [8.1.0] - 2026-10-08
11
+
12
+ ### Added
13
+ - **2 new components (8.1)** in `motionary/components/widgets` (also in `dist/widgets.umd.js`):
14
+ - `<usa-red-envelope>` — Lunar New Year red envelope (红包): tap / Enter / Space → the flap swings open, the card slides out with `amount` counting up (`currency`, default ¥) and gold coins pop out; `message` (恭喜发财), `from`, `opened`; `open()`, `close()`, `opened`; `usa:open` { amount }.
15
+ - `<usa-festival-banner theme="lunar | xmas | halloween | fireworks">` — announcement banner with an ambient festive scene behind its text (lanterns + sparkles, lights + snow, bats + moon, rockets), animating only while on screen; `dismissible` → close button (`usa:dismiss`), `label`; `FESTIVAL_THEMES`.
16
+ - **Festival packs — `motionary/fx/festival`** (= `motionary/components/fx-festival`, `registerFestivalPack()`, also in `registerEffectPacks()`): `firework-burst` (attention), `lantern-rise` (enter), `xmas-snow` (loop), `spooky-float` (attention). `sparkVectors()`.
17
+ - Showcase: 4 new gallery cards with copyable code, live demos and live Store thumbnails; Animation Store 335 → 339 items.
18
+
19
+ ### Fixed
20
+ - Store live thumbnails (`showcase/thumb.js`): the CDN fallback still pointed at `motionary@7` after 8.0 → `motionary@8`.
21
+
22
+ ### Accessibility
23
+ - Red envelope is a real `<button aria-expanded>` with a descriptive label; the amount is announced through a polite live region. Banner: labelled `region`, decorations `aria-hidden`, real dismiss button. Reduced motion: envelope opens without swing / slide / count / coins, the banner scene is static, `firework-burst` / `spooky-float` do nothing, `xmas-snow` is skipped, `lantern-rise` fades in.
24
+
25
+ ## [8.0.0] - 2026-10-08
26
+
27
+ ### ⚠️ Breaking
28
+ - **`<usa-rating>` / `defineRating()` removed** (deprecated in 7.9) → `<usa-star-rating>` / `defineStarRating()` from `motionary/components/widgets` (same `value`, `max`, `readonly`, `label`, `name`; `icon="heart"`; `--usa-star-on`). `npx usa-codemod-8 --write src` rewrites tags, icons and the CSS variable. See [docs/upgrading-8.md](./docs/upgrading-8.md).
29
+ - Frame loops on the shared scheduler receive a `dt` scaled by the motion clock rate (identical at the default rate 1) and are not called while the clock is paused.
30
+
31
+ ### Added
32
+ - **Unified timeline engine — `motionary/engine`** (= `motionary/components/engine`): one clock drives every component, effect and frame loop. `motionClock` (`rate` 0.05–8, `pause()`, `resume()`, `toggle()`, `paused`, `time`, `onChange()`); low-level `getClock()`, `setClock({ rate, paused })`, `onClockChange()`, `trackAnimation()` (also in `motionary/components`' base). Every animation started through the library (`animateWithMotion`, so all `<usa-*>` elements and registered effects) is on the clock.
33
+ - **`createTimeline()`** — sequence animations on the clock: `add(target | targets, keyframes, duration | options (+ stagger), position)` with positions `1200`, `'+=200'`, `'-=100'`, `'<'`, `'<+=80'`, `'>'`; `play()`, `pause()`, `seek(ms)`, `restart()`, `cancel()`, `progress` (get / set), `duration`, `playing`, `finished`; `resolvePosition()`.
34
+ - **SSR hydration animations** — `ssrHead(nonce?)` (`<style>` + one-line `<script>` for the server-rendered head), `HYDRATION_CSS`, `hydrateMotion(root, { stagger, duration, preset, easing })` animates `[data-usa-hydrate="fade | fade-up | fade-down | scale | blur | slide-left"]` (per-element `data-usa-delay`) and emits `usa:hydrated`; `HYDRATE_PRESETS`. No-JS: content visible; JS that never runs: 3 s CSS fallback.
35
+ - **2 new components (8.0)** in `motionary/components/widgets`: `<usa-clock-control>` (pause / speed bar for the motion clock, `speeds`, `usa:change`) and `<usa-hydrate effect stagger duration>` (SSR hydration wrapper for its children, `replay()`, `timeline`, `usa:hydrated`).
36
+ - Chinese roadmap v8.1 → v9.0 in [docs/ROADMAP.md](./docs/ROADMAP.md).
37
+ - Showcase: 2 new gallery cards with copyable code, live demos and live Store thumbnails; the legacy Rating gallery card is gone (Animation Store 333 → 335 items).
38
+ - npm: `motionary` and the `use-scroll-animate` alias are published with the `latest` tag.
39
+
40
+ ### Accessibility
41
+ - Clock control: labelled group, play / pause toggle with `aria-pressed` and a changing label, speeds as a `radiogroup` of `radio` buttons — a page-wide "pause animations" control (WCAG 2.2.2). Hydration never hides content without JS or under reduced motion, and the CSS fallback reveals it after 3 s. Reduced motion: timelines jump to their end, hydration shows at once.
42
+
10
43
  ## [7.9.0] - 2026-10-08
11
44
 
12
45
  ### Added
package/README.md CHANGED
@@ -154,7 +154,7 @@ Import one category (`motionary/components/cards`), everything (`motionary/compo
154
154
  | **Spring & physics** (`/components/physics`) | `<usa-spring>` · `<usa-draggable>` · `<usa-overscroll>` |
155
155
  | **Cards** (`/components/cards`) | `<usa-card>` · `<usa-card-stack>` · `<usa-sticky-stack>` · `<usa-carousel-3d>` |
156
156
  | **Click & buttons** (`/components/click`) | `<usa-click>` · `<usa-button>` · `<usa-icon-morph>` · `<usa-like>` · `<usa-hold>` · `<usa-double-tap>` · `<usa-checkbox>` |
157
- | **UI kit** (`/components/ui`) | `<usa-tabs>` · `<usa-drawer>` · `<usa-bottom-sheet>` · `<usa-pull-refresh>` · `<usa-fab>` · `<usa-navbar>` · `<usa-slider>` · `<usa-rating>` · `<usa-popover>` · `<usa-badge>` · `<usa-avatar-stack>` |
157
+ | **UI kit** (`/components/ui`) | `<usa-tabs>` · `<usa-drawer>` · `<usa-bottom-sheet>` · `<usa-pull-refresh>` · `<usa-fab>` · `<usa-navbar>` · `<usa-slider>` · `<usa-popover>` · `<usa-badge>` · `<usa-avatar-stack>` |
158
158
  | **Page-wide** (`/components/page`) | `<usa-cursor>` · `<usa-fullpage>` · `<usa-loading-bar>` · `<usa-back-to-top>` · `<usa-ambient>` · `<usa-splash>` · `<usa-auto-skeleton>` · `<usa-motion-switch>` |
159
159
  | **Timeline** (`/components/timeline`) | `<usa-timeline>` |
160
160
  | **Gestures** (`/components/gesture`) | `<usa-swipeable>` · `<usa-pinch-zoom>` |
package/README_ja.md CHANGED
@@ -154,7 +154,7 @@ export class Hero {}
154
154
  | **バネ・物理** (`/components/physics`) | `<usa-spring>` · `<usa-draggable>` · `<usa-overscroll>` |
155
155
  | **カード** (`/components/cards`) | `<usa-card>` · `<usa-card-stack>` · `<usa-sticky-stack>` · `<usa-carousel-3d>` |
156
156
  | **クリック・ボタン** (`/components/click`) | `<usa-click>` · `<usa-button>` · `<usa-icon-morph>` · `<usa-like>` · `<usa-hold>` · `<usa-double-tap>` · `<usa-checkbox>` |
157
- | **UI キット** (`/components/ui`) | `<usa-tabs>` · `<usa-drawer>` · `<usa-bottom-sheet>` · `<usa-pull-refresh>` · `<usa-fab>` · `<usa-navbar>` · `<usa-slider>` · `<usa-rating>` · `<usa-popover>` · `<usa-badge>` · `<usa-avatar-stack>` |
157
+ | **UI キット** (`/components/ui`) | `<usa-tabs>` · `<usa-drawer>` · `<usa-bottom-sheet>` · `<usa-pull-refresh>` · `<usa-fab>` · `<usa-navbar>` · `<usa-slider>` · `<usa-popover>` · `<usa-badge>` · `<usa-avatar-stack>` |
158
158
  | **ページ全体** (`/components/page`) | `<usa-cursor>` · `<usa-fullpage>` · `<usa-loading-bar>` · `<usa-back-to-top>` · `<usa-ambient>` · `<usa-splash>` · `<usa-auto-skeleton>` · `<usa-motion-switch>` |
159
159
  | **タイムライン** (`/components/timeline`) | `<usa-timeline>` |
160
160
  | **ジェスチャー** (`/components/gesture`) | `<usa-swipeable>` · `<usa-pinch-zoom>` |
package/README_zh.md CHANGED
@@ -154,7 +154,7 @@ export class Hero {}
154
154
  | **弹簧与物理** (`/components/physics`) | `<usa-spring>` · `<usa-draggable>` · `<usa-overscroll>` |
155
155
  | **卡片** (`/components/cards`) | `<usa-card>` · `<usa-card-stack>` · `<usa-sticky-stack>` · `<usa-carousel-3d>` |
156
156
  | **点击与按钮** (`/components/click`) | `<usa-click>` · `<usa-button>` · `<usa-icon-morph>` · `<usa-like>` · `<usa-hold>` · `<usa-double-tap>` · `<usa-checkbox>` |
157
- | **UI 组件** (`/components/ui`) | `<usa-tabs>` · `<usa-drawer>` · `<usa-bottom-sheet>` · `<usa-pull-refresh>` · `<usa-fab>` · `<usa-navbar>` · `<usa-slider>` · `<usa-rating>` · `<usa-popover>` · `<usa-badge>` · `<usa-avatar-stack>` |
157
+ | **UI 组件** (`/components/ui`) | `<usa-tabs>` · `<usa-drawer>` · `<usa-bottom-sheet>` · `<usa-pull-refresh>` · `<usa-fab>` · `<usa-navbar>` · `<usa-slider>` · `<usa-popover>` · `<usa-badge>` · `<usa-avatar-stack>` |
158
158
  | **整页** (`/components/page`) | `<usa-cursor>` · `<usa-fullpage>` · `<usa-loading-bar>` · `<usa-back-to-top>` · `<usa-ambient>` · `<usa-splash>` · `<usa-auto-skeleton>` · `<usa-motion-switch>` |
159
159
  | **时间线** (`/components/timeline`) | `<usa-timeline>` |
160
160
  | **手势** (`/components/gesture`) | `<usa-swipeable>` · `<usa-pinch-zoom>` |
@@ -1,5 +1,5 @@
1
- import { playEffect } from './registry-CyKExAmE.js';
2
- import { u as defineElement, p as prefersReducedMotion } from './base-2-yYc93C.js';
1
+ import { playEffect } from './registry-CnO7ZVPK.js';
2
+ import { u as defineElement, p as prefersReducedMotion } from './base-CLuqlLfG.js';
3
3
  import { c as canvasBackground, h as hexRgb } from './generative-2LhxG5BJ.js';
4
4
  import { P as PALETTE } from './shared-CkKHWrtJ.js';
5
5
 
@@ -330,4 +330,4 @@ function defineAudio(tag = 'usa-audio') {
330
330
  }
331
331
 
332
332
  export { AUDIO_FX as A, disableAudio as a, bindBeat as b, createBeatDetector as c, defineAudio as d, enableAudio as e, getAudio as g, onBeat as o };
333
- //# sourceMappingURL=audio-DcPvT2Kh.js.map
333
+ //# sourceMappingURL=audio-CynhhWDi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-DcPvT2Kh.js","sources":["../../src/components/effects/audio.ts"],"sourcesContent":["/**\n * 5.6 — sound-reactive effects (Web Audio).\n *\n * - `enableAudio(input)` — start analysing the microphone (`'mic'`), an\n * `<audio>` / `<video>` element (or a selector for one) or a `MediaStream`.\n * Browsers only allow an `AudioContext` to start inside a user gesture, so\n * call it from a click handler (or use `<usa-audio>`, which renders the\n * toggle button for you).\n * - Background effects (kind `background`, Canvas 2D through\n * `canvasBackground()`): `spectrum-bars`, `pulse-ring`, `wave-ring`. Before\n * audio is enabled they idle gently.\n * - Beat detection: `createBeatDetector()` (pure: energy → beat?), `onBeat(cb)`\n * and `bindBeat(el, effect, options)`, which plays any registered effect on\n * every beat. `<usa-audio>` does the same for `[data-usa-beat=\"effect\"]`\n * children and emits `usa-beat`.\n * - While audio runs, `--usa-audio-level` and `--usa-audio-bass` (0–1) are set\n * on `<html>` for CSS-driven reactions.\n *\n * Reduced motion: the visual effects are skipped, beats play no effects and\n * the CSS variables stay at 0 — audio itself keeps playing.\n */\nimport type { EffectDefinition } from '../fx/registry';\nimport { playEffect } from '../fx/registry';\nimport { defineElement, prefersReducedMotion, type UsaElement } from '../base';\nimport { canvasBackground, hexRgb, type GenerativeSpec } from './generative';\nimport { PALETTE } from './shared';\n\nexport type AudioInput = 'mic' | HTMLMediaElement | MediaStream | string;\n\nexport interface AudioSample {\n /** Overall loudness (RMS of the waveform), 0–1. */\n level: number;\n /** Low-frequency energy (first ~8 % of the spectrum), 0–1. */\n bass: number;\n /** Frequency bins, 0–255 each. */\n freq: Uint8Array;\n /** Time-domain waveform, 0–255 (128 = silence). */\n wave: Uint8Array;\n}\n\nexport interface AudioReactive {\n readonly context: AudioContext;\n readonly analyser: AnalyserNode;\n /** Read the analyser now. */\n sample(): AudioSample;\n /** Stop analysing (media keeps playing; the microphone is released). */\n stop(): void;\n}\n\nexport interface BeatOptions {\n /** A beat is energy above `threshold` × the recent average (default 1.35). */\n threshold?: number;\n /** Minimum ms between beats (default 250). */\n cooldown?: number;\n /** Frames of history for the average (default 43 ≈ 0.7 s). */\n history?: number;\n /** Ignore energy below this floor, 0–1 (default 0.08). */\n floor?: number;\n}\n\nlet actx: AudioContext | null = null;\nlet current: AudioReactive | null = null;\nconst mediaSources = new WeakMap<HTMLMediaElement, MediaElementAudioSourceNode>();\n\n/** The running analyser, if `enableAudio()` was called. */\nexport const getAudio = (): AudioReactive | null => current;\n\nfunction audioContext(): AudioContext {\n const AC = (globalThis as any).AudioContext || (globalThis as any).webkitAudioContext;\n if (!AC) throw new Error('[motionary] Web Audio is not available');\n if (!actx || actx.state === 'closed') actx = new AC() as AudioContext;\n return actx;\n}\n\n/**\n * Start analysing `input` and make it the source of every sound-reactive\n * effect. Call from a user gesture. Replaces a previous source.\n */\nexport async function enableAudio(input: AudioInput = 'mic', opts: { fftSize?: number; smoothing?: number } = {}): Promise<AudioReactive> {\n current?.stop();\n const ac = audioContext();\n if (ac.state === 'suspended') await ac.resume().catch(() => undefined);\n const analyser = ac.createAnalyser();\n analyser.fftSize = opts.fftSize || 512;\n analyser.smoothingTimeConstant = opts.smoothing ?? 0.8;\n let src: AudioNode;\n let release = () => {};\n const media = typeof input === 'string' && input !== 'mic' ? document.querySelector<HTMLMediaElement>(input) : input;\n if (media === 'mic') {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n src = ac.createMediaStreamSource(stream);\n src.connect(analyser); // never to the speakers: no feedback\n release = () => stream.getTracks().forEach((t) => t.stop());\n } else if (media && typeof (media as HTMLMediaElement).play === 'function') {\n const m = media as HTMLMediaElement;\n let node = mediaSources.get(m);\n if (!node) mediaSources.set(m, (node = ac.createMediaElementSource(m)));\n try {\n node.disconnect();\n } catch {\n /* not connected */\n }\n src = node;\n src.connect(analyser);\n analyser.connect(ac.destination);\n release = () => {\n try {\n node!.disconnect();\n } catch {\n /* already */\n }\n node!.connect(ac.destination); // keep the media audible\n };\n if (m.paused) await m.play()?.catch?.(() => undefined);\n } else if (media && typeof (media as MediaStream).getTracks === 'function') {\n src = ac.createMediaStreamSource(media as MediaStream);\n src.connect(analyser);\n } else throw new Error(`[motionary] enableAudio: no audio source for ${String(input)}`);\n const freq = new Uint8Array(analyser.frequencyBinCount);\n const wave = new Uint8Array(analyser.fftSize);\n const self: AudioReactive = {\n context: ac,\n analyser,\n sample: () => {\n analyser.getByteFrequencyData(freq);\n analyser.getByteTimeDomainData(wave);\n let sq = 0;\n for (let i = 0; i < wave.length; i++) sq += ((wave[i] - 128) / 128) ** 2;\n const n = Math.max(1, Math.round(freq.length * 0.08));\n let b = 0;\n for (let i = 0; i < n; i++) b += freq[i];\n return { level: Math.min(1, Math.sqrt(sq / wave.length) * 2), bass: b / n / 255, freq, wave };\n },\n stop: () => {\n if (current === self) {\n current = null;\n if (raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(raf);\n raf = 0;\n }\n try {\n src.disconnect();\n analyser.disconnect();\n } catch {\n /* already */\n }\n release();\n setVars(0, 0);\n },\n };\n current = self;\n kick();\n return self;\n}\n\n/** Stop the current audio source (if any). */\nexport function disableAudio(): void {\n current?.stop();\n}\n\n/** A pure beat detector: feed it energy (0–1) and a timestamp per frame; it answers \"beat?\". */\nexport function createBeatDetector(o: BeatOptions = {}): (energy: number, now: number) => boolean {\n const { threshold = 1.35, cooldown = 250, history = 43, floor = 0.08 } = o;\n const hist: number[] = [];\n let last = -Infinity;\n return (energy, now) => {\n const avg = hist.length ? hist.reduce((a, b) => a + b, 0) / hist.length : energy;\n const ready = hist.length >= 8;\n hist.push(energy);\n if (hist.length > history) hist.shift();\n if (ready && energy > floor && energy > avg * threshold && now - last >= cooldown) {\n last = now;\n return true;\n }\n return false;\n };\n}\n\ntype BeatListener = { detect: (e: number, t: number) => boolean; cb: (detail: { energy: number; time: number }) => void };\nconst listeners = new Set<BeatListener>();\nlet raf = 0;\n\nfunction setVars(level: number, bass: number): void {\n if (typeof document === 'undefined') return;\n const s = document.documentElement.style;\n s.setProperty('--usa-audio-level', level.toFixed(3));\n s.setProperty('--usa-audio-bass', bass.toFixed(3));\n}\n\nfunction loop(now: number): void {\n raf = 0;\n if (!current) return;\n const { level, bass } = current.sample();\n const reduced = prefersReducedMotion();\n setVars(reduced ? 0 : level, reduced ? 0 : bass);\n for (const l of Array.from(listeners)) if (l.detect(bass, now)) l.cb({ energy: bass, time: now });\n kick();\n}\n\nfunction kick(): void {\n if (!raf && current && typeof requestAnimationFrame === 'function') raf = requestAnimationFrame(loop);\n}\n\n/** Call `cb` on every detected beat of the current audio source. Returns an unsubscribe. */\nexport function onBeat(cb: (detail: { energy: number; time: number }) => void, o: BeatOptions = {}): () => void {\n const l: BeatListener = { detect: createBeatDetector(o), cb };\n listeners.add(l);\n kick();\n return () => void listeners.delete(l);\n}\n\n/** Play the registered effect `name` on `el` at every beat (not under reduced motion). Returns an unbind. */\nexport function bindBeat(el: HTMLElement, name: string, options: Record<string, unknown> & BeatOptions = {}): () => void {\n const { threshold, cooldown, history, floor, ...fx } = options;\n return onBeat(() => {\n if (!prefersReducedMotion()) playEffect(el, name, fx).catch(() => undefined);\n }, { threshold, cooldown, history, floor } as BeatOptions);\n}\n\n// --- visual effects ----------------------------------------------------------\n\n/** The current sample, or a gentle synthetic one while no audio is enabled. */\nfunction read(t: number, bins: number): AudioSample & { idle: boolean } {\n if (current) return { ...current.sample(), idle: false };\n const freq = new Uint8Array(bins);\n const wave = new Uint8Array(bins * 2);\n for (let i = 0; i < bins; i++) freq[i] = 70 + 50 * Math.sin(t * 2 + i * 0.35) * Math.cos(t * 0.7 + i * 0.11) * (1 - i / bins);\n for (let i = 0; i < wave.length; i++) wave[i] = 128 + 22 * Math.sin(t * 3 + i * 0.12);\n return { level: 0.25 + 0.1 * Math.sin(t * 2), bass: 0.35 + 0.2 * Math.sin(t * 2.4), freq, wave, idle: true };\n}\n\nconst audioFx = (name: string, description: string, defaults: Record<string, unknown>, spec: GenerativeSpec): EffectDefinition => ({\n name,\n kind: 'background',\n description,\n reduced: 'skip',\n defaults: { colors: PALETTE, background: '#0b0d12', speed: 1, quality: 1, ...defaults },\n run: (el, o: any, ctx) => canvasBackground(el, ctx, spec, o),\n});\n\nexport const AUDIO_FX: EffectDefinition[] = [\n audioFx('spectrum-bars', 'Frequency bars dance to the audio (mirror them with `mirror: true`).', { bars: 48, gap: 2, mirror: false }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, o.bars);\n const per = Math.max(1, Math.floor((s.freq.length * 0.7) / o.bars));\n const bw = w / o.bars;\n for (let i = 0; i < o.bars; i++) {\n let v = 0;\n for (let k = 0; k < per; k++) v += s.freq[Math.min(s.freq.length - 1, i * per + k)];\n const bh = (v / per / 255) * h * (o.mirror ? 0.5 : 0.9);\n ctx.fillStyle = o.colors[i % o.colors.length];\n ctx.fillRect(i * bw + o.gap / 2, o.mirror ? h / 2 - bh : h - bh, Math.max(1, bw - o.gap), o.mirror ? bh * 2 : bh);\n }\n },\n }),\n audioFx('pulse-ring', 'Glowing rings pulse with the bass.', { rings: 3, color: '#7c5cff' }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, 32);\n const [r, g, b] = hexRgb(o.color);\n const base = Math.min(w, h) * 0.18;\n for (let i = 0; i < o.rings; i++) {\n const rad = base * (1 + i * 0.55) * (1 + s.bass * 0.6);\n ctx.strokeStyle = `rgba(${r},${g},${b},${(0.9 - i * 0.25) * (0.4 + s.level)})`;\n ctx.lineWidth = 3 + s.bass * 10 - i;\n ctx.beginPath();\n ctx.arc(w / 2, h / 2, rad, 0, Math.PI * 2);\n ctx.stroke();\n }\n },\n }),\n audioFx('wave-ring', 'The live waveform wrapped into a circle.', { color: '#22d3ee', amplitude: 0.35 }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, 64);\n const n = s.wave.length;\n const base = Math.min(w, h) * 0.28;\n ctx.strokeStyle = o.color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n for (let i = 0; i <= n; i++) {\n const a = (i / n) * Math.PI * 2;\n const rad = base * (1 + ((s.wave[i % n] - 128) / 128) * o.amplitude * 2);\n const x = w / 2 + Math.cos(a) * rad;\n const y = h / 2 + Math.sin(a) * rad;\n if (i) ctx.lineTo(x, y);\n else ctx.moveTo(x, y);\n }\n ctx.closePath();\n ctx.stroke();\n },\n }),\n];\n\n// --- <usa-audio> -----------------------------------------------------------\n\nexport interface UsaAudioElement extends UsaElement {\n /** `true` while this element's audio source is being analysed. */\n readonly active: boolean;\n /** Start (from a user gesture) or stop analysing. */\n toggle(): Promise<void>;\n}\n\n/**\n * `<usa-audio source=\"#track | mic\" label=\"…\">` — a toggle button (yours, as\n * `[data-audio-toggle]`, or one it renders) that enables the audio source on\n * click; children with `data-usa-beat=\"effect\"` play that effect on every\n * beat (`data-usa-beat-options` JSON; `threshold` / `cooldown` attributes).\n * Emits `usa-beat` and `usa-audio-error`.\n */\nexport function defineAudio(tag = 'usa-audio'): CustomElementConstructor | undefined {\n return defineElement(\n tag,\n (Base) =>\n class UsaAudio extends Base {\n static get observedAttributes(): string[] {\n return ['source'];\n }\n active = false;\n private audio: AudioReactive | null = null;\n private off: (() => void) | null = null;\n private button(): HTMLButtonElement {\n let b = this.querySelector<HTMLButtonElement>('[data-audio-toggle]');\n if (!b) {\n b = document.createElement('button');\n b.type = 'button';\n b.setAttribute('data-audio-toggle', '');\n b.textContent = this.str('label', '🔊 Enable sound-reactive effects');\n this.prepend(b);\n this.onCleanup(() => b!.remove());\n }\n return b;\n }\n async toggle(): Promise<void> {\n const b = this.button();\n if (this.active) return this.stop();\n try {\n this.audio = await enableAudio(this.str('source', 'mic'));\n this.active = true;\n this.removeAttribute('data-audio-error');\n b.setAttribute('aria-pressed', 'true');\n this.off = onBeat((d) => {\n this.dispatchEvent(new CustomEvent('usa-beat', { detail: d, bubbles: true }));\n if (prefersReducedMotion()) return;\n this.querySelectorAll<HTMLElement>('[data-usa-beat]').forEach((el) => {\n let opts = {};\n try {\n opts = JSON.parse(el.dataset.usaBeatOptions || '{}') || {};\n } catch {\n /* ignore bad JSON */\n }\n playEffect(el, el.dataset.usaBeat || 'pulse', opts).catch(() => undefined);\n });\n }, { threshold: this.num('threshold', 1.35), cooldown: this.num('cooldown', 250) });\n } catch (err) {\n this.setAttribute('data-audio-error', '');\n this.dispatchEvent(new CustomEvent('usa-audio-error', { detail: { error: err }, bubbles: true }));\n }\n }\n private stop(): void {\n this.off?.();\n this.off = null;\n if (this.audio && current === this.audio) this.audio.stop();\n this.audio = null;\n this.active = false;\n this.querySelector('[data-audio-toggle]')?.setAttribute('aria-pressed', 'false');\n }\n mount(): void {\n const b = this.button();\n b.setAttribute('aria-pressed', 'false');\n this.listen(b, 'click', () => void this.toggle());\n this.onCleanup(() => this.stop());\n }\n },\n { id: 'usa-audio', text: 'usa-audio{display:block}usa-audio[data-audio-error] [data-audio-toggle]{outline:2px solid #ff5c8a}' }\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio-CynhhWDi.js","sources":["../../src/components/effects/audio.ts"],"sourcesContent":["/**\n * 5.6 — sound-reactive effects (Web Audio).\n *\n * - `enableAudio(input)` — start analysing the microphone (`'mic'`), an\n * `<audio>` / `<video>` element (or a selector for one) or a `MediaStream`.\n * Browsers only allow an `AudioContext` to start inside a user gesture, so\n * call it from a click handler (or use `<usa-audio>`, which renders the\n * toggle button for you).\n * - Background effects (kind `background`, Canvas 2D through\n * `canvasBackground()`): `spectrum-bars`, `pulse-ring`, `wave-ring`. Before\n * audio is enabled they idle gently.\n * - Beat detection: `createBeatDetector()` (pure: energy → beat?), `onBeat(cb)`\n * and `bindBeat(el, effect, options)`, which plays any registered effect on\n * every beat. `<usa-audio>` does the same for `[data-usa-beat=\"effect\"]`\n * children and emits `usa-beat`.\n * - While audio runs, `--usa-audio-level` and `--usa-audio-bass` (0–1) are set\n * on `<html>` for CSS-driven reactions.\n *\n * Reduced motion: the visual effects are skipped, beats play no effects and\n * the CSS variables stay at 0 — audio itself keeps playing.\n */\nimport type { EffectDefinition } from '../fx/registry';\nimport { playEffect } from '../fx/registry';\nimport { defineElement, prefersReducedMotion, type UsaElement } from '../base';\nimport { canvasBackground, hexRgb, type GenerativeSpec } from './generative';\nimport { PALETTE } from './shared';\n\nexport type AudioInput = 'mic' | HTMLMediaElement | MediaStream | string;\n\nexport interface AudioSample {\n /** Overall loudness (RMS of the waveform), 0–1. */\n level: number;\n /** Low-frequency energy (first ~8 % of the spectrum), 0–1. */\n bass: number;\n /** Frequency bins, 0–255 each. */\n freq: Uint8Array;\n /** Time-domain waveform, 0–255 (128 = silence). */\n wave: Uint8Array;\n}\n\nexport interface AudioReactive {\n readonly context: AudioContext;\n readonly analyser: AnalyserNode;\n /** Read the analyser now. */\n sample(): AudioSample;\n /** Stop analysing (media keeps playing; the microphone is released). */\n stop(): void;\n}\n\nexport interface BeatOptions {\n /** A beat is energy above `threshold` × the recent average (default 1.35). */\n threshold?: number;\n /** Minimum ms between beats (default 250). */\n cooldown?: number;\n /** Frames of history for the average (default 43 ≈ 0.7 s). */\n history?: number;\n /** Ignore energy below this floor, 0–1 (default 0.08). */\n floor?: number;\n}\n\nlet actx: AudioContext | null = null;\nlet current: AudioReactive | null = null;\nconst mediaSources = new WeakMap<HTMLMediaElement, MediaElementAudioSourceNode>();\n\n/** The running analyser, if `enableAudio()` was called. */\nexport const getAudio = (): AudioReactive | null => current;\n\nfunction audioContext(): AudioContext {\n const AC = (globalThis as any).AudioContext || (globalThis as any).webkitAudioContext;\n if (!AC) throw new Error('[motionary] Web Audio is not available');\n if (!actx || actx.state === 'closed') actx = new AC() as AudioContext;\n return actx;\n}\n\n/**\n * Start analysing `input` and make it the source of every sound-reactive\n * effect. Call from a user gesture. Replaces a previous source.\n */\nexport async function enableAudio(input: AudioInput = 'mic', opts: { fftSize?: number; smoothing?: number } = {}): Promise<AudioReactive> {\n current?.stop();\n const ac = audioContext();\n if (ac.state === 'suspended') await ac.resume().catch(() => undefined);\n const analyser = ac.createAnalyser();\n analyser.fftSize = opts.fftSize || 512;\n analyser.smoothingTimeConstant = opts.smoothing ?? 0.8;\n let src: AudioNode;\n let release = () => {};\n const media = typeof input === 'string' && input !== 'mic' ? document.querySelector<HTMLMediaElement>(input) : input;\n if (media === 'mic') {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n src = ac.createMediaStreamSource(stream);\n src.connect(analyser); // never to the speakers: no feedback\n release = () => stream.getTracks().forEach((t) => t.stop());\n } else if (media && typeof (media as HTMLMediaElement).play === 'function') {\n const m = media as HTMLMediaElement;\n let node = mediaSources.get(m);\n if (!node) mediaSources.set(m, (node = ac.createMediaElementSource(m)));\n try {\n node.disconnect();\n } catch {\n /* not connected */\n }\n src = node;\n src.connect(analyser);\n analyser.connect(ac.destination);\n release = () => {\n try {\n node!.disconnect();\n } catch {\n /* already */\n }\n node!.connect(ac.destination); // keep the media audible\n };\n if (m.paused) await m.play()?.catch?.(() => undefined);\n } else if (media && typeof (media as MediaStream).getTracks === 'function') {\n src = ac.createMediaStreamSource(media as MediaStream);\n src.connect(analyser);\n } else throw new Error(`[motionary] enableAudio: no audio source for ${String(input)}`);\n const freq = new Uint8Array(analyser.frequencyBinCount);\n const wave = new Uint8Array(analyser.fftSize);\n const self: AudioReactive = {\n context: ac,\n analyser,\n sample: () => {\n analyser.getByteFrequencyData(freq);\n analyser.getByteTimeDomainData(wave);\n let sq = 0;\n for (let i = 0; i < wave.length; i++) sq += ((wave[i] - 128) / 128) ** 2;\n const n = Math.max(1, Math.round(freq.length * 0.08));\n let b = 0;\n for (let i = 0; i < n; i++) b += freq[i];\n return { level: Math.min(1, Math.sqrt(sq / wave.length) * 2), bass: b / n / 255, freq, wave };\n },\n stop: () => {\n if (current === self) {\n current = null;\n if (raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(raf);\n raf = 0;\n }\n try {\n src.disconnect();\n analyser.disconnect();\n } catch {\n /* already */\n }\n release();\n setVars(0, 0);\n },\n };\n current = self;\n kick();\n return self;\n}\n\n/** Stop the current audio source (if any). */\nexport function disableAudio(): void {\n current?.stop();\n}\n\n/** A pure beat detector: feed it energy (0–1) and a timestamp per frame; it answers \"beat?\". */\nexport function createBeatDetector(o: BeatOptions = {}): (energy: number, now: number) => boolean {\n const { threshold = 1.35, cooldown = 250, history = 43, floor = 0.08 } = o;\n const hist: number[] = [];\n let last = -Infinity;\n return (energy, now) => {\n const avg = hist.length ? hist.reduce((a, b) => a + b, 0) / hist.length : energy;\n const ready = hist.length >= 8;\n hist.push(energy);\n if (hist.length > history) hist.shift();\n if (ready && energy > floor && energy > avg * threshold && now - last >= cooldown) {\n last = now;\n return true;\n }\n return false;\n };\n}\n\ntype BeatListener = { detect: (e: number, t: number) => boolean; cb: (detail: { energy: number; time: number }) => void };\nconst listeners = new Set<BeatListener>();\nlet raf = 0;\n\nfunction setVars(level: number, bass: number): void {\n if (typeof document === 'undefined') return;\n const s = document.documentElement.style;\n s.setProperty('--usa-audio-level', level.toFixed(3));\n s.setProperty('--usa-audio-bass', bass.toFixed(3));\n}\n\nfunction loop(now: number): void {\n raf = 0;\n if (!current) return;\n const { level, bass } = current.sample();\n const reduced = prefersReducedMotion();\n setVars(reduced ? 0 : level, reduced ? 0 : bass);\n for (const l of Array.from(listeners)) if (l.detect(bass, now)) l.cb({ energy: bass, time: now });\n kick();\n}\n\nfunction kick(): void {\n if (!raf && current && typeof requestAnimationFrame === 'function') raf = requestAnimationFrame(loop);\n}\n\n/** Call `cb` on every detected beat of the current audio source. Returns an unsubscribe. */\nexport function onBeat(cb: (detail: { energy: number; time: number }) => void, o: BeatOptions = {}): () => void {\n const l: BeatListener = { detect: createBeatDetector(o), cb };\n listeners.add(l);\n kick();\n return () => void listeners.delete(l);\n}\n\n/** Play the registered effect `name` on `el` at every beat (not under reduced motion). Returns an unbind. */\nexport function bindBeat(el: HTMLElement, name: string, options: Record<string, unknown> & BeatOptions = {}): () => void {\n const { threshold, cooldown, history, floor, ...fx } = options;\n return onBeat(() => {\n if (!prefersReducedMotion()) playEffect(el, name, fx).catch(() => undefined);\n }, { threshold, cooldown, history, floor } as BeatOptions);\n}\n\n// --- visual effects ----------------------------------------------------------\n\n/** The current sample, or a gentle synthetic one while no audio is enabled. */\nfunction read(t: number, bins: number): AudioSample & { idle: boolean } {\n if (current) return { ...current.sample(), idle: false };\n const freq = new Uint8Array(bins);\n const wave = new Uint8Array(bins * 2);\n for (let i = 0; i < bins; i++) freq[i] = 70 + 50 * Math.sin(t * 2 + i * 0.35) * Math.cos(t * 0.7 + i * 0.11) * (1 - i / bins);\n for (let i = 0; i < wave.length; i++) wave[i] = 128 + 22 * Math.sin(t * 3 + i * 0.12);\n return { level: 0.25 + 0.1 * Math.sin(t * 2), bass: 0.35 + 0.2 * Math.sin(t * 2.4), freq, wave, idle: true };\n}\n\nconst audioFx = (name: string, description: string, defaults: Record<string, unknown>, spec: GenerativeSpec): EffectDefinition => ({\n name,\n kind: 'background',\n description,\n reduced: 'skip',\n defaults: { colors: PALETTE, background: '#0b0d12', speed: 1, quality: 1, ...defaults },\n run: (el, o: any, ctx) => canvasBackground(el, ctx, spec, o),\n});\n\nexport const AUDIO_FX: EffectDefinition[] = [\n audioFx('spectrum-bars', 'Frequency bars dance to the audio (mirror them with `mirror: true`).', { bars: 48, gap: 2, mirror: false }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, o.bars);\n const per = Math.max(1, Math.floor((s.freq.length * 0.7) / o.bars));\n const bw = w / o.bars;\n for (let i = 0; i < o.bars; i++) {\n let v = 0;\n for (let k = 0; k < per; k++) v += s.freq[Math.min(s.freq.length - 1, i * per + k)];\n const bh = (v / per / 255) * h * (o.mirror ? 0.5 : 0.9);\n ctx.fillStyle = o.colors[i % o.colors.length];\n ctx.fillRect(i * bw + o.gap / 2, o.mirror ? h / 2 - bh : h - bh, Math.max(1, bw - o.gap), o.mirror ? bh * 2 : bh);\n }\n },\n }),\n audioFx('pulse-ring', 'Glowing rings pulse with the bass.', { rings: 3, color: '#7c5cff' }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, 32);\n const [r, g, b] = hexRgb(o.color);\n const base = Math.min(w, h) * 0.18;\n for (let i = 0; i < o.rings; i++) {\n const rad = base * (1 + i * 0.55) * (1 + s.bass * 0.6);\n ctx.strokeStyle = `rgba(${r},${g},${b},${(0.9 - i * 0.25) * (0.4 + s.level)})`;\n ctx.lineWidth = 3 + s.bass * 10 - i;\n ctx.beginPath();\n ctx.arc(w / 2, h / 2, rad, 0, Math.PI * 2);\n ctx.stroke();\n }\n },\n }),\n audioFx('wave-ring', 'The live waveform wrapped into a circle.', { color: '#22d3ee', amplitude: 0.35 }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, 64);\n const n = s.wave.length;\n const base = Math.min(w, h) * 0.28;\n ctx.strokeStyle = o.color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n for (let i = 0; i <= n; i++) {\n const a = (i / n) * Math.PI * 2;\n const rad = base * (1 + ((s.wave[i % n] - 128) / 128) * o.amplitude * 2);\n const x = w / 2 + Math.cos(a) * rad;\n const y = h / 2 + Math.sin(a) * rad;\n if (i) ctx.lineTo(x, y);\n else ctx.moveTo(x, y);\n }\n ctx.closePath();\n ctx.stroke();\n },\n }),\n];\n\n// --- <usa-audio> -----------------------------------------------------------\n\nexport interface UsaAudioElement extends UsaElement {\n /** `true` while this element's audio source is being analysed. */\n readonly active: boolean;\n /** Start (from a user gesture) or stop analysing. */\n toggle(): Promise<void>;\n}\n\n/**\n * `<usa-audio source=\"#track | mic\" label=\"…\">` — a toggle button (yours, as\n * `[data-audio-toggle]`, or one it renders) that enables the audio source on\n * click; children with `data-usa-beat=\"effect\"` play that effect on every\n * beat (`data-usa-beat-options` JSON; `threshold` / `cooldown` attributes).\n * Emits `usa-beat` and `usa-audio-error`.\n */\nexport function defineAudio(tag = 'usa-audio'): CustomElementConstructor | undefined {\n return defineElement(\n tag,\n (Base) =>\n class UsaAudio extends Base {\n static get observedAttributes(): string[] {\n return ['source'];\n }\n active = false;\n private audio: AudioReactive | null = null;\n private off: (() => void) | null = null;\n private button(): HTMLButtonElement {\n let b = this.querySelector<HTMLButtonElement>('[data-audio-toggle]');\n if (!b) {\n b = document.createElement('button');\n b.type = 'button';\n b.setAttribute('data-audio-toggle', '');\n b.textContent = this.str('label', '🔊 Enable sound-reactive effects');\n this.prepend(b);\n this.onCleanup(() => b!.remove());\n }\n return b;\n }\n async toggle(): Promise<void> {\n const b = this.button();\n if (this.active) return this.stop();\n try {\n this.audio = await enableAudio(this.str('source', 'mic'));\n this.active = true;\n this.removeAttribute('data-audio-error');\n b.setAttribute('aria-pressed', 'true');\n this.off = onBeat((d) => {\n this.dispatchEvent(new CustomEvent('usa-beat', { detail: d, bubbles: true }));\n if (prefersReducedMotion()) return;\n this.querySelectorAll<HTMLElement>('[data-usa-beat]').forEach((el) => {\n let opts = {};\n try {\n opts = JSON.parse(el.dataset.usaBeatOptions || '{}') || {};\n } catch {\n /* ignore bad JSON */\n }\n playEffect(el, el.dataset.usaBeat || 'pulse', opts).catch(() => undefined);\n });\n }, { threshold: this.num('threshold', 1.35), cooldown: this.num('cooldown', 250) });\n } catch (err) {\n this.setAttribute('data-audio-error', '');\n this.dispatchEvent(new CustomEvent('usa-audio-error', { detail: { error: err }, bubbles: true }));\n }\n }\n private stop(): void {\n this.off?.();\n this.off = null;\n if (this.audio && current === this.audio) this.audio.stop();\n this.audio = null;\n this.active = false;\n this.querySelector('[data-audio-toggle]')?.setAttribute('aria-pressed', 'false');\n }\n mount(): void {\n const b = this.button();\n b.setAttribute('aria-pressed', 'false');\n this.listen(b, 'click', () => void this.toggle());\n this.onCleanup(() => this.stop());\n }\n },\n { id: 'usa-audio', text: 'usa-audio{display:block}usa-audio[data-audio-error] [data-audio-toggle]{outline:2px solid #ff5c8a}' }\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var registry = require('./registry-DehBVRDV.cjs');
4
- var base = require('./base-BaQV-2ha.cjs');
3
+ var registry = require('./registry-BVklOepd.cjs');
4
+ var base = require('./base-DoRUZBy-.cjs');
5
5
  var generative = require('./generative-BHIj-NU0.cjs');
6
6
  var shared = require('./shared-jkgRH-Hx.cjs');
7
7
 
@@ -339,4 +339,4 @@ exports.disableAudio = disableAudio;
339
339
  exports.enableAudio = enableAudio;
340
340
  exports.getAudio = getAudio;
341
341
  exports.onBeat = onBeat;
342
- //# sourceMappingURL=audio-EXUoijsG.cjs.map
342
+ //# sourceMappingURL=audio-cgWbDkoY.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-EXUoijsG.cjs","sources":["../../src/components/effects/audio.ts"],"sourcesContent":["/**\n * 5.6 — sound-reactive effects (Web Audio).\n *\n * - `enableAudio(input)` — start analysing the microphone (`'mic'`), an\n * `<audio>` / `<video>` element (or a selector for one) or a `MediaStream`.\n * Browsers only allow an `AudioContext` to start inside a user gesture, so\n * call it from a click handler (or use `<usa-audio>`, which renders the\n * toggle button for you).\n * - Background effects (kind `background`, Canvas 2D through\n * `canvasBackground()`): `spectrum-bars`, `pulse-ring`, `wave-ring`. Before\n * audio is enabled they idle gently.\n * - Beat detection: `createBeatDetector()` (pure: energy → beat?), `onBeat(cb)`\n * and `bindBeat(el, effect, options)`, which plays any registered effect on\n * every beat. `<usa-audio>` does the same for `[data-usa-beat=\"effect\"]`\n * children and emits `usa-beat`.\n * - While audio runs, `--usa-audio-level` and `--usa-audio-bass` (0–1) are set\n * on `<html>` for CSS-driven reactions.\n *\n * Reduced motion: the visual effects are skipped, beats play no effects and\n * the CSS variables stay at 0 — audio itself keeps playing.\n */\nimport type { EffectDefinition } from '../fx/registry';\nimport { playEffect } from '../fx/registry';\nimport { defineElement, prefersReducedMotion, type UsaElement } from '../base';\nimport { canvasBackground, hexRgb, type GenerativeSpec } from './generative';\nimport { PALETTE } from './shared';\n\nexport type AudioInput = 'mic' | HTMLMediaElement | MediaStream | string;\n\nexport interface AudioSample {\n /** Overall loudness (RMS of the waveform), 0–1. */\n level: number;\n /** Low-frequency energy (first ~8 % of the spectrum), 0–1. */\n bass: number;\n /** Frequency bins, 0–255 each. */\n freq: Uint8Array;\n /** Time-domain waveform, 0–255 (128 = silence). */\n wave: Uint8Array;\n}\n\nexport interface AudioReactive {\n readonly context: AudioContext;\n readonly analyser: AnalyserNode;\n /** Read the analyser now. */\n sample(): AudioSample;\n /** Stop analysing (media keeps playing; the microphone is released). */\n stop(): void;\n}\n\nexport interface BeatOptions {\n /** A beat is energy above `threshold` × the recent average (default 1.35). */\n threshold?: number;\n /** Minimum ms between beats (default 250). */\n cooldown?: number;\n /** Frames of history for the average (default 43 ≈ 0.7 s). */\n history?: number;\n /** Ignore energy below this floor, 0–1 (default 0.08). */\n floor?: number;\n}\n\nlet actx: AudioContext | null = null;\nlet current: AudioReactive | null = null;\nconst mediaSources = new WeakMap<HTMLMediaElement, MediaElementAudioSourceNode>();\n\n/** The running analyser, if `enableAudio()` was called. */\nexport const getAudio = (): AudioReactive | null => current;\n\nfunction audioContext(): AudioContext {\n const AC = (globalThis as any).AudioContext || (globalThis as any).webkitAudioContext;\n if (!AC) throw new Error('[motionary] Web Audio is not available');\n if (!actx || actx.state === 'closed') actx = new AC() as AudioContext;\n return actx;\n}\n\n/**\n * Start analysing `input` and make it the source of every sound-reactive\n * effect. Call from a user gesture. Replaces a previous source.\n */\nexport async function enableAudio(input: AudioInput = 'mic', opts: { fftSize?: number; smoothing?: number } = {}): Promise<AudioReactive> {\n current?.stop();\n const ac = audioContext();\n if (ac.state === 'suspended') await ac.resume().catch(() => undefined);\n const analyser = ac.createAnalyser();\n analyser.fftSize = opts.fftSize || 512;\n analyser.smoothingTimeConstant = opts.smoothing ?? 0.8;\n let src: AudioNode;\n let release = () => {};\n const media = typeof input === 'string' && input !== 'mic' ? document.querySelector<HTMLMediaElement>(input) : input;\n if (media === 'mic') {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n src = ac.createMediaStreamSource(stream);\n src.connect(analyser); // never to the speakers: no feedback\n release = () => stream.getTracks().forEach((t) => t.stop());\n } else if (media && typeof (media as HTMLMediaElement).play === 'function') {\n const m = media as HTMLMediaElement;\n let node = mediaSources.get(m);\n if (!node) mediaSources.set(m, (node = ac.createMediaElementSource(m)));\n try {\n node.disconnect();\n } catch {\n /* not connected */\n }\n src = node;\n src.connect(analyser);\n analyser.connect(ac.destination);\n release = () => {\n try {\n node!.disconnect();\n } catch {\n /* already */\n }\n node!.connect(ac.destination); // keep the media audible\n };\n if (m.paused) await m.play()?.catch?.(() => undefined);\n } else if (media && typeof (media as MediaStream).getTracks === 'function') {\n src = ac.createMediaStreamSource(media as MediaStream);\n src.connect(analyser);\n } else throw new Error(`[motionary] enableAudio: no audio source for ${String(input)}`);\n const freq = new Uint8Array(analyser.frequencyBinCount);\n const wave = new Uint8Array(analyser.fftSize);\n const self: AudioReactive = {\n context: ac,\n analyser,\n sample: () => {\n analyser.getByteFrequencyData(freq);\n analyser.getByteTimeDomainData(wave);\n let sq = 0;\n for (let i = 0; i < wave.length; i++) sq += ((wave[i] - 128) / 128) ** 2;\n const n = Math.max(1, Math.round(freq.length * 0.08));\n let b = 0;\n for (let i = 0; i < n; i++) b += freq[i];\n return { level: Math.min(1, Math.sqrt(sq / wave.length) * 2), bass: b / n / 255, freq, wave };\n },\n stop: () => {\n if (current === self) {\n current = null;\n if (raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(raf);\n raf = 0;\n }\n try {\n src.disconnect();\n analyser.disconnect();\n } catch {\n /* already */\n }\n release();\n setVars(0, 0);\n },\n };\n current = self;\n kick();\n return self;\n}\n\n/** Stop the current audio source (if any). */\nexport function disableAudio(): void {\n current?.stop();\n}\n\n/** A pure beat detector: feed it energy (0–1) and a timestamp per frame; it answers \"beat?\". */\nexport function createBeatDetector(o: BeatOptions = {}): (energy: number, now: number) => boolean {\n const { threshold = 1.35, cooldown = 250, history = 43, floor = 0.08 } = o;\n const hist: number[] = [];\n let last = -Infinity;\n return (energy, now) => {\n const avg = hist.length ? hist.reduce((a, b) => a + b, 0) / hist.length : energy;\n const ready = hist.length >= 8;\n hist.push(energy);\n if (hist.length > history) hist.shift();\n if (ready && energy > floor && energy > avg * threshold && now - last >= cooldown) {\n last = now;\n return true;\n }\n return false;\n };\n}\n\ntype BeatListener = { detect: (e: number, t: number) => boolean; cb: (detail: { energy: number; time: number }) => void };\nconst listeners = new Set<BeatListener>();\nlet raf = 0;\n\nfunction setVars(level: number, bass: number): void {\n if (typeof document === 'undefined') return;\n const s = document.documentElement.style;\n s.setProperty('--usa-audio-level', level.toFixed(3));\n s.setProperty('--usa-audio-bass', bass.toFixed(3));\n}\n\nfunction loop(now: number): void {\n raf = 0;\n if (!current) return;\n const { level, bass } = current.sample();\n const reduced = prefersReducedMotion();\n setVars(reduced ? 0 : level, reduced ? 0 : bass);\n for (const l of Array.from(listeners)) if (l.detect(bass, now)) l.cb({ energy: bass, time: now });\n kick();\n}\n\nfunction kick(): void {\n if (!raf && current && typeof requestAnimationFrame === 'function') raf = requestAnimationFrame(loop);\n}\n\n/** Call `cb` on every detected beat of the current audio source. Returns an unsubscribe. */\nexport function onBeat(cb: (detail: { energy: number; time: number }) => void, o: BeatOptions = {}): () => void {\n const l: BeatListener = { detect: createBeatDetector(o), cb };\n listeners.add(l);\n kick();\n return () => void listeners.delete(l);\n}\n\n/** Play the registered effect `name` on `el` at every beat (not under reduced motion). Returns an unbind. */\nexport function bindBeat(el: HTMLElement, name: string, options: Record<string, unknown> & BeatOptions = {}): () => void {\n const { threshold, cooldown, history, floor, ...fx } = options;\n return onBeat(() => {\n if (!prefersReducedMotion()) playEffect(el, name, fx).catch(() => undefined);\n }, { threshold, cooldown, history, floor } as BeatOptions);\n}\n\n// --- visual effects ----------------------------------------------------------\n\n/** The current sample, or a gentle synthetic one while no audio is enabled. */\nfunction read(t: number, bins: number): AudioSample & { idle: boolean } {\n if (current) return { ...current.sample(), idle: false };\n const freq = new Uint8Array(bins);\n const wave = new Uint8Array(bins * 2);\n for (let i = 0; i < bins; i++) freq[i] = 70 + 50 * Math.sin(t * 2 + i * 0.35) * Math.cos(t * 0.7 + i * 0.11) * (1 - i / bins);\n for (let i = 0; i < wave.length; i++) wave[i] = 128 + 22 * Math.sin(t * 3 + i * 0.12);\n return { level: 0.25 + 0.1 * Math.sin(t * 2), bass: 0.35 + 0.2 * Math.sin(t * 2.4), freq, wave, idle: true };\n}\n\nconst audioFx = (name: string, description: string, defaults: Record<string, unknown>, spec: GenerativeSpec): EffectDefinition => ({\n name,\n kind: 'background',\n description,\n reduced: 'skip',\n defaults: { colors: PALETTE, background: '#0b0d12', speed: 1, quality: 1, ...defaults },\n run: (el, o: any, ctx) => canvasBackground(el, ctx, spec, o),\n});\n\nexport const AUDIO_FX: EffectDefinition[] = [\n audioFx('spectrum-bars', 'Frequency bars dance to the audio (mirror them with `mirror: true`).', { bars: 48, gap: 2, mirror: false }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, o.bars);\n const per = Math.max(1, Math.floor((s.freq.length * 0.7) / o.bars));\n const bw = w / o.bars;\n for (let i = 0; i < o.bars; i++) {\n let v = 0;\n for (let k = 0; k < per; k++) v += s.freq[Math.min(s.freq.length - 1, i * per + k)];\n const bh = (v / per / 255) * h * (o.mirror ? 0.5 : 0.9);\n ctx.fillStyle = o.colors[i % o.colors.length];\n ctx.fillRect(i * bw + o.gap / 2, o.mirror ? h / 2 - bh : h - bh, Math.max(1, bw - o.gap), o.mirror ? bh * 2 : bh);\n }\n },\n }),\n audioFx('pulse-ring', 'Glowing rings pulse with the bass.', { rings: 3, color: '#7c5cff' }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, 32);\n const [r, g, b] = hexRgb(o.color);\n const base = Math.min(w, h) * 0.18;\n for (let i = 0; i < o.rings; i++) {\n const rad = base * (1 + i * 0.55) * (1 + s.bass * 0.6);\n ctx.strokeStyle = `rgba(${r},${g},${b},${(0.9 - i * 0.25) * (0.4 + s.level)})`;\n ctx.lineWidth = 3 + s.bass * 10 - i;\n ctx.beginPath();\n ctx.arc(w / 2, h / 2, rad, 0, Math.PI * 2);\n ctx.stroke();\n }\n },\n }),\n audioFx('wave-ring', 'The live waveform wrapped into a circle.', { color: '#22d3ee', amplitude: 0.35 }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, 64);\n const n = s.wave.length;\n const base = Math.min(w, h) * 0.28;\n ctx.strokeStyle = o.color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n for (let i = 0; i <= n; i++) {\n const a = (i / n) * Math.PI * 2;\n const rad = base * (1 + ((s.wave[i % n] - 128) / 128) * o.amplitude * 2);\n const x = w / 2 + Math.cos(a) * rad;\n const y = h / 2 + Math.sin(a) * rad;\n if (i) ctx.lineTo(x, y);\n else ctx.moveTo(x, y);\n }\n ctx.closePath();\n ctx.stroke();\n },\n }),\n];\n\n// --- <usa-audio> -----------------------------------------------------------\n\nexport interface UsaAudioElement extends UsaElement {\n /** `true` while this element's audio source is being analysed. */\n readonly active: boolean;\n /** Start (from a user gesture) or stop analysing. */\n toggle(): Promise<void>;\n}\n\n/**\n * `<usa-audio source=\"#track | mic\" label=\"…\">` — a toggle button (yours, as\n * `[data-audio-toggle]`, or one it renders) that enables the audio source on\n * click; children with `data-usa-beat=\"effect\"` play that effect on every\n * beat (`data-usa-beat-options` JSON; `threshold` / `cooldown` attributes).\n * Emits `usa-beat` and `usa-audio-error`.\n */\nexport function defineAudio(tag = 'usa-audio'): CustomElementConstructor | undefined {\n return defineElement(\n tag,\n (Base) =>\n class UsaAudio extends Base {\n static get observedAttributes(): string[] {\n return ['source'];\n }\n active = false;\n private audio: AudioReactive | null = null;\n private off: (() => void) | null = null;\n private button(): HTMLButtonElement {\n let b = this.querySelector<HTMLButtonElement>('[data-audio-toggle]');\n if (!b) {\n b = document.createElement('button');\n b.type = 'button';\n b.setAttribute('data-audio-toggle', '');\n b.textContent = this.str('label', '🔊 Enable sound-reactive effects');\n this.prepend(b);\n this.onCleanup(() => b!.remove());\n }\n return b;\n }\n async toggle(): Promise<void> {\n const b = this.button();\n if (this.active) return this.stop();\n try {\n this.audio = await enableAudio(this.str('source', 'mic'));\n this.active = true;\n this.removeAttribute('data-audio-error');\n b.setAttribute('aria-pressed', 'true');\n this.off = onBeat((d) => {\n this.dispatchEvent(new CustomEvent('usa-beat', { detail: d, bubbles: true }));\n if (prefersReducedMotion()) return;\n this.querySelectorAll<HTMLElement>('[data-usa-beat]').forEach((el) => {\n let opts = {};\n try {\n opts = JSON.parse(el.dataset.usaBeatOptions || '{}') || {};\n } catch {\n /* ignore bad JSON */\n }\n playEffect(el, el.dataset.usaBeat || 'pulse', opts).catch(() => undefined);\n });\n }, { threshold: this.num('threshold', 1.35), cooldown: this.num('cooldown', 250) });\n } catch (err) {\n this.setAttribute('data-audio-error', '');\n this.dispatchEvent(new CustomEvent('usa-audio-error', { detail: { error: err }, bubbles: true }));\n }\n }\n private stop(): void {\n this.off?.();\n this.off = null;\n if (this.audio && current === this.audio) this.audio.stop();\n this.audio = null;\n this.active = false;\n this.querySelector('[data-audio-toggle]')?.setAttribute('aria-pressed', 'false');\n }\n mount(): void {\n const b = this.button();\n b.setAttribute('aria-pressed', 'false');\n this.listen(b, 'click', () => void this.toggle());\n this.onCleanup(() => this.stop());\n }\n },\n { id: 'usa-audio', text: 'usa-audio{display:block}usa-audio[data-audio-error] [data-audio-toggle]{outline:2px solid #ff5c8a}' }\n );\n}\n"],"names":["prefersReducedMotion","playEffect","PALETTE","canvasBackground","hexRgb","defineElement"],"mappings":"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"}
1
+ {"version":3,"file":"audio-cgWbDkoY.cjs","sources":["../../src/components/effects/audio.ts"],"sourcesContent":["/**\n * 5.6 — sound-reactive effects (Web Audio).\n *\n * - `enableAudio(input)` — start analysing the microphone (`'mic'`), an\n * `<audio>` / `<video>` element (or a selector for one) or a `MediaStream`.\n * Browsers only allow an `AudioContext` to start inside a user gesture, so\n * call it from a click handler (or use `<usa-audio>`, which renders the\n * toggle button for you).\n * - Background effects (kind `background`, Canvas 2D through\n * `canvasBackground()`): `spectrum-bars`, `pulse-ring`, `wave-ring`. Before\n * audio is enabled they idle gently.\n * - Beat detection: `createBeatDetector()` (pure: energy → beat?), `onBeat(cb)`\n * and `bindBeat(el, effect, options)`, which plays any registered effect on\n * every beat. `<usa-audio>` does the same for `[data-usa-beat=\"effect\"]`\n * children and emits `usa-beat`.\n * - While audio runs, `--usa-audio-level` and `--usa-audio-bass` (0–1) are set\n * on `<html>` for CSS-driven reactions.\n *\n * Reduced motion: the visual effects are skipped, beats play no effects and\n * the CSS variables stay at 0 — audio itself keeps playing.\n */\nimport type { EffectDefinition } from '../fx/registry';\nimport { playEffect } from '../fx/registry';\nimport { defineElement, prefersReducedMotion, type UsaElement } from '../base';\nimport { canvasBackground, hexRgb, type GenerativeSpec } from './generative';\nimport { PALETTE } from './shared';\n\nexport type AudioInput = 'mic' | HTMLMediaElement | MediaStream | string;\n\nexport interface AudioSample {\n /** Overall loudness (RMS of the waveform), 0–1. */\n level: number;\n /** Low-frequency energy (first ~8 % of the spectrum), 0–1. */\n bass: number;\n /** Frequency bins, 0–255 each. */\n freq: Uint8Array;\n /** Time-domain waveform, 0–255 (128 = silence). */\n wave: Uint8Array;\n}\n\nexport interface AudioReactive {\n readonly context: AudioContext;\n readonly analyser: AnalyserNode;\n /** Read the analyser now. */\n sample(): AudioSample;\n /** Stop analysing (media keeps playing; the microphone is released). */\n stop(): void;\n}\n\nexport interface BeatOptions {\n /** A beat is energy above `threshold` × the recent average (default 1.35). */\n threshold?: number;\n /** Minimum ms between beats (default 250). */\n cooldown?: number;\n /** Frames of history for the average (default 43 ≈ 0.7 s). */\n history?: number;\n /** Ignore energy below this floor, 0–1 (default 0.08). */\n floor?: number;\n}\n\nlet actx: AudioContext | null = null;\nlet current: AudioReactive | null = null;\nconst mediaSources = new WeakMap<HTMLMediaElement, MediaElementAudioSourceNode>();\n\n/** The running analyser, if `enableAudio()` was called. */\nexport const getAudio = (): AudioReactive | null => current;\n\nfunction audioContext(): AudioContext {\n const AC = (globalThis as any).AudioContext || (globalThis as any).webkitAudioContext;\n if (!AC) throw new Error('[motionary] Web Audio is not available');\n if (!actx || actx.state === 'closed') actx = new AC() as AudioContext;\n return actx;\n}\n\n/**\n * Start analysing `input` and make it the source of every sound-reactive\n * effect. Call from a user gesture. Replaces a previous source.\n */\nexport async function enableAudio(input: AudioInput = 'mic', opts: { fftSize?: number; smoothing?: number } = {}): Promise<AudioReactive> {\n current?.stop();\n const ac = audioContext();\n if (ac.state === 'suspended') await ac.resume().catch(() => undefined);\n const analyser = ac.createAnalyser();\n analyser.fftSize = opts.fftSize || 512;\n analyser.smoothingTimeConstant = opts.smoothing ?? 0.8;\n let src: AudioNode;\n let release = () => {};\n const media = typeof input === 'string' && input !== 'mic' ? document.querySelector<HTMLMediaElement>(input) : input;\n if (media === 'mic') {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n src = ac.createMediaStreamSource(stream);\n src.connect(analyser); // never to the speakers: no feedback\n release = () => stream.getTracks().forEach((t) => t.stop());\n } else if (media && typeof (media as HTMLMediaElement).play === 'function') {\n const m = media as HTMLMediaElement;\n let node = mediaSources.get(m);\n if (!node) mediaSources.set(m, (node = ac.createMediaElementSource(m)));\n try {\n node.disconnect();\n } catch {\n /* not connected */\n }\n src = node;\n src.connect(analyser);\n analyser.connect(ac.destination);\n release = () => {\n try {\n node!.disconnect();\n } catch {\n /* already */\n }\n node!.connect(ac.destination); // keep the media audible\n };\n if (m.paused) await m.play()?.catch?.(() => undefined);\n } else if (media && typeof (media as MediaStream).getTracks === 'function') {\n src = ac.createMediaStreamSource(media as MediaStream);\n src.connect(analyser);\n } else throw new Error(`[motionary] enableAudio: no audio source for ${String(input)}`);\n const freq = new Uint8Array(analyser.frequencyBinCount);\n const wave = new Uint8Array(analyser.fftSize);\n const self: AudioReactive = {\n context: ac,\n analyser,\n sample: () => {\n analyser.getByteFrequencyData(freq);\n analyser.getByteTimeDomainData(wave);\n let sq = 0;\n for (let i = 0; i < wave.length; i++) sq += ((wave[i] - 128) / 128) ** 2;\n const n = Math.max(1, Math.round(freq.length * 0.08));\n let b = 0;\n for (let i = 0; i < n; i++) b += freq[i];\n return { level: Math.min(1, Math.sqrt(sq / wave.length) * 2), bass: b / n / 255, freq, wave };\n },\n stop: () => {\n if (current === self) {\n current = null;\n if (raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(raf);\n raf = 0;\n }\n try {\n src.disconnect();\n analyser.disconnect();\n } catch {\n /* already */\n }\n release();\n setVars(0, 0);\n },\n };\n current = self;\n kick();\n return self;\n}\n\n/** Stop the current audio source (if any). */\nexport function disableAudio(): void {\n current?.stop();\n}\n\n/** A pure beat detector: feed it energy (0–1) and a timestamp per frame; it answers \"beat?\". */\nexport function createBeatDetector(o: BeatOptions = {}): (energy: number, now: number) => boolean {\n const { threshold = 1.35, cooldown = 250, history = 43, floor = 0.08 } = o;\n const hist: number[] = [];\n let last = -Infinity;\n return (energy, now) => {\n const avg = hist.length ? hist.reduce((a, b) => a + b, 0) / hist.length : energy;\n const ready = hist.length >= 8;\n hist.push(energy);\n if (hist.length > history) hist.shift();\n if (ready && energy > floor && energy > avg * threshold && now - last >= cooldown) {\n last = now;\n return true;\n }\n return false;\n };\n}\n\ntype BeatListener = { detect: (e: number, t: number) => boolean; cb: (detail: { energy: number; time: number }) => void };\nconst listeners = new Set<BeatListener>();\nlet raf = 0;\n\nfunction setVars(level: number, bass: number): void {\n if (typeof document === 'undefined') return;\n const s = document.documentElement.style;\n s.setProperty('--usa-audio-level', level.toFixed(3));\n s.setProperty('--usa-audio-bass', bass.toFixed(3));\n}\n\nfunction loop(now: number): void {\n raf = 0;\n if (!current) return;\n const { level, bass } = current.sample();\n const reduced = prefersReducedMotion();\n setVars(reduced ? 0 : level, reduced ? 0 : bass);\n for (const l of Array.from(listeners)) if (l.detect(bass, now)) l.cb({ energy: bass, time: now });\n kick();\n}\n\nfunction kick(): void {\n if (!raf && current && typeof requestAnimationFrame === 'function') raf = requestAnimationFrame(loop);\n}\n\n/** Call `cb` on every detected beat of the current audio source. Returns an unsubscribe. */\nexport function onBeat(cb: (detail: { energy: number; time: number }) => void, o: BeatOptions = {}): () => void {\n const l: BeatListener = { detect: createBeatDetector(o), cb };\n listeners.add(l);\n kick();\n return () => void listeners.delete(l);\n}\n\n/** Play the registered effect `name` on `el` at every beat (not under reduced motion). Returns an unbind. */\nexport function bindBeat(el: HTMLElement, name: string, options: Record<string, unknown> & BeatOptions = {}): () => void {\n const { threshold, cooldown, history, floor, ...fx } = options;\n return onBeat(() => {\n if (!prefersReducedMotion()) playEffect(el, name, fx).catch(() => undefined);\n }, { threshold, cooldown, history, floor } as BeatOptions);\n}\n\n// --- visual effects ----------------------------------------------------------\n\n/** The current sample, or a gentle synthetic one while no audio is enabled. */\nfunction read(t: number, bins: number): AudioSample & { idle: boolean } {\n if (current) return { ...current.sample(), idle: false };\n const freq = new Uint8Array(bins);\n const wave = new Uint8Array(bins * 2);\n for (let i = 0; i < bins; i++) freq[i] = 70 + 50 * Math.sin(t * 2 + i * 0.35) * Math.cos(t * 0.7 + i * 0.11) * (1 - i / bins);\n for (let i = 0; i < wave.length; i++) wave[i] = 128 + 22 * Math.sin(t * 3 + i * 0.12);\n return { level: 0.25 + 0.1 * Math.sin(t * 2), bass: 0.35 + 0.2 * Math.sin(t * 2.4), freq, wave, idle: true };\n}\n\nconst audioFx = (name: string, description: string, defaults: Record<string, unknown>, spec: GenerativeSpec): EffectDefinition => ({\n name,\n kind: 'background',\n description,\n reduced: 'skip',\n defaults: { colors: PALETTE, background: '#0b0d12', speed: 1, quality: 1, ...defaults },\n run: (el, o: any, ctx) => canvasBackground(el, ctx, spec, o),\n});\n\nexport const AUDIO_FX: EffectDefinition[] = [\n audioFx('spectrum-bars', 'Frequency bars dance to the audio (mirror them with `mirror: true`).', { bars: 48, gap: 2, mirror: false }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, o.bars);\n const per = Math.max(1, Math.floor((s.freq.length * 0.7) / o.bars));\n const bw = w / o.bars;\n for (let i = 0; i < o.bars; i++) {\n let v = 0;\n for (let k = 0; k < per; k++) v += s.freq[Math.min(s.freq.length - 1, i * per + k)];\n const bh = (v / per / 255) * h * (o.mirror ? 0.5 : 0.9);\n ctx.fillStyle = o.colors[i % o.colors.length];\n ctx.fillRect(i * bw + o.gap / 2, o.mirror ? h / 2 - bh : h - bh, Math.max(1, bw - o.gap), o.mirror ? bh * 2 : bh);\n }\n },\n }),\n audioFx('pulse-ring', 'Glowing rings pulse with the bass.', { rings: 3, color: '#7c5cff' }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, 32);\n const [r, g, b] = hexRgb(o.color);\n const base = Math.min(w, h) * 0.18;\n for (let i = 0; i < o.rings; i++) {\n const rad = base * (1 + i * 0.55) * (1 + s.bass * 0.6);\n ctx.strokeStyle = `rgba(${r},${g},${b},${(0.9 - i * 0.25) * (0.4 + s.level)})`;\n ctx.lineWidth = 3 + s.bass * 10 - i;\n ctx.beginPath();\n ctx.arc(w / 2, h / 2, rad, 0, Math.PI * 2);\n ctx.stroke();\n }\n },\n }),\n audioFx('wave-ring', 'The live waveform wrapped into a circle.', { color: '#22d3ee', amplitude: 0.35 }, {\n draw: ({ ctx, w, h, t, o }) => {\n ctx.fillStyle = o.background;\n ctx.fillRect(0, 0, w, h);\n const s = read(t, 64);\n const n = s.wave.length;\n const base = Math.min(w, h) * 0.28;\n ctx.strokeStyle = o.color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n for (let i = 0; i <= n; i++) {\n const a = (i / n) * Math.PI * 2;\n const rad = base * (1 + ((s.wave[i % n] - 128) / 128) * o.amplitude * 2);\n const x = w / 2 + Math.cos(a) * rad;\n const y = h / 2 + Math.sin(a) * rad;\n if (i) ctx.lineTo(x, y);\n else ctx.moveTo(x, y);\n }\n ctx.closePath();\n ctx.stroke();\n },\n }),\n];\n\n// --- <usa-audio> -----------------------------------------------------------\n\nexport interface UsaAudioElement extends UsaElement {\n /** `true` while this element's audio source is being analysed. */\n readonly active: boolean;\n /** Start (from a user gesture) or stop analysing. */\n toggle(): Promise<void>;\n}\n\n/**\n * `<usa-audio source=\"#track | mic\" label=\"…\">` — a toggle button (yours, as\n * `[data-audio-toggle]`, or one it renders) that enables the audio source on\n * click; children with `data-usa-beat=\"effect\"` play that effect on every\n * beat (`data-usa-beat-options` JSON; `threshold` / `cooldown` attributes).\n * Emits `usa-beat` and `usa-audio-error`.\n */\nexport function defineAudio(tag = 'usa-audio'): CustomElementConstructor | undefined {\n return defineElement(\n tag,\n (Base) =>\n class UsaAudio extends Base {\n static get observedAttributes(): string[] {\n return ['source'];\n }\n active = false;\n private audio: AudioReactive | null = null;\n private off: (() => void) | null = null;\n private button(): HTMLButtonElement {\n let b = this.querySelector<HTMLButtonElement>('[data-audio-toggle]');\n if (!b) {\n b = document.createElement('button');\n b.type = 'button';\n b.setAttribute('data-audio-toggle', '');\n b.textContent = this.str('label', '🔊 Enable sound-reactive effects');\n this.prepend(b);\n this.onCleanup(() => b!.remove());\n }\n return b;\n }\n async toggle(): Promise<void> {\n const b = this.button();\n if (this.active) return this.stop();\n try {\n this.audio = await enableAudio(this.str('source', 'mic'));\n this.active = true;\n this.removeAttribute('data-audio-error');\n b.setAttribute('aria-pressed', 'true');\n this.off = onBeat((d) => {\n this.dispatchEvent(new CustomEvent('usa-beat', { detail: d, bubbles: true }));\n if (prefersReducedMotion()) return;\n this.querySelectorAll<HTMLElement>('[data-usa-beat]').forEach((el) => {\n let opts = {};\n try {\n opts = JSON.parse(el.dataset.usaBeatOptions || '{}') || {};\n } catch {\n /* ignore bad JSON */\n }\n playEffect(el, el.dataset.usaBeat || 'pulse', opts).catch(() => undefined);\n });\n }, { threshold: this.num('threshold', 1.35), cooldown: this.num('cooldown', 250) });\n } catch (err) {\n this.setAttribute('data-audio-error', '');\n this.dispatchEvent(new CustomEvent('usa-audio-error', { detail: { error: err }, bubbles: true }));\n }\n }\n private stop(): void {\n this.off?.();\n this.off = null;\n if (this.audio && current === this.audio) this.audio.stop();\n this.audio = null;\n this.active = false;\n this.querySelector('[data-audio-toggle]')?.setAttribute('aria-pressed', 'false');\n }\n mount(): void {\n const b = this.button();\n b.setAttribute('aria-pressed', 'false');\n this.listen(b, 'click', () => void this.toggle());\n this.onCleanup(() => this.stop());\n }\n },\n { id: 'usa-audio', text: 'usa-audio{display:block}usa-audio[data-audio-error] [data-audio-toggle]{outline:2px solid #ff5c8a}' }\n );\n}\n"],"names":["prefersReducedMotion","playEffect","PALETTE","canvasBackground","hexRgb","defineElement"],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  * imported during SSR (Next, Nuxt, Astro…) and in Electron/Tauri preload
7
7
  * scripts. Classes are created the first time a `define*()` function runs.
8
8
  */
9
+ var _a;
9
10
  const MOTION_SENSITIVITY_LEVELS = ['full', 'gentle', 'minimal', 'static'];
10
11
  const MOTION_SCALE = { low: 0.6, normal: 1, high: 1.25 };
11
12
  const config = { injectStyles: true, reducedMotion: 'user', motionIntensity: 'normal', motionSensitivity: 'full' };
@@ -248,6 +249,7 @@ function animateWithMotion(el, keyframes, options) {
248
249
  if (k !== 1 && k > 0 && typeof options.duration === 'number')
249
250
  options = { ...options, duration: options.duration * k, delay: (options.delay || 0) * k };
250
251
  const a = el.animate(keyframes, options);
252
+ trackAnimation(a);
251
253
  if (options.iterations !== Infinity) {
252
254
  active++;
253
255
  let done = false;
@@ -324,9 +326,14 @@ function flushFrame(t) {
324
326
  error ?? (error = e);
325
327
  }
326
328
  }
327
- frameListeners.forEach((fn) => fn(t, dt));
328
- if (frameListeners.size)
329
- requestFlush();
329
+ // 8.0: loops run on the unified motion clock — dt scaled by its rate, frozen while paused
330
+ if (!clockState.paused) {
331
+ const cdt = dt * clockState.rate;
332
+ clockState.time += cdt;
333
+ frameListeners.forEach((fn) => fn(t, cdt));
334
+ if (frameListeners.size)
335
+ requestFlush();
336
+ }
330
337
  if (error)
331
338
  throw error;
332
339
  }
@@ -353,13 +360,63 @@ const caf = (id) => {
353
360
  /** Run `fn(time, dt)` every frame on the shared scheduler until the returned function is called. */
354
361
  function onFrame(fn) {
355
362
  frameListeners.add(fn);
356
- requestFlush();
363
+ if (!clockState.paused)
364
+ requestFlush();
357
365
  return () => frameListeners.delete(fn);
358
366
  }
359
367
  /** Scheduler counters: frames flushed, callbacks run, peak callbacks in one frame, pending now. */
360
368
  function schedulerStats() {
361
369
  return { frames: frameStats.frames, callbacks: frameStats.callbacks, peak: frameStats.peak, pending: frameQueue.size, loops: frameListeners.size };
362
370
  }
371
+ const CLOCK_KEY = Symbol.for('motionary.clock');
372
+ const clockState = ((_a = globalThis)[CLOCK_KEY] || (_a[CLOCK_KEY] = { rate: 1, paused: false, time: 0, anims: new Set(), subs: new Set() }));
373
+ function applyClock(a) {
374
+ try {
375
+ if (typeof a.updatePlaybackRate === 'function')
376
+ a.updatePlaybackRate(clockState.rate);
377
+ else if (clockState.rate !== 1 || a.playbackRate !== undefined)
378
+ a.playbackRate = clockState.rate;
379
+ if (clockState.paused)
380
+ a.pause?.();
381
+ else if (a.playState === 'paused' && a._usaClockPaused)
382
+ a.play?.();
383
+ a._usaClockPaused = clockState.paused;
384
+ }
385
+ catch {
386
+ /* finished / detached animation */
387
+ }
388
+ }
389
+ /** Put an animation on the shared motion clock (animateWithMotion does this for every component / effect animation). */
390
+ function trackAnimation(a) {
391
+ if (!a)
392
+ return;
393
+ if (clockState.rate !== 1 || clockState.paused)
394
+ applyClock(a);
395
+ clockState.anims.add(a);
396
+ const drop = () => clockState.anims.delete(a);
397
+ a.finished?.then(drop, drop);
398
+ }
399
+ /** The motion clock's state: `rate` (1 = normal), `paused`, `time` (clock ms elapsed, scaled by rate). */
400
+ function getClock() {
401
+ return { rate: clockState.rate, paused: clockState.paused, time: clockState.time, tracked: clockState.anims.size };
402
+ }
403
+ /** Change the shared clock: `{ rate }` (0.05–8) and / or `{ paused }`. Applies to running animations and loops. */
404
+ function setClock(next) {
405
+ const wasPaused = clockState.paused;
406
+ if (typeof next.rate === 'number' && Number.isFinite(next.rate))
407
+ clockState.rate = Math.min(8, Math.max(0.05, next.rate));
408
+ if (typeof next.paused === 'boolean')
409
+ clockState.paused = next.paused;
410
+ clockState.anims.forEach(applyClock);
411
+ if (wasPaused && !clockState.paused && frameListeners.size)
412
+ requestFlush();
413
+ clockState.subs.forEach((fn) => fn());
414
+ }
415
+ /** Subscribe to clock changes; returns an unsubscribe. */
416
+ function onClockChange(fn) {
417
+ clockState.subs.add(fn);
418
+ return () => clockState.subs.delete(fn);
419
+ }
363
420
  // --- active animation budget (4.5) ---------------------------------------------
364
421
  let active = 0;
365
422
  let maxActive = Infinity;
@@ -400,5 +457,5 @@ function kindOf(el, valid, fallback) {
400
457
  }
401
458
  const clamp = (v, min, max) => Math.min(max, Math.max(min, v));
402
459
 
403
- export { kindOf as A, shadowStyles as B, EASE_SPRING as E, FLUENT_DECELERATE as F, MOTION_SCALE as M, MOTION_SENSITIVITY_LEVELS as a, activeAnimations as b, canDefine as c, adaptKeyframes as d, animateWithMotion as e, animationBudget as f, configureComponents as g, getMotionIntensity as h, getMotionSensitivity as i, setAnimationBudget as j, clamp as k, caf as l, motionScale as m, applyFrame as n, onFrame as o, prefersReducedMotion as p, now as q, raf as r, schedulerStats as s, setStyleLoader as t, defineElement as u, srText as v, withoutDeprecations as w, adoptStyles as x, deprecate as y, EASE_OUT as z };
404
- //# sourceMappingURL=base-2-yYc93C.js.map
460
+ export { srText as A, adoptStyles as B, deprecate as C, EASE_OUT as D, EASE_SPRING as E, kindOf as F, shadowStyles as G, FLUENT_DECELERATE as H, MOTION_SCALE as M, MOTION_SENSITIVITY_LEVELS as a, activeAnimations as b, canDefine as c, adaptKeyframes as d, animateWithMotion as e, animationBudget as f, configureComponents as g, getMotionIntensity as h, getMotionSensitivity as i, setAnimationBudget as j, clamp as k, caf as l, motionScale as m, applyFrame as n, onFrame as o, prefersReducedMotion as p, now as q, raf as r, schedulerStats as s, setStyleLoader as t, defineElement as u, onClockChange as v, withoutDeprecations as w, setClock as x, getClock as y, trackAnimation as z };
461
+ //# sourceMappingURL=base-CLuqlLfG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-CLuqlLfG.js","sources":["../../src/components/base.ts"],"sourcesContent":["/**\n * motionary/components — shared base for the `<usa-*>` custom elements.\n *\n * Everything here is lazy: nothing touches `window`, `document`,\n * `HTMLElement` or `matchMedia` at import time, so the components can be\n * imported during SSR (Next, Nuxt, Astro…) and in Electron/Tauri preload\n * scripts. Classes are created the first time a `define*()` function runs.\n */\n\nexport interface ComponentsConfig {\n /**\n * Inject each component's CSS when it is defined (default `true`). Uses a\n * constructable stylesheet (`document.adoptedStyleSheets`, which a strict\n * `style-src` CSP does not block) and falls back to a `<style>` tag. Set\n * to `false` when you load `motionary/components.css` yourself.\n */\n injectStyles?: boolean;\n /**\n * `'user'` (default) follows `prefers-reduced-motion`; `'reduce'` always\n * uses the reduced variants (e.g. a kiosk / battery-saver mode). 5.0: the\n * OS setting can no longer be ignored (`'no-preference'` was removed).\n */\n reducedMotion?: 'user' | 'reduce';\n /**\n * Global motion intensity (v2.7): `'low'` (shorter, calmer), `'normal'`\n * (default) or `'high'`. Scales every component animation's duration and\n * sets `--usa-motion` (0.6 / 1 / 1.25) on `<html>` for your own CSS. 5.0:\n * `'off'` was removed — use `motionSensitivity: 'minimal'`.\n */\n motionIntensity?: MotionIntensity;\n /**\n * Motion-sensitivity level (v4.4), finer than reduced motion:\n * `'full'` (default) · `'gentle'` (no spins, zooms, skews or parallax —\n * translations and fades only, safe for vestibular disorders) ·\n * `'minimal'` (fades only; components use their reduced-motion variants) ·\n * `'static'` (no animation: every component shows its static alternative).\n * See `setMotionSensitivity()` in `motionary/components/a11y`.\n */\n motionSensitivity?: MotionSensitivity;\n}\n\nexport type MotionSensitivity = 'full' | 'gentle' | 'minimal' | 'static';\nexport const MOTION_SENSITIVITY_LEVELS: readonly MotionSensitivity[] = ['full', 'gentle', 'minimal', 'static'];\n\nexport type MotionIntensity = 'low' | 'normal' | 'high';\nexport const MOTION_SCALE: Record<MotionIntensity, number> = { low: 0.6, normal: 1, high: 1.25 };\n\nconst config: Required<ComponentsConfig> = { injectStyles: true, reducedMotion: 'user', motionIntensity: 'normal', motionSensitivity: 'full' };\n\n/** Change global component settings (call before `define*()` for `injectStyles`). */\nexport function configureComponents(options: ComponentsConfig): void {\n options = { ...options };\n // 5.0: removed values are ignored (see docs/upgrading-5.md)\n if (options.motionIntensity && !(options.motionIntensity in MOTION_SCALE)) delete options.motionIntensity;\n if (options.reducedMotion && options.reducedMotion !== 'reduce') options.reducedMotion = 'user';\n Object.assign(config, options);\n if (options.motionIntensity && typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--usa-motion', String(MOTION_SCALE[options.motionIntensity] ?? 1));\n document.documentElement.setAttribute('data-usa-motion', options.motionIntensity);\n }\n if (options.motionSensitivity && typeof document !== 'undefined') {\n if (options.motionSensitivity === 'full') document.documentElement.removeAttribute('data-usa-sensitivity');\n else document.documentElement.setAttribute('data-usa-sensitivity', options.motionSensitivity);\n }\n}\n\n/** The current motion-sensitivity level (v4.4). */\nexport function getMotionSensitivity(): MotionSensitivity {\n return config.motionSensitivity;\n}\n\nconst VESTIBULAR = /rotate|scale|skew|perspective|matrix3d/;\n/**\n * Adapt keyframes to the sensitivity level: `gentle` drops transforms that\n * spin, zoom or skew (and 3D), `minimal` keeps opacity only, `static` keeps\n * just the final frame. `full` returns them unchanged.\n */\nexport function adaptKeyframes(frames: Keyframe[], level: MotionSensitivity = config.motionSensitivity): Keyframe[] {\n if (level === 'full' || !frames.length) return frames;\n if (level === 'static') return [frames[frames.length - 1]];\n return frames.map((f) => {\n const out: Keyframe = {};\n for (const [k, v] of Object.entries(f)) {\n if (k === 'offset' || k === 'easing' || k === 'composite') out[k] = v as any;\n else if (level === 'minimal') {\n if (k === 'opacity') out[k] = v as any;\n } else if (k === 'rotate' || k === 'scale' || (k === 'transform' && VESTIBULAR.test(String(v)))) continue;\n else out[k] = v as any;\n }\n return out;\n });\n}\n\nlet quiet = 0;\n/** Run `fn` without 4.9 deprecation warnings (library-internal calls). */\nexport function withoutDeprecations<T>(fn: () => T): T {\n quiet++;\n try {\n return fn();\n } finally {\n quiet--;\n }\n}\n\n/** The current global motion intensity. */\nexport function getMotionIntensity(): MotionIntensity {\n return config.motionIntensity;\n}\n\n/** Duration multiplier for the current intensity (1 when `normal`). */\nexport function motionScale(): number {\n return MOTION_SCALE[config.motionIntensity] ?? 1;\n}\n\nexport const canDefine = (): boolean => typeof customElements !== 'undefined' && typeof HTMLElement !== 'undefined';\n\n/** `true` when animations should be reduced (OS setting or `configureComponents`). */\nexport function prefersReducedMotion(): boolean {\n if (config.motionSensitivity === 'minimal' || config.motionSensitivity === 'static') return true;\n if (config.reducedMotion === 'reduce') return true;\n return typeof matchMedia === 'function' && !!matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\nconst injected = new Set<string>();\n\n/** Add a component's stylesheet to the document once. */\nexport function adoptStyles(id: string, css: string): void {\n if (!config.injectStyles || !css || injected.has(id) || typeof document === 'undefined') return;\n injected.add(id);\n try {\n if (typeof CSSStyleSheet === 'function' && 'adoptedStyleSheets' in document) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n return;\n }\n } catch {\n /* fall through to <style> */\n }\n const style = document.createElement('style');\n style.setAttribute('data-usa', id);\n style.textContent = css;\n (document.head || document.documentElement).appendChild(style);\n}\n\n/** Attach `css` to a shadow root (constructable sheet where supported, else `<style>`). */\nexport function shadowStyles(root: ShadowRoot, css: string): void {\n try {\n if (typeof CSSStyleSheet === 'function' && 'adoptedStyleSheets' in root) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n root.adoptedStyleSheets = [sheet];\n return;\n }\n } catch {\n /* fall through */\n }\n const style = document.createElement('style');\n style.textContent = css;\n root.prepend(style);\n}\n\nexport type Cleanup = () => void;\n\n/**\n * Members shared by every `<usa-*>` element. Attribute helpers, a cleanup\n * bag that is emptied on disconnect, and motion helpers that degrade to the\n * final state without WAAPI or under reduced motion.\n */\nexport interface UsaElement extends HTMLElement {\n /** `true` while reduced motion applies to this element. */\n readonly reduced: boolean;\n}\n\nexport interface UsaBase extends UsaElement {\n mount(): void;\n changed(name: string): void;\n unmount(): void;\n str(name: string, fallback?: string): string;\n num(name: string, fallback: number): number;\n flag(name: string): boolean;\n setFlag(name: string, on: boolean): void;\n onCleanup(fn: Cleanup): void;\n listen<K extends keyof HTMLElementEventMap>(\n target: EventTarget,\n type: K | string,\n fn: (e: any) => void,\n options?: AddEventListenerOptions\n ): void;\n inView(cb: (visible: boolean, entry?: IntersectionObserverEntry) => void, init?: IntersectionObserverInit, target?: Element): void;\n motion(el: Element, keyframes: Keyframe[], options: KeyframeAnimationOptions): Animation | null;\n emit(type: string, detail?: unknown): boolean;\n}\n\ntype BaseCtor = new () => UsaBase;\nlet baseClass: BaseCtor | null = null;\n\n/** The lazily created base class (needs `HTMLElement`). */\nexport function getBase(): BaseCtor {\n if (baseClass) return baseClass;\n class Base extends HTMLElement {\n private _cleanups: Cleanup[] = [];\n private _connected = false;\n\n get reduced(): boolean {\n return prefersReducedMotion();\n }\n\n connectedCallback(): void {\n if (this._connected) return;\n this._connected = true;\n styleLoader?.(this.localName);\n // Upgraded while the parser is still inside us (a <script> in <head>\n // defined the element): children/text are not there yet, so wait.\n if (typeof document !== 'undefined' && document.readyState === 'loading' && !this.nextSibling && !this.childNodes.length) {\n const go = () => {\n if (this._connected && this.isConnected) this.mount();\n };\n document.addEventListener('DOMContentLoaded', go, { once: true });\n this._cleanups.push(() => document.removeEventListener('DOMContentLoaded', go));\n return;\n }\n this.mount();\n }\n\n disconnectedCallback(): void {\n this._connected = false;\n this.teardown();\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, value: string | null): void {\n if (!this._connected || oldValue === value) return;\n this.changed(_name);\n }\n\n /** Re-mount on attribute change (override for finer updates). */\n changed(_name: string): void {\n this.teardown();\n this.mount();\n }\n\n private teardown(): void {\n this._cleanups.splice(0).reverse().forEach((fn) => fn());\n this.unmount();\n }\n\n mount(): void {}\n unmount(): void {}\n\n str(name: string, fallback = ''): string {\n const v = this.getAttribute(name);\n return v === null ? fallback : v;\n }\n\n num(name: string, fallback: number): number {\n const v = this.getAttribute(name);\n const n = v === null || v.trim() === '' ? NaN : Number(v);\n return Number.isFinite(n) ? n : fallback;\n }\n\n /** Boolean attribute: present and not `\"false\"`. */\n flag(name: string): boolean {\n const v = this.getAttribute(name);\n return v !== null && v !== 'false';\n }\n\n setFlag(name: string, on: boolean): void {\n if (on) this.setAttribute(name, '');\n else this.removeAttribute(name);\n }\n\n onCleanup(fn: Cleanup): void {\n this._cleanups.push(fn);\n }\n\n listen(target: EventTarget, type: string, fn: (e: any) => void, options?: AddEventListenerOptions): void {\n target.addEventListener(type, fn, options);\n this.onCleanup(() => target.removeEventListener(type, fn, options));\n }\n\n /** Calls `cb(true/false)` as the element enters / leaves the viewport. */\n inView(cb: (visible: boolean, entry?: IntersectionObserverEntry) => void, init?: IntersectionObserverInit, target: Element = this): void {\n if (typeof IntersectionObserver === 'undefined') {\n cb(true);\n return;\n }\n const io = new IntersectionObserver((entries) => {\n for (const e of entries) cb(e.isIntersecting, e);\n }, init);\n io.observe(target);\n this.onCleanup(() => io.disconnect());\n }\n\n /** `el.animate()` that returns `null` (and applies the last frame) without WAAPI. */\n motion(el: Element, keyframes: Keyframe[], options: KeyframeAnimationOptions): Animation | null {\n return animateWithMotion(el, keyframes, options);\n }\n\n emit(type: string, detail?: unknown): boolean {\n return this.dispatchEvent(new CustomEvent(`usa:${type}`, { detail, bubbles: true, cancelable: true }));\n }\n }\n baseClass = Base as unknown as BaseCtor;\n return baseClass;\n}\n\n/**\n * `el.animate()` with the library's motion rules (5.0, shared by elements and\n * registered effects): motion sensitivity (keyframes adapted, `static` →\n * final frame), intensity (duration scale) and the animation budget. Returns\n * `null` (final frame applied) when nothing should animate.\n */\nexport function animateWithMotion(el: Element, keyframes: Keyframe[], options: KeyframeAnimationOptions): Animation | null {\n if (typeof (el as HTMLElement).animate !== 'function' || config.motionSensitivity === 'static') {\n applyFrame(el as HTMLElement, keyframes[keyframes.length - 1]);\n return null;\n }\n keyframes = adaptKeyframes(keyframes);\n if (active >= maxActive) {\n applyFrame(el as HTMLElement, keyframes[keyframes.length - 1]);\n return null;\n }\n const k = motionScale();\n if (k !== 1 && k > 0 && typeof options.duration === 'number') options = { ...options, duration: options.duration * k, delay: (options.delay || 0) * k };\n const a = (el as HTMLElement).animate(keyframes, options);\n trackAnimation(a);\n if (options.iterations !== Infinity) {\n active++;\n let done = false;\n const end = () => {\n if (!done) {\n done = true;\n active--;\n }\n };\n a?.finished?.then(end, end);\n }\n return a;\n}\n\n/** Write a keyframe's properties as inline styles (no-WAAPI fallback). */\nexport function applyFrame(el: HTMLElement, frame?: Keyframe): void {\n if (!frame) return;\n for (const [k, v] of Object.entries(frame)) {\n if (k === 'offset' || k === 'easing' || k === 'composite' || v == null) continue;\n (el.style as any)[k] = String(v);\n }\n}\n\n/**\n * Register `tag` with the class built by `make(Base)`. Returns the\n * constructor, the already registered one, or `undefined` without DOM.\n */\nexport function defineElement(\n tag: string,\n make: (Base: BaseCtor) => CustomElementConstructor,\n css?: { id: string; text: string }\n): CustomElementConstructor | undefined {\n if (!canDefine()) return undefined;\n adoptStyles('base', BASE_CSS);\n if (css) adoptStyles(css.id, css.text);\n const existing = customElements.get(tag);\n if (existing) return existing;\n const ctor = make(getBase());\n customElements.define(tag, ctor);\n return ctor;\n}\n\nconst BASE_CSS = '.usa-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}';\n\n/** A visually hidden copy of `text` for screen readers (the animated copy is `aria-hidden`). */\nexport function srText(text: string): HTMLSpanElement {\n const s = document.createElement('span');\n s.className = 'usa-sr';\n s.textContent = text;\n return s;\n}\n\n// --- shared rAF scheduler (4.5) ----------------------------------------------\n// Every component loop goes through one requestAnimationFrame per frame\n// instead of one per element: callbacks are batched, run in order, and a\n// throwing callback no longer starves the others (the first error is rethrown).\nconst frameQueue = new Map<number, FrameRequestCallback>();\nlet frameSeq = 1;\nlet frameHandle: number | ReturnType<typeof setTimeout> | 0 = 0;\nlet frameVia: unknown = null;\nconst frameStats = { frames: 0, callbacks: 0, peak: 0, last: 0 };\nconst frameListeners = new Set<(t: number, dt: number) => void>();\n\nfunction flushFrame(t: number): void {\n frameHandle = 0;\n const dt = frameStats.last && t > frameStats.last ? t - frameStats.last : 16.7;\n frameStats.last = t;\n frameStats.frames++;\n const cbs = Array.from(frameQueue.values());\n frameQueue.clear();\n frameStats.callbacks += cbs.length;\n frameStats.peak = Math.max(frameStats.peak, cbs.length);\n let error: unknown = null;\n for (const cb of cbs) {\n try {\n cb(t);\n } catch (e) {\n error ??= e;\n }\n }\n // 8.0: loops run on the unified motion clock — dt scaled by its rate, frozen while paused\n if (!clockState.paused) {\n const cdt = dt * clockState.rate;\n clockState.time += cdt;\n frameListeners.forEach((fn) => fn(t, cdt));\n if (frameListeners.size) requestFlush();\n }\n if (error) throw error;\n}\n\nfunction requestFlush(): void {\n const native = typeof requestAnimationFrame === 'function' ? requestAnimationFrame : null;\n // A stale handle from a replaced requestAnimationFrame (tests, iframes) is dropped.\n if (frameHandle && frameVia === native) return;\n frameVia = native;\n frameHandle = native ? native(flushFrame) : setTimeout(() => flushFrame(now()), 16);\n}\n\n/** requestAnimationFrame through the shared scheduler (timeout fallback in jsdom / hidden documents). */\nexport const raf = (cb: FrameRequestCallback): number => {\n const id = frameSeq++;\n frameQueue.set(id, cb);\n requestFlush();\n return id;\n};\n/** Monotonic time in ms (rAF callback timestamps differ between environments, so loops use this). */\nexport const now = (): number => (typeof performance !== 'undefined' ? performance.now() : Date.now());\nexport const caf = (id: number): void => {\n frameQueue.delete(id);\n};\n\n/** Run `fn(time, dt)` every frame on the shared scheduler until the returned function is called. */\nexport function onFrame(fn: (t: number, dt: number) => void): () => void {\n frameListeners.add(fn);\n if (!clockState.paused) requestFlush();\n return () => frameListeners.delete(fn);\n}\n\n/** Scheduler counters: frames flushed, callbacks run, peak callbacks in one frame, pending now. */\nexport function schedulerStats(): { frames: number; callbacks: number; peak: number; pending: number; loops: number } {\n return { frames: frameStats.frames, callbacks: frameStats.callbacks, peak: frameStats.peak, pending: frameQueue.size, loops: frameListeners.size };\n}\n\n// --- unified motion clock (8.0) --------------------------------------------------\n// One clock drives every component, effect and frame loop: its rate scales\n// all WAAPI animations started through animateWithMotion() and the dt of the\n// shared frame loop; pausing it pauses them all. Shared across bundles via a\n// global symbol so the ESM, CJS and UMD builds on one page agree.\ninterface ClockState {\n rate: number;\n paused: boolean;\n time: number;\n anims: Set<Animation>;\n subs: Set<() => void>;\n}\nconst CLOCK_KEY = Symbol.for('motionary.clock');\nconst clockState: ClockState = ((globalThis as any)[CLOCK_KEY] ||= { rate: 1, paused: false, time: 0, anims: new Set(), subs: new Set() });\n\nfunction applyClock(a: Animation): void {\n try {\n if (typeof (a as any).updatePlaybackRate === 'function') (a as any).updatePlaybackRate(clockState.rate);\n else if (clockState.rate !== 1 || (a as any).playbackRate !== undefined) (a as any).playbackRate = clockState.rate;\n if (clockState.paused) a.pause?.();\n else if (a.playState === 'paused' && (a as any)._usaClockPaused) a.play?.();\n (a as any)._usaClockPaused = clockState.paused;\n } catch {\n /* finished / detached animation */\n }\n}\n\n/** Put an animation on the shared motion clock (animateWithMotion does this for every component / effect animation). */\nexport function trackAnimation(a: Animation | null | undefined): void {\n if (!a) return;\n if (clockState.rate !== 1 || clockState.paused) applyClock(a);\n clockState.anims.add(a);\n const drop = () => clockState.anims.delete(a);\n a.finished?.then(drop, drop);\n}\n\n/** The motion clock's state: `rate` (1 = normal), `paused`, `time` (clock ms elapsed, scaled by rate). */\nexport function getClock(): { rate: number; paused: boolean; time: number; tracked: number } {\n return { rate: clockState.rate, paused: clockState.paused, time: clockState.time, tracked: clockState.anims.size };\n}\n\n/** Change the shared clock: `{ rate }` (0.05–8) and / or `{ paused }`. Applies to running animations and loops. */\nexport function setClock(next: { rate?: number; paused?: boolean }): void {\n const wasPaused = clockState.paused;\n if (typeof next.rate === 'number' && Number.isFinite(next.rate)) clockState.rate = Math.min(8, Math.max(0.05, next.rate));\n if (typeof next.paused === 'boolean') clockState.paused = next.paused;\n clockState.anims.forEach(applyClock);\n if (wasPaused && !clockState.paused && frameListeners.size) requestFlush();\n clockState.subs.forEach((fn) => fn());\n}\n\n/** Subscribe to clock changes; returns an unsubscribe. */\nexport function onClockChange(fn: () => void): () => void {\n clockState.subs.add(fn);\n return () => clockState.subs.delete(fn);\n}\n\n// --- active animation budget (4.5) ---------------------------------------------\nlet active = 0;\nlet maxActive = Infinity;\n/** Number of component animations running right now. */\nexport const activeAnimations = (): number => active;\n/** Cap concurrent component animations; extra ones jump to their final frame (`Infinity` = no cap). */\nexport function setAnimationBudget(max: number): void {\n maxActive = max > 0 ? max : Infinity;\n}\n/** The current cap. */\nexport const animationBudget = (): number => maxActive;\n\n// --- on-demand styles (4.5) -----------------------------------------------------\nlet styleLoader: ((tag: string) => void) | null = null;\n/** Called with each element's tag the first time one connects (used by the `lite` build to load CSS on demand). */\nexport function setStyleLoader(fn: ((tag: string) => void) | null): void {\n styleLoader = fn;\n}\n\nexport const EASE_OUT = 'cubic-bezier(0.22, 1, 0.36, 1)';\nexport const EASE_SPRING = 'cubic-bezier(0.34, 1.56, 0.64, 1)';\n/** Windows Fluent \"decelerate\" / \"point-to-point\" curves. */\nexport const FLUENT_DECELERATE = 'cubic-bezier(0.1, 0.9, 0.2, 1)';\n\nconst warned = new Set<string>();\n/** Log a deprecation once per key (console.warn). */\nexport function deprecate(key: string, message: string): void {\n if (warned.has(key)) return;\n warned.add(key);\n if (typeof console !== 'undefined') console.warn(`[motionary] ${message}`);\n}\n\n/**\n * The `kind` attribute of `<usa-spinner>`, `<usa-check>`, `<usa-dialog>` and\n * `<usa-acrylic>` (3.0: `variant` only selects a style variant).\n */\nexport function kindOf(el: Element, valid: readonly string[] | Record<string, unknown>, fallback: string): string {\n const k = el.getAttribute('kind');\n return k && (Array.isArray(valid) ? valid.includes(k) : k in (valid as object)) ? k : fallback;\n}\n\nexport const clamp = (v: number, min: number, max: number): number => Math.min(max, Math.max(min, v));\n"],"names":[],"mappings":"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"}