@supersoniks/concorde 4.9.98-visual-stack.0 → 4.9.98-visual-stack.2

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 (476) hide show
  1. package/.gitlab-ci.yml +0 -13
  2. package/build-infos.json +1 -1
  3. package/concorde-3d.bundle.js +201 -152
  4. package/concorde-3d.es.js +14688 -13906
  5. package/concorde-core.bundle.js +557 -622
  6. package/concorde-core.es.js +6025 -5575
  7. package/concorde-hugging-face-infer.bundle.js +1 -1
  8. package/concorde-hugging-face-infer.es.js +1 -1
  9. package/concorde-interactive.bundle.js +1162 -0
  10. package/concorde-interactive.es.js +10723 -0
  11. package/concorde-shader.bundle.js +31 -20
  12. package/concorde-shader.es.js +2773 -2547
  13. package/concorde-webgpu.bundle.js +43 -32
  14. package/concorde-webgpu.es.js +1819 -1553
  15. package/dist/concorde-3d.bundle.js +201 -152
  16. package/dist/concorde-3d.es.js +14688 -13906
  17. package/dist/concorde-core.bundle.js +557 -622
  18. package/dist/concorde-core.es.js +6025 -5575
  19. package/dist/concorde-hugging-face-infer.bundle.js +1 -1
  20. package/dist/concorde-hugging-face-infer.es.js +1 -1
  21. package/dist/concorde-interactive.bundle.js +1162 -0
  22. package/dist/concorde-interactive.es.js +10723 -0
  23. package/dist/concorde-shader.bundle.js +31 -20
  24. package/dist/concorde-shader.es.js +2773 -2547
  25. package/dist/concorde-webgpu.bundle.js +43 -32
  26. package/dist/concorde-webgpu.es.js +1819 -1553
  27. package/dist/docs-mock-api-sw.js +5 -1
  28. package/dist/docs-mock-api-sw.js.map +2 -2
  29. package/dist/js/addons/interactive.js +6 -0
  30. package/dist/js/addons/interactive.js.map +1 -0
  31. package/dist/js/core/components/functional/3d/3d.js +90 -2
  32. package/dist/js/core/components/functional/3d/3d.js.map +1 -1
  33. package/dist/js/core/components/functional/3d/constants.js +1 -0
  34. package/dist/js/core/components/functional/3d/constants.js.map +1 -1
  35. package/dist/js/core/components/functional/3d/ensure.js +6 -3
  36. package/dist/js/core/components/functional/3d/ensure.js.map +1 -1
  37. package/dist/js/core/components/functional/3d/form-params.js +2 -0
  38. package/dist/js/core/components/functional/3d/form-params.js.map +1 -1
  39. package/dist/js/core/components/functional/3d/life.js +2 -1
  40. package/dist/js/core/components/functional/3d/life.js.map +1 -1
  41. package/dist/js/core/components/functional/3d/out-publish.js +3 -2
  42. package/dist/js/core/components/functional/3d/out-publish.js.map +1 -1
  43. package/dist/js/core/components/functional/3d/playback.js +6 -1
  44. package/dist/js/core/components/functional/3d/playback.js.map +1 -1
  45. package/dist/js/core/components/functional/3d/post-bind.js +207 -0
  46. package/dist/js/core/components/functional/3d/post-bind.js.map +1 -0
  47. package/dist/js/core/components/functional/3d/post-channels.js +39 -0
  48. package/dist/js/core/components/functional/3d/post-channels.js.map +1 -0
  49. package/dist/js/core/components/functional/3d/post-fx.js +495 -0
  50. package/dist/js/core/components/functional/3d/post-fx.js.map +1 -0
  51. package/dist/js/core/components/functional/3d/props.js +142 -0
  52. package/dist/js/core/components/functional/3d/props.js.map +1 -1
  53. package/dist/js/core/components/functional/3d/reload.js +2 -0
  54. package/dist/js/core/components/functional/3d/reload.js.map +1 -1
  55. package/dist/js/core/components/functional/3d/runtime.js +80 -3
  56. package/dist/js/core/components/functional/3d/runtime.js.map +1 -1
  57. package/dist/js/core/components/functional/3d/scene-runtime.js +1 -1
  58. package/dist/js/core/components/functional/3d/scene-runtime.js.map +1 -1
  59. package/dist/js/core/components/functional/3d/tune.js +21 -0
  60. package/dist/js/core/components/functional/3d/tune.js.map +1 -1
  61. package/dist/js/core/components/functional/3d/updated.js +13 -1
  62. package/dist/js/core/components/functional/3d/updated.js.map +1 -1
  63. package/dist/js/core/components/functional/if/if.js +65 -7
  64. package/dist/js/core/components/functional/if/if.js.map +1 -1
  65. package/dist/js/core/components/functional/interactive/action.js +96 -0
  66. package/dist/js/core/components/functional/interactive/action.js.map +1 -0
  67. package/dist/js/core/components/functional/interactive/gamepad.js +206 -0
  68. package/dist/js/core/components/functional/interactive/gamepad.js.map +1 -0
  69. package/dist/js/core/components/functional/interactive/gesture.js +148 -0
  70. package/dist/js/core/components/functional/interactive/gesture.js.map +1 -0
  71. package/dist/js/core/components/functional/interactive/helpers.js +82 -0
  72. package/dist/js/core/components/functional/interactive/helpers.js.map +1 -0
  73. package/dist/js/core/components/functional/interactive/index.js +20 -0
  74. package/dist/js/core/components/functional/interactive/index.js.map +1 -0
  75. package/dist/js/core/components/functional/interactive/keyboard.js +183 -0
  76. package/dist/js/core/components/functional/interactive/keyboard.js.map +1 -0
  77. package/dist/js/core/components/functional/interactive/matrix.js +201 -0
  78. package/dist/js/core/components/functional/interactive/matrix.js.map +1 -0
  79. package/dist/js/core/components/functional/interactive/registry.js +28 -0
  80. package/dist/js/core/components/functional/interactive/registry.js.map +1 -0
  81. package/dist/js/core/components/functional/interactive/store.js +264 -0
  82. package/dist/js/core/components/functional/interactive/store.js.map +1 -0
  83. package/dist/js/core/components/functional/interactive/ticker.js +182 -0
  84. package/dist/js/core/components/functional/interactive/ticker.js.map +1 -0
  85. package/dist/js/core/components/functional/shader/gl-runtime.js +128 -14
  86. package/dist/js/core/components/functional/shader/gl-runtime.js.map +1 -1
  87. package/dist/js/core/components/functional/shader/shader.js +154 -57
  88. package/dist/js/core/components/functional/shader/shader.js.map +1 -1
  89. package/dist/js/core/components/functional/shader/shadertoy-prelude.js +39 -5
  90. package/dist/js/core/components/functional/shader/shadertoy-prelude.js.map +1 -1
  91. package/dist/js/core/components/functional/shader/types.js +58 -7
  92. package/dist/js/core/components/functional/shader/types.js.map +1 -1
  93. package/dist/js/core/components/functional/value/value.js +49 -4
  94. package/dist/js/core/components/functional/value/value.js.map +1 -1
  95. package/dist/js/core/components/functional/webgpu/gl-fallback.js +27 -6
  96. package/dist/js/core/components/functional/webgpu/gl-fallback.js.map +1 -1
  97. package/dist/js/core/components/functional/webgpu/gpu-runtime.js +115 -13
  98. package/dist/js/core/components/functional/webgpu/gpu-runtime.js.map +1 -1
  99. package/dist/js/core/components/functional/webgpu/helpers.js +8 -2
  100. package/dist/js/core/components/functional/webgpu/helpers.js.map +1 -1
  101. package/dist/js/core/components/functional/webgpu/webgpu.js +34 -1
  102. package/dist/js/core/components/functional/webgpu/webgpu.js.map +1 -1
  103. package/dist/js/core/components/ui/_css/rounded.js +34 -0
  104. package/dist/js/core/components/ui/_css/rounded.js.map +1 -0
  105. package/dist/js/core/components/ui/_css/type.js +44 -0
  106. package/dist/js/core/components/ui/_css/type.js.map +1 -1
  107. package/dist/js/core/components/ui/_i18n/ui-aria-labels.js +95 -0
  108. package/dist/js/core/components/ui/_i18n/ui-aria-labels.js.map +1 -0
  109. package/dist/js/core/components/ui/alert/alert.js +72 -87
  110. package/dist/js/core/components/ui/alert/alert.js.map +1 -1
  111. package/dist/js/core/components/ui/alert-messages/alert-messages.js +1 -0
  112. package/dist/js/core/components/ui/alert-messages/alert-messages.js.map +1 -1
  113. package/dist/js/core/components/ui/badge/badge.js +29 -80
  114. package/dist/js/core/components/ui/badge/badge.js.map +1 -1
  115. package/dist/js/core/components/ui/button/button.js +8 -7
  116. package/dist/js/core/components/ui/button/button.js.map +1 -1
  117. package/dist/js/core/components/ui/card/card-header.js +7 -2
  118. package/dist/js/core/components/ui/card/card-header.js.map +1 -1
  119. package/dist/js/core/components/ui/divider/divider.js +1 -1
  120. package/dist/js/core/components/ui/divider/divider.js.map +1 -1
  121. package/dist/js/core/components/ui/form/checkbox/checkbox.js +4 -20
  122. package/dist/js/core/components/ui/form/checkbox/checkbox.js.map +1 -1
  123. package/dist/js/core/components/ui/form/fieldset/legend-description.js +1 -1
  124. package/dist/js/core/components/ui/form/fieldset/legend.js +1 -1
  125. package/dist/js/core/components/ui/form/input/input.js +12 -15
  126. package/dist/js/core/components/ui/form/input/input.js.map +1 -1
  127. package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js +363 -158
  128. package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js.map +1 -1
  129. package/dist/js/core/components/ui/form/radio/radio.js +1 -1
  130. package/dist/js/core/components/ui/form/select/select.js +3 -6
  131. package/dist/js/core/components/ui/form/select/select.js.map +1 -1
  132. package/dist/js/core/components/ui/form/textarea/textarea.js +1 -2
  133. package/dist/js/core/components/ui/form/textarea/textarea.js.map +1 -1
  134. package/dist/js/core/components/ui/image/image.js +9 -37
  135. package/dist/js/core/components/ui/image/image.js.map +1 -1
  136. package/dist/js/core/components/ui/link/link.js +25 -26
  137. package/dist/js/core/components/ui/link/link.js.map +1 -1
  138. package/dist/js/core/components/ui/modal/modal-close.js +3 -12
  139. package/dist/js/core/components/ui/modal/modal-close.js.map +1 -1
  140. package/dist/js/core/components/ui/modal/modal.js +18 -18
  141. package/dist/js/core/components/ui/modal/modal.js.map +1 -1
  142. package/dist/js/core/components/ui/pop/pop.js +131 -112
  143. package/dist/js/core/components/ui/pop/pop.js.map +1 -1
  144. package/dist/js/core/components/ui/table/table.js.map +1 -1
  145. package/dist/js/core/components/ui/theme/theme.js +1 -1
  146. package/dist/js/core/components/ui/toast/dismissed.js +9 -0
  147. package/dist/js/core/components/ui/toast/dismissed.js.map +1 -0
  148. package/dist/js/core/components/ui/toast/render-content.js +14 -0
  149. package/dist/js/core/components/ui/toast/render-content.js.map +1 -0
  150. package/dist/js/core/components/ui/toast/toast-item.js +150 -96
  151. package/dist/js/core/components/ui/toast/toast-item.js.map +1 -1
  152. package/dist/js/core/components/ui/toast/toast.js +41 -13
  153. package/dist/js/core/components/ui/toast/toast.js.map +1 -1
  154. package/dist/js/core/components/ui/tooltip/tooltip.js +144 -143
  155. package/dist/js/core/components/ui/tooltip/tooltip.js.map +1 -1
  156. package/dist/js/core/decorators/subscriber/ancestorAttribute.js.map +1 -1
  157. package/dist/js/core/decorators/subscriber/derive.js +3 -1
  158. package/dist/js/core/decorators/subscriber/derive.js.map +1 -1
  159. package/dist/js/core/mixins/Fetcher.js.map +1 -1
  160. package/dist/js/core/mixins/FormCheckable.js +1 -8
  161. package/dist/js/core/mixins/FormCheckable.js.map +1 -1
  162. package/dist/js/core/mixins/FormElement.js +26 -53
  163. package/dist/js/core/mixins/FormElement.js.map +1 -1
  164. package/dist/js/core/utils/AncestorAttributeObserver.js +130 -55
  165. package/dist/js/core/utils/AncestorAttributeObserver.js.map +1 -1
  166. package/dist/js/core/utils/LocationHandler.js +1 -1
  167. package/dist/js/core/utils/LocationHandler.js.map +1 -1
  168. package/dist/js/core/utils/dismissed.js +23 -0
  169. package/dist/js/core/utils/dismissed.js.map +1 -0
  170. package/dist/js/core/utils/mediaRef.js +37 -0
  171. package/dist/js/core/utils/mediaRef.js.map +1 -1
  172. package/dist/js/core/utils/positioning.js +110 -0
  173. package/dist/js/core/utils/positioning.js.map +1 -0
  174. package/dist/js/directives.js +1 -2
  175. package/dist/js/directives.js.map +1 -1
  176. package/dist/types/addons/interactive.d.ts +6 -0
  177. package/dist/types/addons/interactive.d.ts.map +1 -0
  178. package/dist/types/core/components/functional/3d/3d.d.ts +26 -3
  179. package/dist/types/core/components/functional/3d/3d.d.ts.map +1 -1
  180. package/dist/types/core/components/functional/3d/constants.d.ts +1 -1
  181. package/dist/types/core/components/functional/3d/constants.d.ts.map +1 -1
  182. package/dist/types/core/components/functional/3d/ensure.d.ts +3 -0
  183. package/dist/types/core/components/functional/3d/ensure.d.ts.map +1 -1
  184. package/dist/types/core/components/functional/3d/form-params.d.ts.map +1 -1
  185. package/dist/types/core/components/functional/3d/life.d.ts +2 -0
  186. package/dist/types/core/components/functional/3d/life.d.ts.map +1 -1
  187. package/dist/types/core/components/functional/3d/out-publish.d.ts +1 -0
  188. package/dist/types/core/components/functional/3d/out-publish.d.ts.map +1 -1
  189. package/dist/types/core/components/functional/3d/playback.d.ts +9 -0
  190. package/dist/types/core/components/functional/3d/playback.d.ts.map +1 -1
  191. package/dist/types/core/components/functional/3d/post-bind.d.ts +52 -0
  192. package/dist/types/core/components/functional/3d/post-bind.d.ts.map +1 -0
  193. package/dist/types/core/components/functional/3d/post-channels.d.ts +40 -0
  194. package/dist/types/core/components/functional/3d/post-channels.d.ts.map +1 -0
  195. package/dist/types/core/components/functional/3d/post-fx.d.ts +73 -0
  196. package/dist/types/core/components/functional/3d/post-fx.d.ts.map +1 -0
  197. package/dist/types/core/components/functional/3d/props.d.ts +42 -0
  198. package/dist/types/core/components/functional/3d/props.d.ts.map +1 -1
  199. package/dist/types/core/components/functional/3d/reload.d.ts.map +1 -1
  200. package/dist/types/core/components/functional/3d/runtime.d.ts +16 -1
  201. package/dist/types/core/components/functional/3d/runtime.d.ts.map +1 -1
  202. package/dist/types/core/components/functional/3d/scene-runtime.d.ts +1 -1
  203. package/dist/types/core/components/functional/3d/scene-runtime.d.ts.map +1 -1
  204. package/dist/types/core/components/functional/3d/tune.d.ts +5 -0
  205. package/dist/types/core/components/functional/3d/tune.d.ts.map +1 -1
  206. package/dist/types/core/components/functional/3d/types.d.ts +9 -0
  207. package/dist/types/core/components/functional/3d/types.d.ts.map +1 -1
  208. package/dist/types/core/components/functional/3d/updated.d.ts.map +1 -1
  209. package/dist/types/core/components/functional/if/if.d.ts +14 -5
  210. package/dist/types/core/components/functional/if/if.d.ts.map +1 -1
  211. package/dist/types/core/components/functional/interactive/action.d.ts +22 -0
  212. package/dist/types/core/components/functional/interactive/action.d.ts.map +1 -0
  213. package/dist/types/core/components/functional/interactive/gamepad.d.ts +37 -0
  214. package/dist/types/core/components/functional/interactive/gamepad.d.ts.map +1 -0
  215. package/dist/types/core/components/functional/interactive/gesture.d.ts +26 -0
  216. package/dist/types/core/components/functional/interactive/gesture.d.ts.map +1 -0
  217. package/dist/types/core/components/functional/interactive/helpers.d.ts +23 -0
  218. package/dist/types/core/components/functional/interactive/helpers.d.ts.map +1 -0
  219. package/dist/types/core/components/functional/interactive/index.d.ts +20 -0
  220. package/dist/types/core/components/functional/interactive/index.d.ts.map +1 -0
  221. package/dist/types/core/components/functional/interactive/keyboard.d.ts +37 -0
  222. package/dist/types/core/components/functional/interactive/keyboard.d.ts.map +1 -0
  223. package/dist/types/core/components/functional/interactive/matrix.d.ts +31 -0
  224. package/dist/types/core/components/functional/interactive/matrix.d.ts.map +1 -0
  225. package/dist/types/core/components/functional/interactive/registry.d.ts +23 -0
  226. package/dist/types/core/components/functional/interactive/registry.d.ts.map +1 -0
  227. package/dist/types/core/components/functional/interactive/store.d.ts +46 -0
  228. package/dist/types/core/components/functional/interactive/store.d.ts.map +1 -0
  229. package/dist/types/core/components/functional/interactive/ticker.d.ts +33 -0
  230. package/dist/types/core/components/functional/interactive/ticker.d.ts.map +1 -0
  231. package/dist/types/core/components/functional/shader/gl-runtime.d.ts +33 -1
  232. package/dist/types/core/components/functional/shader/gl-runtime.d.ts.map +1 -1
  233. package/dist/types/core/components/functional/shader/shader.d.ts +28 -7
  234. package/dist/types/core/components/functional/shader/shader.d.ts.map +1 -1
  235. package/dist/types/core/components/functional/shader/shadertoy-prelude.d.ts +16 -2
  236. package/dist/types/core/components/functional/shader/shadertoy-prelude.d.ts.map +1 -1
  237. package/dist/types/core/components/functional/shader/types.d.ts +29 -5
  238. package/dist/types/core/components/functional/shader/types.d.ts.map +1 -1
  239. package/dist/types/core/components/functional/value/value.d.ts +6 -0
  240. package/dist/types/core/components/functional/value/value.d.ts.map +1 -1
  241. package/dist/types/core/components/functional/webgpu/gl-fallback.d.ts +4 -0
  242. package/dist/types/core/components/functional/webgpu/gl-fallback.d.ts.map +1 -1
  243. package/dist/types/core/components/functional/webgpu/gpu-runtime.d.ts +14 -0
  244. package/dist/types/core/components/functional/webgpu/gpu-runtime.d.ts.map +1 -1
  245. package/dist/types/core/components/functional/webgpu/helpers.d.ts +1 -0
  246. package/dist/types/core/components/functional/webgpu/helpers.d.ts.map +1 -1
  247. package/dist/types/core/components/functional/webgpu/webgpu.d.ts +7 -1
  248. package/dist/types/core/components/functional/webgpu/webgpu.d.ts.map +1 -1
  249. package/dist/types/core/components/ui/_css/rounded.d.ts +3 -0
  250. package/dist/types/core/components/ui/_css/rounded.d.ts.map +1 -0
  251. package/dist/types/core/components/ui/_css/type.d.ts +13 -0
  252. package/dist/types/core/components/ui/_css/type.d.ts.map +1 -1
  253. package/dist/types/core/components/ui/_i18n/ui-aria-labels.d.ts +83 -0
  254. package/dist/types/core/components/ui/_i18n/ui-aria-labels.d.ts.map +1 -0
  255. package/dist/types/core/components/ui/alert/alert.d.ts +14 -12
  256. package/dist/types/core/components/ui/alert/alert.d.ts.map +1 -1
  257. package/dist/types/core/components/ui/alert-messages/alert-messages.d.ts.map +1 -1
  258. package/dist/types/core/components/ui/badge/badge.d.ts +1 -1
  259. package/dist/types/core/components/ui/badge/badge.d.ts.map +1 -1
  260. package/dist/types/core/components/ui/button/button.d.ts +13 -29
  261. package/dist/types/core/components/ui/button/button.d.ts.map +1 -1
  262. package/dist/types/core/components/ui/card/card-header.d.ts.map +1 -1
  263. package/dist/types/core/components/ui/divider/divider.d.ts +2 -1
  264. package/dist/types/core/components/ui/divider/divider.d.ts.map +1 -1
  265. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts +25 -73
  266. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts.map +1 -1
  267. package/dist/types/core/components/ui/form/input/input.d.ts +14 -29
  268. package/dist/types/core/components/ui/form/input/input.d.ts.map +1 -1
  269. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts +63 -65
  270. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts.map +1 -1
  271. package/dist/types/core/components/ui/form/radio/radio.d.ts +1 -1
  272. package/dist/types/core/components/ui/form/select/select.d.ts +3 -5
  273. package/dist/types/core/components/ui/form/select/select.d.ts.map +1 -1
  274. package/dist/types/core/components/ui/form/textarea/textarea.d.ts +12 -28
  275. package/dist/types/core/components/ui/form/textarea/textarea.d.ts.map +1 -1
  276. package/dist/types/core/components/ui/image/image.d.ts +2 -1
  277. package/dist/types/core/components/ui/image/image.d.ts.map +1 -1
  278. package/dist/types/core/components/ui/link/link.d.ts +10 -9
  279. package/dist/types/core/components/ui/link/link.d.ts.map +1 -1
  280. package/dist/types/core/components/ui/modal/modal-close.d.ts +2 -2
  281. package/dist/types/core/components/ui/modal/modal-close.d.ts.map +1 -1
  282. package/dist/types/core/components/ui/pop/pop.d.ts +12 -4
  283. package/dist/types/core/components/ui/pop/pop.d.ts.map +1 -1
  284. package/dist/types/core/components/ui/table/table.d.ts +2 -1
  285. package/dist/types/core/components/ui/table/table.d.ts.map +1 -1
  286. package/dist/types/core/components/ui/toast/dismissed.d.ts +3 -0
  287. package/dist/types/core/components/ui/toast/dismissed.d.ts.map +1 -0
  288. package/dist/types/core/components/ui/toast/render-content.d.ts +7 -0
  289. package/dist/types/core/components/ui/toast/render-content.d.ts.map +1 -0
  290. package/dist/types/core/components/ui/toast/toast-item.d.ts +26 -9
  291. package/dist/types/core/components/ui/toast/toast-item.d.ts.map +1 -1
  292. package/dist/types/core/components/ui/toast/toast.d.ts +6 -3
  293. package/dist/types/core/components/ui/toast/toast.d.ts.map +1 -1
  294. package/dist/types/core/components/ui/toast/types.d.ts +12 -2
  295. package/dist/types/core/components/ui/toast/types.d.ts.map +1 -1
  296. package/dist/types/core/components/ui/tooltip/tooltip.d.ts +19 -11
  297. package/dist/types/core/components/ui/tooltip/tooltip.d.ts.map +1 -1
  298. package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts +3 -4
  299. package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts.map +1 -1
  300. package/dist/types/core/decorators/subscriber/derive.d.ts.map +1 -1
  301. package/dist/types/core/mixins/FormCheckable.d.ts +10 -27
  302. package/dist/types/core/mixins/FormCheckable.d.ts.map +1 -1
  303. package/dist/types/core/mixins/FormElement.d.ts +21 -10
  304. package/dist/types/core/mixins/FormElement.d.ts.map +1 -1
  305. package/dist/types/core/mixins/FormInput.d.ts +11 -27
  306. package/dist/types/core/mixins/FormInput.d.ts.map +1 -1
  307. package/dist/types/core/utils/AncestorAttributeObserver.d.ts +17 -9
  308. package/dist/types/core/utils/AncestorAttributeObserver.d.ts.map +1 -1
  309. package/dist/types/core/utils/LocationHandler.d.ts +3 -2
  310. package/dist/types/core/utils/LocationHandler.d.ts.map +1 -1
  311. package/dist/types/core/utils/dismissed.d.ts +3 -0
  312. package/dist/types/core/utils/dismissed.d.ts.map +1 -0
  313. package/dist/types/core/utils/mediaRef.d.ts +15 -0
  314. package/dist/types/core/utils/mediaRef.d.ts.map +1 -1
  315. package/dist/types/core/utils/positioning.d.ts +44 -0
  316. package/dist/types/core/utils/positioning.d.ts.map +1 -0
  317. package/dist/types/directives.d.ts +1 -3
  318. package/dist/types/directives.d.ts.map +1 -1
  319. package/dist/types/mixins.d.ts +22 -55
  320. package/dist/types/mixins.d.ts.map +1 -1
  321. package/docs/assets/{index-FmK4JaIM.js → index-D8MVWqY6.js} +946 -687
  322. package/docs/assets/index-DiD0qYvE.css +1 -0
  323. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +17 -85
  324. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +1 -1
  325. package/docs/crawl/hubs/form-components.html +13 -11
  326. package/docs/docs-mock-api-sw.js +5 -1
  327. package/docs/docs-mock-api-sw.js.map +2 -2
  328. package/docs/index.html +2 -2
  329. package/docs/llms-full.txt +12 -38
  330. package/docs/llms.txt +1 -1
  331. package/docs/src/core/components/functional/sdui/sdui.md +0 -0
  332. package/docs/src/core/components/ui/form/checkbox/checkbox.md +0 -0
  333. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +14 -118
  334. package/docs/src/docs/_getting-started/create-a-component.md +0 -0
  335. package/docs/src/docs/_misc/formelement-subscriber-removal.md +1 -1
  336. package/docs/src/docs/search/docs-search.json +195 -200
  337. package/docs/src/tsconfig.json +324 -0
  338. package/gitlab/job_tests.sh +25 -12
  339. package/index.html +3 -3
  340. package/package.json +217 -9
  341. package/public/docs-mock-api-sw.js +5 -1
  342. package/public/docs-mock-api-sw.js.map +2 -2
  343. package/scripts/build-addons.mjs +2 -2
  344. package/scripts/post-build.mjs +9 -0
  345. package/src/addons/interactive.ts +5 -0
  346. package/src/core/components/functional/3d/3d.md +34 -1
  347. package/src/core/components/functional/3d/3d.spec.ts +42 -0
  348. package/src/core/components/functional/3d/3d.ts +101 -3
  349. package/src/core/components/functional/3d/constants.ts +1 -0
  350. package/src/core/components/functional/3d/ensure.ts +11 -3
  351. package/src/core/components/functional/3d/form-params.ts +2 -0
  352. package/src/core/components/functional/3d/life.ts +4 -1
  353. package/src/core/components/functional/3d/out-publish.ts +4 -3
  354. package/src/core/components/functional/3d/playback.ts +13 -1
  355. package/src/core/components/functional/3d/post-bind.ts +262 -0
  356. package/src/core/components/functional/3d/post-channels.spec.ts +36 -0
  357. package/src/core/components/functional/3d/post-channels.ts +69 -0
  358. package/src/core/components/functional/3d/post-fx.ts +594 -0
  359. package/src/core/components/functional/3d/props.ts +45 -0
  360. package/src/core/components/functional/3d/reload.ts +2 -0
  361. package/src/core/components/functional/3d/runtime.ts +93 -4
  362. package/src/core/components/functional/3d/scene-runtime.ts +3 -0
  363. package/src/core/components/functional/3d/tune.ts +21 -0
  364. package/src/core/components/functional/3d/types.ts +9 -0
  365. package/src/core/components/functional/3d/updated.ts +17 -1
  366. package/src/core/components/functional/if/if.ts +54 -7
  367. package/src/core/components/functional/interactive/action.ts +84 -0
  368. package/src/core/components/functional/interactive/gamepad.ts +197 -0
  369. package/src/core/components/functional/interactive/gesture.ts +136 -0
  370. package/src/core/components/functional/interactive/helpers.spec.ts +50 -0
  371. package/src/core/components/functional/interactive/helpers.ts +97 -0
  372. package/src/core/components/functional/interactive/index.ts +25 -0
  373. package/src/core/components/functional/interactive/interactive.md +33 -0
  374. package/src/core/components/functional/interactive/keyboard.ts +171 -0
  375. package/src/core/components/functional/interactive/matrix.ts +185 -0
  376. package/src/core/components/functional/interactive/registry.ts +46 -0
  377. package/src/core/components/functional/interactive/store.ts +264 -0
  378. package/src/core/components/functional/interactive/ticker.ts +171 -0
  379. package/src/core/components/functional/list/list.ts +0 -0
  380. package/src/core/components/functional/shader/gl-runtime.ts +169 -12
  381. package/src/core/components/functional/shader/shader.md +27 -4
  382. package/src/core/components/functional/shader/shader.spec.ts +267 -0
  383. package/src/core/components/functional/shader/shader.ts +177 -55
  384. package/src/core/components/functional/shader/shadertoy-prelude.ts +49 -5
  385. package/src/core/components/functional/shader/types.ts +89 -12
  386. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  387. package/src/core/components/functional/value/value.ts +44 -4
  388. package/src/core/components/functional/webgpu/gl-fallback.ts +28 -4
  389. package/src/core/components/functional/webgpu/gpu-runtime.ts +154 -18
  390. package/src/core/components/functional/webgpu/helpers.ts +8 -2
  391. package/src/core/components/functional/webgpu/webgpu.md +13 -2
  392. package/src/core/components/functional/webgpu/webgpu.spec.ts +37 -0
  393. package/src/core/components/functional/webgpu/webgpu.ts +39 -1
  394. package/src/core/components/ui/_css/rounded.ts +36 -0
  395. package/src/core/components/ui/_css/type.ts +49 -0
  396. package/src/core/components/ui/_i18n/ui-aria-labels.ts +104 -0
  397. package/src/core/components/ui/alert/alert.md +128 -72
  398. package/src/core/components/ui/alert/alert.spec.ts +145 -0
  399. package/src/core/components/ui/alert/alert.ts +86 -91
  400. package/src/core/components/ui/alert-messages/alert-messages.ts +1 -1
  401. package/src/core/components/ui/badge/badge.md +126 -78
  402. package/src/core/components/ui/badge/badge.ts +29 -81
  403. package/src/core/components/ui/button/button.md +1 -0
  404. package/src/core/components/ui/button/button.ts +12 -10
  405. package/src/core/components/ui/card/card-header.ts +7 -2
  406. package/src/core/components/ui/card/card.md +120 -65
  407. package/src/core/components/ui/divider/divider.ts +4 -9
  408. package/src/core/components/ui/form/checkbox/checkbox.md +1 -1
  409. package/src/core/components/ui/form/checkbox/checkbox.ts +4 -20
  410. package/src/core/components/ui/form/fieldset/legend-description.ts +1 -1
  411. package/src/core/components/ui/form/fieldset/legend.ts +1 -1
  412. package/src/core/components/ui/form/input/input.md +1 -1
  413. package/src/core/components/ui/form/input/input.ts +25 -27
  414. package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +14 -118
  415. package/src/core/components/ui/form/input-autocomplete/input-autocomplete.ts +419 -187
  416. package/src/core/components/ui/form/radio/radio.ts +1 -1
  417. package/src/core/components/ui/form/select/select.ts +3 -6
  418. package/src/core/components/ui/form/textarea/textarea.md +1 -1
  419. package/src/core/components/ui/form/textarea/textarea.ts +1 -2
  420. package/src/core/components/ui/image/image.md +147 -53
  421. package/src/core/components/ui/image/image.ts +10 -44
  422. package/src/core/components/ui/link/link.md +2 -2
  423. package/src/core/components/ui/link/link.ts +42 -37
  424. package/src/core/components/ui/modal/modal-close.ts +8 -12
  425. package/src/core/components/ui/modal/modal.ts +18 -18
  426. package/src/core/components/ui/pop/pop.md +105 -1
  427. package/src/core/components/ui/pop/pop.ts +145 -141
  428. package/src/core/components/ui/table/table.ts +2 -8
  429. package/src/core/components/ui/theme/theme.ts +1 -1
  430. package/src/core/components/ui/toast/dismissed.ts +14 -0
  431. package/src/core/components/ui/toast/render-content.ts +13 -0
  432. package/src/core/components/ui/toast/toast-item.ts +179 -103
  433. package/src/core/components/ui/toast/toast.ts +58 -21
  434. package/src/core/components/ui/toast/types.ts +14 -2
  435. package/src/core/components/ui/tooltip/tooltip.ts +176 -154
  436. package/src/core/decorators/subscriber/ancestorAttribute.spec.ts +26 -0
  437. package/src/core/decorators/subscriber/ancestorAttribute.ts +3 -4
  438. package/src/core/decorators/subscriber/derive.ts +3 -3
  439. package/src/core/mixins/Fetcher.ts +1 -1
  440. package/src/core/mixins/FormCheckable.ts +1 -8
  441. package/src/core/mixins/FormElement.ts +74 -76
  442. package/src/core/mixins/Subscriber.ts +0 -0
  443. package/src/core/utils/AncestorAttributeObserver.ts +183 -70
  444. package/src/core/utils/DataBindObserver.ts +0 -0
  445. package/src/core/utils/LocationHandler.ts +12 -5
  446. package/src/core/utils/Objects.ts +0 -0
  447. package/src/core/utils/dismissed.ts +22 -0
  448. package/src/core/utils/mediaRef.spec.ts +25 -0
  449. package/src/core/utils/mediaRef.ts +45 -0
  450. package/src/core/utils/positioning.spec.ts +208 -0
  451. package/src/core/utils/positioning.ts +183 -0
  452. package/src/directives.ts +1 -3
  453. package/src/docs/_core-concept/dataFlow.md +1 -1
  454. package/src/docs/_decorators/ancestor-attribute.md +3 -2
  455. package/src/docs/_getting-started/concorde-outside.md +3 -3
  456. package/src/docs/_misc/formelement-subscriber-removal.md +115 -0
  457. package/src/docs/_misc/html-integration.md +2 -0
  458. package/src/docs/_misc/visual-stack.md +19 -1
  459. package/src/docs/code.ts +3 -1
  460. package/src/docs/components/docs-demo-sources.ts +88 -0
  461. package/src/docs/docs.ts +3 -0
  462. package/src/docs/example/docs-3d-post-depth-demo.ts +68 -0
  463. package/src/docs/example/docs-3d-webgpu-live-demo.ts +83 -0
  464. package/src/docs/example/docs-harris-webgpu-demo.ts +53 -55
  465. package/src/docs/example/docs-input-autocomplete-demos.ts +110 -0
  466. package/src/docs/mock-api/router.ts +17 -1
  467. package/src/docs/navigation/navigation.ts +4 -0
  468. package/src/docs/search/docs-search.json +922 -1762
  469. package/src/docs/tailwind/css/tailwind.css +13 -6
  470. package/src/tsconfig.json +162 -6
  471. package/src/tsconfig.tsbuildinfo +1 -1
  472. package/tailwind.config.js +50 -3
  473. package/vite/config.js +23 -35
  474. package/vite.config.mts +5 -0
  475. package/vitest.setup.ts +49 -13
  476. package/docs/assets/index-BZiZXMU-.css +0 -1
