@supersoniks/concorde 4.9.96 → 4.9.98-visual-stack.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 (1020) hide show
  1. package/README.md +34 -17
  2. package/build-infos.json +1 -1
  3. package/concorde-3d.bundle.js +3911 -0
  4. package/concorde-3d.es.js +32651 -0
  5. package/concorde-core.bundle.js +147 -147
  6. package/concorde-core.es.js +4375 -4282
  7. package/concorde-hugging-face-infer.bundle.js +32 -0
  8. package/concorde-hugging-face-infer.es.js +2952 -0
  9. package/concorde-shader.bundle.js +105 -0
  10. package/concorde-shader.es.js +8127 -0
  11. package/concorde-webgpu.bundle.js +296 -0
  12. package/concorde-webgpu.es.js +8361 -0
  13. package/dist/concorde-3d.bundle.js +3911 -0
  14. package/dist/concorde-3d.es.js +32651 -0
  15. package/dist/concorde-core.bundle.js +147 -147
  16. package/dist/concorde-core.es.js +4375 -4282
  17. package/dist/concorde-hugging-face-infer.bundle.js +32 -0
  18. package/dist/concorde-hugging-face-infer.es.js +2952 -0
  19. package/dist/concorde-shader.bundle.js +105 -0
  20. package/dist/concorde-shader.es.js +8127 -0
  21. package/dist/concorde-webgpu.bundle.js +296 -0
  22. package/dist/concorde-webgpu.es.js +8361 -0
  23. package/dist/docs/hf-samples/beach.jpg +0 -0
  24. package/dist/docs/hf-samples/cats.jpg +0 -0
  25. package/dist/docs/hf-samples/corgi.jpg +0 -0
  26. package/dist/docs/hf-samples/portrait.jpg +0 -0
  27. package/dist/docs/hf-samples/scene.jpg +0 -0
  28. package/dist/docs/hf-samples/singer.jpg +0 -0
  29. package/dist/docs/shader-samples/color.jpg +0 -0
  30. package/dist/docs/shader-samples/depth.png +0 -0
  31. package/dist/docs/shader-samples/impact.jpg +0 -0
  32. package/dist/docs/shader-samples/video.webm +0 -0
  33. package/dist/js/addons/3d.js +6 -0
  34. package/dist/js/addons/3d.js.map +1 -0
  35. package/dist/js/addons/hugging-face-infer.js +8 -0
  36. package/dist/js/addons/hugging-face-infer.js.map +1 -0
  37. package/dist/js/addons/shader.js +6 -0
  38. package/dist/js/addons/shader.js.map +1 -0
  39. package/dist/js/addons/webgpu.js +7 -0
  40. package/dist/js/addons/webgpu.js.map +1 -0
  41. package/dist/js/components.js +12 -0
  42. package/dist/js/components.js.map +1 -0
  43. package/dist/js/concorde-loaded.js +5 -0
  44. package/dist/js/concorde-loaded.js.map +1 -0
  45. package/dist/js/core/_types/endpoint.js +5 -0
  46. package/dist/js/core/_types/endpoint.js.map +1 -0
  47. package/dist/js/core/_types/key.js +2 -0
  48. package/dist/js/core/_types/key.js.map +1 -0
  49. package/dist/js/core/_types/types.js +3 -0
  50. package/dist/js/core/_types/types.js.map +1 -0
  51. package/dist/js/core/components/functional/3d/3d.js +161 -0
  52. package/dist/js/core/components/functional/3d/3d.js.map +1 -0
  53. package/dist/js/core/components/functional/3d/asset.js +20 -0
  54. package/dist/js/core/components/functional/3d/asset.js.map +1 -0
  55. package/dist/js/core/components/functional/3d/boot.js +47 -0
  56. package/dist/js/core/components/functional/3d/boot.js.map +1 -0
  57. package/dist/js/core/components/functional/3d/constants.js +90 -0
  58. package/dist/js/core/components/functional/3d/constants.js.map +1 -0
  59. package/dist/js/core/components/functional/3d/demo-content.js +38 -0
  60. package/dist/js/core/components/functional/3d/demo-content.js.map +1 -0
  61. package/dist/js/core/components/functional/3d/ensure.js +73 -0
  62. package/dist/js/core/components/functional/3d/ensure.js.map +1 -0
  63. package/dist/js/core/components/functional/3d/form-bind.js +25 -0
  64. package/dist/js/core/components/functional/3d/form-bind.js.map +1 -0
  65. package/dist/js/core/components/functional/3d/form-fields.js +76 -0
  66. package/dist/js/core/components/functional/3d/form-fields.js.map +1 -0
  67. package/dist/js/core/components/functional/3d/form-params.js +67 -0
  68. package/dist/js/core/components/functional/3d/form-params.js.map +1 -0
  69. package/dist/js/core/components/functional/3d/frame-capture.js +108 -0
  70. package/dist/js/core/components/functional/3d/frame-capture.js.map +1 -0
  71. package/dist/js/core/components/functional/3d/frame-source.js +22 -0
  72. package/dist/js/core/components/functional/3d/frame-source.js.map +1 -0
  73. package/dist/js/core/components/functional/3d/gl.js +34 -0
  74. package/dist/js/core/components/functional/3d/gl.js.map +1 -0
  75. package/dist/js/core/components/functional/3d/life.js +55 -0
  76. package/dist/js/core/components/functional/3d/life.js.map +1 -0
  77. package/dist/js/core/components/functional/3d/load.js +109 -0
  78. package/dist/js/core/components/functional/3d/load.js.map +1 -0
  79. package/dist/js/core/components/functional/3d/ops.js +78 -0
  80. package/dist/js/core/components/functional/3d/ops.js.map +1 -0
  81. package/dist/js/core/components/functional/3d/opts.js +2 -0
  82. package/dist/js/core/components/functional/3d/opts.js.map +1 -0
  83. package/dist/js/core/components/functional/3d/orbit.js +136 -0
  84. package/dist/js/core/components/functional/3d/orbit.js.map +1 -0
  85. package/dist/js/core/components/functional/3d/out-publish.js +103 -0
  86. package/dist/js/core/components/functional/3d/out-publish.js.map +1 -0
  87. package/dist/js/core/components/functional/3d/parse.js +95 -0
  88. package/dist/js/core/components/functional/3d/parse.js.map +1 -0
  89. package/dist/js/core/components/functional/3d/pick.js +62 -0
  90. package/dist/js/core/components/functional/3d/pick.js.map +1 -0
  91. package/dist/js/core/components/functional/3d/playback.js +56 -0
  92. package/dist/js/core/components/functional/3d/playback.js.map +1 -0
  93. package/dist/js/core/components/functional/3d/pointer.js +58 -0
  94. package/dist/js/core/components/functional/3d/pointer.js.map +1 -0
  95. package/dist/js/core/components/functional/3d/props.js +105 -0
  96. package/dist/js/core/components/functional/3d/props.js.map +1 -0
  97. package/dist/js/core/components/functional/3d/publisher-listen.js +6 -0
  98. package/dist/js/core/components/functional/3d/publisher-listen.js.map +1 -0
  99. package/dist/js/core/components/functional/3d/reload.js +63 -0
  100. package/dist/js/core/components/functional/3d/reload.js.map +1 -0
  101. package/dist/js/core/components/functional/3d/runtime.js +116 -0
  102. package/dist/js/core/components/functional/3d/runtime.js.map +1 -0
  103. package/dist/js/core/components/functional/3d/scene-runtime.js +6 -0
  104. package/dist/js/core/components/functional/3d/scene-runtime.js.map +1 -0
  105. package/dist/js/core/components/functional/3d/snapshot.js +47 -0
  106. package/dist/js/core/components/functional/3d/snapshot.js.map +1 -0
  107. package/dist/js/core/components/functional/3d/styles.js +38 -0
  108. package/dist/js/core/components/functional/3d/styles.js.map +1 -0
  109. package/dist/js/core/components/functional/3d/tune.js +42 -0
  110. package/dist/js/core/components/functional/3d/tune.js.map +1 -0
  111. package/dist/js/core/components/functional/3d/types.js +8 -0
  112. package/dist/js/core/components/functional/3d/types.js.map +1 -0
  113. package/dist/js/core/components/functional/3d/updated.js +58 -0
  114. package/dist/js/core/components/functional/3d/updated.js.map +1 -0
  115. package/dist/js/core/components/functional/3d/view.js +40 -0
  116. package/dist/js/core/components/functional/3d/view.js.map +1 -0
  117. package/dist/js/core/components/functional/3d/wire.js +34 -0
  118. package/dist/js/core/components/functional/3d/wire.js.map +1 -0
  119. package/dist/js/core/components/functional/date/date.js +272 -0
  120. package/dist/js/core/components/functional/date/date.js.map +1 -0
  121. package/dist/js/core/components/functional/example/example.js +44 -0
  122. package/dist/js/core/components/functional/example/example.js.map +1 -0
  123. package/dist/js/core/components/functional/fetch/fetch.js +79 -0
  124. package/dist/js/core/components/functional/fetch/fetch.js.map +1 -0
  125. package/dist/js/core/components/functional/functional.js +18 -0
  126. package/dist/js/core/components/functional/functional.js.map +1 -0
  127. package/dist/js/core/components/functional/if/if.js +39 -0
  128. package/dist/js/core/components/functional/if/if.js.map +1 -0
  129. package/dist/js/core/components/functional/infer/hugging-face/hf-cache.js +183 -0
  130. package/dist/js/core/components/functional/infer/hugging-face/hf-cache.js.map +1 -0
  131. package/dist/js/core/components/functional/infer/hugging-face/hf-config.js +50 -0
  132. package/dist/js/core/components/functional/infer/hugging-face/hf-config.js.map +1 -0
  133. package/dist/js/core/components/functional/infer/hugging-face/hf-controller.js +460 -0
  134. package/dist/js/core/components/functional/infer/hugging-face/hf-controller.js.map +1 -0
  135. package/dist/js/core/components/functional/infer/hugging-face/hf-engine.js +116 -0
  136. package/dist/js/core/components/functional/infer/hugging-face/hf-engine.js.map +1 -0
  137. package/dist/js/core/components/functional/infer/hugging-face/hf-input.js +170 -0
  138. package/dist/js/core/components/functional/infer/hugging-face/hf-input.js.map +1 -0
  139. package/dist/js/core/components/functional/infer/hugging-face/hf-protocol.js +2 -0
  140. package/dist/js/core/components/functional/infer/hugging-face/hf-protocol.js.map +1 -0
  141. package/dist/js/core/components/functional/infer/hugging-face/hf-registry.js +367 -0
  142. package/dist/js/core/components/functional/infer/hugging-face/hf-registry.js.map +1 -0
  143. package/dist/js/core/components/functional/infer/hugging-face/hf-schema.js +288 -0
  144. package/dist/js/core/components/functional/infer/hugging-face/hf-schema.js.map +1 -0
  145. package/dist/js/core/components/functional/infer/hugging-face/hf-worker-runtime.js +309 -0
  146. package/dist/js/core/components/functional/infer/hugging-face/hf-worker-runtime.js.map +1 -0
  147. package/dist/js/core/components/functional/infer/hugging-face/hugging-face-infer.js +213 -0
  148. package/dist/js/core/components/functional/infer/hugging-face/hugging-face-infer.js.map +1 -0
  149. package/dist/js/core/components/functional/infer/hugging-face/hugging-face.js +76 -0
  150. package/dist/js/core/components/functional/infer/hugging-face/hugging-face.js.map +1 -0
  151. package/dist/js/core/components/functional/infer/hugging-face/types.js +62 -0
  152. package/dist/js/core/components/functional/infer/hugging-face/types.js.map +1 -0
  153. package/dist/js/core/components/functional/jsonata/jsonata.js +119 -0
  154. package/dist/js/core/components/functional/jsonata/jsonata.js.map +1 -0
  155. package/dist/js/core/components/functional/list/list.js +341 -0
  156. package/dist/js/core/components/functional/list/list.js.map +1 -0
  157. package/dist/js/core/components/functional/mix/mix.js +103 -0
  158. package/dist/js/core/components/functional/mix/mix.js.map +1 -0
  159. package/dist/js/core/components/functional/queue/queue.js +450 -0
  160. package/dist/js/core/components/functional/queue/queue.js.map +1 -0
  161. package/dist/js/core/components/functional/router/redirect.js +54 -0
  162. package/dist/js/core/components/functional/router/redirect.js.map +1 -0
  163. package/dist/js/core/components/functional/router/router.js +179 -0
  164. package/dist/js/core/components/functional/router/router.js.map +1 -0
  165. package/dist/js/core/components/functional/sdui/SDUIDescriptorTransformer.js +216 -0
  166. package/dist/js/core/components/functional/sdui/SDUIDescriptorTransformer.js.map +1 -0
  167. package/dist/js/core/components/functional/sdui/default-library.json +108 -0
  168. package/dist/js/core/components/functional/sdui/sdui-utils.js +64 -0
  169. package/dist/js/core/components/functional/sdui/sdui-utils.js.map +1 -0
  170. package/dist/js/core/components/functional/sdui/sdui.js +271 -0
  171. package/dist/js/core/components/functional/sdui/sdui.js.map +1 -0
  172. package/dist/js/core/components/functional/sdui/types.js +2 -0
  173. package/dist/js/core/components/functional/sdui/types.js.map +1 -0
  174. package/dist/js/core/components/functional/shader/gl-runtime.js +738 -0
  175. package/dist/js/core/components/functional/shader/gl-runtime.js.map +1 -0
  176. package/dist/js/core/components/functional/shader/shader.js +1642 -0
  177. package/dist/js/core/components/functional/shader/shader.js.map +1 -0
  178. package/dist/js/core/components/functional/shader/shadertoy-prelude.js +48 -0
  179. package/dist/js/core/components/functional/shader/shadertoy-prelude.js.map +1 -0
  180. package/dist/js/core/components/functional/shader/types.js +179 -0
  181. package/dist/js/core/components/functional/shader/types.js.map +1 -0
  182. package/dist/js/core/components/functional/sonic-scope/sonic-scope.js +22 -0
  183. package/dist/js/core/components/functional/sonic-scope/sonic-scope.js.map +1 -0
  184. package/dist/js/core/components/functional/states/states.js +172 -0
  185. package/dist/js/core/components/functional/states/states.js.map +1 -0
  186. package/dist/js/core/components/functional/submit/submit.js +284 -0
  187. package/dist/js/core/components/functional/submit/submit.js.map +1 -0
  188. package/dist/js/core/components/functional/subscriber/subscriber.js +39 -0
  189. package/dist/js/core/components/functional/subscriber/subscriber.js.map +1 -0
  190. package/dist/js/core/components/functional/translation/translation.js +28 -0
  191. package/dist/js/core/components/functional/translation/translation.js.map +1 -0
  192. package/dist/js/core/components/functional/value/value.js +28 -0
  193. package/dist/js/core/components/functional/value/value.js.map +1 -0
  194. package/dist/js/core/components/functional/webgpu/canvas2d-fallback.js +117 -0
  195. package/dist/js/core/components/functional/webgpu/canvas2d-fallback.js.map +1 -0
  196. package/dist/js/core/components/functional/webgpu/form-bind.js +92 -0
  197. package/dist/js/core/components/functional/webgpu/form-bind.js.map +1 -0
  198. package/dist/js/core/components/functional/webgpu/gl-fallback.js +135 -0
  199. package/dist/js/core/components/functional/webgpu/gl-fallback.js.map +1 -0
  200. package/dist/js/core/components/functional/webgpu/gpu-runtime.js +305 -0
  201. package/dist/js/core/components/functional/webgpu/gpu-runtime.js.map +1 -0
  202. package/dist/js/core/components/functional/webgpu/helpers.js +44 -0
  203. package/dist/js/core/components/functional/webgpu/helpers.js.map +1 -0
  204. package/dist/js/core/components/functional/webgpu/out-frame.js +117 -0
  205. package/dist/js/core/components/functional/webgpu/out-frame.js.map +1 -0
  206. package/dist/js/core/components/functional/webgpu/particles-runtime.js +407 -0
  207. package/dist/js/core/components/functional/webgpu/particles-runtime.js.map +1 -0
  208. package/dist/js/core/components/functional/webgpu/pointer.js +56 -0
  209. package/dist/js/core/components/functional/webgpu/pointer.js.map +1 -0
  210. package/dist/js/core/components/functional/webgpu/types.js +24 -0
  211. package/dist/js/core/components/functional/webgpu/types.js.map +1 -0
  212. package/dist/js/core/components/functional/webgpu/webgpu.js +676 -0
  213. package/dist/js/core/components/functional/webgpu/webgpu.js.map +1 -0
  214. package/dist/js/core/components/functional/webgpu/wgsl-prelude.js +77 -0
  215. package/dist/js/core/components/functional/webgpu/wgsl-prelude.js.map +1 -0
  216. package/dist/js/core/components/ui/_css/scroll.js +27 -0
  217. package/dist/js/core/components/ui/_css/scroll.js.map +1 -0
  218. package/dist/js/core/components/ui/_css/shadow.js +22 -0
  219. package/dist/js/core/components/ui/_css/shadow.js.map +1 -0
  220. package/dist/js/core/components/ui/_css/size.js +36 -0
  221. package/dist/js/core/components/ui/_css/size.js.map +1 -0
  222. package/dist/js/core/components/ui/_css/type.js +92 -0
  223. package/dist/js/core/components/ui/_css/type.js.map +1 -0
  224. package/dist/js/core/components/ui/alert/alert.js +213 -0
  225. package/dist/js/core/components/ui/alert/alert.js.map +1 -0
  226. package/dist/js/core/components/ui/alert-messages/alert-messages.js +68 -0
  227. package/dist/js/core/components/ui/alert-messages/alert-messages.js.map +1 -0
  228. package/dist/js/core/components/ui/badge/badge.js +199 -0
  229. package/dist/js/core/components/ui/badge/badge.js.map +1 -0
  230. package/dist/js/core/components/ui/button/button.js +697 -0
  231. package/dist/js/core/components/ui/button/button.js.map +1 -0
  232. package/dist/js/core/components/ui/captcha/altchaStyles.js +226 -0
  233. package/dist/js/core/components/ui/captcha/altchaStyles.js.map +1 -0
  234. package/dist/js/core/components/ui/captcha/captcha.js +167 -0
  235. package/dist/js/core/components/ui/captcha/captcha.js.map +1 -0
  236. package/dist/js/core/components/ui/card/card-footer.js +26 -0
  237. package/dist/js/core/components/ui/card/card-footer.js.map +1 -0
  238. package/dist/js/core/components/ui/card/card-header-descripton.js +30 -0
  239. package/dist/js/core/components/ui/card/card-header-descripton.js.map +1 -0
  240. package/dist/js/core/components/ui/card/card-header.js +79 -0
  241. package/dist/js/core/components/ui/card/card-header.js.map +1 -0
  242. package/dist/js/core/components/ui/card/card-main.js +26 -0
  243. package/dist/js/core/components/ui/card/card-main.js.map +1 -0
  244. package/dist/js/core/components/ui/card/card.js +67 -0
  245. package/dist/js/core/components/ui/card/card.js.map +1 -0
  246. package/dist/js/core/components/ui/divider/divider.js +200 -0
  247. package/dist/js/core/components/ui/divider/divider.js.map +1 -0
  248. package/dist/js/core/components/ui/form/checkbox/checkbox.js +257 -0
  249. package/dist/js/core/components/ui/form/checkbox/checkbox.js.map +1 -0
  250. package/dist/js/core/components/ui/form/css/form-control.js +393 -0
  251. package/dist/js/core/components/ui/form/css/form-control.js.map +1 -0
  252. package/dist/js/core/components/ui/form/fieldset/fieldset.js +124 -0
  253. package/dist/js/core/components/ui/form/fieldset/fieldset.js.map +1 -0
  254. package/dist/js/core/components/ui/form/fieldset/legend-description.js +38 -0
  255. package/dist/js/core/components/ui/form/fieldset/legend-description.js.map +1 -0
  256. package/dist/js/core/components/ui/form/fieldset/legend.js +130 -0
  257. package/dist/js/core/components/ui/form/fieldset/legend.js.map +1 -0
  258. package/dist/js/core/components/ui/form/form-actions/form-actions.js +47 -0
  259. package/dist/js/core/components/ui/form/form-actions/form-actions.js.map +1 -0
  260. package/dist/js/core/components/ui/form/form-layout/form-layout.js +84 -0
  261. package/dist/js/core/components/ui/form/form-layout/form-layout.js.map +1 -0
  262. package/dist/js/core/components/ui/form/input/input.js +316 -0
  263. package/dist/js/core/components/ui/form/input/input.js.map +1 -0
  264. package/dist/js/core/components/ui/form/input/password-helper.js +134 -0
  265. package/dist/js/core/components/ui/form/input/password-helper.js.map +1 -0
  266. package/dist/js/core/components/ui/form/input/same-value-helper.js +85 -0
  267. package/dist/js/core/components/ui/form/input/same-value-helper.js.map +1 -0
  268. package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js +405 -0
  269. package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js.map +1 -0
  270. package/dist/js/core/components/ui/form/radio/radio.js +63 -0
  271. package/dist/js/core/components/ui/form/radio/radio.js.map +1 -0
  272. package/dist/js/core/components/ui/form/select/select.js +323 -0
  273. package/dist/js/core/components/ui/form/select/select.js.map +1 -0
  274. package/dist/js/core/components/ui/form/switch/switch.js +90 -0
  275. package/dist/js/core/components/ui/form/switch/switch.js.map +1 -0
  276. package/dist/js/core/components/ui/form/textarea/textarea.js +162 -0
  277. package/dist/js/core/components/ui/form/textarea/textarea.js.map +1 -0
  278. package/dist/js/core/components/ui/group/group.js +128 -0
  279. package/dist/js/core/components/ui/group/group.js.map +1 -0
  280. package/dist/js/core/components/ui/icon/icon.js +145 -0
  281. package/dist/js/core/components/ui/icon/icon.js.map +1 -0
  282. package/dist/js/core/components/ui/icon/icons.js +184 -0
  283. package/dist/js/core/components/ui/icon/icons.js.map +1 -0
  284. package/dist/js/core/components/ui/icon/icons.json +1 -0
  285. package/dist/js/core/components/ui/image/image.js +160 -0
  286. package/dist/js/core/components/ui/image/image.js.map +1 -0
  287. package/dist/js/core/components/ui/link/link.js +125 -0
  288. package/dist/js/core/components/ui/link/link.js.map +1 -0
  289. package/dist/js/core/components/ui/loader/loader.js +106 -0
  290. package/dist/js/core/components/ui/loader/loader.js.map +1 -0
  291. package/dist/js/core/components/ui/loader/styles/fixed.js +56 -0
  292. package/dist/js/core/components/ui/loader/styles/fixed.js.map +1 -0
  293. package/dist/js/core/components/ui/loader/styles/inline.js +70 -0
  294. package/dist/js/core/components/ui/loader/styles/inline.js.map +1 -0
  295. package/dist/js/core/components/ui/menu/menu-item.js +35 -0
  296. package/dist/js/core/components/ui/menu/menu-item.js.map +1 -0
  297. package/dist/js/core/components/ui/menu/menu.js +436 -0
  298. package/dist/js/core/components/ui/menu/menu.js.map +1 -0
  299. package/dist/js/core/components/ui/modal/modal-actions.js +44 -0
  300. package/dist/js/core/components/ui/modal/modal-actions.js.map +1 -0
  301. package/dist/js/core/components/ui/modal/modal-close.js +56 -0
  302. package/dist/js/core/components/ui/modal/modal-close.js.map +1 -0
  303. package/dist/js/core/components/ui/modal/modal-content.js +27 -0
  304. package/dist/js/core/components/ui/modal/modal-content.js.map +1 -0
  305. package/dist/js/core/components/ui/modal/modal-subtitle.js +34 -0
  306. package/dist/js/core/components/ui/modal/modal-subtitle.js.map +1 -0
  307. package/dist/js/core/components/ui/modal/modal-title.js +35 -0
  308. package/dist/js/core/components/ui/modal/modal-title.js.map +1 -0
  309. package/dist/js/core/components/ui/modal/modal-utils.js +32 -0
  310. package/dist/js/core/components/ui/modal/modal-utils.js.map +1 -0
  311. package/dist/js/core/components/ui/modal/modal.js +568 -0
  312. package/dist/js/core/components/ui/modal/modal.js.map +1 -0
  313. package/dist/js/core/components/ui/pop/pop.js +337 -0
  314. package/dist/js/core/components/ui/pop/pop.js.map +1 -0
  315. package/dist/js/core/components/ui/progress/progress.js +164 -0
  316. package/dist/js/core/components/ui/progress/progress.js.map +1 -0
  317. package/dist/js/core/components/ui/table/table-caption.js +29 -0
  318. package/dist/js/core/components/ui/table/table-caption.js.map +1 -0
  319. package/dist/js/core/components/ui/table/table-tbody.js +41 -0
  320. package/dist/js/core/components/ui/table/table-tbody.js.map +1 -0
  321. package/dist/js/core/components/ui/table/table-td.js +69 -0
  322. package/dist/js/core/components/ui/table/table-td.js.map +1 -0
  323. package/dist/js/core/components/ui/table/table-tfoot.js +28 -0
  324. package/dist/js/core/components/ui/table/table-tfoot.js.map +1 -0
  325. package/dist/js/core/components/ui/table/table-th.js +80 -0
  326. package/dist/js/core/components/ui/table/table-th.js.map +1 -0
  327. package/dist/js/core/components/ui/table/table-thead.js +26 -0
  328. package/dist/js/core/components/ui/table/table-thead.js.map +1 -0
  329. package/dist/js/core/components/ui/table/table-tr.js +67 -0
  330. package/dist/js/core/components/ui/table/table-tr.js.map +1 -0
  331. package/dist/js/core/components/ui/table/table.js +106 -0
  332. package/dist/js/core/components/ui/table/table.js.map +1 -0
  333. package/dist/js/core/components/ui/theme/theme-collection/core-variables.js +74 -0
  334. package/dist/js/core/components/ui/theme/theme-collection/core-variables.js.map +1 -0
  335. package/dist/js/core/components/ui/theme/theme-collection/dark.js +39 -0
  336. package/dist/js/core/components/ui/theme/theme-collection/dark.js.map +1 -0
  337. package/dist/js/core/components/ui/theme/theme-collection/light.js +32 -0
  338. package/dist/js/core/components/ui/theme/theme-collection/light.js.map +1 -0
  339. package/dist/js/core/components/ui/theme/theme.js +150 -0
  340. package/dist/js/core/components/ui/theme/theme.js.map +1 -0
  341. package/dist/js/core/components/ui/toast/message-subscriber.js +41 -0
  342. package/dist/js/core/components/ui/toast/message-subscriber.js.map +1 -0
  343. package/dist/js/core/components/ui/toast/toast-item.js +379 -0
  344. package/dist/js/core/components/ui/toast/toast-item.js.map +1 -0
  345. package/dist/js/core/components/ui/toast/toast.js +269 -0
  346. package/dist/js/core/components/ui/toast/toast.js.map +1 -0
  347. package/dist/js/core/components/ui/toast/types.js +2 -0
  348. package/dist/js/core/components/ui/toast/types.js.map +1 -0
  349. package/dist/js/core/components/ui/tooltip/tooltip.js +219 -0
  350. package/dist/js/core/components/ui/tooltip/tooltip.js.map +1 -0
  351. package/dist/js/core/components/ui/ui.js +41 -0
  352. package/dist/js/core/components/ui/ui.js.map +1 -0
  353. package/dist/js/core/core.js +14 -0
  354. package/dist/js/core/core.js.map +1 -0
  355. package/dist/js/core/decorators/Subscriber.js +10 -0
  356. package/dist/js/core/decorators/Subscriber.js.map +1 -0
  357. package/dist/js/core/decorators/api.js +806 -0
  358. package/dist/js/core/decorators/api.js.map +1 -0
  359. package/dist/js/core/decorators/lifecycle.js +67 -0
  360. package/dist/js/core/decorators/lifecycle.js.map +1 -0
  361. package/dist/js/core/decorators/subscriber/ancestorAttribute.js +27 -0
  362. package/dist/js/core/decorators/subscriber/ancestorAttribute.js.map +1 -0
  363. package/dist/js/core/decorators/subscriber/autoFill.js +26 -0
  364. package/dist/js/core/decorators/subscriber/autoFill.js.map +1 -0
  365. package/dist/js/core/decorators/subscriber/autoSubscribe.js +46 -0
  366. package/dist/js/core/decorators/subscriber/autoSubscribe.js.map +1 -0
  367. package/dist/js/core/decorators/subscriber/bind.js +150 -0
  368. package/dist/js/core/decorators/subscriber/bind.js.map +1 -0
  369. package/dist/js/core/decorators/subscriber/common.js +44 -0
  370. package/dist/js/core/decorators/subscriber/common.js.map +1 -0
  371. package/dist/js/core/decorators/subscriber/derive.js +60 -0
  372. package/dist/js/core/decorators/subscriber/derive.js.map +1 -0
  373. package/dist/js/core/decorators/subscriber/dynamicPath.js +75 -0
  374. package/dist/js/core/decorators/subscriber/dynamicPath.js.map +1 -0
  375. package/dist/js/core/decorators/subscriber/dynamicPropertyWatch.js +138 -0
  376. package/dist/js/core/decorators/subscriber/dynamicPropertyWatch.js.map +1 -0
  377. package/dist/js/core/decorators/subscriber/handle.js +22 -0
  378. package/dist/js/core/decorators/subscriber/handle.js.map +1 -0
  379. package/dist/js/core/decorators/subscriber/onAssign.js +199 -0
  380. package/dist/js/core/decorators/subscriber/onAssign.js.map +1 -0
  381. package/dist/js/core/decorators/subscriber/publish.js +108 -0
  382. package/dist/js/core/decorators/subscriber/publish.js.map +1 -0
  383. package/dist/js/core/decorators/subscriber/publisherPath.js +16 -0
  384. package/dist/js/core/decorators/subscriber/publisherPath.js.map +1 -0
  385. package/dist/js/core/decorators/subscriber/subscribe.js +20 -0
  386. package/dist/js/core/decorators/subscriber/subscribe.js.map +1 -0
  387. package/dist/js/core/directives/DataProvider.js +127 -0
  388. package/dist/js/core/directives/DataProvider.js.map +1 -0
  389. package/dist/js/core/directives/Wording.js +221 -0
  390. package/dist/js/core/directives/Wording.js.map +1 -0
  391. package/dist/js/core/mixins/Fetcher.js +325 -0
  392. package/dist/js/core/mixins/Fetcher.js.map +1 -0
  393. package/dist/js/core/mixins/FormCheckable.js +313 -0
  394. package/dist/js/core/mixins/FormCheckable.js.map +1 -0
  395. package/dist/js/core/mixins/FormElement.js +304 -0
  396. package/dist/js/core/mixins/FormElement.js.map +1 -0
  397. package/dist/js/core/mixins/FormInput.js +82 -0
  398. package/dist/js/core/mixins/FormInput.js.map +1 -0
  399. package/dist/js/core/mixins/Subscriber.js +354 -0
  400. package/dist/js/core/mixins/Subscriber.js.map +1 -0
  401. package/dist/js/core/mixins/TemplatesContainer.js +70 -0
  402. package/dist/js/core/mixins/TemplatesContainer.js.map +1 -0
  403. package/dist/js/core/mixins/mixins.js +7 -0
  404. package/dist/js/core/mixins/mixins.js.map +1 -0
  405. package/dist/js/core/utils/AncestorAttributeObserver.js +140 -0
  406. package/dist/js/core/utils/AncestorAttributeObserver.js.map +1 -0
  407. package/dist/js/core/utils/Arrays.js +141 -0
  408. package/dist/js/core/utils/Arrays.js.map +1 -0
  409. package/dist/js/core/utils/DataBindObserver.js +265 -0
  410. package/dist/js/core/utils/DataBindObserver.js.map +1 -0
  411. package/dist/js/core/utils/Electron.js +14 -0
  412. package/dist/js/core/utils/Electron.js.map +1 -0
  413. package/dist/js/core/utils/Format.js +43 -0
  414. package/dist/js/core/utils/Format.js.map +1 -0
  415. package/dist/js/core/utils/HTML.js +307 -0
  416. package/dist/js/core/utils/HTML.js.map +1 -0
  417. package/dist/js/core/utils/LocationHandler.js +143 -0
  418. package/dist/js/core/utils/LocationHandler.js.map +1 -0
  419. package/dist/js/core/utils/Objects.js +111 -0
  420. package/dist/js/core/utils/Objects.js.map +1 -0
  421. package/dist/js/core/utils/PublisherProxy.js +970 -0
  422. package/dist/js/core/utils/PublisherProxy.js.map +1 -0
  423. package/dist/js/core/utils/SafariScrollGuard.js +384 -0
  424. package/dist/js/core/utils/SafariScrollGuard.js.map +1 -0
  425. package/dist/js/core/utils/Utils.js +19 -0
  426. package/dist/js/core/utils/Utils.js.map +1 -0
  427. package/dist/js/core/utils/aesCrypto.js +98 -0
  428. package/dist/js/core/utils/aesCrypto.js.map +1 -0
  429. package/dist/js/core/utils/api.js +595 -0
  430. package/dist/js/core/utils/api.js.map +1 -0
  431. package/dist/js/core/utils/dataProviderKey.js +64 -0
  432. package/dist/js/core/utils/dataProviderKey.js.map +1 -0
  433. package/dist/js/core/utils/derive.js +246 -0
  434. package/dist/js/core/utils/derive.js.map +1 -0
  435. package/dist/js/core/utils/endpoint.js +74 -0
  436. package/dist/js/core/utils/endpoint.js.map +1 -0
  437. package/dist/js/core/utils/jsonataHelpers.js +84 -0
  438. package/dist/js/core/utils/jsonataHelpers.js.map +1 -0
  439. package/dist/js/core/utils/jsonataRuntime.js +75 -0
  440. package/dist/js/core/utils/jsonataRuntime.js.map +1 -0
  441. package/dist/js/core/utils/mediaRef.js +169 -0
  442. package/dist/js/core/utils/mediaRef.js.map +1 -0
  443. package/dist/js/core/utils/route.js +149 -0
  444. package/dist/js/core/utils/route.js.map +1 -0
  445. package/dist/js/core/utils/similarity.js +44 -0
  446. package/dist/js/core/utils/similarity.js.map +1 -0
  447. package/dist/js/core/utils/url-pattern.js +3 -0
  448. package/dist/js/core/utils/url-pattern.js.map +1 -0
  449. package/dist/js/dataprovider.js +2 -0
  450. package/dist/js/dataprovider.js.map +1 -0
  451. package/dist/js/decorators.js +43 -0
  452. package/dist/js/decorators.js.map +1 -0
  453. package/dist/js/directives.js +30 -0
  454. package/dist/js/directives.js.map +1 -0
  455. package/dist/js/index.js +8 -0
  456. package/dist/js/index.js.map +1 -0
  457. package/dist/js/mixins.js +23 -0
  458. package/dist/js/mixins.js.map +1 -0
  459. package/dist/js/test-utils/TestUtils.js +10 -0
  460. package/dist/js/test-utils/TestUtils.js.map +1 -0
  461. package/dist/js/utils.js +46 -0
  462. package/dist/js/utils.js.map +1 -0
  463. package/dist/types/addons/3d.d.ts +6 -0
  464. package/dist/types/addons/3d.d.ts.map +1 -0
  465. package/dist/types/addons/hugging-face-infer.d.ts +8 -0
  466. package/dist/types/addons/hugging-face-infer.d.ts.map +1 -0
  467. package/dist/types/addons/shader.d.ts +6 -0
  468. package/dist/types/addons/shader.d.ts.map +1 -0
  469. package/dist/types/addons/webgpu.d.ts +7 -0
  470. package/dist/types/addons/webgpu.d.ts.map +1 -0
  471. package/dist/types/components.d.ts +5 -0
  472. package/dist/types/components.d.ts.map +1 -0
  473. package/dist/types/concorde-loaded.d.ts +2 -0
  474. package/dist/types/concorde-loaded.d.ts.map +1 -0
  475. package/dist/types/core/_types/endpoint.d.ts +5 -0
  476. package/dist/types/core/_types/endpoint.d.ts.map +1 -0
  477. package/dist/types/core/_types/key.d.ts +2 -0
  478. package/dist/types/core/_types/key.d.ts.map +1 -0
  479. package/dist/types/core/_types/types.d.ts +28 -0
  480. package/dist/types/core/_types/types.d.ts.map +1 -0
  481. package/dist/types/core/components/functional/3d/3d.d.ts +71 -0
  482. package/dist/types/core/components/functional/3d/3d.d.ts.map +1 -0
  483. package/dist/types/core/components/functional/3d/asset.d.ts +12 -0
  484. package/dist/types/core/components/functional/3d/asset.d.ts.map +1 -0
  485. package/dist/types/core/components/functional/3d/boot.d.ts +23 -0
  486. package/dist/types/core/components/functional/3d/boot.d.ts.map +1 -0
  487. package/dist/types/core/components/functional/3d/constants.d.ts +43 -0
  488. package/dist/types/core/components/functional/3d/constants.d.ts.map +1 -0
  489. package/dist/types/core/components/functional/3d/demo-content.d.ts +10 -0
  490. package/dist/types/core/components/functional/3d/demo-content.d.ts.map +1 -0
  491. package/dist/types/core/components/functional/3d/ensure.d.ts +36 -0
  492. package/dist/types/core/components/functional/3d/ensure.d.ts.map +1 -0
  493. package/dist/types/core/components/functional/3d/form-bind.d.ts +20 -0
  494. package/dist/types/core/components/functional/3d/form-bind.d.ts.map +1 -0
  495. package/dist/types/core/components/functional/3d/form-fields.d.ts +14 -0
  496. package/dist/types/core/components/functional/3d/form-fields.d.ts.map +1 -0
  497. package/dist/types/core/components/functional/3d/form-params.d.ts +37 -0
  498. package/dist/types/core/components/functional/3d/form-params.d.ts.map +1 -0
  499. package/dist/types/core/components/functional/3d/frame-capture.d.ts +33 -0
  500. package/dist/types/core/components/functional/3d/frame-capture.d.ts.map +1 -0
  501. package/dist/types/core/components/functional/3d/frame-source.d.ts +23 -0
  502. package/dist/types/core/components/functional/3d/frame-source.d.ts.map +1 -0
  503. package/dist/types/core/components/functional/3d/gl.d.ts +4 -0
  504. package/dist/types/core/components/functional/3d/gl.d.ts.map +1 -0
  505. package/dist/types/core/components/functional/3d/life.d.ts +41 -0
  506. package/dist/types/core/components/functional/3d/life.d.ts.map +1 -0
  507. package/dist/types/core/components/functional/3d/load.d.ts +36 -0
  508. package/dist/types/core/components/functional/3d/load.d.ts.map +1 -0
  509. package/dist/types/core/components/functional/3d/ops.d.ts +48 -0
  510. package/dist/types/core/components/functional/3d/ops.d.ts.map +1 -0
  511. package/dist/types/core/components/functional/3d/opts.d.ts +16 -0
  512. package/dist/types/core/components/functional/3d/opts.d.ts.map +1 -0
  513. package/dist/types/core/components/functional/3d/orbit.d.ts +55 -0
  514. package/dist/types/core/components/functional/3d/orbit.d.ts.map +1 -0
  515. package/dist/types/core/components/functional/3d/out-publish.d.ts +47 -0
  516. package/dist/types/core/components/functional/3d/out-publish.d.ts.map +1 -0
  517. package/dist/types/core/components/functional/3d/parse.d.ts +23 -0
  518. package/dist/types/core/components/functional/3d/parse.d.ts.map +1 -0
  519. package/dist/types/core/components/functional/3d/pick.d.ts +32 -0
  520. package/dist/types/core/components/functional/3d/pick.d.ts.map +1 -0
  521. package/dist/types/core/components/functional/3d/playback.d.ts +26 -0
  522. package/dist/types/core/components/functional/3d/playback.d.ts.map +1 -0
  523. package/dist/types/core/components/functional/3d/pointer.d.ts +27 -0
  524. package/dist/types/core/components/functional/3d/pointer.d.ts.map +1 -0
  525. package/dist/types/core/components/functional/3d/props.d.ts +30 -0
  526. package/dist/types/core/components/functional/3d/props.d.ts.map +1 -0
  527. package/dist/types/core/components/functional/3d/publisher-listen.d.ts +8 -0
  528. package/dist/types/core/components/functional/3d/publisher-listen.d.ts.map +1 -0
  529. package/dist/types/core/components/functional/3d/reload.d.ts +38 -0
  530. package/dist/types/core/components/functional/3d/reload.d.ts.map +1 -0
  531. package/dist/types/core/components/functional/3d/runtime.d.ts +75 -0
  532. package/dist/types/core/components/functional/3d/runtime.d.ts.map +1 -0
  533. package/dist/types/core/components/functional/3d/scene-runtime.d.ts +6 -0
  534. package/dist/types/core/components/functional/3d/scene-runtime.d.ts.map +1 -0
  535. package/dist/types/core/components/functional/3d/snapshot.d.ts +29 -0
  536. package/dist/types/core/components/functional/3d/snapshot.d.ts.map +1 -0
  537. package/dist/types/core/components/functional/3d/styles.d.ts +2 -0
  538. package/dist/types/core/components/functional/3d/styles.d.ts.map +1 -0
  539. package/dist/types/core/components/functional/3d/tune.d.ts +32 -0
  540. package/dist/types/core/components/functional/3d/tune.d.ts.map +1 -0
  541. package/dist/types/core/components/functional/3d/types.d.ts +140 -0
  542. package/dist/types/core/components/functional/3d/types.d.ts.map +1 -0
  543. package/dist/types/core/components/functional/3d/updated.d.ts +7 -0
  544. package/dist/types/core/components/functional/3d/updated.d.ts.map +1 -0
  545. package/dist/types/core/components/functional/3d/view.d.ts +25 -0
  546. package/dist/types/core/components/functional/3d/view.d.ts.map +1 -0
  547. package/dist/types/core/components/functional/3d/wire.d.ts +32 -0
  548. package/dist/types/core/components/functional/3d/wire.d.ts.map +1 -0
  549. package/dist/types/core/components/functional/date/date.d.ts +52 -0
  550. package/dist/types/core/components/functional/date/date.d.ts.map +1 -0
  551. package/dist/types/core/components/functional/example/example.d.ts +15 -0
  552. package/dist/types/core/components/functional/example/example.d.ts.map +1 -0
  553. package/dist/types/core/components/functional/fetch/fetch.d.ts +102 -0
  554. package/dist/types/core/components/functional/fetch/fetch.d.ts.map +1 -0
  555. package/dist/types/core/components/functional/functional.d.ts +18 -0
  556. package/dist/types/core/components/functional/functional.d.ts.map +1 -0
  557. package/dist/types/core/components/functional/if/if.d.ts +13 -0
  558. package/dist/types/core/components/functional/if/if.d.ts.map +1 -0
  559. package/dist/types/core/components/functional/infer/hugging-face/hf-cache.d.ts +21 -0
  560. package/dist/types/core/components/functional/infer/hugging-face/hf-cache.d.ts.map +1 -0
  561. package/dist/types/core/components/functional/infer/hugging-face/hf-config.d.ts +133 -0
  562. package/dist/types/core/components/functional/infer/hugging-face/hf-config.d.ts.map +1 -0
  563. package/dist/types/core/components/functional/infer/hugging-face/hf-controller.d.ts +79 -0
  564. package/dist/types/core/components/functional/infer/hugging-face/hf-controller.d.ts.map +1 -0
  565. package/dist/types/core/components/functional/infer/hugging-face/hf-engine.d.ts +43 -0
  566. package/dist/types/core/components/functional/infer/hugging-face/hf-engine.d.ts.map +1 -0
  567. package/dist/types/core/components/functional/infer/hugging-face/hf-input.d.ts +47 -0
  568. package/dist/types/core/components/functional/infer/hugging-face/hf-input.d.ts.map +1 -0
  569. package/dist/types/core/components/functional/infer/hugging-face/hf-protocol.d.ts +95 -0
  570. package/dist/types/core/components/functional/infer/hugging-face/hf-protocol.d.ts.map +1 -0
  571. package/dist/types/core/components/functional/infer/hugging-face/hf-registry.d.ts +77 -0
  572. package/dist/types/core/components/functional/infer/hugging-face/hf-registry.d.ts.map +1 -0
  573. package/dist/types/core/components/functional/infer/hugging-face/hf-schema.d.ts +1251 -0
  574. package/dist/types/core/components/functional/infer/hugging-face/hf-schema.d.ts.map +1 -0
  575. package/dist/types/core/components/functional/infer/hugging-face/hf-worker-runtime.d.ts +56 -0
  576. package/dist/types/core/components/functional/infer/hugging-face/hf-worker-runtime.d.ts.map +1 -0
  577. package/dist/types/core/components/functional/infer/hugging-face/hugging-face-infer.d.ts +67 -0
  578. package/dist/types/core/components/functional/infer/hugging-face/hugging-face-infer.d.ts.map +1 -0
  579. package/dist/types/core/components/functional/infer/hugging-face/hugging-face.d.ts +116 -0
  580. package/dist/types/core/components/functional/infer/hugging-face/hugging-face.d.ts.map +1 -0
  581. package/dist/types/core/components/functional/infer/hugging-face/types.d.ts +167 -0
  582. package/dist/types/core/components/functional/infer/hugging-face/types.d.ts.map +1 -0
  583. package/dist/types/core/components/functional/jsonata/jsonata.d.ts +29 -0
  584. package/dist/types/core/components/functional/jsonata/jsonata.d.ts.map +1 -0
  585. package/dist/types/core/components/functional/list/list.d.ts +149 -0
  586. package/dist/types/core/components/functional/list/list.d.ts.map +1 -0
  587. package/dist/types/core/components/functional/mix/mix.d.ts +23 -0
  588. package/dist/types/core/components/functional/mix/mix.d.ts.map +1 -0
  589. package/dist/types/core/components/functional/queue/queue.d.ts +93 -0
  590. package/dist/types/core/components/functional/queue/queue.d.ts.map +1 -0
  591. package/dist/types/core/components/functional/router/redirect.d.ts +19 -0
  592. package/dist/types/core/components/functional/router/redirect.d.ts.map +1 -0
  593. package/dist/types/core/components/functional/router/router.d.ts +46 -0
  594. package/dist/types/core/components/functional/router/router.d.ts.map +1 -0
  595. package/dist/types/core/components/functional/sdui/SDUIDescriptorTransformer.d.ts +59 -0
  596. package/dist/types/core/components/functional/sdui/SDUIDescriptorTransformer.d.ts.map +1 -0
  597. package/dist/types/core/components/functional/sdui/sdui-utils.d.ts +6 -0
  598. package/dist/types/core/components/functional/sdui/sdui-utils.d.ts.map +1 -0
  599. package/dist/types/core/components/functional/sdui/sdui.d.ts +148 -0
  600. package/dist/types/core/components/functional/sdui/sdui.d.ts.map +1 -0
  601. package/dist/types/core/components/functional/sdui/types.d.ts +38 -0
  602. package/dist/types/core/components/functional/sdui/types.d.ts.map +1 -0
  603. package/dist/types/core/components/functional/shader/gl-runtime.d.ts +90 -0
  604. package/dist/types/core/components/functional/shader/gl-runtime.d.ts.map +1 -0
  605. package/dist/types/core/components/functional/shader/shader.d.ts +285 -0
  606. package/dist/types/core/components/functional/shader/shader.d.ts.map +1 -0
  607. package/dist/types/core/components/functional/shader/shadertoy-prelude.d.ts +6 -0
  608. package/dist/types/core/components/functional/shader/shadertoy-prelude.d.ts.map +1 -0
  609. package/dist/types/core/components/functional/shader/types.d.ts +262 -0
  610. package/dist/types/core/components/functional/shader/types.d.ts.map +1 -0
  611. package/dist/types/core/components/functional/sonic-scope/sonic-scope.d.ts +6 -0
  612. package/dist/types/core/components/functional/sonic-scope/sonic-scope.d.ts.map +1 -0
  613. package/dist/types/core/components/functional/states/states.d.ts +42 -0
  614. package/dist/types/core/components/functional/states/states.d.ts.map +1 -0
  615. package/dist/types/core/components/functional/submit/submit.d.ts +37 -0
  616. package/dist/types/core/components/functional/submit/submit.d.ts.map +1 -0
  617. package/dist/types/core/components/functional/subscriber/subscriber.d.ts +13 -0
  618. package/dist/types/core/components/functional/subscriber/subscriber.d.ts.map +1 -0
  619. package/dist/types/core/components/functional/translation/translation.d.ts +7 -0
  620. package/dist/types/core/components/functional/translation/translation.d.ts.map +1 -0
  621. package/dist/types/core/components/functional/value/value.d.ts +8 -0
  622. package/dist/types/core/components/functional/value/value.d.ts.map +1 -0
  623. package/dist/types/core/components/functional/webgpu/canvas2d-fallback.d.ts +29 -0
  624. package/dist/types/core/components/functional/webgpu/canvas2d-fallback.d.ts.map +1 -0
  625. package/dist/types/core/components/functional/webgpu/form-bind.d.ts +43 -0
  626. package/dist/types/core/components/functional/webgpu/form-bind.d.ts.map +1 -0
  627. package/dist/types/core/components/functional/webgpu/gl-fallback.d.ts +31 -0
  628. package/dist/types/core/components/functional/webgpu/gl-fallback.d.ts.map +1 -0
  629. package/dist/types/core/components/functional/webgpu/gpu-runtime.d.ts +53 -0
  630. package/dist/types/core/components/functional/webgpu/gpu-runtime.d.ts.map +1 -0
  631. package/dist/types/core/components/functional/webgpu/helpers.d.ts +9 -0
  632. package/dist/types/core/components/functional/webgpu/helpers.d.ts.map +1 -0
  633. package/dist/types/core/components/functional/webgpu/out-frame.d.ts +29 -0
  634. package/dist/types/core/components/functional/webgpu/out-frame.d.ts.map +1 -0
  635. package/dist/types/core/components/functional/webgpu/particles-runtime.d.ts +37 -0
  636. package/dist/types/core/components/functional/webgpu/particles-runtime.d.ts.map +1 -0
  637. package/dist/types/core/components/functional/webgpu/pointer.d.ts +41 -0
  638. package/dist/types/core/components/functional/webgpu/pointer.d.ts.map +1 -0
  639. package/dist/types/core/components/functional/webgpu/types.d.ts +75 -0
  640. package/dist/types/core/components/functional/webgpu/types.d.ts.map +1 -0
  641. package/dist/types/core/components/functional/webgpu/webgpu.d.ts +127 -0
  642. package/dist/types/core/components/functional/webgpu/webgpu.d.ts.map +1 -0
  643. package/dist/types/core/components/functional/webgpu/wgsl-prelude.d.ts +8 -0
  644. package/dist/types/core/components/functional/webgpu/wgsl-prelude.d.ts.map +1 -0
  645. package/dist/types/core/components/ui/_css/scroll.d.ts +2 -0
  646. package/dist/types/core/components/ui/_css/scroll.d.ts.map +1 -0
  647. package/dist/types/core/components/ui/_css/shadow.d.ts +3 -0
  648. package/dist/types/core/components/ui/_css/shadow.d.ts.map +1 -0
  649. package/dist/types/core/components/ui/_css/size.d.ts +3 -0
  650. package/dist/types/core/components/ui/_css/size.d.ts.map +1 -0
  651. package/dist/types/core/components/ui/_css/type.d.ts +3 -0
  652. package/dist/types/core/components/ui/_css/type.d.ts.map +1 -0
  653. package/dist/types/core/components/ui/alert/alert.d.ts +37 -0
  654. package/dist/types/core/components/ui/alert/alert.d.ts.map +1 -0
  655. package/dist/types/core/components/ui/alert-messages/alert-messages.d.ts +15 -0
  656. package/dist/types/core/components/ui/alert-messages/alert-messages.d.ts.map +1 -0
  657. package/dist/types/core/components/ui/badge/badge.d.ts +27 -0
  658. package/dist/types/core/components/ui/badge/badge.d.ts.map +1 -0
  659. package/dist/types/core/components/ui/button/button.d.ts +180 -0
  660. package/dist/types/core/components/ui/button/button.d.ts.map +1 -0
  661. package/dist/types/core/components/ui/captcha/altchaStyles.d.ts +2 -0
  662. package/dist/types/core/components/ui/captcha/altchaStyles.d.ts.map +1 -0
  663. package/dist/types/core/components/ui/captcha/captcha.d.ts +30 -0
  664. package/dist/types/core/components/ui/captcha/captcha.d.ts.map +1 -0
  665. package/dist/types/core/components/ui/card/card-footer.d.ts +6 -0
  666. package/dist/types/core/components/ui/card/card-footer.d.ts.map +1 -0
  667. package/dist/types/core/components/ui/card/card-header-descripton.d.ts +6 -0
  668. package/dist/types/core/components/ui/card/card-header-descripton.d.ts.map +1 -0
  669. package/dist/types/core/components/ui/card/card-header.d.ts +9 -0
  670. package/dist/types/core/components/ui/card/card-header.d.ts.map +1 -0
  671. package/dist/types/core/components/ui/card/card-main.d.ts +6 -0
  672. package/dist/types/core/components/ui/card/card-main.d.ts.map +1 -0
  673. package/dist/types/core/components/ui/card/card.d.ts +13 -0
  674. package/dist/types/core/components/ui/card/card.d.ts.map +1 -0
  675. package/dist/types/core/components/ui/divider/divider.d.ts +16 -0
  676. package/dist/types/core/components/ui/divider/divider.d.ts.map +1 -0
  677. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts +176 -0
  678. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts.map +1 -0
  679. package/dist/types/core/components/ui/form/css/form-control.d.ts +5 -0
  680. package/dist/types/core/components/ui/form/css/form-control.d.ts.map +1 -0
  681. package/dist/types/core/components/ui/form/fieldset/fieldset.d.ts +24 -0
  682. package/dist/types/core/components/ui/form/fieldset/fieldset.d.ts.map +1 -0
  683. package/dist/types/core/components/ui/form/fieldset/legend-description.d.ts +6 -0
  684. package/dist/types/core/components/ui/form/fieldset/legend-description.d.ts.map +1 -0
  685. package/dist/types/core/components/ui/form/fieldset/legend.d.ts +17 -0
  686. package/dist/types/core/components/ui/form/fieldset/legend.d.ts.map +1 -0
  687. package/dist/types/core/components/ui/form/form-actions/form-actions.d.ts +8 -0
  688. package/dist/types/core/components/ui/form/form-actions/form-actions.d.ts.map +1 -0
  689. package/dist/types/core/components/ui/form/form-layout/form-layout.d.ts +13 -0
  690. package/dist/types/core/components/ui/form/form-layout/form-layout.d.ts.map +1 -0
  691. package/dist/types/core/components/ui/form/input/input.d.ts +123 -0
  692. package/dist/types/core/components/ui/form/input/input.d.ts.map +1 -0
  693. package/dist/types/core/components/ui/form/input/password-helper.d.ts +26 -0
  694. package/dist/types/core/components/ui/form/input/password-helper.d.ts.map +1 -0
  695. package/dist/types/core/components/ui/form/input/same-value-helper.d.ts +17 -0
  696. package/dist/types/core/components/ui/form/input/same-value-helper.d.ts.map +1 -0
  697. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts +155 -0
  698. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts.map +1 -0
  699. package/dist/types/core/components/ui/form/radio/radio.d.ts +15 -0
  700. package/dist/types/core/components/ui/form/radio/radio.d.ts.map +1 -0
  701. package/dist/types/core/components/ui/form/select/select.d.ts +59 -0
  702. package/dist/types/core/components/ui/form/select/select.d.ts.map +1 -0
  703. package/dist/types/core/components/ui/form/switch/switch.d.ts +6 -0
  704. package/dist/types/core/components/ui/form/switch/switch.d.ts.map +1 -0
  705. package/dist/types/core/components/ui/form/textarea/textarea.d.ts +94 -0
  706. package/dist/types/core/components/ui/form/textarea/textarea.d.ts.map +1 -0
  707. package/dist/types/core/components/ui/group/group.d.ts +17 -0
  708. package/dist/types/core/components/ui/group/group.d.ts.map +1 -0
  709. package/dist/types/core/components/ui/icon/icon.d.ts +30 -0
  710. package/dist/types/core/components/ui/icon/icon.d.ts.map +1 -0
  711. package/dist/types/core/components/ui/icon/icons.d.ts +13 -0
  712. package/dist/types/core/components/ui/icon/icons.d.ts.map +1 -0
  713. package/dist/types/core/components/ui/image/image.d.ts +16 -0
  714. package/dist/types/core/components/ui/image/image.d.ts.map +1 -0
  715. package/dist/types/core/components/ui/link/link.d.ts +30 -0
  716. package/dist/types/core/components/ui/link/link.d.ts.map +1 -0
  717. package/dist/types/core/components/ui/loader/loader.d.ts +24 -0
  718. package/dist/types/core/components/ui/loader/loader.d.ts.map +1 -0
  719. package/dist/types/core/components/ui/loader/styles/fixed.d.ts +2 -0
  720. package/dist/types/core/components/ui/loader/styles/fixed.d.ts.map +1 -0
  721. package/dist/types/core/components/ui/loader/styles/inline.d.ts +2 -0
  722. package/dist/types/core/components/ui/loader/styles/inline.d.ts.map +1 -0
  723. package/dist/types/core/components/ui/menu/menu-item.d.ts +6 -0
  724. package/dist/types/core/components/ui/menu/menu-item.d.ts.map +1 -0
  725. package/dist/types/core/components/ui/menu/menu.d.ts +52 -0
  726. package/dist/types/core/components/ui/menu/menu.d.ts.map +1 -0
  727. package/dist/types/core/components/ui/modal/modal-actions.d.ts +9 -0
  728. package/dist/types/core/components/ui/modal/modal-actions.d.ts.map +1 -0
  729. package/dist/types/core/components/ui/modal/modal-close.d.ts +11 -0
  730. package/dist/types/core/components/ui/modal/modal-close.d.ts.map +1 -0
  731. package/dist/types/core/components/ui/modal/modal-content.d.ts +6 -0
  732. package/dist/types/core/components/ui/modal/modal-content.d.ts.map +1 -0
  733. package/dist/types/core/components/ui/modal/modal-subtitle.d.ts +6 -0
  734. package/dist/types/core/components/ui/modal/modal-subtitle.d.ts.map +1 -0
  735. package/dist/types/core/components/ui/modal/modal-title.d.ts +6 -0
  736. package/dist/types/core/components/ui/modal/modal-title.d.ts.map +1 -0
  737. package/dist/types/core/components/ui/modal/modal-utils.d.ts +4 -0
  738. package/dist/types/core/components/ui/modal/modal-utils.d.ts.map +1 -0
  739. package/dist/types/core/components/ui/modal/modal.d.ts +79 -0
  740. package/dist/types/core/components/ui/modal/modal.d.ts.map +1 -0
  741. package/dist/types/core/components/ui/pop/pop.d.ts +42 -0
  742. package/dist/types/core/components/ui/pop/pop.d.ts.map +1 -0
  743. package/dist/types/core/components/ui/progress/progress.d.ts +12 -0
  744. package/dist/types/core/components/ui/progress/progress.d.ts.map +1 -0
  745. package/dist/types/core/components/ui/table/table-caption.d.ts +6 -0
  746. package/dist/types/core/components/ui/table/table-caption.d.ts.map +1 -0
  747. package/dist/types/core/components/ui/table/table-tbody.d.ts +6 -0
  748. package/dist/types/core/components/ui/table/table-tbody.d.ts.map +1 -0
  749. package/dist/types/core/components/ui/table/table-td.d.ts +13 -0
  750. package/dist/types/core/components/ui/table/table-td.d.ts.map +1 -0
  751. package/dist/types/core/components/ui/table/table-tfoot.d.ts +6 -0
  752. package/dist/types/core/components/ui/table/table-tfoot.d.ts.map +1 -0
  753. package/dist/types/core/components/ui/table/table-th.d.ts +12 -0
  754. package/dist/types/core/components/ui/table/table-th.d.ts.map +1 -0
  755. package/dist/types/core/components/ui/table/table-thead.d.ts +6 -0
  756. package/dist/types/core/components/ui/table/table-thead.d.ts.map +1 -0
  757. package/dist/types/core/components/ui/table/table-tr.d.ts +14 -0
  758. package/dist/types/core/components/ui/table/table-tr.d.ts.map +1 -0
  759. package/dist/types/core/components/ui/table/table.d.ts +18 -0
  760. package/dist/types/core/components/ui/table/table.d.ts.map +1 -0
  761. package/dist/types/core/components/ui/theme/theme-collection/core-variables.d.ts +2 -0
  762. package/dist/types/core/components/ui/theme/theme-collection/core-variables.d.ts.map +1 -0
  763. package/dist/types/core/components/ui/theme/theme-collection/dark.d.ts +2 -0
  764. package/dist/types/core/components/ui/theme/theme-collection/dark.d.ts.map +1 -0
  765. package/dist/types/core/components/ui/theme/theme-collection/light.d.ts +2 -0
  766. package/dist/types/core/components/ui/theme/theme-collection/light.d.ts.map +1 -0
  767. package/dist/types/core/components/ui/theme/theme.d.ts +20 -0
  768. package/dist/types/core/components/ui/theme/theme.d.ts.map +1 -0
  769. package/dist/types/core/components/ui/toast/message-subscriber.d.ts +19 -0
  770. package/dist/types/core/components/ui/toast/message-subscriber.d.ts.map +1 -0
  771. package/dist/types/core/components/ui/toast/toast-item.d.ts +41 -0
  772. package/dist/types/core/components/ui/toast/toast-item.d.ts.map +1 -0
  773. package/dist/types/core/components/ui/toast/toast.d.ts +28 -0
  774. package/dist/types/core/components/ui/toast/toast.d.ts.map +1 -0
  775. package/dist/types/core/components/ui/toast/types.d.ts +12 -0
  776. package/dist/types/core/components/ui/toast/types.d.ts.map +1 -0
  777. package/dist/types/core/components/ui/tooltip/tooltip.d.ts +21 -0
  778. package/dist/types/core/components/ui/tooltip/tooltip.d.ts.map +1 -0
  779. package/dist/types/core/components/ui/ui.d.ts +35 -0
  780. package/dist/types/core/components/ui/ui.d.ts.map +1 -0
  781. package/dist/types/core/core.d.ts +5 -0
  782. package/dist/types/core/core.d.ts.map +1 -0
  783. package/dist/types/core/decorators/Subscriber.d.ts +13 -0
  784. package/dist/types/core/decorators/Subscriber.d.ts.map +1 -0
  785. package/dist/types/core/decorators/api.d.ts +155 -0
  786. package/dist/types/core/decorators/api.d.ts.map +1 -0
  787. package/dist/types/core/decorators/lifecycle.d.ts +19 -0
  788. package/dist/types/core/decorators/lifecycle.d.ts.map +1 -0
  789. package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts +11 -0
  790. package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts.map +1 -0
  791. package/dist/types/core/decorators/subscriber/autoFill.d.ts +2 -0
  792. package/dist/types/core/decorators/subscriber/autoFill.d.ts.map +1 -0
  793. package/dist/types/core/decorators/subscriber/autoSubscribe.d.ts +2 -0
  794. package/dist/types/core/decorators/subscriber/autoSubscribe.d.ts.map +1 -0
  795. package/dist/types/core/decorators/subscriber/bind.d.ts +28 -0
  796. package/dist/types/core/decorators/subscriber/bind.d.ts.map +1 -0
  797. package/dist/types/core/decorators/subscriber/common.d.ts +14 -0
  798. package/dist/types/core/decorators/subscriber/common.d.ts.map +1 -0
  799. package/dist/types/core/decorators/subscriber/derive.d.ts +30 -0
  800. package/dist/types/core/decorators/subscriber/derive.d.ts.map +1 -0
  801. package/dist/types/core/decorators/subscriber/dynamicPath.d.ts +23 -0
  802. package/dist/types/core/decorators/subscriber/dynamicPath.d.ts.map +1 -0
  803. package/dist/types/core/decorators/subscriber/dynamicPropertyWatch.d.ts +42 -0
  804. package/dist/types/core/decorators/subscriber/dynamicPropertyWatch.d.ts.map +1 -0
  805. package/dist/types/core/decorators/subscriber/handle.d.ts +74 -0
  806. package/dist/types/core/decorators/subscriber/handle.d.ts.map +1 -0
  807. package/dist/types/core/decorators/subscriber/onAssign.d.ts +53 -0
  808. package/dist/types/core/decorators/subscriber/onAssign.d.ts.map +1 -0
  809. package/dist/types/core/decorators/subscriber/publish.d.ts +23 -0
  810. package/dist/types/core/decorators/subscriber/publish.d.ts.map +1 -0
  811. package/dist/types/core/decorators/subscriber/publisherPath.d.ts +3 -0
  812. package/dist/types/core/decorators/subscriber/publisherPath.d.ts.map +1 -0
  813. package/dist/types/core/decorators/subscriber/subscribe.d.ts +20 -0
  814. package/dist/types/core/decorators/subscriber/subscribe.d.ts.map +1 -0
  815. package/dist/types/core/directives/DataProvider.d.ts +45 -0
  816. package/dist/types/core/directives/DataProvider.d.ts.map +1 -0
  817. package/dist/types/core/directives/Wording.d.ts +44 -0
  818. package/dist/types/core/directives/Wording.d.ts.map +1 -0
  819. package/dist/types/core/mixins/Fetcher.d.ts +108 -0
  820. package/dist/types/core/mixins/Fetcher.d.ts.map +1 -0
  821. package/dist/types/core/mixins/FormCheckable.d.ts +95 -0
  822. package/dist/types/core/mixins/FormCheckable.d.ts.map +1 -0
  823. package/dist/types/core/mixins/FormElement.d.ts +37 -0
  824. package/dist/types/core/mixins/FormElement.d.ts.map +1 -0
  825. package/dist/types/core/mixins/FormInput.d.ts +79 -0
  826. package/dist/types/core/mixins/FormInput.d.ts.map +1 -0
  827. package/dist/types/core/mixins/Subscriber.d.ts +38 -0
  828. package/dist/types/core/mixins/Subscriber.d.ts.map +1 -0
  829. package/dist/types/core/mixins/TemplatesContainer.d.ts +14 -0
  830. package/dist/types/core/mixins/TemplatesContainer.d.ts.map +1 -0
  831. package/dist/types/core/mixins/mixins.d.ts +7 -0
  832. package/dist/types/core/mixins/mixins.d.ts.map +1 -0
  833. package/dist/types/core/utils/AncestorAttributeObserver.d.ts +38 -0
  834. package/dist/types/core/utils/AncestorAttributeObserver.d.ts.map +1 -0
  835. package/dist/types/core/utils/Arrays.d.ts +98 -0
  836. package/dist/types/core/utils/Arrays.d.ts.map +1 -0
  837. package/dist/types/core/utils/DataBindObserver.d.ts +84 -0
  838. package/dist/types/core/utils/DataBindObserver.d.ts.map +1 -0
  839. package/dist/types/core/utils/Electron.d.ts +8 -0
  840. package/dist/types/core/utils/Electron.d.ts.map +1 -0
  841. package/dist/types/core/utils/Format.d.ts +13 -0
  842. package/dist/types/core/utils/Format.d.ts.map +1 -0
  843. package/dist/types/core/utils/HTML.d.ts +59 -0
  844. package/dist/types/core/utils/HTML.d.ts.map +1 -0
  845. package/dist/types/core/utils/LocationHandler.d.ts +48 -0
  846. package/dist/types/core/utils/LocationHandler.d.ts.map +1 -0
  847. package/dist/types/core/utils/Objects.d.ts +31 -0
  848. package/dist/types/core/utils/Objects.d.ts.map +1 -0
  849. package/dist/types/core/utils/PublisherProxy.d.ts +230 -0
  850. package/dist/types/core/utils/PublisherProxy.d.ts.map +1 -0
  851. package/dist/types/core/utils/SafariScrollGuard.d.ts +36 -0
  852. package/dist/types/core/utils/SafariScrollGuard.d.ts.map +1 -0
  853. package/dist/types/core/utils/Utils.d.ts +6 -0
  854. package/dist/types/core/utils/Utils.d.ts.map +1 -0
  855. package/dist/types/core/utils/aesCrypto.d.ts +53 -0
  856. package/dist/types/core/utils/aesCrypto.d.ts.map +1 -0
  857. package/dist/types/core/utils/api.d.ts +173 -0
  858. package/dist/types/core/utils/api.d.ts.map +1 -0
  859. package/dist/types/core/utils/dataProviderKey.d.ts +56 -0
  860. package/dist/types/core/utils/dataProviderKey.d.ts.map +1 -0
  861. package/dist/types/core/utils/derive.d.ts +40 -0
  862. package/dist/types/core/utils/derive.d.ts.map +1 -0
  863. package/dist/types/core/utils/endpoint.d.ts +37 -0
  864. package/dist/types/core/utils/endpoint.d.ts.map +1 -0
  865. package/dist/types/core/utils/jsonataHelpers.d.ts +15 -0
  866. package/dist/types/core/utils/jsonataHelpers.d.ts.map +1 -0
  867. package/dist/types/core/utils/jsonataRuntime.d.ts +13 -0
  868. package/dist/types/core/utils/jsonataRuntime.d.ts.map +1 -0
  869. package/dist/types/core/utils/mediaRef.d.ts +53 -0
  870. package/dist/types/core/utils/mediaRef.d.ts.map +1 -0
  871. package/dist/types/core/utils/route.d.ts +41 -0
  872. package/dist/types/core/utils/route.d.ts.map +1 -0
  873. package/dist/types/core/utils/similarity.d.ts +15 -0
  874. package/dist/types/core/utils/similarity.d.ts.map +1 -0
  875. package/dist/types/core/utils/url-pattern.d.ts +3 -0
  876. package/dist/types/core/utils/url-pattern.d.ts.map +1 -0
  877. package/dist/types/dataprovider.d.ts +2 -0
  878. package/dist/types/dataprovider.d.ts.map +1 -0
  879. package/dist/types/decorators.d.ts +30 -0
  880. package/dist/types/decorators.d.ts.map +1 -0
  881. package/dist/types/directives.d.ts +21 -0
  882. package/dist/types/directives.d.ts.map +1 -0
  883. package/dist/types/index.d.ts +8 -0
  884. package/dist/types/index.d.ts.map +1 -0
  885. package/dist/types/mixins.d.ts +204 -0
  886. package/dist/types/mixins.d.ts.map +1 -0
  887. package/dist/types/test-utils/TestUtils.d.ts +4 -0
  888. package/dist/types/test-utils/TestUtils.d.ts.map +1 -0
  889. package/dist/types/utils.d.ts +20 -0
  890. package/dist/types/utils.d.ts.map +1 -0
  891. package/package.json +1792 -382
  892. package/public/docs/hf-samples/beach.jpg +0 -0
  893. package/public/docs/hf-samples/cats.jpg +0 -0
  894. package/public/docs/hf-samples/corgi.jpg +0 -0
  895. package/public/docs/hf-samples/portrait.jpg +0 -0
  896. package/public/docs/hf-samples/scene.jpg +0 -0
  897. package/public/docs/hf-samples/singer.jpg +0 -0
  898. package/public/docs/shader-samples/color.jpg +0 -0
  899. package/public/docs/shader-samples/depth.png +0 -0
  900. package/public/docs/shader-samples/impact.jpg +0 -0
  901. package/public/docs/shader-samples/video.webm +0 -0
  902. package/scripts/build-addons.mjs +26 -0
  903. package/scripts/gen-shader-depth.mjs +85 -0
  904. package/scripts/gen-shader-harris-video.mjs +17 -0
  905. package/scripts/gen-shader-harris-video.py +84 -0
  906. package/scripts/hf-vendor.mjs +154 -0
  907. package/scripts/post-build.mjs +116 -10
  908. package/scripts/pre-build.mjs +119 -36
  909. package/scripts/pre-publish.mjs +76 -54
  910. package/src/addons/3d.ts +5 -0
  911. package/src/addons/hugging-face-infer.ts +11 -0
  912. package/src/addons/shader.ts +5 -0
  913. package/src/addons/webgpu.ts +15 -0
  914. package/src/core/components/functional/3d/3d.md +128 -0
  915. package/src/core/components/functional/3d/3d.spec.ts +171 -0
  916. package/src/core/components/functional/3d/3d.ts +186 -0
  917. package/src/core/components/functional/3d/asset.ts +22 -0
  918. package/src/core/components/functional/3d/boot.ts +77 -0
  919. package/src/core/components/functional/3d/constants.ts +100 -0
  920. package/src/core/components/functional/3d/demo-content.ts +45 -0
  921. package/src/core/components/functional/3d/ensure.ts +99 -0
  922. package/src/core/components/functional/3d/form-bind.ts +40 -0
  923. package/src/core/components/functional/3d/form-fields.ts +80 -0
  924. package/src/core/components/functional/3d/form-params.ts +97 -0
  925. package/src/core/components/functional/3d/frame-capture.spec.ts +72 -0
  926. package/src/core/components/functional/3d/frame-capture.ts +135 -0
  927. package/src/core/components/functional/3d/frame-source.ts +30 -0
  928. package/src/core/components/functional/3d/gl.ts +35 -0
  929. package/src/core/components/functional/3d/life.ts +101 -0
  930. package/src/core/components/functional/3d/load.ts +129 -0
  931. package/src/core/components/functional/3d/ops.ts +126 -0
  932. package/src/core/components/functional/3d/opts.ts +16 -0
  933. package/src/core/components/functional/3d/orbit.ts +185 -0
  934. package/src/core/components/functional/3d/out-publish.ts +140 -0
  935. package/src/core/components/functional/3d/parse.ts +95 -0
  936. package/src/core/components/functional/3d/pick.ts +92 -0
  937. package/src/core/components/functional/3d/playback.ts +70 -0
  938. package/src/core/components/functional/3d/pointer.ts +79 -0
  939. package/src/core/components/functional/3d/props.ts +50 -0
  940. package/src/core/components/functional/3d/publisher-listen.ts +13 -0
  941. package/src/core/components/functional/3d/reload.ts +94 -0
  942. package/src/core/components/functional/3d/runtime.ts +148 -0
  943. package/src/core/components/functional/3d/scene-runtime.ts +9 -0
  944. package/src/core/components/functional/3d/snapshot.ts +73 -0
  945. package/src/core/components/functional/3d/styles.ts +38 -0
  946. package/src/core/components/functional/3d/tune.ts +72 -0
  947. package/src/core/components/functional/3d/types.ts +150 -0
  948. package/src/core/components/functional/3d/updated.ts +70 -0
  949. package/src/core/components/functional/3d/view.ts +63 -0
  950. package/src/core/components/functional/3d/wire.ts +65 -0
  951. package/src/core/components/functional/infer/hugging-face/hf-cache.ts +198 -0
  952. package/src/core/components/functional/infer/hugging-face/hf-config.ts +188 -0
  953. package/src/core/components/functional/infer/hugging-face/hf-controller.spec.ts +350 -0
  954. package/src/core/components/functional/infer/hugging-face/hf-controller.ts +622 -0
  955. package/src/core/components/functional/infer/hugging-face/hf-engine.ts +178 -0
  956. package/src/core/components/functional/infer/hugging-face/hf-input.spec.ts +99 -0
  957. package/src/core/components/functional/infer/hugging-face/hf-input.ts +218 -0
  958. package/src/core/components/functional/infer/hugging-face/hf-protocol.ts +76 -0
  959. package/src/core/components/functional/infer/hugging-face/hf-registry.ts +457 -0
  960. package/src/core/components/functional/infer/hugging-face/hf-schema.spec.ts +124 -0
  961. package/src/core/components/functional/infer/hugging-face/hf-schema.ts +390 -0
  962. package/src/core/components/functional/infer/hugging-face/hf-worker-runtime.spec.ts +147 -0
  963. package/src/core/components/functional/infer/hugging-face/hf-worker-runtime.ts +381 -0
  964. package/src/core/components/functional/infer/hugging-face/hugging-face-infer.md +304 -0
  965. package/src/core/components/functional/infer/hugging-face/hugging-face-infer.ts +202 -0
  966. package/src/core/components/functional/infer/hugging-face/hugging-face.ts +282 -0
  967. package/src/core/components/functional/infer/hugging-face/types.ts +325 -0
  968. package/src/core/components/functional/jsonata/jsonata.md +4 -2
  969. package/src/core/components/functional/sdui/sdui.md +2 -2
  970. package/src/core/components/functional/sdui/sdui.ts +40 -29
  971. package/src/core/components/functional/shader/gl-runtime.ts +963 -0
  972. package/src/core/components/functional/shader/shader.md +209 -0
  973. package/src/core/components/functional/shader/shader.spec.ts +368 -0
  974. package/src/core/components/functional/shader/shader.ts +1624 -0
  975. package/src/core/components/functional/shader/shadertoy-prelude.ts +52 -0
  976. package/src/core/components/functional/shader/types.ts +448 -0
  977. package/src/core/components/functional/webgpu/canvas2d-fallback.ts +125 -0
  978. package/src/core/components/functional/webgpu/form-bind.ts +116 -0
  979. package/src/core/components/functional/webgpu/gl-fallback.ts +158 -0
  980. package/src/core/components/functional/webgpu/gpu-runtime.ts +349 -0
  981. package/src/core/components/functional/webgpu/helpers.ts +47 -0
  982. package/src/core/components/functional/webgpu/out-frame.ts +137 -0
  983. package/src/core/components/functional/webgpu/particles-runtime.ts +426 -0
  984. package/src/core/components/functional/webgpu/pointer.ts +85 -0
  985. package/src/core/components/functional/webgpu/types.ts +96 -0
  986. package/src/core/components/functional/webgpu/webgpu.md +75 -0
  987. package/src/core/components/functional/webgpu/webgpu.spec.ts +141 -0
  988. package/src/core/components/functional/webgpu/webgpu.ts +668 -0
  989. package/src/core/components/functional/webgpu/wgsl-prelude.ts +81 -0
  990. package/src/core/mixins/Fetcher.ts +1 -1
  991. package/src/core/utils/HTML.ts +107 -74
  992. package/src/core/utils/PublisherProxy.ts +29 -6
  993. package/src/core/utils/jsonataHelpers.ts +36 -0
  994. package/src/core/utils/mediaRef.spec.ts +121 -0
  995. package/src/core/utils/mediaRef.ts +193 -0
  996. package/src/core/utils/similarity.spec.ts +34 -0
  997. package/src/core/utils/similarity.ts +54 -0
  998. package/src/docs/_core-concept/dataFlow.md +2 -0
  999. package/src/docs/_getting-started/cdn-addons.md +73 -0
  1000. package/src/docs/_getting-started/create-a-component.md +1 -1
  1001. package/src/docs/_misc/visual-stack.md +65 -0
  1002. package/src/docs/components/docs-demo-sources.ts +373 -39
  1003. package/src/docs/docs.ts +7 -0
  1004. package/src/docs/example/docs-3d-demos.ts +8 -0
  1005. package/src/docs/example/docs-3d-form.ts +95 -0
  1006. package/src/docs/example/docs-3d-orbit.ts +44 -0
  1007. package/src/docs/example/docs-3d-out.ts +56 -0
  1008. package/src/docs/example/docs-3d-shader-live-demo.ts +98 -0
  1009. package/src/docs/example/docs-3d-shared.ts +15 -0
  1010. package/src/docs/example/docs-harris-webgpu-demo.ts +482 -0
  1011. package/src/docs/example/docs-hugging-face-demos.ts +516 -0
  1012. package/src/docs/example/docs-shader-demos.ts +357 -0
  1013. package/src/docs/example/docs-visual-stack-demo.ts +394 -0
  1014. package/src/docs/example/docs-webgpu-demo.ts +77 -0
  1015. package/src/docs/navigation/navigation.ts +25 -0
  1016. package/src/docs/search/docs-search.json +61 -11
  1017. package/src/tsconfig.json +490 -301
  1018. package/src/tsconfig.tsbuildinfo +1 -1
  1019. package/vite/config.js +42 -30
  1020. package/vite.config.mts +51 -12
