@kitn.ai/ui 0.18.2 → 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 (258) 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/components/thread.d.ts +54 -0
  16. package/dist/create-tween-hvpmSuwW.js +7 -0
  17. package/dist/custom-elements.json +477 -0
  18. package/dist/elements/agent-card.js +1 -1
  19. package/dist/elements/artifact.js +1 -1
  20. package/dist/elements/attachments.js +1 -1
  21. package/dist/elements/audio-visualizer.d.ts +1 -0
  22. package/dist/elements/audio-visualizer.js +1 -0
  23. package/dist/elements/autoloader.js +1 -1
  24. package/dist/elements/avatar.js +1 -1
  25. package/dist/elements/badge.js +1 -1
  26. package/dist/elements/button.js +1 -1
  27. package/dist/elements/card.js +1 -1
  28. package/dist/elements/cards.js +1 -1
  29. package/dist/elements/chain-of-thought.js +1 -1
  30. package/dist/elements/chat-scope-picker.js +1 -1
  31. package/dist/elements/chat-workspace.js +1 -1
  32. package/dist/elements/chat.js +1 -1
  33. package/dist/elements/checkpoint.js +1 -1
  34. package/dist/elements/choice.js +1 -1
  35. package/dist/elements/chunks/{Icon-C2LTALdM.js → Icon-Tj58ES_d.js} +1 -1
  36. package/dist/elements/chunks/action-icons-ns1Fnedj.js +1 -0
  37. package/dist/elements/chunks/arrow-left-DQocUFvy.js +1 -0
  38. package/dist/elements/chunks/{attachments-DLJcWCDV.js → attachments-mCB5F1Fq.js} +1 -1
  39. package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +1 -0
  40. package/dist/elements/chunks/{badge-BTNZTODL.js → badge-B4Zuajl2.js} +1 -1
  41. package/dist/elements/chunks/{button-DBDZebGr.js → button-ZWNif3--.js} +1 -1
  42. package/dist/elements/chunks/{card-YfCyI4fH.js → card-BkHbp4BA.js} +1 -1
  43. package/dist/elements/chunks/chat-thread-CkRN6pZ7.js +1 -0
  44. package/dist/elements/chunks/check-B9-gn6SS.js +1 -0
  45. package/dist/elements/chunks/chevron-down-BNsxc2hk.js +1 -0
  46. package/dist/elements/chunks/chevron-right-Hv00StBO.js +1 -0
  47. package/dist/elements/chunks/circle-0e3KJTDr.js +1 -0
  48. package/dist/elements/chunks/circle-check-BNAS0JEy.js +1 -0
  49. package/dist/elements/chunks/{circle-x-pDtzlghQ.js → circle-x-B7faJFlY.js} +1 -1
  50. package/dist/elements/chunks/{code-block-DZ6mz6vs.js → code-block-BFUHn6Va.js} +1 -1
  51. package/dist/elements/chunks/collapsible-DM1Ckd4e.js +1 -0
  52. package/dist/elements/chunks/{composer-BZyPU6gD.js → composer-BguS0QL_.js} +7 -3
  53. package/dist/elements/chunks/{context-Cx6eQA_G.js → context-Cb7k4F-v.js} +1 -1
  54. package/dist/elements/chunks/{conversation-list-C4xTQSpT.js → conversation-list-CvoAkWhN.js} +1 -1
  55. package/dist/elements/chunks/create-tween-oVvAIG8r.js +7 -0
  56. package/dist/elements/chunks/{default-input-BZcwyKcP.js → default-input-Cqqilg9t.js} +1 -1
  57. package/dist/elements/chunks/define-D1din7Ld.js +1 -0
  58. package/dist/elements/chunks/{disclosure-BcBs--Jf.js → disclosure-CIZ5c8nO.js} +1 -1
  59. package/dist/elements/chunks/{download-BDQwcFav.js → download-Dsbg3ste.js} +1 -1
  60. package/dist/elements/chunks/{dropdown-wgs8xCJZ.js → dropdown-BDd1-Zgi.js} +1 -1
  61. package/dist/elements/chunks/{ellipsis-CUiEJ6R1.js → ellipsis-Dw6qrss-.js} +1 -1
  62. package/dist/elements/chunks/{external-link-DJUmC7g2.js → external-link-Vt74zAoL.js} +1 -1
  63. package/dist/elements/chunks/{file-text-DOYfYvrh.js → file-text-CZrZF6_v.js} +1 -1
  64. package/dist/elements/chunks/{file-tree-DQzNQrbr.js → file-tree-DF4okKyo.js} +1 -1
  65. package/dist/elements/chunks/{folder-DBDUBANz.js → folder-glP5rha4.js} +1 -1
  66. package/dist/elements/chunks/hover-card-Cmm6Q53m.js +1 -0
  67. package/dist/elements/chunks/icon-BLb8beoi.js +1 -0
  68. package/dist/elements/chunks/{info-DBQl-m6e.js → info-CIsv92JK.js} +1 -1
  69. package/dist/elements/chunks/{input-DZD67EvW.js → input-Dds1kFyt.js} +1 -1
  70. package/dist/elements/chunks/{kbd-DbyVrlnU.js → kbd-De_xbgi9.js} +1 -1
  71. package/dist/elements/chunks/{link-vko7AttA.js → link-i4r_k7z4.js} +1 -1
  72. package/dist/elements/chunks/{loader-Cg6rO8tQ.js → loader-BmQH4s3V.js} +1 -1
  73. package/dist/elements/chunks/{markdown-n3Xbj3PR.js → markdown-Zi21WhUz.js} +7 -7
  74. package/dist/elements/chunks/{message-CgKytiSB.js → message-BqyXDN3-.js} +1 -1
  75. package/dist/elements/chunks/{message-feedback-Ds3-US0e.js → message-feedback-Djr3z6Yb.js} +1 -1
  76. package/dist/elements/chunks/message-square-vFAgbDaX.js +1 -0
  77. package/dist/elements/chunks/{minimize-2-3kCdE0q3.js → minimize-2--ifeCGrl.js} +1 -1
  78. package/dist/elements/chunks/{model-switcher-BMtXGwLU.js → model-switcher-B94YAKsM.js} +1 -1
  79. package/dist/elements/chunks/{overlay-B1-MBI6h.js → overlay-kD8dwRv_.js} +1 -1
  80. package/dist/elements/chunks/{paperclip-DDEfmkHc.js → paperclip-q21dYOSK.js} +1 -1
  81. package/dist/elements/chunks/{progress-bar-Dwbiyv3s.js → progress-bar-BrAIIaaJ.js} +1 -1
  82. package/dist/elements/chunks/{prompt-suggestion-9lvgFcEa.js → prompt-suggestion-Bjn2K-fR.js} +1 -1
  83. package/dist/elements/chunks/{reasoning-DzHWsdAJ.js → reasoning-DTpCGtnY.js} +1 -1
  84. package/dist/elements/chunks/resizable-Dp4JExql.js +1 -0
  85. package/dist/elements/chunks/{rotate-cw-jpisOdOV.js → rotate-cw-CFWWkpj2.js} +1 -1
  86. package/dist/elements/chunks/{scroll-area-g5Ze3K6f.js → scroll-area-Bb0kHH1j.js} +1 -1
  87. package/dist/elements/chunks/scroll-button-B0cH5fXf.js +1 -0
  88. package/dist/elements/chunks/{separator-Bmjc5XyX.js → separator-9kRgr1X9.js} +1 -1
  89. package/dist/elements/chunks/{settings-Cz1bMJP9.js → settings-B8lmec4D.js} +1 -1
  90. package/dist/elements/chunks/{settings-group-9imY3kRA.js → settings-group-I0hEuXiN.js} +1 -1
  91. package/dist/elements/chunks/{share-BdenF0wQ.js → share-C3lTiYGt.js} +1 -1
  92. package/dist/elements/chunks/skeleton-DSXW5Yya.js +1 -0
  93. package/dist/elements/chunks/{slots-DkZ-Cmha.js → slots--V19HwUb.js} +1 -1
  94. package/dist/elements/chunks/{star-DY6z1UUH.js → star-CSJtGxgv.js} +1 -1
  95. package/dist/elements/chunks/{store-th4VyJXM.js → store-CHyW95TP.js} +1 -1
  96. package/dist/elements/chunks/{text-shimmer-CEi-tlXr.js → text-shimmer-Cn9TmNpI.js} +1 -1
  97. package/dist/elements/chunks/textarea-CUwqAX0G.js +1 -0
  98. package/dist/elements/chunks/{thumbs-up-BR33KLfA.js → thumbs-up-PNVVThEF.js} +1 -1
  99. package/dist/elements/chunks/{toast-store-BEMda0fv.js → toast-store-DKbQn3Wn.js} +1 -1
  100. package/dist/elements/chunks/{tool-TMued3WO.js → tool-DjTRpIpl.js} +1 -1
  101. package/dist/elements/chunks/tooltip-CgBZCVKp.js +1 -0
  102. package/dist/elements/chunks/{triangle-alert-B07fX3Q8.js → triangle-alert-DsHTHCPm.js} +1 -1
  103. package/dist/elements/chunks/use-card-resolution-BSu_XHjH.js +1 -0
  104. package/dist/elements/chunks/variant-aurora-Dc4nQUia.js +218 -0
  105. package/dist/elements/chunks/variant-custom-y_3kVQhS.js +1 -0
  106. package/dist/elements/chunks/variant-wave-D5OR1-9Z.js +116 -0
  107. package/dist/elements/chunks/{video-MKp3LmNT.js → video-B7vmenoC.js} +1 -1
  108. package/dist/elements/chunks/x-GRUeeQFT.js +1 -0
  109. package/dist/elements/coachmark.js +1 -1
  110. package/dist/elements/code-block.js +1 -1
  111. package/dist/elements/command.js +1 -1
  112. package/dist/elements/compare.js +1 -1
  113. package/dist/elements/composer.js +1 -1
  114. package/dist/elements/confirm-card.js +1 -1
  115. package/dist/elements/context-meter.js +1 -1
  116. package/dist/elements/conversation-list.js +1 -1
  117. package/dist/elements/define.d.ts +11 -0
  118. package/dist/elements/dialog.js +1 -1
  119. package/dist/elements/editable-label.js +1 -1
  120. package/dist/elements/embed.js +1 -1
  121. package/dist/elements/empty.js +1 -1
  122. package/dist/elements/feedback-bar.js +1 -1
  123. package/dist/elements/file-tree.js +1 -1
  124. package/dist/elements/file-upload.js +1 -1
  125. package/dist/elements/form.js +1 -1
  126. package/dist/elements/hover-card.js +1 -1
  127. package/dist/elements/icon.js +1 -1
  128. package/dist/elements/image.js +1 -1
  129. package/dist/elements/input.js +1 -1
  130. package/dist/elements/kbd.js +1 -1
  131. package/dist/elements/link-preview.js +1 -1
  132. package/dist/elements/loader.js +1 -1
  133. package/dist/elements/markdown.js +1 -1
  134. package/dist/elements/menu.js +1 -1
  135. package/dist/elements/message-skills.js +1 -1
  136. package/dist/elements/message.js +1 -1
  137. package/dist/elements/model-switcher.js +1 -1
  138. package/dist/elements/nav.js +1 -1
  139. package/dist/elements/notice.js +1 -1
  140. package/dist/elements/pane-group.js +1 -1
  141. package/dist/elements/pane.js +1 -1
  142. package/dist/elements/popover.js +1 -1
  143. package/dist/elements/progress-bar.js +1 -1
  144. package/dist/elements/prompt-dock.js +1 -1
  145. package/dist/elements/prompt-input.js +1 -1
  146. package/dist/elements/prompt-suggestions.js +1 -1
  147. package/dist/elements/reasoning.js +1 -1
  148. package/dist/elements/remote.js +1 -1
  149. package/dist/elements/resizable.js +1 -1
  150. package/dist/elements/response-stream.js +1 -1
  151. package/dist/elements/screen.js +1 -1
  152. package/dist/elements/scroll-area.js +1 -1
  153. package/dist/elements/scroll-button.js +1 -1
  154. package/dist/elements/search.js +1 -1
  155. package/dist/elements/segmented.js +1 -1
  156. package/dist/elements/separator.js +1 -1
  157. package/dist/elements/setting-item.js +1 -1
  158. package/dist/elements/settings-group.js +1 -1
  159. package/dist/elements/skeleton.js +1 -1
  160. package/dist/elements/slots.d.ts +15 -0
  161. package/dist/elements/source.js +1 -1
  162. package/dist/elements/status.js +1 -1
  163. package/dist/elements/switch.js +1 -1
  164. package/dist/elements/tabs.js +1 -1
  165. package/dist/elements/tasks.js +1 -1
  166. package/dist/elements/text-shimmer.js +1 -1
  167. package/dist/elements/thinking-bar.js +1 -1
  168. package/dist/elements/thread.d.ts +1 -0
  169. package/dist/elements/thread.js +1 -0
  170. package/dist/elements/toast.js +1 -1
  171. package/dist/elements/tool.js +1 -1
  172. package/dist/elements/tooltip.js +1 -1
  173. package/dist/elements/voice-input.js +1 -1
  174. package/dist/elements/voice-output.js +1 -1
  175. package/dist/elements.d.ts +62 -0
  176. package/dist/index.js +3411 -3328
  177. package/dist/kai.es.js +1 -1
  178. package/dist/llms/llms-full.txt +70 -4
  179. package/dist/llms/llms.txt +3 -3
  180. package/dist/primitives/audio-bands.d.ts +106 -0
  181. package/dist/primitives/create-tween.d.ts +33 -0
  182. package/dist/primitives/use-audio-analysis.d.ts +149 -0
  183. package/dist/primitives/use-sequencer.d.ts +13 -0
  184. package/dist/primitives/use-voice-recorder.d.ts +1 -0
  185. package/dist/primitives/visualizer-sequences.d.ts +39 -0
  186. package/dist/react/index.d.ts +105 -0
  187. package/dist/react/use-voice-input.d.ts +15 -0
  188. package/dist/react.js +269 -240
  189. package/dist/register-impl-DQyejdfb.js +145 -0
  190. package/dist/test-utils/fake-clock.d.ts +45 -0
  191. package/dist/ui/resizable.d.ts +9 -3
  192. package/dist/variant-aurora-DVtGqVH6.js +218 -0
  193. package/dist/variant-custom-Dif-IV4u.js +1 -0
  194. package/dist/variant-wave-DbfNdvSi.js +116 -0
  195. package/frameworks/react/index.tsx +74 -1
  196. package/frameworks/react/use-voice-input.tsx +59 -0
  197. package/llms-full.txt +70 -4
  198. package/llms.txt +3 -3
  199. package/package.json +32 -7
  200. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +257 -0
  201. package/src/components/audio-visualizer/aurora.glsl.ts +330 -0
  202. package/src/components/audio-visualizer/index.tsx +442 -0
  203. package/src/components/audio-visualizer/shader-canvas.tsx +846 -0
  204. package/src/components/audio-visualizer/sizes.ts +54 -0
  205. package/src/components/audio-visualizer/variant-aurora.tsx +299 -0
  206. package/src/components/audio-visualizer/variant-bar.tsx +143 -0
  207. package/src/components/audio-visualizer/variant-custom.tsx +338 -0
  208. package/src/components/audio-visualizer/variant-grid.tsx +170 -0
  209. package/src/components/audio-visualizer/variant-radial.tsx +158 -0
  210. package/src/components/audio-visualizer/variant-wave.tsx +125 -0
  211. package/src/components/audio-visualizer/wave.glsl.ts +130 -0
  212. package/src/components/component-meta.json +34 -32
  213. package/src/components/composer.tsx +5 -0
  214. package/src/components/thread.tsx +177 -0
  215. package/src/elements/audio-visualizer.tsx +183 -0
  216. package/src/elements/chat-workspace.tsx +1 -1
  217. package/src/elements/compiled.css +1 -1
  218. package/src/elements/define.tsx +12 -1
  219. package/src/elements/element-manifest.json +8 -0
  220. package/src/elements/element-meta.json +287 -0
  221. package/src/elements/element-types.d.ts +62 -0
  222. package/src/elements/icon-names.json +2 -0
  223. package/src/elements/menu.tsx +7 -4
  224. package/src/elements/register-impl.ts +3 -0
  225. package/src/elements/resizable.tsx +78 -2
  226. package/src/elements/slots.ts +42 -0
  227. package/src/elements/thread.tsx +105 -0
  228. package/src/primitives/audio-bands.ts +174 -0
  229. package/src/primitives/create-tween.ts +214 -0
  230. package/src/primitives/use-audio-analysis.ts +321 -0
  231. package/src/primitives/use-sequencer.ts +53 -0
  232. package/src/primitives/use-voice-recorder.ts +16 -4
  233. package/src/primitives/visualizer-sequences.ts +350 -0
  234. package/src/test-utils/fake-clock.ts +88 -0
  235. package/src/ui/action-icons.ts +2 -1
  236. package/src/ui/icon.tsx +4 -0
  237. package/src/ui/overlay.tsx +8 -1
  238. package/src/ui/resizable.tsx +47 -9
  239. package/dist/elements/chunks/action-icons-Dtl8Ox5D.js +0 -1
  240. package/dist/elements/chunks/arrow-left-GbBceGBE.js +0 -1
  241. package/dist/elements/chunks/chat-thread-Dz2qbzvI.js +0 -1
  242. package/dist/elements/chunks/check-fhmRksq_.js +0 -1
  243. package/dist/elements/chunks/chevron-down-DcRg1aRU.js +0 -1
  244. package/dist/elements/chunks/chevron-right-ChzBcNJ-.js +0 -1
  245. package/dist/elements/chunks/circle-B4fTe9v6.js +0 -1
  246. package/dist/elements/chunks/circle-check-CJV-3Rem.js +0 -1
  247. package/dist/elements/chunks/collapsible-CWUAShMC.js +0 -1
  248. package/dist/elements/chunks/define-CNSKFZCd.js +0 -1
  249. package/dist/elements/chunks/hover-card-BQGdGAQ3.js +0 -1
  250. package/dist/elements/chunks/icon-CAyRqVrg.js +0 -1
  251. package/dist/elements/chunks/message-square-MmRkvc-M.js +0 -1
  252. package/dist/elements/chunks/resizable-Bq_eHxUm.js +0 -1
  253. package/dist/elements/chunks/skeleton-Pjc5jiaY.js +0 -1
  254. package/dist/elements/chunks/textarea-CboigarR.js +0 -1
  255. package/dist/elements/chunks/tooltip-Cft_Rxiw.js +0 -1
  256. package/dist/elements/chunks/use-card-resolution-M36zVciB.js +0 -1
  257. package/dist/elements/chunks/x-Ckwicf6g.js +0 -1
  258. package/dist/register-impl-DcjZDELj.js +0 -141
