@kitn.ai/ui 0.19.0 → 0.20.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 (235) hide show
  1. package/LICENSE +6 -0
  2. package/NOTICE +54 -0
  3. package/dist/components/audio-visualizer/audio-visualizer.voice-fixture.d.ts +59 -0
  4. package/dist/components/audio-visualizer/aurora.glsl.d.ts +114 -0
  5. package/dist/components/audio-visualizer/index.d.ts +155 -0
  6. package/dist/components/audio-visualizer/shader-canvas.d.ts +130 -0
  7. package/dist/components/audio-visualizer/sizes.d.ts +25 -0
  8. package/dist/components/audio-visualizer/variant-aurora.d.ts +89 -0
  9. package/dist/components/audio-visualizer/variant-bar.d.ts +46 -0
  10. package/dist/components/audio-visualizer/variant-custom.d.ts +73 -0
  11. package/dist/components/audio-visualizer/variant-grid.d.ts +22 -0
  12. package/dist/components/audio-visualizer/variant-radial.d.ts +13 -0
  13. package/dist/components/audio-visualizer/variant-wave.d.ts +11 -0
  14. package/dist/components/audio-visualizer/wave.glsl.d.ts +16 -0
  15. package/dist/create-tween-hvpmSuwW.js +7 -0
  16. package/dist/custom-elements.json +282 -0
  17. package/dist/elements/agent-card.js +1 -1
  18. package/dist/elements/artifact.js +1 -1
  19. package/dist/elements/attachments.js +1 -1
  20. package/dist/elements/audio-visualizer.d.ts +1 -0
  21. package/dist/elements/audio-visualizer.js +1 -0
  22. package/dist/elements/autoloader.js +1 -1
  23. package/dist/elements/avatar.js +1 -1
  24. package/dist/elements/badge.js +1 -1
  25. package/dist/elements/button.js +1 -1
  26. package/dist/elements/card.js +1 -1
  27. package/dist/elements/cards.js +1 -1
  28. package/dist/elements/chain-of-thought.js +1 -1
  29. package/dist/elements/chat-scope-picker.js +1 -1
  30. package/dist/elements/chat-workspace.js +1 -1
  31. package/dist/elements/chat.js +1 -1
  32. package/dist/elements/checkpoint.js +1 -1
  33. package/dist/elements/choice.js +1 -1
  34. package/dist/elements/chunks/{Icon-11SRdjJ4.js → Icon-Tj58ES_d.js} +1 -1
  35. package/dist/elements/chunks/{action-icons-CtRg17uX.js → action-icons-ns1Fnedj.js} +1 -1
  36. package/dist/elements/chunks/arrow-left-DQocUFvy.js +1 -0
  37. package/dist/elements/chunks/{attachments-CBqQRh60.js → attachments-mCB5F1Fq.js} +1 -1
  38. package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +1 -0
  39. package/dist/elements/chunks/{badge-CxklEXQm.js → badge-B4Zuajl2.js} +1 -1
  40. package/dist/elements/chunks/{button-BD7lUvVB.js → button-ZWNif3--.js} +1 -1
  41. package/dist/elements/chunks/{card-B-PRGXdj.js → card-BkHbp4BA.js} +1 -1
  42. package/dist/elements/chunks/{chat-thread-DIZbRIKG.js → chat-thread-CkRN6pZ7.js} +1 -1
  43. package/dist/elements/chunks/check-B9-gn6SS.js +1 -0
  44. package/dist/elements/chunks/chevron-down-BNsxc2hk.js +1 -0
  45. package/dist/elements/chunks/chevron-right-Hv00StBO.js +1 -0
  46. package/dist/elements/chunks/circle-0e3KJTDr.js +1 -0
  47. package/dist/elements/chunks/circle-check-BNAS0JEy.js +1 -0
  48. package/dist/elements/chunks/{circle-x-mtjCO_Ok.js → circle-x-B7faJFlY.js} +1 -1
  49. package/dist/elements/chunks/{code-block-BeWVttmU.js → code-block-BFUHn6Va.js} +1 -1
  50. package/dist/elements/chunks/collapsible-DM1Ckd4e.js +1 -0
  51. package/dist/elements/chunks/{composer-CavJww3d.js → composer-BguS0QL_.js} +2 -2
  52. package/dist/elements/chunks/{context-CnlsNJSJ.js → context-Cb7k4F-v.js} +1 -1
  53. package/dist/elements/chunks/{conversation-list-5O_KdI_I.js → conversation-list-CvoAkWhN.js} +1 -1
  54. package/dist/elements/chunks/create-tween-oVvAIG8r.js +7 -0
  55. package/dist/elements/chunks/{default-input-CB46cJJ1.js → default-input-Cqqilg9t.js} +1 -1
  56. package/dist/elements/chunks/define-D1din7Ld.js +1 -0
  57. package/dist/elements/chunks/{disclosure-BtFK3a-M.js → disclosure-CIZ5c8nO.js} +1 -1
  58. package/dist/elements/chunks/{download-qJv1dS3M.js → download-Dsbg3ste.js} +1 -1
  59. package/dist/elements/chunks/{dropdown-UhtAueYR.js → dropdown-BDd1-Zgi.js} +1 -1
  60. package/dist/elements/chunks/{ellipsis-B1sOOqiJ.js → ellipsis-Dw6qrss-.js} +1 -1
  61. package/dist/elements/chunks/{external-link-DToP_VKE.js → external-link-Vt74zAoL.js} +1 -1
  62. package/dist/elements/chunks/{file-text-BwUs_Pj4.js → file-text-CZrZF6_v.js} +1 -1
  63. package/dist/elements/chunks/{file-tree-C6RhmSnX.js → file-tree-DF4okKyo.js} +1 -1
  64. package/dist/elements/chunks/{folder-H_Xp0GYP.js → folder-glP5rha4.js} +1 -1
  65. package/dist/elements/chunks/{hover-card-Dn3yrk1l.js → hover-card-Cmm6Q53m.js} +1 -1
  66. package/dist/elements/chunks/{icon-BrxJQXzC.js → icon-BLb8beoi.js} +1 -1
  67. package/dist/elements/chunks/{info-11eT2q5H.js → info-CIsv92JK.js} +1 -1
  68. package/dist/elements/chunks/{input-B9oZKDfb.js → input-Dds1kFyt.js} +1 -1
  69. package/dist/elements/chunks/{kbd-D2fx3rWh.js → kbd-De_xbgi9.js} +1 -1
  70. package/dist/elements/chunks/{link-B-RNYWNw.js → link-i4r_k7z4.js} +1 -1
  71. package/dist/elements/chunks/{loader-BJh_aRlp.js → loader-BmQH4s3V.js} +1 -1
  72. package/dist/elements/chunks/{markdown-BIpjrDFv.js → markdown-Zi21WhUz.js} +7 -7
  73. package/dist/elements/chunks/{message-CPfqj8Gi.js → message-BqyXDN3-.js} +1 -1
  74. package/dist/elements/chunks/{message-feedback-8uj0aVYh.js → message-feedback-Djr3z6Yb.js} +1 -1
  75. package/dist/elements/chunks/message-square-vFAgbDaX.js +1 -0
  76. package/dist/elements/chunks/{minimize-2-C9qkiTJg.js → minimize-2--ifeCGrl.js} +1 -1
  77. package/dist/elements/chunks/{model-switcher-DRrMcRXH.js → model-switcher-B94YAKsM.js} +1 -1
  78. package/dist/elements/chunks/{overlay-C8_FUL8q.js → overlay-kD8dwRv_.js} +1 -1
  79. package/dist/elements/chunks/{paperclip-MA9hxLhW.js → paperclip-q21dYOSK.js} +1 -1
  80. package/dist/elements/chunks/{progress-bar-y5G6HDjg.js → progress-bar-BrAIIaaJ.js} +1 -1
  81. package/dist/elements/chunks/{prompt-suggestion-LalWvCJy.js → prompt-suggestion-Bjn2K-fR.js} +1 -1
  82. package/dist/elements/chunks/reasoning-DTpCGtnY.js +1 -0
  83. package/dist/elements/chunks/{resizable-xhYF5lCQ.js → resizable-Dp4JExql.js} +1 -1
  84. package/dist/elements/chunks/{rotate-cw-2ndEXjgS.js → rotate-cw-CFWWkpj2.js} +1 -1
  85. package/dist/elements/chunks/{scroll-area-BzOPDXrZ.js → scroll-area-Bb0kHH1j.js} +1 -1
  86. package/dist/elements/chunks/scroll-button-B0cH5fXf.js +1 -0
  87. package/dist/elements/chunks/{separator-CPvL5Xdl.js → separator-9kRgr1X9.js} +1 -1
  88. package/dist/elements/chunks/{settings-hmzIuNXD.js → settings-B8lmec4D.js} +1 -1
  89. package/dist/elements/chunks/{settings-group-BiIym17O.js → settings-group-I0hEuXiN.js} +1 -1
  90. package/dist/elements/chunks/{share-BbziTAzn.js → share-C3lTiYGt.js} +1 -1
  91. package/dist/elements/chunks/{skeleton-Bxhs1thL.js → skeleton-DSXW5Yya.js} +1 -1
  92. package/dist/elements/chunks/{star-BHL3Va5p.js → star-CSJtGxgv.js} +1 -1
  93. package/dist/elements/chunks/{store-tpnnWlxY.js → store-CHyW95TP.js} +1 -1
  94. package/dist/elements/chunks/{text-shimmer-1DCKivKx.js → text-shimmer-Cn9TmNpI.js} +1 -1
  95. package/dist/elements/chunks/{textarea-Czaowo9F.js → textarea-CUwqAX0G.js} +1 -1
  96. package/dist/elements/chunks/{thumbs-up-CdLqA13R.js → thumbs-up-PNVVThEF.js} +1 -1
  97. package/dist/elements/chunks/{toast-store-BvBquUFA.js → toast-store-DKbQn3Wn.js} +1 -1
  98. package/dist/elements/chunks/{tool-4P_ne8Go.js → tool-DjTRpIpl.js} +1 -1
  99. package/dist/elements/chunks/tooltip-CgBZCVKp.js +1 -0
  100. package/dist/elements/chunks/{triangle-alert-BllqxXq8.js → triangle-alert-DsHTHCPm.js} +1 -1
  101. package/dist/elements/chunks/{use-card-resolution-73xiddIW.js → use-card-resolution-BSu_XHjH.js} +1 -1
  102. package/dist/elements/chunks/variant-aurora-Dc4nQUia.js +218 -0
  103. package/dist/elements/chunks/variant-custom-y_3kVQhS.js +1 -0
  104. package/dist/elements/chunks/variant-wave-D5OR1-9Z.js +116 -0
  105. package/dist/elements/chunks/{video-O9rA6k7S.js → video-B7vmenoC.js} +1 -1
  106. package/dist/elements/chunks/x-GRUeeQFT.js +1 -0
  107. package/dist/elements/coachmark.js +1 -1
  108. package/dist/elements/code-block.js +1 -1
  109. package/dist/elements/command.js +1 -1
  110. package/dist/elements/compare.js +1 -1
  111. package/dist/elements/composer.js +1 -1
  112. package/dist/elements/confirm-card.js +1 -1
  113. package/dist/elements/context-meter.js +1 -1
  114. package/dist/elements/conversation-list.js +1 -1
  115. package/dist/elements/define.d.ts +11 -0
  116. package/dist/elements/dialog.js +1 -1
  117. package/dist/elements/editable-label.js +1 -1
  118. package/dist/elements/embed.js +1 -1
  119. package/dist/elements/empty.js +1 -1
  120. package/dist/elements/feedback-bar.js +1 -1
  121. package/dist/elements/file-tree.js +1 -1
  122. package/dist/elements/file-upload.js +1 -1
  123. package/dist/elements/form.js +1 -1
  124. package/dist/elements/hover-card.js +1 -1
  125. package/dist/elements/icon.js +1 -1
  126. package/dist/elements/image.js +1 -1
  127. package/dist/elements/input.js +1 -1
  128. package/dist/elements/kbd.js +1 -1
  129. package/dist/elements/link-preview.js +1 -1
  130. package/dist/elements/loader.js +1 -1
  131. package/dist/elements/markdown.js +1 -1
  132. package/dist/elements/menu.js +1 -1
  133. package/dist/elements/message-skills.js +1 -1
  134. package/dist/elements/message.js +1 -1
  135. package/dist/elements/model-switcher.js +1 -1
  136. package/dist/elements/nav.js +1 -1
  137. package/dist/elements/notice.js +1 -1
  138. package/dist/elements/pane-group.js +1 -1
  139. package/dist/elements/pane.js +1 -1
  140. package/dist/elements/popover.js +1 -1
  141. package/dist/elements/progress-bar.js +1 -1
  142. package/dist/elements/prompt-dock.js +1 -1
  143. package/dist/elements/prompt-input.js +1 -1
  144. package/dist/elements/prompt-suggestions.js +1 -1
  145. package/dist/elements/reasoning.js +1 -1
  146. package/dist/elements/remote.js +1 -1
  147. package/dist/elements/resizable.js +1 -1
  148. package/dist/elements/response-stream.js +1 -1
  149. package/dist/elements/screen.js +1 -1
  150. package/dist/elements/scroll-area.js +1 -1
  151. package/dist/elements/scroll-button.js +1 -1
  152. package/dist/elements/search.js +1 -1
  153. package/dist/elements/segmented.js +1 -1
  154. package/dist/elements/separator.js +1 -1
  155. package/dist/elements/setting-item.js +1 -1
  156. package/dist/elements/settings-group.js +1 -1
  157. package/dist/elements/skeleton.js +1 -1
  158. package/dist/elements/slots.d.ts +12 -0
  159. package/dist/elements/source.js +1 -1
  160. package/dist/elements/status.js +1 -1
  161. package/dist/elements/switch.js +1 -1
  162. package/dist/elements/tabs.js +1 -1
  163. package/dist/elements/tasks.js +1 -1
  164. package/dist/elements/text-shimmer.js +1 -1
  165. package/dist/elements/thinking-bar.js +1 -1
  166. package/dist/elements/thread.js +1 -1
  167. package/dist/elements/toast.js +1 -1
  168. package/dist/elements/tool.js +1 -1
  169. package/dist/elements/tooltip.js +1 -1
  170. package/dist/elements/voice-input.js +1 -1
  171. package/dist/elements/voice-output.js +1 -1
  172. package/dist/elements.d.ts +38 -0
  173. package/dist/index.js +18 -17
  174. package/dist/kai.es.js +1 -1
  175. package/dist/llms/llms-full.txt +40 -4
  176. package/dist/llms/llms.txt +3 -3
  177. package/dist/primitives/audio-bands.d.ts +106 -0
  178. package/dist/primitives/create-tween.d.ts +33 -0
  179. package/dist/primitives/use-audio-analysis.d.ts +149 -0
  180. package/dist/primitives/use-sequencer.d.ts +13 -0
  181. package/dist/primitives/use-voice-recorder.d.ts +1 -0
  182. package/dist/primitives/visualizer-sequences.d.ts +39 -0
  183. package/dist/react/index.d.ts +41 -0
  184. package/dist/react.js +159 -153
  185. package/dist/register-impl-DQyejdfb.js +145 -0
  186. package/dist/test-utils/fake-clock.d.ts +45 -0
  187. package/dist/variant-aurora-DVtGqVH6.js +218 -0
  188. package/dist/variant-custom-Dif-IV4u.js +1 -0
  189. package/dist/variant-wave-DbfNdvSi.js +116 -0
  190. package/frameworks/react/index.tsx +42 -0
  191. package/llms-full.txt +40 -4
  192. package/llms.txt +3 -3
  193. package/package.json +6 -3
  194. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +257 -0
  195. package/src/components/audio-visualizer/aurora.glsl.ts +330 -0
  196. package/src/components/audio-visualizer/index.tsx +442 -0
  197. package/src/components/audio-visualizer/shader-canvas.tsx +846 -0
  198. package/src/components/audio-visualizer/sizes.ts +54 -0
  199. package/src/components/audio-visualizer/variant-aurora.tsx +299 -0
  200. package/src/components/audio-visualizer/variant-bar.tsx +143 -0
  201. package/src/components/audio-visualizer/variant-custom.tsx +338 -0
  202. package/src/components/audio-visualizer/variant-grid.tsx +170 -0
  203. package/src/components/audio-visualizer/variant-radial.tsx +158 -0
  204. package/src/components/audio-visualizer/variant-wave.tsx +125 -0
  205. package/src/components/audio-visualizer/wave.glsl.ts +130 -0
  206. package/src/components/component-meta.json +24 -24
  207. package/src/elements/audio-visualizer.tsx +183 -0
  208. package/src/elements/compiled.css +1 -1
  209. package/src/elements/define.tsx +12 -1
  210. package/src/elements/element-manifest.json +4 -0
  211. package/src/elements/element-meta.json +170 -0
  212. package/src/elements/element-types.d.ts +38 -0
  213. package/src/elements/register-impl.ts +1 -0
  214. package/src/elements/slots.ts +35 -0
  215. package/src/primitives/audio-bands.ts +174 -0
  216. package/src/primitives/create-tween.ts +214 -0
  217. package/src/primitives/use-audio-analysis.ts +321 -0
  218. package/src/primitives/use-sequencer.ts +53 -0
  219. package/src/primitives/use-voice-recorder.ts +16 -4
  220. package/src/primitives/visualizer-sequences.ts +350 -0
  221. package/src/test-utils/fake-clock.ts +88 -0
  222. package/dist/elements/chunks/arrow-left-CifsGq8x.js +0 -1
  223. package/dist/elements/chunks/check-CUKS495w.js +0 -1
  224. package/dist/elements/chunks/chevron-down-AELmYT1j.js +0 -1
  225. package/dist/elements/chunks/chevron-right-C8g26oKh.js +0 -1
  226. package/dist/elements/chunks/circle-DGcI8Cft.js +0 -1
  227. package/dist/elements/chunks/circle-check-DuU0IcBQ.js +0 -1
  228. package/dist/elements/chunks/collapsible-DGjADCN6.js +0 -1
  229. package/dist/elements/chunks/define-DfTe4zwZ.js +0 -1
  230. package/dist/elements/chunks/message-square-CCSQ4M9g.js +0 -1
  231. package/dist/elements/chunks/reasoning-CW3SDdb4.js +0 -1
  232. package/dist/elements/chunks/scroll-button-B1x4cYqM.js +0 -1
  233. package/dist/elements/chunks/tooltip-CBeFqJKk.js +0 -1
  234. package/dist/elements/chunks/x-DeS3rQhx.js +0 -1
  235. package/dist/register-impl-CaaHJcea.js +0 -145