@@ -4,9 +4,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
+ var InputAutocomplete_1;
7
8
  import { html, LitElement, css, nothing } from "lit";
8
9
  import { customElement, property, queryAssignedNodes, state, query, } from "lit/decorators.js";
9
- import { FormInput, FormElement, Subscriber, TemplatesContainer, } from "@supersoniks/concorde/mixins";
10
+ import { FormInput, FormElement, TemplatesContainer, } from "@supersoniks/concorde/mixins";
10
11
  import "@supersoniks/concorde/core/components/ui/form/input/input";
11
12
  import "@supersoniks/concorde/core/components/ui/pop/pop";
12
13
  import "@supersoniks/concorde/core/components/functional/queue/queue";
@@ -16,75 +17,149 @@ import { PublisherManager } from "@supersoniks/concorde/utils";
16
17
  import { customScroll } from "@supersoniks/concorde/core/components/ui/_css/scroll";
17
18
  import { ResizeController } from "@lit-labs/observers/resize-controller.js";
18
19
  import { traverseDotNotation } from "@supersoniks/concorde/core/utils/Objects";
20
+ const SUGGESTION_VALUE_ATTR = "data-autocomplete-value";
21
+ const SUGGESTION_LABEL_ATTR = "data-autocomplete-label";
19
22
  /**
20
- * Input avec autocomplete. Propose des valeurs à partir d'un sonic-queue.
21
- * L'input permet de filtrer les choix de valeurs dans le sonic-pop.
22
- * La valeur de cet input est ensuite retransmit au premier via un dataProvider.
23
+ * Input avec suggestions (queue). Valeur formulaire via formDataProvider + name ;
24
+ * texte de recherche sur un store interne dédié.
23
25
  */