package/llms-full.txt CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @kitn.ai/ui
5
5
 
6
- > Framework-agnostic, Shadow-DOM web components for building AI chat interfaces — works in React, Vue, Angular, Svelte, or plain HTML. 78 custom elements, every one prefixed `kai-` (e.g. `<kai-chat>`, `<kai-artifact>`): streaming responses, markdown + code rendering, reasoning/tool panels, attachments, conversation sidebar, voice input. Zero framework dependency for consumers; the SolidJS runtime it is authored in is bundled in, so the host needs nothing.
6
+ > Framework-agnostic, Shadow-DOM web components for building AI chat interfaces — works in React, Vue, Angular, Svelte, or plain HTML. 80 custom elements, every one prefixed `kai-` (e.g. `<kai-chat>`, `<kai-artifact>`): streaming responses, markdown + code rendering, reasoning/tool panels, attachments, conversation sidebar, voice input. Zero framework dependency for consumers; the SolidJS runtime it is authored in is bundled in, so the host needs nothing.
7
7
 
8
8
  ## Install
9
9
 
@@ -37,7 +37,7 @@ Drop an element into any framework (React, Vue, plain HTML). Data in via JS prop
37
37
  - `<kai-prompt-input>` — standalone composer with send button.
38
38
 
39
39
  **Layer 2 — composable primitives** (`import { … } from '@kitn.ai/ui'`):