@@ -0,0 +1,1624 @@
1
+ import { css, html, LitElement } from "lit";
2
+ import { customElement, property, state } from "lit/decorators.js";
3
+ import HTML from "@supersoniks/concorde/core/utils/HTML";
4
+ import { revokeMediaUrls, toMediaUrl, mediaElementKey, lookupLiveElement } from "@supersoniks/concorde/core/utils/mediaRef";
5
+ import { PublisherManager } from "@supersoniks/concorde/utils";
6
+ import {
7
+ parseChannelSource,
8
+ ShaderToyRuntime,
9
+ } from "./gl-runtime";
10
+ import {
11
+ PassChannels,
12
+ ShaderCompileError,
13
+ ShaderExtractItem,
14
+ ShaderExtractOutput,
15
+ ShaderHoverParam,
16
+ ShaderMouseMode,
17
+ ShaderPassId,
18
+ ShaderRoi,
19
+ ShaderSources,
20
+ SonicShaderOutput,
21
+ findPeaks,
22
+ meanRgba,
23
+ parseExtractPass,
24
+ parseHoverParam,
25
+ roiToPixels,
26
+ } from "./types";
27
+
28
+ const tagName = "sonic-shader";
29
+
30
+ const MAX_PATCH_PX = 128;
31
+
32
+ /**
33
+ * Champs méta publiés vers le out-dataProvider.
34
+ * `param0…3` sont exclus du gate « consommateur » : un `sonic-input name="param0"`
35
+ * ne doit pas activer la publication (sinon write-back → reset des champs form).
36
+ */
37
+ const OUT_META_KEYS = [
38
+ "time",
39
+ "frame",
40
+ "mouseX",
41
+ "mouseY",
42
+ "hovering",
43
+ ] as const;
44
+
45
+ const OUT_PARAM_KEYS = ["param0", "param1", "param2", "param3"] as const;
46
+
47
+ /** Champs canaux lisibles depuis dataProvider (string | SonicMediaRef). */
48
+ const CHANNEL_FORM_KEYS = [
49
+ "channel0",
50
+ "channel1",
51
+ "channel2",
52
+ "channel3",
53
+ "imageCh0",
54
+ "imageCh1",
55
+ "imageCh2",
56
+ "imageCh3",
57
+ "bufferACh0",
58
+ "bufferACh1",
59
+ "bufferACh2",
60
+ "bufferACh3",
61
+ "bufferBCh0",
62
+ "bufferBCh1",
63
+ "bufferBCh2",
64
+ "bufferBCh3",
65
+ "bufferCCh0",
66
+ "bufferCCh1",
67
+ "bufferCCh2",
68
+ "bufferCCh3",
69
+ "bufferDCh0",
70
+ "bufferDCh1",
71
+ "bufferDCh2",
72
+ "bufferDCh3",
73
+ ] as const;
74
+
75
+ /** Champs sample (coûteux : readPixels). */
76
+ const OUT_SAMPLE_KEYS = [
77
+ "sampleR",
78
+ "sampleG",
79
+ "sampleB",
80
+ "sampleA",
81
+ "sampleLuma",
82
+ ] as const;
83
+
84
+ const EXTRACT_OUT_KEYS = ["extracts", "extractCount", "extractSeq"] as const;
85
+
86
+ type OutPublisherLike = {
87
+ _proxies_?: Map<string, { hasListener?: () => boolean }>;
88
+ get?: () => Record<string, unknown>;
89
+ };
90
+
91
+ function prefersReducedMotion(): boolean {
92
+ return (
93
+ typeof matchMedia === "function" &&
94
+ matchMedia("(prefers-reduced-motion: reduce)").matches
95
+ );
96
+ }
97
+
98
+ function toNum(v: unknown, fallback: number): number {
99
+ if (typeof v === "number" && Number.isFinite(v)) return v;
100
+ if (typeof v === "string" && v.trim() !== "") {
101
+ const n = Number(v);
102
+ if (Number.isFinite(n)) return n;
103
+ }
104
+ return fallback;
105
+ }
106
+
107
+ /** Valeur canal depuis DP : string (url, buffer-a, #id) | MediaRef → url | { element }. */
108
+ function channelFormValue(value: unknown): string | undefined {
109
+ if (value === null || value === "") return "";
110
+ if (typeof value === "string") return value.trim();
111
+ const url = toMediaUrl(value);
112
+ if (url) return url;
113
+ if (value && typeof value === "object") {
114
+ const el = (value as { element?: unknown }).element;
115
+ const key = mediaElementKey(el);
116
+ if (key) return key;
117
+ return undefined;
118
+ }
119
+ return "";
120
+ }
121
+
122
+ /** Exposé pour tests. */
123
+ export { channelFormValue };
124
+
125
+ function parseRois(value: unknown): ShaderRoi[] {
126
+ if (!Array.isArray(value)) return [];
127
+ const out: ShaderRoi[] = [];
128
+ for (const raw of value) {
129
+ if (!raw || typeof raw !== "object") continue;
130
+ const o = raw as Record<string, unknown>;
131
+ const x = toNum(o.x, NaN);
132
+ const y = toNum(o.y, NaN);
133
+ if (!Number.isFinite(x) || !Number.isFinite(y)) continue;
134
+ const roi: ShaderRoi = { x, y, source: "manual" };
135
+ if (typeof o.id === "string" && o.id) roi.id = o.id;
136
+ if ("w" in o) roi.w = toNum(o.w, 0);
137
+ if ("h" in o) roi.h = toNum(o.h, 0);
138
+ if ("patch" in o) roi.patch = toNum(o.patch, 16);
139
+ out.push(roi);
140
+ }
141
+ return out;
142
+ }
143
+
144
+ const BYTES_PER_PIXEL = 4;
145
+
146
+ async function rgbaToBlobUrl(
147
+ data: Uint8Array,
148
+ width: number,
149
+ height: number,
150
+ ): Promise<string | null> {
151
+ if (typeof document === "undefined" || width < 1 || height < 1) return null;
152
+ try {
153
+ const canvas = document.createElement("canvas");
154
+ canvas.width = width;
155
+ canvas.height = height;
156
+ const ctx = canvas.getContext("2d");
157
+ if (!ctx) return null;
158
+ // WebGL readPixels is bottom-up; flip for canvas display.
159
+ const imageData = ctx.createImageData(width, height);
160
+ const dst = imageData.data;
161
+ for (let y = 0; y < height; y++) {
162
+ const srcRow = (height - 1 - y) * width * BYTES_PER_PIXEL;
163
+ const dstRow = y * width * BYTES_PER_PIXEL;
164
+ for (let i = 0; i < width * BYTES_PER_PIXEL; i++) {
165
+ dst[dstRow + i] = data[srcRow + i];
166
+ }
167
+ }
168
+ ctx.putImageData(imageData, 0, 0);
169
+ const blob = await new Promise<Blob | null>((resolve) => {
170
+ try {
171
+ canvas.toBlob((b) => resolve(b), "image/png");
172
+ } catch {
173
+ resolve(null);
174
+ }
175
+ });
176
+ if (blob) return URL.createObjectURL(blob);
177
+ // Fallback (certs navigateurs / contexts bloquent toBlob)
178
+ const dataUrl = canvas.toDataURL("image/png");
179
+ return dataUrl || null;
180
+ } catch {
181
+ return null;
182
+ }
183
+ }
184
+
185
+ function assignExtractMediaUrls(item: ShaderExtractItem, url: string): void {
186
+ item.blobUrl = url;
187
+ item.url = url;
188
+ }
189
+
190
+ type PendingRoi = ShaderRoi & { score?: number };
191
+
192
+ /**
193
+ * ShaderToy-compatible multipass renderer (Image + Buffer A–D + Common).
194
+ * Opt-in: import `@supersoniks/concorde/shader`.
195
+ *
196
+ * Optional `dataProvider` (attr or ancestor `dataProvider` / `formDataProvider`):
197
+ * maps form fields `param0`…`param3` → uniforms `uParam0`…`uParam3`.
198
+ */
199
+ @customElement(tagName)
200
+ export class SonicShader extends LitElement {
201
+ static styles = css`
202
+ :host {
203
+ display: block;
204
+ position: relative;
205
+ width: 100%;
206
+ max-width: 100%;
207
+ height: auto;
208
+ aspect-ratio: var(--sonic-shader-ar, 16 / 9);
209
+ overflow: hidden;
210
+ background: #0a0a0a;
211
+ color: #f87171;
212
+ font: 12px/1.4 ui-monospace, monospace;
213
+ }
214
+ canvas {
215
+ position: absolute;
216
+ inset: 0;
217
+ width: 100%;
218
+ height: 100%;
219
+ display: block;
220
+ touch-action: none;
221
+ }
222
+ .err {
223
+ position: absolute;
224
+ inset: 0;
225
+ z-index: 1;
226
+ padding: 0.75rem;
227
+ background: rgba(0, 0, 0, 0.85);
228
+ white-space: pre-wrap;
229
+ overflow: auto;
230
+ }
231
+ `;
232
+
233
+ @property() image = "";
234
+ @property({ attribute: "buffer-a" }) bufferA = "";
235
+ @property({ attribute: "buffer-b" }) bufferB = "";
236
+ @property({ attribute: "buffer-c" }) bufferC = "";
237
+ @property({ attribute: "buffer-d" }) bufferD = "";
238
+ @property() common = "";
239
+
240
+ @property() channel0 = "";
241
+ @property() channel1 = "";
242
+ @property() channel2 = "";
243
+ @property() channel3 = "";
244
+
245
+ @property({ attribute: "image-ch0" }) imageCh0 = "";
246
+ @property({ attribute: "image-ch1" }) imageCh1 = "";
247
+ @property({ attribute: "image-ch2" }) imageCh2 = "";
248
+ @property({ attribute: "image-ch3" }) imageCh3 = "";
249
+
250
+ @property({ attribute: "buffer-a-ch0" }) bufferACh0 = "";
251
+ @property({ attribute: "buffer-a-ch1" }) bufferACh1 = "";
252
+ @property({ attribute: "buffer-a-ch2" }) bufferACh2 = "";
253
+ @property({ attribute: "buffer-a-ch3" }) bufferACh3 = "";
254
+
255
+ @property({ attribute: "buffer-b-ch0" }) bufferBCh0 = "";
256
+ @property({ attribute: "buffer-b-ch1" }) bufferBCh1 = "";
257
+ @property({ attribute: "buffer-b-ch2" }) bufferBCh2 = "";
258
+ @property({ attribute: "buffer-b-ch3" }) bufferBCh3 = "";
259
+
260
+ @property({ attribute: "buffer-c-ch0" }) bufferCCh0 = "";
261
+ @property({ attribute: "buffer-c-ch1" }) bufferCCh1 = "";
262
+ @property({ attribute: "buffer-c-ch2" }) bufferCCh2 = "";
263
+ @property({ attribute: "buffer-c-ch3" }) bufferCCh3 = "";
264
+
265
+ @property({ attribute: "buffer-d-ch0" }) bufferDCh0 = "";
266
+ @property({ attribute: "buffer-d-ch1" }) bufferDCh1 = "";
267
+ @property({ attribute: "buffer-d-ch2" }) bufferDCh2 = "";
268
+ @property({ attribute: "buffer-d-ch3" }) bufferDCh3 = "";
269
+
270
+ @property({ type: Boolean, reflect: true }) play = true;
271
+ /**
272
+ * N’anime que pendant le hover (ou tant que le param hover n’a pas fini
273
+ * sa transition). Utile avec beaucoup d’instances.
274
+ */
275
+ @property({ type: Boolean, attribute: "play-on-hover" }) playOnHover = false;
276
+ @property({ type: Boolean }) mouse = true;
277
+ /**
278
+ * `direct` — `iMouse.xy` = pointeur (ShaderToy).
279
+ * `target` — le pointeur est une cible ; `iMouse.xy` suit (vitesse ∝ distance).
280
+ */
281
+ @property({ type: String, attribute: "mouse-mode" })
282
+ mouseMode: ShaderMouseMode = "direct";
283
+ /**
284
+ * Vitesse de poursuite en mode `target` (1/s). Plus haut = plus snappy.
285
+ * Déplacement ≈ `(cible − pos) * (1 − e^(−speed·dt))`.
286
+ */
287
+ @property({ type: Number, attribute: "mouse-speed" }) mouseSpeed = 8;
288
+ /**
289
+ * Anime `uParamN` au rollover / roll-out (0↔1). Ex. `hover-param="0"` ou `"param0"`.
290
+ * Le shader lit `uParamN` pour mixer l’effet on/off.
291
+ */
292
+ @property({ attribute: "hover-param" }) hoverParam: ShaderHoverParam | string =
293
+ "";
294
+ /** Vitesse d’easing hover on/off (1/s, défaut 10). */
295
+ @property({ type: Number, attribute: "hover-speed" }) hoverSpeed = 10;
296
+ /**
297
+ * Libère le contexte WebGL hors viewport (défaut true).
298
+ * Les navigateurs limitent ~8–16 contextes.
299
+ */
300
+ @property({ type: Boolean, attribute: "release-offscreen" })
301
+ releaseOffscreen = true;
302
+ @property({ type: Number, attribute: "dpr-max" }) dprMax = 2;
303
+
304
+ /** Generic float uniforms `uParam0`…`uParam3` (no shader rebuild). */
305
+ @property({ type: Number, attribute: "param0" }) param0 = 0;
306
+ @property({ type: Number, attribute: "param1" }) param1 = 0;
307
+ @property({ type: Number, attribute: "param2" }) param2 = 0;
308
+ @property({ type: Number, attribute: "param3" }) param3 = 0;
309
+
310
+ /**
311
+ * Publisher id. Fields `param0`…`param3` feed `uParam0`…`uParam3`.
312
+ * Falls back to ancestor `dataProvider` or `formDataProvider` when unset.
313
+ * Also used as default out publisher (see `outDataProvider`).
314
+ */
315
+ @property({ type: String })
316
+ dataProvider = "";
317
+
318
+ /**
319
+ * Publisher de sortie. Défaut : même id que `dataProvider` / ancêtre.
320
+ * Écrit mouseX/Y, hovering, frame (+ sample* si `sample`).
321
+ * Sur DP partagé form+out : ne réécrit pas param0…3 (sauf slot hover-param).
322
+ * Paresseux : pas de set / readPixels sans lecteur méta/sample ni listener `out`.
323
+ */
324
+ @property({ type: String, attribute: "out-data-provider" })
325
+ outDataProvider = "";
326
+
327
+ /**
328
+ * Active le sample couleur → sampleR/G/B/A + sampleLuma.
329
+ * `readPixels` uniquement s’il y a un consommateur out (DP ou event `out`).
330
+ */
331
+ @property({ type: Boolean }) sample = false;
332
+
333
+ /** Intervalle de publication / event `out` (ms, défaut 80). */
334
+ @property({ type: Number, attribute: "out-interval" }) outInterval = 80;
335
+
336
+ /** Active l’extraction de patches / singularités. */
337
+ @property({ type: Boolean }) extract = false;
338
+ /** Throttle extract ms (défaut = `out-interval` ou 100). */
339
+ @property({ type: Number, attribute: "extract-interval" })
340
+ extractInterval = 0;
341
+ /** Pass où lire les pixels couleur : `image` \| `buffer-a`… */
342
+ @property({ type: String, attribute: "extract-source" })
343
+ extractSource = "image";
344
+ /** Pass mask pour détection : `none` \| `buffer-a`… */
345
+ @property({ type: String, attribute: "extract-mask" })
346
+ extractMask = "none";
347
+ /** Seuil 0–1 sur le mask (défaut 0.5). */
348
+ @property({ type: Number, attribute: "extract-threshold" })
349
+ extractThreshold = 0.5;
350
+ /** Cap N items détectés (défaut 8). */
351
+ @property({ type: Number, attribute: "extract-max" }) extractMax = 8;
352
+ /** Taille patch px par défaut pour un point (défaut 16). */
353
+ @property({ type: Number, attribute: "extract-patch" }) extractPatch = 16;
354
+ /** Génère des blob URLs par item. */
355
+ @property({ type: Boolean, attribute: "extract-bitmaps" })
356
+ extractBitmaps = false;
357
+ /** Publisher dédié extract (défaut = out / dataProvider). */
358
+ @property({ type: String, attribute: "extract-data-provider" })
359
+ extractDataProvider = "";
360
+
361
+ /**
362
+ * Force CSS aspect-ratio (e.g. `"16/9"`, `"1"`).
363
+ * When empty, uses channel0 (or first texture) dimensions.
364
+ */
365
+ @property({ type: String, attribute: "aspect-ratio" })
366
+ aspectRatio = "";
367
+
368
+ @state() private errorMessage = "";
369
+
370
+ private runtime: ShaderToyRuntime | null = null;
371
+ private raf = 0;
372
+ private startTime = 0;
373
+ private lastTime = 0;
374
+ private frame = 0;
375
+ /** Incrémenté après chaque render (contrat SonicFrameSource). */
376
+ frameSeq = 0;
377
+ private mouseVec: [number, number, number, number] = [0, 0, 0, 0];
378
+ /** Cible pointeur (px drawing buffer, origine bas-gauche). */
379
+ private mouseTarget: [number, number] = [0, 0];
380
+ /** Position suivie → `iMouse.xy` en mode target. */
381
+ private mouseFollow: [number, number] = [0, 0];
382
+ private mouseHasPointer = false;
383
+ private pointerDown = false;
384
+ private hovering = false;
385
+ private hoverGoal = 0;
386
+ /**
387
+ * Valeur easée 0↔1 pour le slot `hover-param`.
388
+ * Privée (pas une @property) pour éviter un requestUpdate Lit à chaque frame
389
+ * — sinon re-renders / write-back dataProvider → enter/leave en boucle.
390
+ */
391
+ private hoverMix = 0;
392
+ private leaveRaf = 0;
393
+ /** Compteur d’écouteurs `out` (publication paresseuse). */
394
+ private outEventListeners = 0;
395
+ /** Compteur d’écouteurs `extract`. */
396
+ private extractEventListeners = 0;
397
+ private releasing = false;
398
+ private inView = true;
399
+ private resizeObserver: ResizeObserver | null = null;
400
+ private intersectionObserver: IntersectionObserver | null = null;
401
+ private rebuildToken = 0;
402
+ private ready = false;
403
+ private formPublisher: ReturnType<typeof PublisherManager.get> | null = null;
404
+ private outPublisher: ReturnType<typeof PublisherManager.get> | null = null;
405
+ private extractPublisher: ReturnType<typeof PublisherManager.get> | null =
406
+ null;
407
+ private lastOutAt = 0;
408
+ private lastExtractAt = 0;
409
+ private manualRois: ShaderRoi[] = [];
410
+ private lastBlobUrls: string[] = [];
411
+ private pendingRevokeUrls: string[] = [];
412
+ private extractRunning = false;
413
+ private extractSeq = 0;
414
+ private onFormMutation = () => {
415
+ const data = (this.formPublisher?.get() ?? {}) as Record<string, unknown>;
416
+ this.applyFormParams(data);
417
+ };
418
+
419
+ connectedCallback() {
420
+ super.connectedCallback();
421
+ this.addEventListener("pointermove", this.onPointerMove as EventListener);
422
+ this.addEventListener("pointerdown", this.onPointerDown as EventListener);
423
+ this.addEventListener("pointerup", this.onPointerUp as EventListener);
424
+ this.addEventListener("pointerleave", this.onPointerLeave);
425
+ this.addEventListener("pointerenter", this.onPointerEnter);
426
+ this.bindFormProvider();
427
+ this.bindOutPublisher();
428
+ this.bindExtractPublisher();
429
+ }
430
+
431
+ /**
432
+ * Suit les listeners `out` / `extract` pour ne publier (et ne readPixels)
433
+ * que s’il y a un consommateur — zéro coût tant que personne ne lit.
434
+ */
435
+ override addEventListener(
436
+ type: string,
437
+ listener: EventListenerOrEventListenerObject | null,
438
+ options?: boolean | AddEventListenerOptions,
439
+ ): void {
440
+ if (type === "out" && listener) this.outEventListeners++;
441
+ if (type === "extract" && listener) this.extractEventListeners++;
442
+ super.addEventListener(type, listener as never, options);
443
+ }
444
+
445
+ override removeEventListener(
446
+ type: string,
447
+ listener: EventListenerOrEventListenerObject | null,
448
+ options?: boolean | EventListenerOptions,
449
+ ): void {
450
+ if (type === "out" && listener) {
451
+ this.outEventListeners = Math.max(0, this.outEventListeners - 1);
452
+ }
453
+ if (type === "extract" && listener) {
454
+ this.extractEventListeners = Math.max(0, this.extractEventListeners - 1);
455
+ }
456
+ super.removeEventListener(type, listener as never, options);
457
+ }
458
+
459
+ disconnectedCallback() {
460
+ super.disconnectedCallback();
461
+ this.removeEventListener("pointermove", this.onPointerMove as EventListener);
462
+ this.removeEventListener("pointerdown", this.onPointerDown as EventListener);
463
+ this.removeEventListener("pointerup", this.onPointerUp as EventListener);
464
+ this.removeEventListener("pointerleave", this.onPointerLeave);
465
+ this.removeEventListener("pointerenter", this.onPointerEnter);
466
+ if (this.leaveRaf) {
467
+ cancelAnimationFrame(this.leaveRaf);
468
+ this.leaveRaf = 0;
469
+ }
470
+ this.unbindFormProvider();
471
+ this.unbindContextEvents();
472
+ this.revokeBlobUrls();
473
+ for (const url of this.pendingRevokeUrls) {
474
+ try {
475
+ URL.revokeObjectURL(url);
476
+ } catch {
477
+ /* ignore */
478
+ }
479
+ }
480
+ this.pendingRevokeUrls = [];
481
+ this.stopLoop();
482
+ this.resizeObserver?.disconnect();
483
+ this.intersectionObserver?.disconnect();
484
+ this.rebuildToken++;
485
+ this.ready = false;
486
+ this.releasing = true;
487
+ this.runtime?.dispose(true); // libère le slot navigateur
488
+ this.runtime = null;
489
+ this.outPublisher = null;
490
+ this.releasing = false;
491
+ }
492
+
493
+ protected firstUpdated() {
494
+ this.resizeObserver = new ResizeObserver(() => this.syncSize());
495
+ this.resizeObserver.observe(this);
496
+ this.intersectionObserver = new IntersectionObserver(
497
+ (entries) => {
498
+ this.inView = entries.some((e) => e.isIntersecting);
499
+ this.syncVisibility();
500
+ },
501
+ { threshold: 0 },
502
+ );
503
+ this.intersectionObserver.observe(this);
504
+ this.bindFormProvider();
505
+ this.bindOutPublisher();
506
+ this.bindExtractPublisher();
507
+ requestAnimationFrame(() => {
508
+ if (this.inView || !this.releaseOffscreen) {
509
+ void this.ensureRuntime();
510
+ }
511
+ });
512
+ }
513
+
514
+ protected updated(changed: Map<string, unknown>) {
515
+ if (!this.runtime) return;
516
+ const shaderKeys = [
517
+ "image",
518
+ "bufferA",
519
+ "bufferB",
520
+ "bufferC",
521
+ "bufferD",
522
+ "common",
523
+ "channel0",
524
+ "channel1",
525
+ "channel2",
526
+ "channel3",
527
+ "imageCh0",
528
+ "imageCh1",
529
+ "imageCh2",
530
+ "imageCh3",
531
+ "bufferACh0",
532
+ "bufferACh1",
533
+ "bufferACh2",
534
+ "bufferACh3",
535
+ "bufferBCh0",
536
+ "bufferBCh1",
537
+ "bufferBCh2",
538
+ "bufferBCh3",
539
+ "bufferCCh0",
540
+ "bufferCCh1",
541
+ "bufferCCh2",
542
+ "bufferCCh3",
543
+ "bufferDCh0",
544
+ "bufferDCh1",
545
+ "bufferDCh2",
546
+ "bufferDCh3",
547
+ ];
548
+ if (shaderKeys.some((k) => changed.has(k))) {
549
+ void this.rebuild();
550
+ }
551
+ if (changed.has("play")) {
552
+ this.syncPlayback();
553
+ }
554
+ if (
555
+ changed.has("dataProvider") ||
556
+ changed.has("outDataProvider") ||
557
+ changed.has("extractDataProvider")
558
+ ) {
559
+ this.bindFormProvider();
560
+ this.bindOutPublisher();
561
+ this.bindExtractPublisher();
562
+ }
563
+ if (changed.has("aspectRatio")) {
564
+ this.applyAspectRatio();
565
+ }
566
+ }
567
+
568
+ private applyAspectRatio(textureUrl?: string) {
569
+ const forced = this.aspectRatio.trim();
570
+ if (forced) {
571
+ this.style.setProperty(
572
+ "--sonic-shader-ar",
573
+ forced.includes("/") ? forced : forced.replace(":", " / "),
574
+ );
575
+ return;
576
+ }
577
+ const url = textureUrl || this.channel0;
578
+ const size = url ? this.runtime?.getTextureSize(url) : null;
579
+ if (size) {
580
+ this.style.setProperty(
581
+ "--sonic-shader-ar",
582
+ `${size.width} / ${size.height}`,
583
+ );
584
+ return;
585
+ }
586
+ this.style.removeProperty("--sonic-shader-ar");
587
+ }
588
+
589
+ private resolveFormProviderId(): string {
590
+ const own = this.dataProvider?.trim();
591
+ if (own) return own;
592
+ return (
593
+ HTML.getAncestorAttributeValue(this, "dataProvider") ||
594
+ HTML.getAncestorAttributeValue(this, "formDataProvider") ||
595
+ ""
596
+ );
597
+ }
598
+
599
+ private unbindFormProvider() {
600
+ if (this.formPublisher) {
601
+ // Nested form fields (sonic-input) mutate children — root onAssign
602
+ // does not fire; onInternalMutation does.
603
+ this.formPublisher.offInternalMutation(this.onFormMutation);
604
+ this.formPublisher = null;
605
+ }
606
+ }
607
+
608
+ private bindFormProvider() {
609
+ this.unbindFormProvider();
610
+ const id = this.resolveFormProviderId();
611
+ if (!id) return;
612
+ this.formPublisher = PublisherManager.get(id);
613
+ this.formPublisher.onInternalMutation(this.onFormMutation);
614
+ this.onFormMutation();
615
+ }
616
+
617
+ private resolveOutProviderId(): string {
618
+ const own = this.outDataProvider?.trim();
619
+ if (own) return own;
620
+ return this.resolveFormProviderId();
621
+ }
622
+
623
+ private bindOutPublisher() {
624
+ const id = this.resolveOutProviderId();
625
+ this.outPublisher = id ? PublisherManager.get(id) : null;
626
+ }
627
+
628
+ private resolveExtractProviderId(): string {
629
+ const own = this.extractDataProvider?.trim();
630
+ if (own) return own;
631
+ return this.resolveOutProviderId();
632
+ }
633
+
634
+ private bindExtractPublisher() {
635
+ const id = this.resolveExtractProviderId();
636
+ this.extractPublisher = id ? PublisherManager.get(id) : null;
637
+ }
638
+
639
+ private applyFormParams(value: unknown) {
640
+ const data =
641
+ value && typeof value === "object"
642
+ ? (value as Record<string, unknown>)
643
+ : {};
644
+ // Le slot hover-param est piloté en interne : ne pas le réécrire depuis le
645
+ // publisher (évite la boucle out → mutation → param ↔ hoverGoal).
646
+ const hoverSlot = parseHoverParam(this.hoverParam);
647
+ if (hoverSlot !== 0) this.param0 = toNum(data.param0, this.param0);
648
+ if (hoverSlot !== 1) this.param1 = toNum(data.param1, this.param1);
649
+ if (hoverSlot !== 2) this.param2 = toNum(data.param2, this.param2);
650
+ if (hoverSlot !== 3) this.param3 = toNum(data.param3, this.param3);
651
+ if ("mouseSpeed" in data) {
652
+ this.mouseSpeed = toNum(data.mouseSpeed, this.mouseSpeed);
653
+ }
654
+ if ("hoverSpeed" in data) {
655
+ this.hoverSpeed = toNum(data.hoverSpeed, this.hoverSpeed);
656
+ }
657
+ if ("extractThreshold" in data) {
658
+ this.extractThreshold = toNum(data.extractThreshold, this.extractThreshold);
659
+ }
660
+ if ("extractMax" in data) {
661
+ this.extractMax = toNum(data.extractMax, this.extractMax);
662
+ }
663
+ if ("extractPatch" in data) {
664
+ this.extractPatch = toNum(data.extractPatch, this.extractPatch);
665
+ }
666
+ if ("rois" in data) {
667
+ this.manualRois = parseRois(data.rois);
668
+ }
669
+ for (const key of CHANNEL_FORM_KEYS) {
670
+ if (!(key in data)) continue;
671
+ const next = channelFormValue(data[key]);
672
+ if (next === undefined) continue;
673
+ if ((this as unknown as Record<string, string>)[key] !== next) {
674
+ (this as unknown as Record<string, string>)[key] = next;
675
+ }
676
+ }
677
+ }
678
+
679
+ /** Params GPU : remplace le slot `hover-param` par `hoverMix`. */
680
+ private effectiveParams(): [number, number, number, number] {
681
+ const params: [number, number, number, number] = [
682
+ this.param0,
683
+ this.param1,
684
+ this.param2,
685
+ this.param3,
686
+ ];
687
+ const slot = parseHoverParam(this.hoverParam);
688
+ if (slot !== null) params[slot] = this.hoverMix;
689
+ return params;
690
+ }
691
+
692
+ /**
693
+ * Hors viewport : libère textures / FBO / programmes, **sans** loseContext
694
+ * (sinon le même canvas ne peut plus compiler au retour).
695
+ * Le slot navigateur est libéré au disconnect (`dispose(true)`).
696
+ */
697
+ private releaseRuntime() {
698
+ this.rebuildToken++;
699
+ this.stopLoop();
700
+ this.ready = false;
701
+ this.releasing = true;
702
+ this.unbindContextEvents();
703
+ this.runtime?.dispose(false);
704
+ this.runtime = null;
705
+ this.releasing = false;
706
+ }
707
+
708
+ private getCanvas(): HTMLCanvasElement | null {
709
+ return (
710
+ (this.renderRoot?.querySelector("canvas") as HTMLCanvasElement | null) ??
711
+ null
712
+ );
713
+ }
714
+
715
+ /** Contrat SonicFrameSource — canvas lisible pour un autre sonic-shader. */
716
+ getFrameCanvas(): HTMLCanvasElement | null {
717
+ if (!this.ready || !this.runtime || this.runtime.isLost) return null;
718
+ return this.getCanvas();
719
+ }
720
+
721
+ /** Résout `#id` dans getRootNode() puis document ; clés live `__sonic_frame_`. */
722
+ private lookupElement(key: string): Element | null {
723
+ if (!key.startsWith("#")) return null;
724
+ const live = lookupLiveElement(key);
725
+ if (live) return live;
726
+ const id = key.slice(1);
727
+ if (!id || id.startsWith("__sonic_frame_")) return null;
728
+ const root = this.getRootNode();
729
+ if (root instanceof Document || root instanceof ShadowRoot) {
730
+ const el = root.getElementById(id);
731
+ if (el) return el;
732
+ }
733
+ return typeof document !== "undefined" ? document.getElementById(id) : null;
734
+ }
735
+
736
+ private bindContextEvents() {
737
+ const canvas = this.getCanvas();
738
+ canvas?.addEventListener("webglcontextlost", this.onContextLost);
739
+ canvas?.addEventListener("webglcontextrestored", this.onContextRestored);
740
+ }
741
+
742
+ private unbindContextEvents() {
743
+ const canvas = this.getCanvas();
744
+ canvas?.removeEventListener("webglcontextlost", this.onContextLost);
745
+ canvas?.removeEventListener(
746
+ "webglcontextrestored",
747
+ this.onContextRestored,
748
+ );
749
+ }
750
+
751
+ private onContextLost = (e: Event) => {
752
+ e.preventDefault();
753
+ if (this.releasing) return;
754
+ this.rebuildToken++;
755
+ this.stopLoop();
756
+ this.ready = false;
757
+ this.runtime = null;
758
+ };
759
+
760
+ private onContextRestored = () => {
761
+ if (this.releasing || !this.inView) return;
762
+ void this.ensureRuntime();
763
+ };
764
+
765
+ private async ensureRuntime() {
766
+ if (this.runtime && !this.runtime.isLost) return;
767
+ this.runtime = null;
768
+ await this.updateComplete;
769
+ if (!this.isConnected || (!this.inView && this.releaseOffscreen)) return;
770
+
771
+ const canvas = this.getCanvas();
772
+ if (!canvas) return;
773
+
774
+ try {
775
+ this.errorMessage = "";
776
+ this.runtime = new ShaderToyRuntime(canvas);
777
+ this.runtime.setElementResolver((key) => this.lookupElement(key));
778
+ this.bindContextEvents();
779
+ this.syncSize();
780
+ await this.rebuild();
781
+ } catch (err) {
782
+ this.emitError(err);
783
+ }
784
+ }
785
+
786
+ private syncVisibility() {
787
+ if (!this.inView && this.releaseOffscreen) {
788
+ this.releaseRuntime();
789
+ return;
790
+ }
791
+ if (this.inView && (!this.runtime || this.runtime.isLost)) {
792
+ void this.ensureRuntime();
793
+ return;
794
+ }
795
+ this.syncPlayback();
796
+ }
797
+
798
+ private syncSize() {
799
+ if (!this.runtime) return;
800
+ const rect = this.getBoundingClientRect();
801
+ const cssW = Math.max(rect.width, this.clientWidth, 1);
802
+ const cssH = Math.max(rect.height, this.clientHeight, 1);
803
+ const dpr = Math.min(window.devicePixelRatio || 1, this.dprMax);
804
+ this.runtime.resize(cssW * dpr, cssH * dpr);
805
+ if (this.ready) {
806
+ this.drawFrame(performance.now());
807
+ }
808
+ }
809
+
810
+ private buildChannels(pass: ShaderPassId): PassChannels {
811
+ const fallbacks = [
812
+ this.channel0,
813
+ this.channel1,
814
+ this.channel2,
815
+ this.channel3,
816
+ ];
817
+ const overrides: (string | undefined)[] =
818
+ pass === "image"
819
+ ? [this.imageCh0, this.imageCh1, this.imageCh2, this.imageCh3]
820
+ : pass === "bufferA"
821
+ ? [
822
+ this.bufferACh0,
823
+ this.bufferACh1,
824
+ this.bufferACh2,
825
+ this.bufferACh3,
826
+ ]
827
+ : pass === "bufferB"
828
+ ? [
829
+ this.bufferBCh0,
830
+ this.bufferBCh1,
831
+ this.bufferBCh2,
832
+ this.bufferBCh3,
833
+ ]
834
+ : pass === "bufferC"
835
+ ? [
836
+ this.bufferCCh0,
837
+ this.bufferCCh1,
838
+ this.bufferCCh2,
839
+ this.bufferCCh3,
840
+ ]
841
+ : [
842
+ this.bufferDCh0,
843
+ this.bufferDCh1,
844
+ this.bufferDCh2,
845
+ this.bufferDCh3,
846
+ ];
847
+ return [0, 1, 2, 3].map((i) =>
848
+ parseChannelSource(overrides[i], fallbacks[i]),
849
+ ) as PassChannels;
850
+ }
851
+
852
+ private collectUrls(channels: Map<ShaderPassId, PassChannels>): string[] {
853
+ const urls: string[] = [];
854
+ for (const chs of channels.values()) {
855
+ for (const c of chs) {
856
+ if (c.kind === "url") urls.push(c.url);
857
+ }
858
+ }
859
+ return urls;
860
+ }
861
+
862
+ private collectElementKeys(
863
+ channels: Map<ShaderPassId, PassChannels>,
864
+ ): string[] {
865
+ const keys: string[] = [];
866
+ for (const chs of channels.values()) {
867
+ for (const c of chs) {
868
+ if (c.kind === "element") keys.push(c.key);
869
+ }
870
+ }
871
+ return [...new Set(keys)];
872
+ }
873
+
874
+ private async rebuild() {
875
+ if (!this.runtime || this.runtime.isLost || !this.image.trim()) return;
876
+ const token = ++this.rebuildToken;
877
+ this.errorMessage = "";
878
+ const sources: ShaderSources = {
879
+ common: this.common,
880
+ image: this.image,
881
+ bufferA: this.bufferA,
882
+ bufferB: this.bufferB,
883
+ bufferC: this.bufferC,
884
+ bufferD: this.bufferD,
885
+ };
886
+ const channels = new Map<ShaderPassId, PassChannels>();
887
+ for (const pass of [
888
+ "bufferA",
889
+ "bufferB",
890
+ "bufferC",
891
+ "bufferD",
892
+ "image",
893
+ ] as ShaderPassId[]) {
894
+ channels.set(pass, this.buildChannels(pass));
895
+ }
896
+ try {
897
+ this.syncSize();
898
+ const urls = this.collectUrls(channels);
899
+ await this.runtime.ensureTextures(urls);
900
+ for (const key of this.collectElementKeys(channels)) {
901
+ this.runtime.ensureElementTexture(key);
902
+ }
903
+ if (token !== this.rebuildToken || !this.runtime || this.runtime.isLost) {
904
+ return;
905
+ }
906
+ const aspectHint =
907
+ this.channel0.startsWith("#") ? "" : this.channel0 || urls[0];
908
+ this.applyAspectRatio(aspectHint);
909
+ this.syncSize();
910
+ this.runtime.setSources(sources, channels);
911
+ if (token !== this.rebuildToken || !this.runtime || this.runtime.isLost) {
912
+ return;
913
+ }
914
+ this.ready = true;
915
+ this.startTime = performance.now();
916
+ this.lastTime = this.startTime;
917
+ this.frame = 0;
918
+ this.drawFrame(this.startTime);
919
+ this.syncPlayback();
920
+ } catch (err) {
921
+ if (token !== this.rebuildToken) return;
922
+ this.ready = false;
923
+ this.stopLoop();
924
+ this.emitError(err);
925
+ }
926
+ }
927
+
928
+ private emitError(err: unknown) {
929
+ const message =
930
+ err instanceof ShaderCompileError
931
+ ? err.message
932
+ : err instanceof Error
933
+ ? err.message
934
+ : String(err);
935
+ this.errorMessage = message;
936
+ this.dispatchEvent(
937
+ new CustomEvent("error", {
938
+ detail: {
939
+ message,
940
+ pass: err instanceof ShaderCompileError ? err.pass : undefined,
941
+ infoLog: err instanceof ShaderCompileError ? err.infoLog : undefined,
942
+ },
943
+ bubbles: true,
944
+ composed: true,
945
+ }),
946
+ );
947
+ }
948
+
949
+ private shouldAnimate(): boolean {
950
+ if (
951
+ !this.play ||
952
+ !this.ready ||
953
+ !this.inView ||
954
+ prefersReducedMotion() ||
955
+ !this.runtime
956
+ ) {
957
+ return false;
958
+ }
959
+ if (this.playOnHover) {
960
+ return this.hovering || !this.hoverSettled();
961
+ }
962
+ return true;
963
+ }
964
+
965
+ private hoverSettled(): boolean {
966
+ if (parseHoverParam(this.hoverParam) === null) return true;
967
+ return Math.abs(this.hoverMix - this.hoverGoal) < 0.002;
968
+ }
969
+
970
+ private syncPlayback() {
971
+ if (this.shouldAnimate()) {
972
+ this.runtime?.setVideosPlaying(true);
973
+ if (!this.raf) {
974
+ this.lastTime = performance.now();
975
+ this.loop();
976
+ }
977
+ } else {
978
+ this.stopLoop();
979
+ this.runtime?.setVideosPlaying(false);
980
+ if (this.ready) this.drawFrame(performance.now());
981
+ }
982
+ }
983
+
984
+ private loop = () => {
985
+ this.raf = requestAnimationFrame(this.loop);
986
+ this.drawFrame(performance.now());
987
+ // play-on-hover : arrêter une fois la transition terminée
988
+ if (this.playOnHover && !this.hovering && this.hoverSettled()) {
989
+ this.stopLoop();
990
+ this.runtime?.setVideosPlaying(false);
991
+ }
992
+ };
993
+
994
+ private stopLoop() {
995
+ if (this.raf) {
996
+ cancelAnimationFrame(this.raf);
997
+ this.raf = 0;
998
+ }
999
+ }
1000
+
1001
+ private drawFrame(now: number) {
1002
+ if (!this.runtime || !this.ready) return;
1003
+ const time = (now - this.startTime) / 1000;
1004
+ const timeDelta = Math.max(0, (now - this.lastTime) / 1000);
1005
+ this.lastTime = now;
1006
+ this.advanceMouseFollow(timeDelta);
1007
+ this.advanceHover(timeDelta);
1008
+ const params = this.effectiveParams();
1009
+ this.runtime.render({
1010
+ time,
1011
+ timeDelta,
1012
+ frame: this.frame++,
1013
+ mouse: this.mouseVec,
1014
+ params,
1015
+ });
1016
+ this.frameSeq++;
1017
+ this.maybePublishOut(now, time, params);
1018
+ void this.maybeExtract(now, time);
1019
+ }
1020
+
1021
+ private round3(n: number): number {
1022
+ return Math.round(n * 1000) / 1000;
1023
+ }
1024
+
1025
+ private buildOutput(
1026
+ time: number,
1027
+ params?: [number, number, number, number],
1028
+ wantSample = false,
1029
+ ): SonicShaderOutput {
1030
+ const { width, height } = this.runtime?.size ?? { width: 1, height: 1 };
1031
+ const hasPtr = this.mouseHasPointer;
1032
+ const mx = hasPtr && width > 0 ? this.mouseVec[0] / width : 0.5;
1033
+ const my = hasPtr && height > 0 ? this.mouseVec[1] / height : 0.5;
1034
+ const p = params ?? this.effectiveParams();
1035
+ const out: SonicShaderOutput = {
1036
+ time: this.round3(time),
1037
+ frame: this.frame,
1038
+ mouseX: this.round3(mx),
1039
+ mouseY: this.round3(my),
1040
+ hovering: this.hovering ? 1 : 0,
1041
+ param0: this.round3(p[0]),
1042
+ param1: this.round3(p[1]),
1043
+ param2: this.round3(p[2]),
1044
+ param3: this.round3(p[3]),
1045
+ };
1046
+ if (wantSample && this.runtime) {
1047
+ const sx = hasPtr ? this.mouseVec[0] : width * 0.5;
1048
+ const sy = hasPtr ? this.mouseVec[1] : height * 0.5;
1049
+ const [r8, g8, b8, a8] = this.runtime.readPixel(sx, sy);
1050
+ const r = r8 / 255;
1051
+ const g = g8 / 255;
1052
+ const b = b8 / 255;
1053
+ const a = a8 / 255;
1054
+ out.sampleR = this.round3(r);
1055
+ out.sampleG = this.round3(g);
1056
+ out.sampleB = this.round3(b);
1057
+ out.sampleA = this.round3(a);
1058
+ out.sampleLuma = this.round3(0.2126 * r + 0.7152 * g + 0.0722 * b);
1059
+ }
1060
+ return out;
1061
+ }
1062
+
1063
+ /** Un champ out du publisher a-t-il un listener (sonic-value, @subscribe…) ? */
1064
+ private publisherFieldHasListener(key: string): boolean {
1065
+ const pub = this.outPublisher as OutPublisherLike | null;
1066
+ const child = pub?._proxies_?.get(key);
1067
+ return !!child?.hasListener?.();
1068
+ }
1069
+
1070
+ /**
1071
+ * Publication paresseuse : uniquement s’il y a un event `out` ou un lecteur
1072
+ * DP sur un champ de sortie. Sinon aucun coût (pas de set, pas de readPixels).
1073
+ */
1074
+ private hasOutConsumers(): boolean {
1075
+ if (this.outEventListeners > 0) return true;
1076
+ if (!this.outPublisher) return false;
1077
+ for (const key of OUT_META_KEYS) {
1078
+ if (this.publisherFieldHasListener(key)) return true;
1079
+ }
1080
+ for (const key of OUT_SAMPLE_KEYS) {
1081
+ if (this.publisherFieldHasListener(key)) return true;
1082
+ }
1083
+ return false;
1084
+ }
1085
+
1086
+ /**
1087
+ * Même DP pour form (entrée param*) et out : ne pas réécrire les params
1088
+ * pilotés par le formulaire (sinon sortie viewport / hoverMix → champs à 0).
1089
+ * Seul le slot `hover-param` reste écrit (piloté par le shader).
1090
+ */
1091
+ private shouldSkipParamOutWrite(key: string): boolean {
1092
+ if (!(OUT_PARAM_KEYS as readonly string[]).includes(key)) return false;
1093
+ if (!this.formPublisher || this.formPublisher !== this.outPublisher) {
1094
+ return false;
1095
+ }
1096
+ const slot = parseHoverParam(this.hoverParam);
1097
+ if (slot === null) return true;
1098
+ return Number(key.slice(5)) !== slot;
1099
+ }
1100
+
1101
+ /**
1102
+ * `readPixels` si `sample` et au moins un consommateur out.
1103
+ * (Un `@handle(frame)` + `get(dp)` massif doit recevoir les samples.)
1104
+ */
1105
+ private needsSampleRead(): boolean {
1106
+ return this.sample && this.hasOutConsumers();
1107
+ }
1108
+
1109
+ private maybePublishOut(
1110
+ now: number,
1111
+ time: number,
1112
+ params?: [number, number, number, number],
1113
+ ) {
1114
+ if (!this.outPublisher) this.bindOutPublisher();
1115
+ if (!this.hasOutConsumers()) return;
1116
+ const interval = Math.max(16, this.outInterval || 80);
1117
+ if (now - this.lastOutAt < interval) return;
1118
+ this.lastOutAt = now;
1119
+ const payload = this.buildOutput(time, params, this.needsSampleRead());
1120
+ const pub = this.outPublisher;
1121
+ if (pub) {
1122
+ for (const [key, value] of Object.entries(payload)) {
1123
+ if (value === undefined) continue;
1124
+ if (this.shouldSkipParamOutWrite(key)) continue;
1125
+ try {
1126
+ // Champs individuels pour ne pas écraser le reste du form
1127
+ (pub as Record<string, { set: (v: unknown) => void }>)[key].set(
1128
+ value,
1129
+ );
1130
+ } catch {
1131
+ /* publisher leaf manquant / non settable */
1132
+ }
1133
+ }
1134
+ }
1135
+ this.dispatchEvent(
1136
+ new CustomEvent("out", {
1137
+ detail: payload,
1138
+ bubbles: true,
1139
+ composed: true,
1140
+ }),
1141
+ );
1142
+ }
1143
+
1144
+ private revokeBlobUrls() {
1145
+ for (const url of this.lastBlobUrls) {
1146
+ try {
1147
+ URL.revokeObjectURL(url);
1148
+ } catch {
1149
+ /* ignore */
1150
+ }
1151
+ }
1152
+ this.lastBlobUrls = [];
1153
+ }
1154
+
1155
+ /** Révoque les URLs du batch précédent après un court délai (évite img cassées). */
1156
+ private scheduleRevokePreviousBlobs(urls: string[]) {
1157
+ const objectUrls = urls.filter((u) => u.startsWith("blob:"));
1158
+ if (objectUrls.length === 0) return;
1159
+ this.pendingRevokeUrls.push(...objectUrls);
1160
+ const toRevoke = objectUrls;
1161
+ window.setTimeout(() => {
1162
+ for (const url of toRevoke) {
1163
+ try {
1164
+ URL.revokeObjectURL(url);
1165
+ } catch {
1166
+ /* ignore */
1167
+ }
1168
+ const i = this.pendingRevokeUrls.indexOf(url);
1169
+ if (i >= 0) this.pendingRevokeUrls.splice(i, 1);
1170
+ }
1171
+ }, 1500);
1172
+ }
1173
+
1174
+ private publisherHasFieldListener(
1175
+ pub: OutPublisherLike | null,
1176
+ key: string,
1177
+ ): boolean {
1178
+ const child = pub?._proxies_?.get(key);
1179
+ return !!child?.hasListener?.();
1180
+ }
1181
+
1182
+ private hasExtractConsumers(): boolean {
1183
+ if (this.extractEventListeners > 0) return true;
1184
+ const pub = this.extractPublisher as OutPublisherLike | null;
1185
+ if (!pub) return false;
1186
+ for (const key of EXTRACT_OUT_KEYS) {
1187
+ if (this.publisherHasFieldListener(pub, key)) return true;
1188
+ }
1189
+ return false;
1190
+ }
1191
+
1192
+ private syncManualRoisFromPublishers() {
1193
+ const tryGet = (pub: OutPublisherLike | null) => {
1194
+ if (!pub?.get) return;
1195
+ try {
1196
+ const data = pub.get() ?? {};
1197
+ if ("rois" in data) this.manualRois = parseRois(data.rois);
1198
+ } catch {
1199
+ /* ignore */
1200
+ }
1201
+ };
1202
+ tryGet(this.formPublisher as OutPublisherLike | null);
1203
+ if (this.extractPublisher && this.extractPublisher !== this.formPublisher) {
1204
+ tryGet(this.extractPublisher as OutPublisherLike | null);
1205
+ }
1206
+ }
1207
+
1208
+ private resolveExtractInterval(): number {
1209
+ if (this.extractInterval > 0) return Math.max(16, this.extractInterval);
1210
+ return Math.max(16, this.outInterval || 100);
1211
+ }
1212
+
1213
+ /**
1214
+ * Lit une ROI à la demande (hors throttle). Nécessite un runtime prêt.
1215
+ */
1216
+ async readRegion(roi: ShaderRoi): Promise<ShaderExtractItem | null> {
1217
+ if (!this.runtime || !this.ready) return null;
1218
+ const item = await this.buildExtractItem(roi, "manual", undefined);
1219
+ return item;
1220
+ }
1221
+
1222
+ /** Lance une extraction complète immédiatement. */
1223
+ async extractNow(): Promise<ShaderExtractOutput> {
1224
+ const time = (performance.now() - this.startTime) / 1000;
1225
+ return this.runExtract(time);
1226
+ }
1227
+
1228
+ private async maybeExtract(now: number, time: number) {
1229
+ if (!this.extract || !this.ready || !this.runtime) return;
1230
+ if (!this.extractPublisher) this.bindExtractPublisher();
1231
+ if (!this.hasExtractConsumers()) return;
1232
+ if (now - this.lastExtractAt < this.resolveExtractInterval()) return;
1233
+ if (this.extractRunning) return;
1234
+ this.lastExtractAt = now;
1235
+ await this.runExtract(time);
1236
+ }
1237
+
1238
+ private async runExtract(time: number): Promise<ShaderExtractOutput> {
1239
+ const empty: ShaderExtractOutput = {
1240
+ frame: this.frame,
1241
+ time: this.round3(time),
1242
+ items: [],
1243
+ };
1244
+ if (!this.runtime || !this.ready) return empty;
1245
+ this.extractRunning = true;
1246
+ try {
1247
+ this.syncManualRoisFromPublishers();
1248
+ const { width: bufW, height: bufH } = this.runtime.size;
1249
+ const rois: PendingRoi[] = this.manualRois.map((r) => ({
1250
+ ...r,
1251
+ source: "manual" as const,
1252
+ }));
1253
+
1254
+ const maskPass = parseExtractPass(this.extractMask);
1255
+ if (maskPass) {
1256
+ const full = this.runtime.readBufferRect(maskPass, 0, 0, bufW, bufH);
1257
+ if (full) {
1258
+ const peaks = findPeaks(full.data, full.width, full.height, {
1259
+ threshold: this.extractThreshold,
1260
+ maxCount: Math.max(0, Math.floor(this.extractMax)),
1261
+ // Défaut ≈ patch/3 plafonné à 16 (doc) — laisse assez de coins espacés
1262
+ minDistance: Math.max(
1263
+ 8,
1264
+ Math.floor(Math.min(this.extractPatch / 3, 16)),
1265
+ ),
1266
+ });
1267
+ // Score relatif au meilleur peak du batch (ordre inchangé, UI lisible)
1268
+ const topScore = peaks[0]?.score || 1;
1269
+ for (let i = 0; i < peaks.length; i++) {
1270
+ const p = peaks[i];
1271
+ rois.push({
1272
+ id: `detect-${i}`,
1273
+ x: (p.x + 0.5) / bufW,
1274
+ y: (p.y + 0.5) / bufH,
1275
+ patch: this.extractPatch,
1276
+ source: "detect",
1277
+ score: topScore > 0 ? p.score / topScore : p.score,
1278
+ });
1279
+ }
1280
+ }
1281
+ }
1282
+
1283
+ // Phase sync : tous les readPixels AVANT tout await
1284
+ // (preserveDrawingBuffer=false → buffer Image vidé dès qu’on yield).
1285
+ type PendingItem = {
1286
+ item: ShaderExtractItem;
1287
+ rgba: Uint8Array;
1288
+ width: number;
1289
+ height: number;
1290
+ };
1291
+ const pending: PendingItem[] = [];
1292
+ let detectIdx = 0;
1293
+ const pass = parseExtractPass(this.extractSource) ?? "image";
1294
+
1295
+ for (const roi of rois) {
1296
+ const source = roi.source === "detect" ? "detect" : "manual";
1297
+ if (source === "detect") {
1298
+ if (detectIdx >= Math.max(0, Math.floor(this.extractMax))) continue;
1299
+ detectIdx++;
1300
+ }
1301
+ const px = roiToPixels(
1302
+ roi,
1303
+ bufW,
1304
+ bufH,
1305
+ this.extractPatch,
1306
+ MAX_PATCH_PX,
1307
+ );
1308
+ if (!px) continue;
1309
+ const rect =
1310
+ pass === "image"
1311
+ ? this.runtime.readRect(px.x, px.y, px.w, px.h)
1312
+ : this.runtime.readBufferRect(pass, px.x, px.y, px.w, px.h);
1313
+ if (!rect) continue;
1314
+ // Copie : le buffer WebGL peut être réutilisé / invalidé ensuite
1315
+ const rgba = new Uint8Array(rect.data);
1316
+ const mean = meanRgba(rgba);
1317
+ const item: ShaderExtractItem = {
1318
+ id: roi.id || `${source}-${px.x}-${px.y}`,
1319
+ x: this.round3(rect.x / bufW),
1320
+ y: this.round3(rect.y / bufH),
1321
+ w: this.round3(rect.width / bufW),
1322
+ h: this.round3(rect.height / bufH),
1323
+ meanR: this.round3(mean.r),
1324
+ meanG: this.round3(mean.g),
1325
+ meanB: this.round3(mean.b),
1326
+ meanA: this.round3(mean.a),
1327
+ meanLuma: this.round3(mean.luma),
1328
+ source,
1329
+ };
1330
+ if (typeof roi.score === "number") item.score = this.round3(roi.score);
1331
+ pending.push({
1332
+ item,
1333
+ rgba,
1334
+ width: rect.width,
1335
+ height: rect.height,
1336
+ });
1337
+ }
1338
+
1339
+ // Phase async : bitmaps (après copies CPU)
1340
+ if (this.extractBitmaps) {
1341
+ const token = this.rebuildToken;
1342
+ for (const p of pending) {
1343
+ if (token !== this.rebuildToken || !this.isConnected) {
1344
+ for (const q of pending) {
1345
+ if (q.item.blobUrl) revokeMediaUrls([q.item.blobUrl]);
1346
+ }
1347
+ return empty;
1348
+ }
1349
+ const url = await rgbaToBlobUrl(p.rgba, p.width, p.height);
1350
+ if (token !== this.rebuildToken || !this.isConnected) {
1351
+ if (url) revokeMediaUrls([url]);
1352
+ for (const q of pending) {
1353
+ if (q.item.blobUrl) revokeMediaUrls([q.item.blobUrl]);
1354
+ }
1355
+ return empty;
1356
+ }
1357
+ if (url) assignExtractMediaUrls(p.item, url);
1358
+ }
1359
+ }
1360
+
1361
+ if (!this.isConnected) {
1362
+ for (const p of pending) {
1363
+ if (p.item.blobUrl) revokeMediaUrls([p.item.blobUrl]);
1364
+ }
1365
+ return empty;
1366
+ }
1367
+
1368
+ const items = pending.map((p) => p.item);
1369
+ const payload: ShaderExtractOutput = {
1370
+ frame: this.frame,
1371
+ time: this.round3(time),
1372
+ items,
1373
+ };
1374
+ this.publishExtract(payload);
1375
+ return payload;
1376
+ } finally {
1377
+ this.extractRunning = false;
1378
+ }
1379
+ }
1380
+
1381
+ private async buildExtractItem(
1382
+ roi: ShaderRoi,
1383
+ source: "manual" | "detect",
1384
+ score?: number,
1385
+ ): Promise<ShaderExtractItem | null> {
1386
+ if (!this.runtime) return null;
1387
+ const { width: bufW, height: bufH } = this.runtime.size;
1388
+ const px = roiToPixels(roi, bufW, bufH, this.extractPatch, MAX_PATCH_PX);
1389
+ if (!px) return null;
1390
+ const pass = parseExtractPass(this.extractSource) ?? "image";
1391
+ const rect =
1392
+ pass === "image"
1393
+ ? this.runtime.readRect(px.x, px.y, px.w, px.h)
1394
+ : this.runtime.readBufferRect(pass, px.x, px.y, px.w, px.h);
1395
+ if (!rect) return null;
1396
+ const mean = meanRgba(rect.data);
1397
+ const item: ShaderExtractItem = {
1398
+ id: roi.id || `${source}-${px.x}-${px.y}`,
1399
+ x: this.round3(rect.x / bufW),
1400
+ y: this.round3(rect.y / bufH),
1401
+ w: this.round3(rect.width / bufW),
1402
+ h: this.round3(rect.height / bufH),
1403
+ meanR: this.round3(mean.r),
1404
+ meanG: this.round3(mean.g),
1405
+ meanB: this.round3(mean.b),
1406
+ meanA: this.round3(mean.a),
1407
+ meanLuma: this.round3(mean.luma),
1408
+ source,
1409
+ };
1410
+ if (typeof score === "number") item.score = this.round3(score);
1411
+ if (this.extractBitmaps) {
1412
+ const token = this.rebuildToken;
1413
+ const url = await rgbaToBlobUrl(rect.data, rect.width, rect.height);
1414
+ if (token !== this.rebuildToken || !this.isConnected) {
1415
+ if (url) revokeMediaUrls([url]);
1416
+ return null;
1417
+ }
1418
+ if (url) assignExtractMediaUrls(item, url);
1419
+ }
1420
+ return item;
1421
+ }
1422
+
1423
+ private publishExtract(payload: ShaderExtractOutput) {
1424
+ // Ne pas révoquer tout de suite : les <img> du batch précédent casseraient.
1425
+ this.scheduleRevokePreviousBlobs(this.lastBlobUrls);
1426
+ this.lastBlobUrls = [];
1427
+ for (const it of payload.items) {
1428
+ if (it.blobUrl) this.lastBlobUrls.push(it.blobUrl);
1429
+ }
1430
+ this.extractSeq++;
1431
+ if (!this.extractPublisher) this.bindExtractPublisher();
1432
+ const pub = this.extractPublisher;
1433
+ if (pub) {
1434
+ // Set atomique sur la racine : invalide `_cachedGet_` du parent.
1435
+ // (pub.extracts.set(...) seul laisse un snapshot périmé → 1 seul item en get()).
1436
+ try {
1437
+ const prev =
1438
+ ((pub as { get?: () => Record<string, unknown> }).get?.() as
1439
+ | Record<string, unknown>
1440
+ | null
1441
+ | undefined) ?? {};
1442
+ (pub as { set: (v: unknown) => void }).set({
1443
+ ...prev,
1444
+ rois: Array.isArray(prev.rois) ? prev.rois : this.manualRois,
1445
+ extracts: payload.items,
1446
+ extractCount: payload.items.length,
1447
+ extractSeq: this.extractSeq,
1448
+ });
1449
+ } catch {
1450
+ try {
1451
+ (pub as Record<string, { set: (v: unknown) => void }>).extracts.set(
1452
+ payload.items,
1453
+ );
1454
+ (
1455
+ pub as Record<string, { set: (v: unknown) => void }>
1456
+ ).extractCount.set(payload.items.length);
1457
+ (
1458
+ pub as Record<string, { set: (v: unknown) => void }>
1459
+ ).extractSeq.set(this.extractSeq);
1460
+ } catch {
1461
+ /* ignore */
1462
+ }
1463
+ }
1464
+ }
1465
+ this.dispatchEvent(
1466
+ new CustomEvent("extract", {
1467
+ detail: payload,
1468
+ bubbles: true,
1469
+ composed: true,
1470
+ }),
1471
+ );
1472
+ }
1473
+
1474
+ /**
1475
+ * Mode target : poursuite exponentielle (vitesse proportionnelle à la distance).
1476
+ * Frame-rate indépendant via `1 - exp(-speed * dt)`.
1477
+ */
1478
+ private advanceMouseFollow(dt: number) {
1479
+ if (!this.mouse || this.mouseMode !== "target" || !this.mouseHasPointer) {
1480
+ return;
1481
+ }
1482
+ const speed = Math.max(0, this.mouseSpeed);
1483
+ const t = speed <= 0 || dt <= 0 ? 1 : 1 - Math.exp(-speed * dt);
1484
+ this.mouseFollow[0] += (this.mouseTarget[0] - this.mouseFollow[0]) * t;
1485
+ this.mouseFollow[1] += (this.mouseTarget[1] - this.mouseFollow[1]) * t;
1486
+ this.mouseVec[0] = this.mouseFollow[0];
1487
+ this.mouseVec[1] = this.mouseFollow[1];
1488
+ }
1489
+
1490
+ /** Rollover / roll-out → easing de `hoverMix` (0↔1) pour le slot choisi. */
1491
+ private advanceHover(dt: number) {
1492
+ if (parseHoverParam(this.hoverParam) === null) return;
1493
+ const speed = Math.max(0, this.hoverSpeed);
1494
+ const t = speed <= 0 || dt <= 0 ? 1 : 1 - Math.exp(-speed * dt);
1495
+ const next = this.hoverMix + (this.hoverGoal - this.hoverMix) * t;
1496
+ // Snap pour éviter une micro-animation infinie (play-on-hover qui redémarre).
1497
+ this.hoverMix =
1498
+ Math.abs(next - this.hoverGoal) < 0.002 ? this.hoverGoal : next;
1499
+ }
1500
+
1501
+ private localPointer(e: PointerEvent): { x: number; y: number } {
1502
+ const rect = this.getBoundingClientRect();
1503
+ const dpr = Math.min(window.devicePixelRatio || 1, this.dprMax);
1504
+ const x = (e.clientX - rect.left) * dpr;
1505
+ const y = (rect.height - (e.clientY - rect.top)) * dpr;
1506
+ return { x, y };
1507
+ }
1508
+
1509
+ private setPointerTarget(x: number, y: number, snap = false) {
1510
+ this.mouseTarget[0] = x;
1511
+ this.mouseTarget[1] = y;
1512
+ if (!this.mouseHasPointer || snap || this.mouseMode === "direct") {
1513
+ this.mouseHasPointer = true;
1514
+ this.mouseFollow[0] = x;
1515
+ this.mouseFollow[1] = y;
1516
+ this.mouseVec[0] = x;
1517
+ this.mouseVec[1] = y;
1518
+ }
1519
+ }
1520
+
1521
+ private onPointerMove = (e: PointerEvent) => {
1522
+ if (!this.mouse) return;
1523
+ const { x, y } = this.localPointer(e);
1524
+ this.setPointerTarget(x, y);
1525
+ if (this.pointerDown) {
1526
+ this.mouseVec[2] = x;
1527
+ this.mouseVec[3] = y;
1528
+ }
1529
+ };
1530
+
1531
+ private onPointerDown = (e: PointerEvent) => {
1532
+ if (!this.mouse) return;
1533
+ this.pointerDown = true;
1534
+ this.setPointerCapture?.(e.pointerId);
1535
+ const { x, y } = this.localPointer(e);
1536
+ this.setPointerTarget(x, y, true);
1537
+ this.mouseVec[2] = x;
1538
+ this.mouseVec[3] = y;
1539
+ };
1540
+
1541
+ private onPointerUp = (e: PointerEvent) => {
1542
+ if (!this.mouse) return;
1543
+ this.pointerDown = false;
1544
+ const { x, y } = this.localPointer(e);
1545
+ this.setPointerTarget(x, y);
1546
+ this.mouseVec[2] = -Math.abs(this.mouseVec[2]);
1547
+ this.mouseVec[3] = -Math.abs(this.mouseVec[3]);
1548
+ };
1549
+
1550
+ private onPointerEnter = () => {
1551
+ if (this.leaveRaf) {
1552
+ cancelAnimationFrame(this.leaveRaf);
1553
+ this.leaveRaf = 0;
1554
+ }
1555
+ this.hovering = true;
1556
+ this.hoverGoal = 1;
1557
+ this.syncPlayback();
1558
+ };
1559
+
1560
+ private onPointerLeave = () => {
1561
+ // Différer : un leave parasite (re-render / enfant shadow) suivi d’un
1562
+ // re-enter immédiat provoquait activation↔désactivation en boucle.
1563
+ if (this.leaveRaf) cancelAnimationFrame(this.leaveRaf);
1564
+ this.leaveRaf = requestAnimationFrame(() => {
1565
+ this.leaveRaf = 0;
1566
+ if (!this.isConnected || this.matches(":hover")) return;
1567
+ this.hovering = false;
1568
+ this.hoverGoal = 0;
1569
+ this.pointerDown = false;
1570
+ this.syncPlayback();
1571
+ });
1572
+ };
1573
+
1574
+ render() {
1575
+ return html`
1576
+ <canvas part="canvas"></canvas>
1577
+ ${this.errorMessage
1578
+ ? html`<div class="err" part="error">${this.errorMessage}</div>`
1579
+ : null}
1580
+ `;
1581
+ }
1582
+ }
1583
+
1584
+ export { parseChannelSource, ShaderToyRuntime, shouldUploadElementFrame } from "./gl-runtime";
1585
+ export { buildFragmentSource } from "./shadertoy-prelude";
1586
+ export type {
1587
+ ChannelSource,
1588
+ ShaderExtractItem,
1589
+ ShaderExtractOutput,
1590
+ ShaderExtractPass,
1591
+ ShaderHoverParam,
1592
+ ShaderMouseMode,
1593
+ ShaderParamSlot,
1594
+ ShaderPassId,
1595
+ ShaderPeak,
1596
+ ShaderRoi,
1597
+ ShaderSources,
1598
+ SonicShaderConfig,
1599
+ SonicShaderOutput,
1600
+ } from "./types";
1601
+ export type {
1602
+ SonicMediaRef,
1603
+ SonicFrameSource,
1604
+ } from "@supersoniks/concorde/core/utils/mediaRef";
1605
+ export {
1606
+ toMediaUrl,
1607
+ cloneMediaRef,
1608
+ isFrameSource,
1609
+ mediaElementKey,
1610
+ } from "@supersoniks/concorde/core/utils/mediaRef";
1611
+ export {
1612
+ findPeaks,
1613
+ meanRgba,
1614
+ parseExtractPass,
1615
+ parseHoverParam,
1616
+ roiToPixels,
1617
+ ShaderCompileError,
1618
+ } from "./types";
1619
+
1620
+ declare global {
1621
+ interface HTMLElementTagNameMap {
1622
+ [tagName]: SonicShader;
1623
+ }
1624
+ }