@@ -0,0 +1,183 @@
1
+ import type { JSX } from 'solid-js';
2
+ import { AudioVisualizer, type ShaderSpec, type VisualizerVariant } from '../components/audio-visualizer';
3
+ import type { VisualizerSize } from '../components/audio-visualizer/sizes';
4
+ import { defineWebComponent, type WebComponentContext } from './define';
5
+
6
+ interface Props extends Record<string, unknown> {
7
+ /** Look to render: `bar` (default), `grid`, `radial`, `wave`, `aurora`, `custom`.
8
+ * `aura` is accepted as a LiveKit-markup alias for `aurora`. Attribute: `variant`. */
9
+ variant?: string;
10
+ /** `idle` (default), `connecting`, `listening`, `thinking`, `speaking`,
11
+ * `disconnected` (connection down: the dead, flat look). LiveKit's
12
+ * room-lifecycle state names are accepted as aliases. Attribute: `state`. */
13
+ state?: string;
14
+ /** `icon` | `sm` | `md` (default) | `lg` | `xl`. Attribute: `size`. */
15
+ size?: string;
16
+ /** Bars to draw. Bar and radial only. Attribute: `bar-count`. */
17
+ barCount?: number;
18
+ /** Grid only: rows and columns of the (always square) grid. Attribute: `count`. */
19
+ count?: number;
20
+ /** Radial only: ring distance from center, in px. Attribute: `radius`. */
21
+ radius?: number;
22
+ /** Grid only: ring distance for the connecting animation, in cells. Attribute: `spread`. */
23
+ spread?: number;
24
+ /** Grid only: ms between scripted frames. Attribute: `interval`. */
25
+ interval?: number;
26
+ /** CSS color for the geometry, overriding the inherited `currentColor`. Attribute: `color`. */
27
+ color?: string;
28
+ /** Shader variants only: pattern density, 0..1. Attribute: `complexity`. */
29
+ complexity?: number;
30
+ /** Setting this makes the element an announced image (`role="img"`) instead of
31
+ * decorative (`aria-hidden`). Attribute: `label`. */
32
+ label?: string;
33
+ /** Live microphone or WebRTC audio to analyze. JS property only. */
34
+ stream?: MediaStream;
35
+ /** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
36
+ audioElement?: HTMLMediaElement;
37
+ /** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is
38
+ * what keeps headless/SSR rendering and browser-speech-synthesis playback (which
39
+ * exposes no audio node) free of Web Audio entirely. JS property only. A new
40
+ * array reference is required for each update; mutating the existing array in
41
+ * place will not re-render. */
42
+ bands?: number[];
43
+ /** Custom fragment shader for `variant="custom"`. JS property only. */
44
+ shader?: ShaderSpec;
45
+ /** Shader variants only: keep animating while scrolled off screen. Off by default,
46
+ * which stops drawing and releases the WebGL context until the element comes back
47
+ * (browsers ration contexts to roughly 16 a page). Does not override
48
+ * `prefers-reduced-motion`. Attribute: `animate-when-not-visible`. */
49
+ animateWhenNotVisible?: boolean;
50
+ }
51
+
52
+ /**
53
+ * Parse a numeric attribute or JS property value. Attribute values arrive as
54
+ * strings, so a missing or non-numeric one must resolve to `undefined` (which
55
+ * the composed component then defaults itself), never `NaN`, which would
56
+ * poison the downstream geometry (bar counts, radii, grid dimensions).
57
+ */
58
+ export function num(value: unknown): number | undefined {
59
+ if (value == null || value === '') return undefined;
60
+ const n = Number(value);
61
+ return Number.isFinite(n) ? n : undefined;
62
+ }
63
+
64
+ /**
65
+ * The facade's render logic, extracted to a named function so it can be
66
+ * exercised directly in tests (a plain Solid component call, no shadow DOM
67
+ * involved) without needing `defineWebComponent`'s browser-only custom-element
68
+ * upgrade path. Identical to what was previously an inline arrow passed to
69
+ * `defineWebComponent` below, plus forwarding the resolved theme (see `dark`
70
+ * below) once that context field existed to forward.
71
+ *
72
+ * `ctx` is optional so the existing declarative test (which calls this
73
+ * directly with just `props`, the way it did before `dark` existed) keeps
74
+ * working unchanged. `defineWebComponent` always supplies a real one; the
75
+ * `false` fallback only matters for that reduced, no-shadow-DOM call path.
76
+ */
77
+ export function AudioVisualizerFacade(
78
+ props: Props,
79
+ ctx?: Partial<Pick<WebComponentContext, 'dark' | 'flag'>>,
80
+ ): JSX.Element {
81
+ // Every element already resolves `theme='light'|'dark'|'auto'` against a
82
+ // live `prefers-color-scheme` listener in `defineWebComponent` (see
83
+ // `createDarkMode`), to drive the `.dark` class every element's content
84
+ // sits inside. A WebGL shader cannot read that class or a CSS custom
85
+ // property, so `<kai-audio-visualizer variant="aurora">` needs the ALREADY
86
+ // -RESOLVED boolean forwarded explicitly instead. Passing it through as a
87
+ // definite 'light'/'dark' (never 'auto') means the resolution RULE itself
88
+ // -- explicit wins, 'auto' follows the media query -- lives in exactly one
89
+ // place (`createDarkMode`); this is a plain relay, not a second
90
+ // implementation of that rule.
91
+ const dark = ctx?.dark?.() ?? false;
92
+
93
+ // `flag` is what makes a BARE attribute
94
+ // (`<kai-audio-visualizer animate-when-not-visible>`) mean true:
95
+ // component-register parses a valueless boolean attribute to `undefined`, so
96
+ // the prop alone cannot tell it apart from an absent one. Same helper every
97
+ // other boolean-attribute element uses, so the coercion rule lives in one
98
+ // place. The `props` fallback only covers the ctx-less direct-call path the
99
+ // declarative test uses, where there is no host element carrying an
100
+ // attribute at all.
101
+ const animateWhenNotVisible = ctx?.flag
102
+ ? ctx.flag('animateWhenNotVisible')
103
+ : props.animateWhenNotVisible === true;
104
+
105
+ return (
106
+ <AudioVisualizer
107
+ variant={props.variant as VisualizerVariant | undefined}
108
+ state={props.state as string | undefined}
109
+ size={props.size as VisualizerSize | undefined}
110
+ barCount={num(props.barCount)}
111
+ count={num(props.count)}
112
+ radius={num(props.radius)}
113
+ spread={num(props.spread)}
114
+ interval={num(props.interval)}
115
+ color={props.color as string | undefined}
116
+ complexity={num(props.complexity)}
117
+ label={props.label as string | undefined}
118
+ stream={props.stream as MediaStream | undefined}
119
+ audioElement={props.audioElement as HTMLMediaElement | undefined}
120
+ bands={props.bands as number[] | undefined}
121
+ shader={props.shader as ShaderSpec | undefined}
122
+ animateWhenNotVisible={animateWhenNotVisible}
123
+ theme={dark ? 'dark' : 'light'}
124
+ />
125
+ );
126
+ }
127
+
128
+ /**
129
+ * `<kai-audio-visualizer>` renders live audio as bars, a grid, a ring, a wave,
130
+ * or a glowing aurora. It also animates from `state` alone with no audio at
131
+ * all, which is what you want when the source cannot be tapped (browser
132
+ * speech synthesis exposes no audio node).
133
+ *
134
+ * ```html
135
+ * <kai-audio-visualizer variant="bar" state="speaking" size="md"></kai-audio-visualizer>
136
+ * <kai-audio-visualizer variant="radial" size="lg" bar-count="24"></kai-audio-visualizer>
137
+ * ```
138
+ *
139
+ * Audio sources and rich data are JS properties, never attributes:
140
+ * ```js
141
+ * el.stream = micStream // MediaStream
142
+ * el.audioElement = audioRef // HTMLMediaElement
143
+ * el.bands = [0.2, 0.8, 0.4] // pre-computed, skips Web Audio; new array each update
144
+ * el.shader = { fragment: glsl } // variant="custom" only
145
+ * ```
146
+ *
147
+ * The `wave`, `aurora`, and `custom` variants render through WebGL, and a
148
+ * browser only allows about 16 live WebGL contexts per page. So a shader
149
+ * variant scrolled off screen stops drawing and hands its context back,
150
+ * picking up where it left off when it returns. Opt out per element when a
151
+ * visualizer must keep running unseen:
152
+ *
153
+ * ```html
154
+ * <kai-audio-visualizer variant="wave" animate-when-not-visible></kai-audio-visualizer>
155
+ * ```
156
+ *
157
+ * This is a display element: no methods, no events.
158
+ *
159
+ * Restyle from outside via `::part(bar)` / `::part(cell)` / `::part(canvas)`,
160
+ * the bar and cell parts each carrying `data-kai-index` and `data-kai-highlighted`.
161
+ */
162
+ defineWebComponent<Props>('kai-audio-visualizer', {
163
+ variant: 'bar',
164
+ state: 'idle',
165
+ size: 'md',
166
+ barCount: undefined,
167
+ count: undefined,
168
+ radius: undefined,
169
+ spread: undefined,
170
+ interval: undefined,
171
+ color: undefined,
172
+ complexity: undefined,
173
+ label: undefined,
174
+ stream: undefined,
175
+ audioElement: undefined,
176
+ bands: undefined,
177
+ shader: undefined,
178
+ // `undefined`, not `false`: `resolveFlag` short-circuits on an explicit
179
+ // `false` prop value, so a `false` default would beat a bare
180
+ // `animate-when-not-visible` attribute if component-register ever left the
181
+ // default in place instead of writing `undefined` for a valueless attribute.
182
+ animateWhenNotVisible: undefined,
183
+ }, AudioVisualizerFacade);