40
- All 78 elements are also exported individually. Use them for custom layouts or features `<kai-chat>` does not expose (ChainOfThought, FeedbackBar, ThinkingBar, VoiceInput, …). Your bundler tree-shakes the rest.
40
+ All 80 elements are also exported individually. Use them for custom layouts or features `<kai-chat>` does not expose (ChainOfThought, FeedbackBar, ThinkingBar, VoiceInput, …). Your bundler tree-shakes the rest.
41
41
 
42
42
  ## Key rules for the web components
43
43
 
@@ -99,7 +99,7 @@ For Tailwind builds: `@import "@kitn.ai/ui/theme.css"` in your CSS.
99
99
 
100
100
  ## Docs
101
101
 
102
- - Full element reference (all 78 elements, every prop/event): ./llms-full.txt — https://kitn.dev/llms-full.txt
102
+ - Full element reference (all 80 elements, every prop/event): ./llms-full.txt — https://kitn.dev/llms-full.txt
103
103
  - Machine-readable Custom Elements Manifest: https://unpkg.com/@kitn.ai/ui/dist/custom-elements.json
104
104
  - Working examples: https://github.com/kitn-ai/ui/tree/main/examples
105
105
  - Storybook: https://storybook.kitn.dev
@@ -173,7 +173,7 @@ The same rule applies to every array/object property (`models`, `context`, `sugg
173
173
 
174
174
  ---
175
175
 
176
- ## Element reference (78 elements, generated from custom-elements.json)
176
+ ## Element reference (80 elements, generated from custom-elements.json)
177
177
 
178
178
  Every element also accepts the `theme` attribute. Array/object properties are marked with a `—` attribute: they must be set as JS properties.
179
179
 
@@ -267,6 +267,42 @@ Every element also accepts the `theme` attribute. Array/object properties are ma
267
267
 
268
268
  ---
269
269
 
270
+ ### `kai-audio-visualizer` / `AudioVisualizer`
271
+
272
+ **Properties** (every element also accepts `theme="light|dark|auto"`; only scalar props work as HTML attributes):
273
+
274
+ | Property | Attribute | Type | Description |
275
+ |---|---|---|---|
276
+ | `variant` | `variant` | `undefined \| string` | Look to render: `bar` (default), `grid`, `radial`, `wave`, `aurora`, `custom`. `aura` is accepted as a LiveKit-markup alias for `aurora`. Attribute: `variant`. |
277
+ | `state` | `state` | `undefined \| string` | `idle` (default), `connecting`, `listening`, `thinking`, `speaking`, `disconnected` (connection down: the dead, flat look). LiveKit's room-lifecycle state names are accepted as aliases. Attribute: `state`. |
278
+ | `size` | `size` | `undefined \| string` | `icon` \| `sm` \| `md` (default) \| `lg` \| `xl`. Attribute: `size`. |
279
+ | `barCount` | `bar-count` | `undefined \| number` | Bars to draw. Bar and radial only. Attribute: `bar-count`. |
280
+ | `count` | `count` | `undefined \| number` | Grid only: rows and columns of the (always square) grid. Attribute: `count`. |
281
+ | `radius` | `radius` | `undefined \| number` | Radial only: ring distance from center, in px. Attribute: `radius`. |
282
+ | `spread` | `spread` | `undefined \| number` | Grid only: ring distance for the connecting animation, in cells. Attribute: `spread`. |
283
+ | `interval` | `interval` | `undefined \| number` | Grid only: ms between scripted frames. Attribute: `interval`. |
284
+ | `color` | `color` | `undefined \| string` | CSS color for the geometry, overriding the inherited `currentColor`. Attribute: `color`. |
285
+ | `complexity` | `complexity` | `undefined \| number` | Shader variants only: pattern density, 0..1. Attribute: `complexity`. |
286
+ | `label` | `label` | `undefined \| string` | Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. |
287
+ | `stream` | — | `undefined \| MediaStream` | Live microphone or WebRTC audio to analyze. JS property only. |
288
+ | `audioElement` | — | `undefined \| HTMLMediaElement` | An `<audio>` or `<video>` element to tap for its audio. JS property only. |
289
+ | `bands` | — | `undefined \| number[]` | Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. |
290
+ | `shader` | — | `undefined \| { fragment: string; uniforms?: undefined \| Record<string, { type: "1f" \| "1i" \| "1fv" \| "2f" \| "3f" \| "3fv" \| "4f" \| "4fv" \| "Matrix2fv" \| "Matrix3fv" \| "Matrix4fv"; value: number \| number[] }> }` | Custom fragment shader for `variant="custom"`. JS property only. |
291
+ | `animateWhenNotVisible` | `animate-when-not-visible` | `undefined \| false \| true` | Shader variants only: keep animating while scrolled off screen. Off by default, which stops drawing and releases the WebGL context until the element comes back (browsers ration contexts to roughly 16 a page). Does not override `prefers-reduced-motion`. Attribute: `animate-when-not-visible`. |
292
+
293
+ _No events._
294
+
295
+ **Styleable parts** (restyle from outside via `kai-audio-visualizer::part(name)`):
296
+
297
+ | Part | Description |
298
+ |---|---|
299
+ | `::part(bar)` | A single bar in the `bar` variant, or a single spoke in the `radial` variant. Also carries `data-kai-index` and `data-kai-highlighted` ("true"/"false") for use inside the shadow root; to style the lit state from OUTSIDE, combine with the `highlighted` part below rather than an attribute selector. — `kai-audio-visualizer::part(bar) { border-radius: 2px } kai-audio-visualizer::part(bar highlighted) { background: var(--brand) }` |
300
+ | `::part(cell)` | A single dot in the `grid` variant. Also carries `data-kai-index` and `data-kai-highlighted` ("true"/"false") for use inside the shadow root; to style the lit state from OUTSIDE, combine with the `highlighted` part below rather than an attribute selector. — `kai-audio-visualizer::part(cell) { border-radius: 9999px } kai-audio-visualizer::part(cell highlighted) { background: var(--brand) }` |
301
+ | `::part(highlighted)` | A second part TOKEN present on a `bar` or `cell` exactly when the sequencer or live audio has it lit, not a standalone styleable element. Combine it in the same `::part()` argument: `::part(bar highlighted)` or `::part(cell highlighted)`. This is the external equivalent of the internal `data-kai-highlighted="true"` attribute, which a `::part()` selector cannot reach (an attribute selector cannot follow a pseudo-element). — `kai-audio-visualizer::part(bar highlighted) { background: var(--brand) } kai-audio-visualizer::part(cell highlighted) { background: var(--brand) }` |
302
+ | `::part(canvas)` | The WebGL canvas backing the `wave` and `aurora` variants. Restyle its size or radius, or layer a mask/filter, from outside. — `kai-audio-visualizer::part(canvas) { border-radius: 0.75rem }` |
303
+
304
+ ---
305
+
270
306
  ### `kai-avatar` / `Avatar`
271
307
 
272
308
  **Properties** (every element also accepts `theme="light|dark|auto"`; only scalar props work as HTML attributes):
@@ -1487,6 +1523,7 @@ _No events._
1487
1523
  |---|---|---|---|
1488
1524
  | `orientation` | `orientation` | `undefined \| "vertical" \| "horizontal"` | Layout axis: `horizontal` (row, default) or `vertical` (column). |
1489
1525
  | `maximizedIndex` | — | `undefined \| null \| number` | Which item index is maximized (null = none). Declarative source of truth. |
1526
+ | `handle` | `handle` | `undefined \| "none" \| "line" \| "grip"` | Divider affordance drawn inside each draggable handle's 8px grab zone: - `line` (default) — a 1px hairline, transparent at rest, tinting on hover/drag. - `grip` — a dotted grip handle. - `none` — no visible divider, just the invisible hit-area. The full grab zone and keyboard/ARIA behavior are identical for all three. |
1490
1527
 
1491
1528
  **Events** (non-bubbling `CustomEvent`s — listen directly on the element):
1492
1529
 
@@ -1963,6 +2000,35 @@ _No events._
1963
2000
 
1964
2001
  ---
1965
2002
 
2003
+ ### `kai-thread` / `Thread`
2004
+
2005
+ **Properties** (every element also accepts `theme="light|dark|auto"`; only scalar props work as HTML attributes):
2006
+
2007
+ | Property | Attribute | Type | Description |
2008
+ |---|---|---|---|
2009
+ | `messages` | — | `undefined \| { id: string; role: "user" \| "assistant"; content: string; reasoning?: undefined \| { text: string; label?: undefined \| string }; tools?: undefined \| { type: string; state: "input-streaming" \| "input-available" \| "output-available" \| "output-error"; input?: undefined \| Record<string, unknown>; output?: undefined \| Record<string, unknown>; toolCallId?: undefined \| string; errorText?: undefined \| string }[]; attachments?: undefined \| { id: string; type: "file" \| "source-document"; filename?: undefined \| string; mediaType?: undefined \| string; url?: undefined \| string; title?: undefined \| string }[]; actions?: undefined \| ("copy" \| "like" \| "dislike" \| "regenerate" \| "edit" \| { id: string; label: string; icon?: undefined \| string; tooltip?: undefined \| string })[]; avatar?: undefined \| { src?: undefined \| string; fallback?: undefined \| string; alt?: undefined \| string }; feedback?: undefined \| "like" \| "dislike" }[]` | The full message thread to render, newest last. Each entry carries its role, content, and optional reasoning/tools/attachments/actions/avatar. Set as a JS property (`el.messages = [...]`); a NEW array reference per streaming chunk re-renders (mutating in place does not). |
2010
+ | `loading` | `loading` | `undefined \| false \| true` | Show a typing indicator on the pending assistant turn — set while awaiting the assistant's reply. |
2011
+ | `proseSize` | `prose-size` | `undefined \| "sm" \| "lg" \| "xs" \| "base"` | Body/prose font scale for rendered markdown (`'xs' \| 'sm' \| 'base' \| 'lg'`). Defaults to `'sm'`. |
2012
+ | `codeTheme` | `code-theme` | `undefined \| string` | Shiki theme name for syntax-highlighted code blocks (e.g. `'github-dark-dimmed'`). |
2013
+ | `codeHighlight` | `code-highlight` | `undefined \| false \| true` | Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true. |
2014
+ | `actionsReveal` | `actions-reveal` | `undefined \| "always" \| "hover"` | Whether each message's action bar is always visible (`'always'`, default) or only revealed on hover of that message row (`'hover'`). |
2015
+ | `scrollButton` | `scroll-button` | `undefined \| false \| true` | Show the scroll-to-bottom button inside the scroll area. Default true. |
2016
+ | `class` | `class` | `undefined \| string` | Extra classes applied to the thread's inner root. |
2017
+
2018
+ **Events** (non-bubbling `CustomEvent`s — listen directly on the element):
2019
+
2020
+ | Event | `detail` type | Description |
2021
+ |---|---|---|
2022
+ | `kai-message-action` | `CustomEvent<{ messageId: string; action: string; state?: undefined \| "on" \| "off" }>` | A message's action button was clicked. `action` is the built-in name (`copy` / `like` / `dislike` / `regenerate` / `edit`) or a custom id. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear. |
2023
+
2024
+ **Slots** (project your own markup via `slot="name"` on a light-DOM child):
2025
+
2026
+ | Slot | Mode | Description |
2027
+ |---|---|---|
2028
+ | `empty` | replace | Custom zero-state rendered in the message area while the thread is empty; replaces the built-in default. |
2029
+
2030
+ ---
2031
+
1966
2032
  ### `kai-toast-region` / `ToastRegion`
1967
2033
 
1968
2034
  **Properties** (every element also accepts `theme="light|dark|auto"`; only scalar props work as HTML attributes):
package/llms.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  <!-- AUTO-GENERATED by scripts/gen-llms.mjs — do not edit by hand. Run `npm run build`. -->
2
2
  # @kitn.ai/ui
3
3
 
4
- > Framework-agnostic, Shadow-DOM web components for building AI chat interfaces — works in React, Vue, Angular, Svelte, or plain HTML. 78 custom elements, every one prefixed `kai-` (e.g. `<kai-chat>`, `<kai-artifact>`): streaming responses, markdown + code rendering, reasoning/tool panels, attachments, conversation sidebar, voice input. Zero framework dependency for consumers; the SolidJS runtime it is authored in is bundled in, so the host needs nothing.
4
+ > Framework-agnostic, Shadow-DOM web components for building AI chat interfaces — works in React, Vue, Angular, Svelte, or plain HTML. 80 custom elements, every one prefixed `kai-` (e.g. `<kai-chat>`, `<kai-artifact>`): streaming responses, markdown + code rendering, reasoning/tool panels, attachments, conversation sidebar, voice input. Zero framework dependency for consumers; the SolidJS runtime it is authored in is bundled in, so the host needs nothing.
5
5
 
6
6
  ## Install
7
7
 
@@ -35,7 +35,7 @@ Drop an element into any framework (React, Vue, plain HTML). Data in via JS prop
35
35
  - `<kai-prompt-input>` — standalone composer with send button.
36
36
 
37
37
  **Layer 2 — composable primitives** (`import { … } from '@kitn.ai/ui'`):
38
- All 78 elements are also exported individually. Use them for custom layouts or features `<kai-chat>` does not expose (ChainOfThought, FeedbackBar, ThinkingBar, VoiceInput, …). Your bundler tree-shakes the rest.
38
+ All 80 elements are also exported individually. Use them for custom layouts or features `<kai-chat>` does not expose (ChainOfThought, FeedbackBar, ThinkingBar, VoiceInput, …). Your bundler tree-shakes the rest.
39
39
 
40
40
  ## Key rules for the web components
41
41
 
@@ -97,7 +97,7 @@ For Tailwind builds: `@import "@kitn.ai/ui/theme.css"` in your CSS.
97
97
 
98
98
  ## Docs
99
99
 
100
- - Full element reference (all 78 elements, every prop/event): ./llms-full.txt — https://kitn.dev/llms-full.txt
100
+ - Full element reference (all 80 elements, every prop/event): ./llms-full.txt — https://kitn.dev/llms-full.txt
101
101
  - Machine-readable Custom Elements Manifest: https://unpkg.com/@kitn.ai/ui/dist/custom-elements.json
102
102
  - Working examples: https://github.com/kitn-ai/ui/tree/main/examples
103
103
  - Storybook: https://storybook.kitn.dev
package/package.json CHANGED
@@ -1,13 +1,36 @@
1
1
  {
2
2
  "name": "@kitn.ai/ui",
3
- "version": "0.18.2",
3
+ "version": "0.20.0",
4
4
  "nx": {
5
- "name": "ui"
5
+ "name": "ui",
6
+ "targets": {
7
+ "build-storybook": {
8
+ "dependsOn": [
9
+ "build"
10
+ ]
11
+ },
12
+ "dev": {
13
+ "dependsOn": [
14
+ "build"
15
+ ]
16
+ },
17
+ "test:storybook": {
18
+ "dependsOn": [
19
+ "build"
20
+ ]
21
+ },
22
+ "test:storybook:ci": {
23
+ "dependsOn": [
24
+ "build"
25
+ ]
26
+ }
27
+ }
6
28
  },
7
29
  "type": "module",
8
30
  "sideEffects": [
9
31
  "**/*.css",
10
32
  "./dist/kai.es.js",
33
+ "./dist/register-impl-*.js",
11
34
  "./dist/elements/*.js"
12
35
  ],
13
36
  "description": "Framework-agnostic, Shadow-DOM web components for building AI chat interfaces — works in React, Vue, Angular, Svelte, or plain HTML. Authored in SolidJS.",
@@ -95,31 +118,33 @@
95
118
  "frameworks",
96
119
  "theme.css",
97
120
  "llms.txt",
98
- "llms-full.txt"
121
+ "llms-full.txt",
122
+ "NOTICE"
99
123
  ],
100
124
  "scripts": {
101
125
  "prepublishOnly": "npm run build",
102
126
  "prebuild": "npm run build:css",
103
- "build": "vite build --config vite.config.ts && vite build --config vite.config.provider.ts && vite build --config vite.config.react.ts && vite build --config vite.config.barrel.ts && vite build --config vite.config.state.ts && vite build --config vite.config.mcp.ts && npm run build:elements && node scripts/verify-elements-bundle.mjs && node scripts/verify-react-wrappers.mjs",
127
+ "build": "vite build --config vite.config.ts && vite build --config vite.config.provider.ts && vite build --config vite.config.react.ts && vite build --config vite.config.barrel.ts && vite build --config vite.config.state.ts && vite build --config vite.config.mcp.ts && npm run build:elements && node scripts/verify-elements-bundle.mjs && node scripts/verify-react-wrappers.mjs && node scripts/verify-shader-lazy.mjs",
104
128
  "build:elements": "node scripts/gen-elements-manifest.mjs && vite build --config vite.config.elements.ts && node scripts/gen-element-dts.mjs",
105
129
  "postbuild": "npm run build:theme && npm run build:api && npm run build:schemas",
106
130
  "build:theme": "node scripts/build-theme-tokens.mjs",
107
131
  "build:api": "node scripts/gen-element-api.mjs",
108
132
  "build:schemas": "node scripts/copy-card-schemas.mjs",
133
+ "verify:consumer": "node scripts/verify-consumer-sideeffects.mjs",
109
134
  "test": "vitest run",
110
135
  "test:react": "vitest run --config vitest.react.config.ts",
111
136
  "test:storybook": "vitest run --project=storybook",
112
137
  "test:storybook:ci": "node scripts/run-storybook-tests.mjs",
113
138
  "test:watch": "vitest",
114
139
  "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.react.json && tsc --noEmit -p tsconfig.react.test.json && tsc --noEmit -p tsconfig.mcp.json",
115
- "examples": "echo 'Serving repo root on http://localhost:8000 — open http://localhost:8000/examples/composable/index.html' && python3 -m http.server 8000",
140
+ "examples": "echo 'Serving repo root on http://localhost:8000 — open http://localhost:8000/examples/demos/composable/index.html' && python3 -m http.server 8000",
116
141
  "dev": "npm run build:css && storybook dev -p 6006",
117
142
  "storybook": "npm run build:css && storybook dev -p 6006",
118
143
  "build-storybook": "npm run build:css && storybook build",
119
144
  "build:css": "tailwindcss -i src/elements/styles.css -o src/elements/compiled.css --minify",
120
145
  "build:css:watch": "tailwindcss -i src/elements/styles.css -o src/elements/compiled.css --watch",
121
- "dev:provider": "vite ../../examples/remote-provider --port 6007 --strictPort",
122
- "dev:host": "vite ../../examples/remote-host --port 6006 --strictPort",
146
+ "dev:provider": "vite ../../examples/internal/remote-provider --port 6007 --strictPort",
147
+ "dev:host": "vite ../../examples/internal/remote-host --port 6006 --strictPort",
123
148
  "test:e2e": "playwright test",
124
149
  "test:composer-ivp": "playwright test --config playwright.composer.config.ts",
125
150
  "test:slots-ivp": "playwright test --config playwright.slots.config.ts",
@@ -0,0 +1,257 @@
1
+ /**
2
+ * A real recorded voice, baked into a short seamless loop for the
3
+ * `speaking` tiles in the stories -- the genuine article, not a generator.
4
+ *
5
+ * Real voice, recorded by the project owner: "This is a test, testing one
6
+ * two three, hello world." Captured mono at 44.1kHz, then extracted through
7
+ * the component's ALIGNED analysis chain -- the same values upstream
8
+ * LiveKit's components run: AnalyserNode fftSize 2048 / smoothing 0.8,
9
+ * window bins 100-200 (the components' own loPass/hiPass; see DEFAULTS in
10
+ * primitives/use-audio-analysis.ts), `reduceToBands`' linear-proportional
11
+ * split as it exists in THIS tree, ~32ms cadence. Third bake of this
12
+ * fixture: the first was 5 linear bands over a wide raw-mic window
13
+ * (bins 4-120), the second 3 geometric bands over the same wide window;
14
+ * both predate the pipeline realignment that reverted window and split to
15
+ * upstream's.
16
+ *
17
+ * GAIN: the raw take is boosted 8x (+18dB) through a GainNode before the
18
+ * analysers -- an honest approximation of capture-side AGC, which every
19
+ * real input to the aligned window gets (LiveKit captures local mics with
20
+ * autoGainControl on; the mic stories request the same) but this recording,
21
+ * made raw, never had. Un-gained, quiet natural-volume speech sits at or
22
+ * under the -100dB floor across bins 100-200 and the loop's time-averaged
23
+ * band profile comes out flat-to-inverted (edges louder than centre);
24
+ * measured at +18dB the bake hits the live-AGC targets: speech-active
25
+ * volume through the aligned byte path (minDecibels -100 / maxDecibels
26
+ * -80) averages 0.73, no speech frame reads all-zero bands, and the
27
+ * time-averaged mirrored md profile is centre-strictly-max --
28
+ * [0.41, 0.42, 0.44, 0.42, 0.41]. The trade, recorded honestly: +18dB also
29
+ * lifts part of the room tone over the floor, so rest frames idle near
30
+ * [0.2, 0.04, 0] instead of the exact zeros an un-gained bake would show
31
+ * -- which is also what a real AGC mic does between words.
32
+ *
33
+ * 3 bands per frame is HALF width on purpose: `Math.ceil(count / 2)`, the
34
+ * exact band count the component itself requests at `md` before mirroring
35
+ * (see `bandCount()` in index.tsx). The `bands` prop is a raw passthrough
36
+ * by contract, so the stories mirror these half bands out to the full
37
+ * element count themselves through `mirrorBandsCenterOut` /
38
+ * `mirrorBandsAroundRing` -- the same primitives the live-audio path runs.
39
+ * See `useVoiceBands` in the stories file.
40
+ *
41
+ * Trimmed to the same 196-frame window (~6.4s) as the previous bake:
42
+ * about half a second of rest before the first word, just under a second
43
+ * after the last, and BOTH natural pauses in the middle -- one short gap
44
+ * around "test," / "testing", the longer one after "three," before
45
+ * "hello" -- since those are what prove the visualizer falls back to rest
46
+ * and recovers. Loops by wrapping frame 195 back to frame 0. Re-verified
47
+ * at the aligned values: the endpoints differ by 0.034 pre-quantization
48
+ * ([0.22,0.05,0] vs [0.2,0.03,0] after it), which sits between the median
49
+ * (0.025) and p90 (0.053) of ADJACENT quiet frames' natural motion at this
50
+ * gain -- the wrap step is indistinguishable from ordinary idle flicker.
51
+ * (The previous bake's endpoints quantized identical, but only because its
52
+ * un-gained rest frames were all zeros -- trivial, not preserved here.)
53
+ *
54
+ * Quantized to 2 decimals. Playback treats the cadence as a flat
55
+ * `VOICE_FRAME_MS`; the capture's real ticks land at 32-33ms (setTimeout
56
+ * jitter), a ~2% difference nobody can see. Body is ~3.8KB.
57
+ */
58
+ export const VOICE_FRAME_MS = 32;
59
+
60
+ export const VOICE_BANDS: readonly (readonly number[])[] = [
61
+ [0.22,0.05,0],
62
+ [0.21,0.04,0],
63
+ [0.2,0.04,0],
64
+ [0.22,0.03,0],
65
+ [0.23,0.03,0],
66
+ [0.22,0.02,0],
67
+ [0.21,0.02,0],
68
+ [0.22,0.02,0],
69
+ [0.22,0.11,0.01],
70
+ [0.22,0.14,0.02],
71
+ [0.23,0.13,0.01],
72
+ [0.45,0.45,0.57],
73
+ [0.52,0.52,0.61],
74
+ [0.62,0.61,0.64],
75
+ [0.64,0.62,0.65],
76
+ [0.64,0.63,0.65],
77
+ [0.63,0.63,0.66],
78
+ [0.62,0.62,0.65],
79
+ [0.61,0.61,0.65],
80
+ [0.61,0.61,0.65],
81
+ [0.65,0.63,0.67],
82
+ [0.67,0.63,0.67],
83
+ [0.66,0.62,0.66],
84
+ [0.65,0.61,0.65],
85
+ [0.64,0.59,0.64],
86
+ [0.63,0.58,0.62],
87
+ [0.62,0.59,0.61],
88
+ [0.61,0.61,0.6],
89
+ [0.62,0.62,0.59],
90
+ [0.61,0.62,0.59],
91
+ [0.59,0.61,0.57],
92
+ [0.59,0.61,0.59],
93
+ [0.59,0.62,0.64],
94
+ [0.59,0.62,0.66],
95
+ [0.61,0.62,0.66],
96
+ [0.61,0.61,0.65],
97
+ [0.61,0.6,0.64],
98
+ [0.6,0.59,0.63],
99
+ [0.59,0.57,0.62],
100
+ [0.58,0.56,0.6],
101
+ [0.61,0.59,0.6],
102
+ [0.62,0.59,0.6],
103
+ [0.61,0.58,0.58],
104
+ [0.59,0.57,0.57],
105
+ [0.58,0.56,0.55],
106
+ [0.6,0.57,0.56],
107
+ [0.62,0.58,0.56],
108
+ [0.63,0.58,0.57],
109
+ [0.64,0.58,0.56],
110
+ [0.64,0.58,0.55],
111
+ [0.63,0.57,0.54],
112
+ [0.63,0.56,0.54],
113
+ [0.62,0.54,0.52],
114
+ [0.61,0.53,0.51],
115
+ [0.59,0.51,0.49],
116
+ [0.58,0.49,0.47],
117
+ [0.56,0.47,0.45],
118
+ [0.54,0.46,0.43],
119
+ [0.53,0.48,0.42],
120
+ [0.52,0.47,0.4],
121
+ [0.5,0.45,0.37],
122
+ [0.48,0.43,0.35],
123
+ [0.46,0.41,0.32],
124
+ [0.45,0.39,0.3],
125
+ [0.43,0.37,0.26],
126
+ [0.41,0.35,0.23],
127
+ [0.4,0.34,0.22],
128
+ [0.38,0.33,0.18],
129
+ [0.37,0.31,0.16],
130
+ [0.38,0.32,0.21],
131
+ [0.37,0.31,0.19],
132
+ [0.36,0.28,0.16],
133
+ [0.46,0.41,0.37],
134
+ [0.5,0.49,0.52],
135
+ [0.51,0.53,0.58],
136
+ [0.51,0.54,0.6],
137
+ [0.51,0.55,0.62],
138
+ [0.52,0.56,0.63],
139
+ [0.51,0.56,0.63],
140
+ [0.51,0.56,0.63],
141
+ [0.5,0.56,0.64],
142
+ [0.51,0.56,0.64],
143
+ [0.53,0.59,0.64],
144
+ [0.55,0.6,0.64],
145
+ [0.55,0.6,0.63],
146
+ [0.53,0.58,0.61],
147
+ [0.54,0.59,0.62],
148
+ [0.56,0.59,0.65],
149
+ [0.61,0.63,0.68],
150
+ [0.63,0.64,0.69],
151
+ [0.63,0.65,0.68],
152
+ [0.63,0.64,0.67],
153
+ [0.62,0.63,0.66],
154
+ [0.61,0.61,0.65],
155
+ [0.6,0.61,0.65],
156
+ [0.59,0.6,0.65],
157
+ [0.58,0.59,0.66],
158
+ [0.56,0.58,0.65],
159
+ [0.55,0.57,0.64],
160
+ [0.54,0.58,0.65],
161
+ [0.54,0.57,0.65],
162
+ [0.53,0.56,0.64],
163
+ [0.52,0.54,0.62],
164
+ [0.5,0.52,0.61],
165
+ [0.48,0.51,0.59],
166
+ [0.47,0.49,0.58],
167
+ [0.46,0.47,0.56],
168
+ [0.44,0.46,0.55],
169
+ [0.42,0.44,0.53],
170
+ [0.4,0.41,0.51],
171
+ [0.39,0.39,0.49],
172
+ [0.37,0.37,0.47],
173
+ [0.36,0.35,0.45],
174
+ [0.34,0.34,0.43],
175
+ [0.36,0.37,0.42],
176
+ [0.35,0.37,0.4],
177
+ [0.33,0.35,0.38],
178
+ [0.32,0.33,0.36],
179
+ [0.3,0.3,0.33],
180
+ [0.29,0.28,0.31],
181
+ [0.27,0.26,0.28],
182
+ [0.26,0.24,0.26],
183
+ [0.25,0.21,0.22],
184
+ [0.24,0.19,0.19],
185
+ [0.25,0.23,0.21],
186
+ [0.35,0.38,0.36],
187
+ [0.39,0.5,0.46],
188
+ [0.39,0.52,0.48],
189
+ [0.4,0.53,0.49],
190
+ [0.47,0.6,0.55],
191
+ [0.52,0.62,0.58],
192
+ [0.55,0.63,0.58],
193
+ [0.56,0.63,0.58],
194
+ [0.54,0.62,0.57],
195
+ [0.53,0.6,0.55],
196
+ [0.52,0.59,0.54],
197
+ [0.5,0.57,0.52],
198
+ [0.49,0.56,0.5],
199
+ [0.47,0.55,0.49],
200
+ [0.46,0.53,0.47],
201
+ [0.44,0.52,0.45],
202
+ [0.43,0.51,0.46],
203
+ [0.51,0.54,0.54],
204
+ [0.54,0.55,0.55],
205
+ [0.53,0.56,0.54],
206
+ [0.52,0.57,0.54],
207
+ [0.51,0.57,0.53],
208
+ [0.53,0.59,0.56],
209
+ [0.52,0.58,0.56],
210
+ [0.51,0.57,0.55],
211
+ [0.49,0.55,0.54],
212
+ [0.48,0.54,0.52],
213
+ [0.46,0.52,0.51],
214
+ [0.44,0.5,0.49],
215
+ [0.43,0.49,0.47],
216
+ [0.41,0.47,0.45],
217
+ [0.39,0.46,0.43],
218
+ [0.37,0.44,0.41],
219
+ [0.36,0.42,0.39],
220
+ [0.34,0.4,0.36],
221
+ [0.32,0.37,0.34],
222
+ [0.31,0.35,0.32],
223
+ [0.3,0.33,0.29],
224
+ [0.28,0.31,0.26],
225
+ [0.27,0.29,0.23],
226
+ [0.27,0.27,0.22],
227
+ [0.26,0.25,0.18],
228
+ [0.25,0.23,0.15],
229
+ [0.24,0.2,0.13],
230
+ [0.23,0.18,0.09],
231
+ [0.23,0.16,0.07],
232
+ [0.23,0.14,0.04],
233
+ [0.22,0.11,0.03],
234
+ [0.22,0.09,0.02],
235
+ [0.2,0.07,0.01],
236
+ [0.2,0.04,0.01],
237
+ [0.18,0.03,0.01],
238
+ [0.18,0.02,0.01],
239
+ [0.19,0.02,0],
240
+ [0.19,0.01,0],
241
+ [0.19,0.01,0],
242
+ [0.17,0.01,0],
243
+ [0.19,0.01,0],
244
+ [0.18,0.07,0],
245
+ [0.21,0.06,0],
246
+ [0.21,0.06,0],
247
+ [0.22,0.05,0],
248
+ [0.2,0.03,0],
249
+ [0.2,0.02,0],
250
+ [0.19,0.01,0],
251
+ [0.19,0.01,0],
252
+ [0.2,0.01,0],
253
+ [0.2,0,0],
254
+ [0.19,0,0],
255
+ [0.18,0,0],
256
+ [0.2,0.03,0],
257
+ ];