24
- let InputAutocomplete = class InputAutocomplete extends TemplatesContainer(FormInput(FormElement(Subscriber(LitElement)))) {
26
+ let InputAutocomplete = InputAutocomplete_1 = class InputAutocomplete extends TemplatesContainer(FormInput(FormElement(LitElement))) {
25
27
  constructor() {
26
28
  super(...arguments);
27
- /**
28
- * Possibles mutualisation avec text
29
- */
30
29
  this.size = "md";
31
30
  this.placeholder = "";
32
31
  this.filteredFields = "";
33
32
  this.readonly = null;
34
33
  this.dataProviderExpression = "";
35
- this.minSearchLength = 0;
34
+ this.serviceURL = "";
35
+ this.minSearchLength = 3;
36
36
  this.key = "";
37
- /** The parameter name to use in dataProviderExpression route */
38
37
  this.searchParameter = "";
39
- /** The property name to search in the dataProviderExpression result, use "_self" if result is a string list */
40
38
  this.propertyName = "";
39
+ this.items = null;
41
40
  this.hasInputPrefix = false;
42
41
  this._resizeController = new ResizeController(this, {});
43
- this.isPopVisible = false;
44
- /**
45
- * Les dataProviders
46
- */
42
+ this.searchText = "";
47
43
  this.searchDataProvider = "";
44
+ /** Filtre queue : ne reçoit la saisie qu'à partir de minSearchLength. */
45
+ this.queueFilterDataProvider = "";
48
46
  this.initSearchDataProvider = "";
49
47
  this.queueDataProvider = "";
50
48
  this.initQueueDataProvider = "";
49
+ /** Public — cptypeahead. */
51
50
  this.lastValidSearch = "";
51
+ this.providersReady = false;
52
+ /** Évite de rouvrir le pop juste après une sélection. */
53
+ this.suppressPopOpen = false;
54
+ this.filterArmed = false;
55
+ this.updateSearchParameter = (value) => {
56
+ if (value == "" || value == null) {
57
+ if (this.isSearchParameter()) {
58
+ this.lastValidSearch = "";
59
+ this.setSearchText("");
60
+ }
61
+ return;
62
+ }
63
+ const found = this.queryQueueListItem(this.queueDataProvider, (listItem) => {
64
+ const itemVal = this.propertyName === "_self"
65
+ ? listItem
66
+ : listItem[this.propertyName || this.name];
67
+ return itemVal == value;
68
+ }, this.setSearchFromSelection);
69
+ if (!found) {
70
+ const foundInit = this.queryQueueListItem(this.initQueueDataProvider, (listItem) => {
71
+ const itemVal = this.propertyName === "_self"
72
+ ? listItem
73
+ : listItem[this.propertyName || this.name];
74
+ return itemVal == value;
75
+ }, this.setSearchFromSelection);
76
+ if (!foundInit && this.isSearchParameter()) {
77
+ this.lastValidSearch = value;
78
+ this.setSearchText(String(value));
79
+ }
80
+ }
81
+ };
82
+ this.onSearchPublisherAssign = (value) => {
83
+ const next = value == null ? "" : String(value);
84
+ if (this.searchText !== next) {
85
+ this.searchText = next;
86
+ }
87
+ this.syncQueueFilter(next);
88
+ this.openPopIfNeeded(next);
89
+ };
90
+ this.handleSearchActivity = () => {
91
+ const text = String(this.searchPublisher?.get() ?? this.searchText ?? "");
92
+ this.openPopIfNeeded(text, true);
93
+ };
94
+ /** keyup composé depuis l'input shadow — ouvre le pop dès qu'il y a assez de caractères. */
95
+ this.handleSearchKeyUp = (e) => {
96
+ if (e.ctrlKey || e.metaKey || e.altKey)
97
+ return;
98
+ if (["Escape", "Tab", "Enter", "ArrowUp", "ArrowDown"].includes(e.key))
99
+ return;
100
+ this.handleSearchActivity();
101
+ };
52
102
  /**
53
- * Run when the formDataProvider's field is updated
54
- *
55
- * @param value
103
+ * Capture : empêche la nav FormElement (data-keyboard-nav) de sortir du champ
104
+ * et de fermer le pop. ArrowDown/Up gardent le pop ouvert et entrent dans la liste.
105
+ * Enter depuis le champ sélectionne la 1re suggestion.
56
106
  */
57
- this.updateSearchParameter = (value) => {
58
- if (value == "" && this.isSearchParameter()) {
59
- this.lastValidSearch = "";
107
+ this.handleSearchKeyDown = (e) => {
108
+ const path = e.composedPath();
109
+ const fromMenuItem = path.some((n) => n?.tagName === "SONIC-MENU-ITEM");
110
+ // Enter / Espace sur une suggestion → sélection
111
+ if (fromMenuItem && (e.key === "Enter" || e.key === " ")) {
112
+ const item = path.find((n) => n?.tagName === "SONIC-MENU-ITEM");
113
+ if (!item)
114
+ return;
115
+ e.preventDefault();
116
+ e.stopPropagation();
117
+ this.selectSuggestionItem(item);
60
118
  return;
61
119
  }
62
- const found = this.queryQueueListItem(this.queueDataProvider, this.findSelection, this.setSearchFromSelection);
63
- // Si la liste de this.queueDataProvider est bien initialisée, mais qu'aucun item ne correspond à la recherche
64
- // On affiche quand même la valeur dans le champ de recherche, car il provient directement du formDataProvider
65
- if (found === false && this.isSearchParameter()) {
66
- this.lastValidSearch = value;
67
- this.searchPublisher?.set(this.lastValidSearch);
120
+ if (fromMenuItem)
121
+ return;
122
+ const text = String(this.searchPublisher?.get() ?? this.searchText ?? "");
123
+ if (!this.shouldShowSuggestions(text))
124
+ return;
125
+ // Enter dans le champ → 1re suggestion
126
+ if (e.key === "Enter") {
127
+ const items = this.getSuggestionItems();
128
+ if (!items.length)
129
+ return;
130
+ e.preventDefault();
131
+ e.stopPropagation();
132
+ this.selectSuggestionItem(items[0]);
133
+ return;
68
134
  }
135
+ if (e.key !== "ArrowDown" && e.key !== "ArrowUp")
136
+ return;
137
+ e.preventDefault();
138
+ e.stopPropagation();
139
+ this.suppressPopOpen = false;
140
+ this.popElement?.show();
141
+ requestAnimationFrame(() => this.popElement?.show());
142
+ const items = this.getSuggestionItems();
143
+ if (!items.length)
144
+ return;
145
+ const target = e.key === "ArrowDown" ? items[0] : items[items.length - 1];
146
+ target.focus?.();
69
147
  };
70
- this.updatePopContentVisibility = (value) => {
71
- this.isPopVisible = (value?.length || 0) >= this.minSearchLength;
148
+ /**
149
+ * pointerdown : avant le click document qui ferme le pop.
150
+ * data-autocomplete-* (démos .items) ou value + textContent (templates legacy).
151
+ */
152
+ this.handleSuggestionPointerDown = (e) => {
153
+ const item = e.composedPath().find((n) => n?.tagName === "SONIC-MENU-ITEM");
154
+ if (!item)
155
+ return;
156
+ e.preventDefault();
157
+ e.stopPropagation();
158
+ this.selectSuggestionItem(item);
72
159
  };
73
160
  this.initSearchParameter = () => {
74
161
  this.queryQueueListItem(this.initQueueDataProvider, this.findSelection, this.setSearchFromSelection);
75
162
  };
76
- this.selectListItem = (listItem) => {
77
- const value = this.propertyName === "_self"
78
- ? listItem
79
- : listItem[this.propertyName || this.name];
80
- this.formValuePublisher?.set(value);
81
- };
82
- this.findSearchedItem = (listItem) => {
83
- const value = this.propertyName === "_self"
84
- ? listItem
85
- : listItem[this.propertyName || this.searchParameter || this.name];
86
- return value == this.searchPublisher?.get();
87
- };
88
163
  this.findSelection = (listItem) => {
89
164
  const value = this.propertyName === "_self"
90
165
  ? listItem
@@ -96,136 +171,225 @@ let InputAutocomplete = class InputAutocomplete extends TemplatesContainer(FormI
96
171
  this.propertyName === "_self"
97
172
  ? listItem
98
173
  : listItem[this.searchParameter || this.propertyName || this.name];
99
- if (this.isSearchParameter()) {
100
- this.searchPublisher?.set(this.lastValidSearch);
101
- }
174
+ this.setSearchText(this.lastValidSearch);
102
175
  };
103
- this.updateActiveSelection = () => {
104
- this.queryQueueListItem(this.queueDataProvider, this.findSearchedItem, this.selectListItem);
105
- if (!this.select &&
106
- this.lastValidSearch &&
107
- this.lastValidSearch != this.searchPublisher?.get() &&
108
- this.formValuePublisher?.get()) {
109
- this.formValuePublisher?.set("");
176
+ this.handleFocusOut = (e) => {
177
+ const related = e.relatedTarget;
178
+ if (this.deepContains(this.popElement, related) ||
179
+ this.deepContains(this, related)) {
180
+ return;
110
181
  }
111
- };
112
- this.handleFocusOut = (_e) => {
113
- // Utiliser setTimeout pour vérifier où va le focus après le focusout
114
- // Cela permet de ne pas fermer le pop si le focus va vers un élément du pop
115
182
  setTimeout(() => {
183
+ if (this.suppressPopOpen)
184
+ return;
116
185
  const activeElement = document.activeElement;
117
- if (!activeElement) {
118
- this.popElement.hide();
186
+ if (!activeElement ||
187
+ this.deepContains(this.popElement, activeElement) ||
188
+ this.deepContains(this, activeElement)) {
119
189
  return;
120
190
  }
121
- // Vérifier si le focus est dans le popElement ou dans ce composant
122
- const isInPop = this.popElement.contains(activeElement) ||
123
- this.popElement.shadowRoot?.contains(activeElement);
124
- const isInComponent = this.contains(activeElement) ||
125
- this.shadowRoot?.contains(activeElement);
126
- // Si le focus n'est ni dans le pop ni dans ce composant, fermer le pop
127
- if (!isInPop && !isInComponent) {
128
- this.popElement.hide();
129
- }
191
+ this.popElement?.hide();
130
192
  }, 0);
131
193
  };
132
194
  }
133
- /**
134
- * Les fonctions de gestion
135
- */
136
195
  hasSlotOrProps() {
137
196
  this.hasInputPrefix = !!this.slotInputPrefixNodes?.length;
138
197
  }
198
+ searchFieldName() {
199
+ return this.searchParameter || this.name;
200
+ }
139
201
  isSearchParameter() {
140
202
  return !this.searchParameter || this.searchParameter === this.name;
141
203
  }
142
- connectedCallback() {
143
- super.connectedCallback();
144
- /**
145
- * Nom de la valeur de recherche
146
- * Si non défini, on utilise name
147
- **/
148
- const searchParameter = this.searchParameter || this.name;
149
- /**
150
- * Nommage des différents dataProviders utilisés
151
- */
152
- const formDataProvider = this.getAncestorAttributeValue("formDataProvider");
153
- // Create unique provider name with formProvider name + input name
154
- const dpPrefix = formDataProvider + "__" + this.name + "__autocomplete";
204
+ shouldShowSuggestions(text) {
205
+ return ((text?.length || 0) >= this.minSearchLength || this.minSearchLength === 0);
206
+ }
207
+ isSearchFocused() {
208
+ const active = document.activeElement;
209
+ if (!active)
210
+ return false;
211
+ const input = this.renderRoot?.querySelector("sonic-input.form-element");
212
+ return !!(input &&
213
+ (active === input ||
214
+ input.contains(active) ||
215
+ input.shadowRoot?.contains(active)));
216
+ }
217
+ openPopIfNeeded(text, fromUserInput = false) {
218
+ if (this.suppressPopOpen)
219
+ return;
220
+ if (!this.shouldShowSuggestions(text)) {
221
+ this.popElement?.hide();
222
+ return;
223
+ }
224
+ if (fromUserInput || this.isSearchFocused() || this.popElement?.open) {
225
+ this.popElement?.show();
226
+ // 2e show après le render Lit du pop (remettait display:none)
227
+ requestAnimationFrame(() => {
228
+ if (this.suppressPopOpen)
229
+ return;
230
+ const current = String(this.searchPublisher?.get() ?? this.searchText ?? "");
231
+ if (this.shouldShowSuggestions(current)) {
232
+ this.popElement?.show();
233
+ }
234
+ });
235
+ }
236
+ }
237
+ setSearchText(value) {
238
+ const next = value == null || value === ""
239
+ ? ""
240
+ : typeof value === "string"
241
+ ? value
242
+ : String(value);
243
+ this.searchText = next;
244
+ if (this.searchPublisher && this.searchPublisher.get() !== next) {
245
+ this.searchPublisher.set(next);
246
+ }
247
+ this.syncQueueFilter(next);
248
+ }
249
+ /** Pousse vers la queue seulement si assez de caractères. */
250
+ syncQueueFilter(text) {
251
+ if (!this.queueFilterPublisher)
252
+ return;
253
+ const ready = this.minSearchLength === 0 || text.length >= this.minSearchLength;
254
+ if (ready) {
255
+ if (!this.filterArmed || this.queueFilterPublisher.get() !== text) {
256
+ this.queueFilterPublisher.set(text);
257
+ }
258
+ this.filterArmed = true;
259
+ return;
260
+ }
261
+ if (this.filterArmed) {
262
+ this.filterArmed = false;
263
+ this.clearSearchQueueResults();
264
+ }
265
+ }
266
+ clearSearchQueueResults() {
267
+ if (!this.queueDataProvider)
268
+ return;
269
+ const queuePub = PublisherManager.get(this.queueDataProvider);
270
+ const descriptors = queuePub.get();
271
+ if (Array.isArray(descriptors)) {
272
+ for (const d of descriptors) {
273
+ if (d?.dataProvider) {
274
+ PublisherManager.getInstance().delete(d.dataProvider);
275
+ }
276
+ }
277
+ }
278
+ queuePub.set([]);
279
+ }
280
+ applySuggestion(value, label) {
281
+ this.suppressPopOpen = true;
282
+ const formValue = value;
283
+ const searchLabel = label ||
284
+ (typeof formValue === "string" ? formValue : String(formValue ?? ""));
285
+ this.formValuePublisher?.set(formValue);
286
+ this.lastValidSearch = this.isSearchParameter() ? formValue : searchLabel;
287
+ this.setSearchText(this.isSearchParameter() ? String(formValue ?? "") : searchLabel);
288
+ this.popElement?.hide();
289
+ // Laisse le cycle hide/focus se terminer avant de réautoriser l'ouverture.
290
+ requestAnimationFrame(() => {
291
+ this.suppressPopOpen = false;
292
+ });
293
+ }
294
+ getSuggestionItems() {
295
+ return [
296
+ ...(this.renderRoot?.querySelectorAll("sonic-menu-item") ?? []),
297
+ ];
298
+ }
299
+ selectSuggestionItem(item) {
300
+ const value = item.getAttribute(SUGGESTION_VALUE_ATTR) ?? item.value ?? null;
301
+ const label = item.getAttribute(SUGGESTION_LABEL_ATTR) ??
302
+ (item.textContent || "").trim();
303
+ if (value == null && !label)
304
+ return;
305
+ this.applySuggestion(value ?? label, label);
306
+ }
307
+ setupProviders() {
308
+ const searchParameter = this.searchFieldName();
309
+ const formDataProvider = this.formDataProvider ||
310
+ this.getAncestorAttributeValue("formDataProvider") ||
311
+ "";
312
+ const instanceId = InputAutocomplete_1.instanceCounter++;
313
+ const dpPrefix = (formDataProvider || "form") +
314
+ "__" +
315
+ (this.name || "field") +
316
+ "__autocomplete__" +
317
+ instanceId;
155
318
  this.initSearchDataProvider = `${dpPrefix}_init_search__`;
156
319
  this.initQueueDataProvider = `${dpPrefix}_init_queue__`;
157
320
  this.searchDataProvider = `${dpPrefix}_search__`;
321
+ this.queueFilterDataProvider = `${dpPrefix}_queue_filter__`;
158
322
  this.queueDataProvider = `${dpPrefix}_queue__`;
159
- /**
160
- * Les publishers utilisés plusieurs fois dans la classe son miss en propriétés privées de la classe
161
- */
162
323
  const getPublisher = PublisherManager.get;
163
- this.searchPublisher = getPublisher(this.searchDataProvider)[searchParameter];
324
+ this.searchPublisher =
325
+ getPublisher(this.searchDataProvider)[searchParameter];
326
+ this.queueFilterPublisher =
327
+ getPublisher(this.queueFilterDataProvider)[searchParameter];
164
328
  this.formValuePublisher = traverseDotNotation(getPublisher(formDataProvider), this.name);
165
- this.countPublisher = getPublisher(this.queueDataProvider).resultCount;
166
329
  this.initCountPublisher = getPublisher(this.initQueueDataProvider).resultCount;
167
- /**
168
- * Si une valeur est fourrnie a l'initialisation, un queue spécifique appelle le service avec le name founi en paramètre
169
- * Pour récupérer la valeur de searchParameter correspondante et renseigner l'input
170
- **/
171
330
  if (this.value) {
172
- PublisherManager.get(this.initSearchDataProvider)[this.name].set(this.value);
331
+ getPublisher(this.initSearchDataProvider)[this.name].set(this.value);
173
332
  }
174
333
  this.initCountPublisher?.onAssign(this.initSearchParameter);
175
- /**
176
- * Lorsque la sélection change, on met à jour la valeur de recherche
177
- */
178
334
  this.formValuePublisher?.onAssign(this.updateSearchParameter);
179
- /**
180
- * Lorsque La valeur de recherche change, que le composant n'est pas en mode select
181
- * et qu'elle est différente de la derniere recherche valide on désactive la selection
182
- */
183
- this.countPublisher?.onAssign(this.updateActiveSelection);
184
- this.searchPublisher?.onAssign(this.updatePopContentVisibility);
335
+ this.searchPublisher?.onAssign(this.onSearchPublisherAssign);
336
+ const existing = this.searchPublisher?.get();
337
+ if (existing != null && existing !== "") {
338
+ this.searchText = String(existing);
339
+ this.syncQueueFilter(this.searchText);
340
+ }
341
+ this.providersReady = true;
342
+ }
343
+ teardownProviders() {
344
+ this.initCountPublisher?.offAssign(this.initSearchParameter);
345
+ this.formValuePublisher?.offAssign(this.updateSearchParameter);
346
+ this.searchPublisher?.offAssign(this.onSearchPublisherAssign);
347
+ const getPublisher = PublisherManager.get;
348
+ if (this.initSearchDataProvider)
349
+ getPublisher(this.initSearchDataProvider).delete();
350
+ if (this.initQueueDataProvider)
351
+ getPublisher(this.initQueueDataProvider).delete();
352
+ if (this.searchDataProvider)
353
+ getPublisher(this.searchDataProvider).delete();
354
+ if (this.queueFilterDataProvider)
355
+ getPublisher(this.queueFilterDataProvider).delete();
356
+ if (this.queueDataProvider)
357
+ getPublisher(this.queueDataProvider).delete();
358
+ this.providersReady = false;
359
+ }
360
+ connectedCallback() {
361
+ super.connectedCallback();
362
+ this.setupProviders();
363
+ this.addEventListener("keyup", this.handleSearchKeyUp);
364
+ this.addEventListener("keydown", this.handleSearchKeyDown, true);
185
365
  }
186
366
  firstUpdated(_changedProperties) {
187
367
  super.firstUpdated(_changedProperties);
188
- // Écouter le focusout sur le popElement pour fermer le pop quand le focus sort
189
368
  this.popElement.addEventListener("focusout", this.handleFocusOut);
190
369
  }
191
370
  disconnectedCallback() {
371
+ this.removeEventListener("keyup", this.handleSearchKeyUp);
372
+ this.removeEventListener("keydown", this.handleSearchKeyDown, true);
373
+ this.teardownProviders();
374
+ this.popElement?.removeEventListener("focusout", this.handleFocusOut);
192
375
  super.disconnectedCallback();
193
- this.initCountPublisher?.offAssign(this.initSearchParameter);
194
- this.formValuePublisher?.offAssign(this.updateSearchParameter);
195
- this.countPublisher?.offAssign(this.updateActiveSelection);
196
- const getPublisher = PublisherManager.get;
197
- getPublisher(this.initSearchDataProvider).delete();
198
- getPublisher(this.initQueueDataProvider).delete();
199
- getPublisher(this.searchDataProvider).delete();
200
- getPublisher(this.queueDataProvider).delete();
201
- this.searchPublisher?.offAssign(this.updatePopContentVisibility);
202
- // Retirer l'écouteur de focusout
203
- this.popElement.removeEventListener("focusout", this.handleFocusOut);
204
376
  }
205
- /**
206
- * @param queueDataProvider
207
- * @param itemFinder
208
- * @param itemMutator
209
- *
210
- * @return bool|undefined True if item found, false otherwise, undefined if result is not a list
211
- */
212
377
  queryQueueListItem(queueDataProvider, itemFinder, itemMutator) {
213
378
  const queuePublisher = PublisherManager.get(queueDataProvider);
214
379
  let listItem;
215
- let listsDescriptors = queuePublisher.get();
380
+ const listsDescriptors = queuePublisher.get();
216
381
  if (!listsDescriptors || !Array.isArray(listsDescriptors)) {
217
382
  return false;
218
383
  }
219
384
  if (!listsDescriptors.length)
220
385
  return false;
221
386
  for (const listDescriptor of listsDescriptors) {
222
- let list = PublisherManager.get(listDescriptor.dataProvider).get();
387
+ const list = PublisherManager.get(listDescriptor.dataProvider).get();
223
388
  if (!Array.isArray(list))
224
389
  continue;
225
390
  listItem = list.find(itemFinder);
226
- if (listItem) {
391
+ if (listItem)
227
392
  break;
228
- }
229
393
  }
230
394
  if (listItem) {
231
395
  itemMutator(listItem);
@@ -234,40 +398,59 @@ let InputAutocomplete = class InputAutocomplete extends TemplatesContainer(FormI
234
398
  return false;
235
399
  }
236
400
  setSelectionRange(start, end) {
237
- this.querySelector("sonic-input")?.setSelectionRange(start, end);
401
+ this.renderRoot?.querySelector("sonic-input.form-element")?.setSelectionRange(start, end);
238
402
  }
239
403
  handleHide() {
240
404
  if (!this.select)
241
405
  return;
242
- if (this.searchPublisher?.get() == "") {
406
+ if (!this.searchText) {
243
407
  this.lastValidSearch = "";
244
408
  this.formValuePublisher?.set("");
245
409
  return;
246
410
  }
247
- this.searchPublisher?.set(this.lastValidSearch);
411
+ this.setSearchText(this.lastValidSearch);
248
412
  }
249
- getInputValue() {
250
- if (!this.isSearchParameter()) {
251
- return this.lastValidSearch;
413
+ /** Contient `node` même à travers des shadow roots imbriqués. */
414
+ deepContains(container, node) {
415
+ if (!container || !node)
416
+ return false;
417
+ let current = node;
418
+ while (current) {
419
+ if (current === container || container.contains(current))
420
+ return true;
421
+ const root = current.getRootNode();
422
+ if (root instanceof ShadowRoot) {
423
+ current = root.host;
424
+ }
425
+ else {
426
+ break;
427
+ }
252
428
  }
253
- return this.searchPublisher?.get();
429
+ return false;
254
430
  }
255
431
  handleFocus() {
256
- this.popElement.show();
432
+ const text = String(this.searchText ?? "");
433
+ if (this.shouldShowSuggestions(text)) {
434
+ this.suppressPopOpen = false;
435
+ this.popElement?.show();
436
+ }
257
437
  }
258
438
  render() {
439
+ if (!this.providersReady || !this.searchDataProvider) {
440
+ return nothing;
441
+ }
442
+ const templates = this.templateList.concat(this.templatePartsList);
259
443
  return html `
260
444
  <sonic-pop manual style="display:block;" @hide=${this.handleHide}>
261
445
  <sonic-input
262
446
  class="form-element"
263
- dataProvider="${this.initSearchDataProvider + Math.random()}"
264
- noAutofill
265
- formDataProvider="${this.searchDataProvider}"
447
+ .formDataProvider=${this.searchDataProvider}
448
+ .value=${this.searchText}
266
449
  type="search"
267
- data-keyboard-nav="${this.getAttribute("data-keyboard-nav") || ""}"
450
+ data-keyboard-nav=""
268
451
  label="${ifDefined(this.label)}"
269
452
  description="${ifDefined(this.description)}"
270
- name="${ifDefined(this.searchParameter || this.name)}"
453
+ name="${ifDefined(this.searchFieldName())}"
271
454
  ?required=${this.required}
272
455
  placeholder="${ifDefined(this.placeholder)}"
273
456
  ?readonly="${this.readonly}"
@@ -276,7 +459,7 @@ let InputAutocomplete = class InputAutocomplete extends TemplatesContainer(FormI
276
459
  inlineContent
277
460
  size=${this.size}
278
461
  @focus=${this.handleFocus}
279
- value=${ifDefined(this.getInputValue())}
462
+ @change=${this.handleSearchActivity}
280
463
  >
281
464
  <slot
282
465
  name="prefix"
@@ -298,33 +481,40 @@ let InputAutocomplete = class InputAutocomplete extends TemplatesContainer(FormI
298
481
  <sonic-menu
299
482
  slot="content"
300
483
  class="custom-scroll"
301
- style="${this.offsetWidth
302
- ? `width: ${this.offsetWidth}px`
303
- : ""}; display:${this.isPopVisible ? "block" : "none"};"
484
+ data-on-select="keep"
485
+ style="${this.offsetWidth ? `width: ${this.offsetWidth}px` : ""}"
486
+ @pointerdown=${this.handleSuggestionPointerDown}
304
487
  >
305
488
  <sonic-queue
306
489
  dataProvider="${this.queueDataProvider}"
307
490
  filteredFields=${this.filteredFields}
308
491
  dataProviderExpression="${this.dataProviderExpression}"
309
- dataFilterProvider="${this.searchDataProvider}"
310
- key="${this.key}"
311
- .templates=${this.templateList.concat(this.templatePartsList)}
312
- displayContents
313
- >
314
- </sonic-queue>
315
- <sonic-queue
316
- noLazyload
317
- loader="no-loader"
318
- dataProvider="${this.initQueueDataProvider}"
319
- filteredFields=${this.filteredFields}
320
- dataProviderExpression="${this.dataProviderExpression}"
321
- dataFilterProvider="${this.initSearchDataProvider}"
492
+ dataFilterProvider="${this.queueFilterDataProvider}"
493
+ serviceURL=${ifDefined(this.serviceURL || undefined)}
322
494
  key="${this.key}"
495
+ .templates=${templates}
496
+ .items=${this.items}
323
497
  displayContents
324
498
  >
325
499
  </sonic-queue>
326
500
  </sonic-menu>
327
501
  </sonic-pop>
502
+ <!-- Lookup valeur initiale : hors menu, jamais displayContents (sinon visible). -->
503
+ <sonic-queue
504
+ class="init-queue"
505
+ hidden
506
+ noLazyload
507
+ loader="no-loader"
508
+ dataProvider="${this.initQueueDataProvider}"
509
+ filteredFields=${this.filteredFields}
510
+ dataProviderExpression="${this.dataProviderExpression}"
511
+ dataFilterProvider="${this.initSearchDataProvider}"
512
+ serviceURL=${ifDefined(this.serviceURL || undefined)}
513
+ key="${this.key}"
514
+ .templates=${templates}
515
+ .items=${this.items}
516
+ >
517
+ </sonic-queue>
328
518
  `;
329
519
  }
330
520
  };
@@ -334,7 +524,6 @@ InputAutocomplete.styles = [
334
524
  :host {
335
525
  display: block;
336
526
  }
337
- /**disable mouse if there is an attribute readonly */
338
527
  :host([readonly]),
339
528
  :host([disabled]) {
340
529
  pointer-events: none;
@@ -351,8 +540,18 @@ InputAutocomplete.styles = [
351
540
  min-width: 14rem;
352
541
  width: 100%;
353
542
  }
543
+
544
+ .init-queue {
545
+ display: none !important;
546
+ position: absolute;
547
+ width: 0;
548
+ height: 0;
549
+ overflow: hidden;
550
+ pointer-events: none;
551
+ }
354
552
  `,
355
553
  ];
554
+ InputAutocomplete.instanceCounter = 0;
356
555
  __decorate([
357
556
  property({ type: String })
358
557
  ], InputAutocomplete.prototype, "size", void 0);
@@ -368,6 +567,9 @@ __decorate([
368
567
  __decorate([
369
568
  property({ type: String })
370
569
  ], InputAutocomplete.prototype, "dataProviderExpression", void 0);
570
+ __decorate([
571
+ property({ type: String })
572
+ ], InputAutocomplete.prototype, "serviceURL", void 0);
371
573
  __decorate([
372
574
  property({ type: Number })
373
575
  ], InputAutocomplete.prototype, "minSearchLength", void 0);
@@ -383,6 +585,9 @@ __decorate([
383
585
  __decorate([
384
586
  property({ type: String })
385
587
  ], InputAutocomplete.prototype, "propertyName", void 0);
588
+ __decorate([
589
+ property({ type: Function, attribute: false })
590
+ ], InputAutocomplete.prototype, "items", void 0);
386
591
  __decorate([
387
592
  queryAssignedNodes({ slot: "prefix", flatten: true })
388
593
  ], InputAutocomplete.prototype, "slotInputPrefixNodes", void 0);
@@ -394,11 +599,11 @@ __decorate([
394
599
  ], InputAutocomplete.prototype, "popElement", void 0);
395
600
  __decorate([
396
601
  state()
397
- ], InputAutocomplete.prototype, "isPopVisible", void 0);
602
+ ], InputAutocomplete.prototype, "searchText", void 0);
398
603
  __decorate([
399
604
  state()
400
- ], InputAutocomplete.prototype, "lastValidSearch", void 0);
401
- InputAutocomplete = __decorate([
605
+ ], InputAutocomplete.prototype, "searchDataProvider", void 0);
606
+ InputAutocomplete = InputAutocomplete_1 = __decorate([
402
607
  customElement("sonic-input-autocomplete")
403
608
  ], InputAutocomplete);
404
609
  export { InputAutocomplete };