@supersoniks/concorde 4.9.98-visual-stack.1 → 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 (339) hide show
  1. package/.gitlab-ci.yml +0 -13
  2. package/build-infos.json +1 -1
  3. package/concorde-3d.bundle.js +1 -1
  4. package/concorde-3d.es.js +2 -2
  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 +1 -1
  12. package/concorde-shader.es.js +2 -2
  13. package/concorde-webgpu.bundle.js +1 -1
  14. package/concorde-webgpu.es.js +2 -2
  15. package/dist/concorde-3d.bundle.js +1 -1
  16. package/dist/concorde-3d.es.js +2 -2
  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 +1 -1
  24. package/dist/concorde-shader.es.js +2 -2
  25. package/dist/concorde-webgpu.bundle.js +1 -1
  26. package/dist/concorde-webgpu.es.js +2 -2
  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/if/if.js +65 -7
  32. package/dist/js/core/components/functional/if/if.js.map +1 -1
  33. package/dist/js/core/components/functional/interactive/action.js +96 -0
  34. package/dist/js/core/components/functional/interactive/action.js.map +1 -0
  35. package/dist/js/core/components/functional/interactive/gamepad.js +206 -0
  36. package/dist/js/core/components/functional/interactive/gamepad.js.map +1 -0
  37. package/dist/js/core/components/functional/interactive/gesture.js +148 -0
  38. package/dist/js/core/components/functional/interactive/gesture.js.map +1 -0
  39. package/dist/js/core/components/functional/interactive/helpers.js +82 -0
  40. package/dist/js/core/components/functional/interactive/helpers.js.map +1 -0
  41. package/dist/js/core/components/functional/interactive/index.js +20 -0
  42. package/dist/js/core/components/functional/interactive/index.js.map +1 -0
  43. package/dist/js/core/components/functional/interactive/keyboard.js +183 -0
  44. package/dist/js/core/components/functional/interactive/keyboard.js.map +1 -0
  45. package/dist/js/core/components/functional/interactive/matrix.js +201 -0
  46. package/dist/js/core/components/functional/interactive/matrix.js.map +1 -0
  47. package/dist/js/core/components/functional/interactive/registry.js +28 -0
  48. package/dist/js/core/components/functional/interactive/registry.js.map +1 -0
  49. package/dist/js/core/components/functional/interactive/store.js +264 -0
  50. package/dist/js/core/components/functional/interactive/store.js.map +1 -0
  51. package/dist/js/core/components/functional/interactive/ticker.js +182 -0
  52. package/dist/js/core/components/functional/interactive/ticker.js.map +1 -0
  53. package/dist/js/core/components/functional/value/value.js +49 -4
  54. package/dist/js/core/components/functional/value/value.js.map +1 -1
  55. package/dist/js/core/components/ui/_css/rounded.js +34 -0
  56. package/dist/js/core/components/ui/_css/rounded.js.map +1 -0
  57. package/dist/js/core/components/ui/_css/type.js +44 -0
  58. package/dist/js/core/components/ui/_css/type.js.map +1 -1
  59. package/dist/js/core/components/ui/_i18n/ui-aria-labels.js +95 -0
  60. package/dist/js/core/components/ui/_i18n/ui-aria-labels.js.map +1 -0
  61. package/dist/js/core/components/ui/alert/alert.js +72 -87
  62. package/dist/js/core/components/ui/alert/alert.js.map +1 -1
  63. package/dist/js/core/components/ui/alert-messages/alert-messages.js +1 -0
  64. package/dist/js/core/components/ui/alert-messages/alert-messages.js.map +1 -1
  65. package/dist/js/core/components/ui/badge/badge.js +29 -80
  66. package/dist/js/core/components/ui/badge/badge.js.map +1 -1
  67. package/dist/js/core/components/ui/button/button.js +8 -7
  68. package/dist/js/core/components/ui/button/button.js.map +1 -1
  69. package/dist/js/core/components/ui/card/card-header.js +7 -2
  70. package/dist/js/core/components/ui/card/card-header.js.map +1 -1
  71. package/dist/js/core/components/ui/divider/divider.js +1 -1
  72. package/dist/js/core/components/ui/divider/divider.js.map +1 -1
  73. package/dist/js/core/components/ui/form/checkbox/checkbox.js +4 -20
  74. package/dist/js/core/components/ui/form/checkbox/checkbox.js.map +1 -1
  75. package/dist/js/core/components/ui/form/fieldset/legend-description.js +1 -1
  76. package/dist/js/core/components/ui/form/fieldset/legend.js +1 -1
  77. package/dist/js/core/components/ui/form/input/input.js +12 -15
  78. package/dist/js/core/components/ui/form/input/input.js.map +1 -1
  79. package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js +363 -158
  80. package/dist/js/core/components/ui/form/input-autocomplete/input-autocomplete.js.map +1 -1
  81. package/dist/js/core/components/ui/form/radio/radio.js +1 -1
  82. package/dist/js/core/components/ui/form/select/select.js +3 -6
  83. package/dist/js/core/components/ui/form/select/select.js.map +1 -1
  84. package/dist/js/core/components/ui/form/textarea/textarea.js +1 -2
  85. package/dist/js/core/components/ui/form/textarea/textarea.js.map +1 -1
  86. package/dist/js/core/components/ui/image/image.js +9 -37
  87. package/dist/js/core/components/ui/image/image.js.map +1 -1
  88. package/dist/js/core/components/ui/link/link.js +25 -26
  89. package/dist/js/core/components/ui/link/link.js.map +1 -1
  90. package/dist/js/core/components/ui/modal/modal-close.js +3 -12
  91. package/dist/js/core/components/ui/modal/modal-close.js.map +1 -1
  92. package/dist/js/core/components/ui/modal/modal.js +18 -18
  93. package/dist/js/core/components/ui/modal/modal.js.map +1 -1
  94. package/dist/js/core/components/ui/pop/pop.js +131 -112
  95. package/dist/js/core/components/ui/pop/pop.js.map +1 -1
  96. package/dist/js/core/components/ui/table/table.js.map +1 -1
  97. package/dist/js/core/components/ui/theme/theme.js +1 -1
  98. package/dist/js/core/components/ui/toast/dismissed.js +9 -0
  99. package/dist/js/core/components/ui/toast/dismissed.js.map +1 -0
  100. package/dist/js/core/components/ui/toast/render-content.js +14 -0
  101. package/dist/js/core/components/ui/toast/render-content.js.map +1 -0
  102. package/dist/js/core/components/ui/toast/toast-item.js +150 -96
  103. package/dist/js/core/components/ui/toast/toast-item.js.map +1 -1
  104. package/dist/js/core/components/ui/toast/toast.js +41 -13
  105. package/dist/js/core/components/ui/toast/toast.js.map +1 -1
  106. package/dist/js/core/components/ui/tooltip/tooltip.js +144 -143
  107. package/dist/js/core/components/ui/tooltip/tooltip.js.map +1 -1
  108. package/dist/js/core/decorators/subscriber/ancestorAttribute.js.map +1 -1
  109. package/dist/js/core/decorators/subscriber/derive.js +3 -1
  110. package/dist/js/core/decorators/subscriber/derive.js.map +1 -1
  111. package/dist/js/core/mixins/Fetcher.js.map +1 -1
  112. package/dist/js/core/mixins/FormCheckable.js +1 -8
  113. package/dist/js/core/mixins/FormCheckable.js.map +1 -1
  114. package/dist/js/core/mixins/FormElement.js +26 -53
  115. package/dist/js/core/mixins/FormElement.js.map +1 -1
  116. package/dist/js/core/utils/AncestorAttributeObserver.js +130 -55
  117. package/dist/js/core/utils/AncestorAttributeObserver.js.map +1 -1
  118. package/dist/js/core/utils/LocationHandler.js +1 -1
  119. package/dist/js/core/utils/LocationHandler.js.map +1 -1
  120. package/dist/js/core/utils/dismissed.js +23 -0
  121. package/dist/js/core/utils/dismissed.js.map +1 -0
  122. package/dist/js/core/utils/positioning.js +110 -0
  123. package/dist/js/core/utils/positioning.js.map +1 -0
  124. package/dist/js/directives.js +1 -2
  125. package/dist/js/directives.js.map +1 -1
  126. package/dist/types/addons/interactive.d.ts +6 -0
  127. package/dist/types/addons/interactive.d.ts.map +1 -0
  128. package/dist/types/core/components/functional/if/if.d.ts +14 -5
  129. package/dist/types/core/components/functional/if/if.d.ts.map +1 -1
  130. package/dist/types/core/components/functional/interactive/action.d.ts +22 -0
  131. package/dist/types/core/components/functional/interactive/action.d.ts.map +1 -0
  132. package/dist/types/core/components/functional/interactive/gamepad.d.ts +37 -0
  133. package/dist/types/core/components/functional/interactive/gamepad.d.ts.map +1 -0
  134. package/dist/types/core/components/functional/interactive/gesture.d.ts +26 -0
  135. package/dist/types/core/components/functional/interactive/gesture.d.ts.map +1 -0
  136. package/dist/types/core/components/functional/interactive/helpers.d.ts +23 -0
  137. package/dist/types/core/components/functional/interactive/helpers.d.ts.map +1 -0
  138. package/dist/types/core/components/functional/interactive/index.d.ts +20 -0
  139. package/dist/types/core/components/functional/interactive/index.d.ts.map +1 -0
  140. package/dist/types/core/components/functional/interactive/keyboard.d.ts +37 -0
  141. package/dist/types/core/components/functional/interactive/keyboard.d.ts.map +1 -0
  142. package/dist/types/core/components/functional/interactive/matrix.d.ts +31 -0
  143. package/dist/types/core/components/functional/interactive/matrix.d.ts.map +1 -0
  144. package/dist/types/core/components/functional/interactive/registry.d.ts +23 -0
  145. package/dist/types/core/components/functional/interactive/registry.d.ts.map +1 -0
  146. package/dist/types/core/components/functional/interactive/store.d.ts +46 -0
  147. package/dist/types/core/components/functional/interactive/store.d.ts.map +1 -0
  148. package/dist/types/core/components/functional/interactive/ticker.d.ts +33 -0
  149. package/dist/types/core/components/functional/interactive/ticker.d.ts.map +1 -0
  150. package/dist/types/core/components/functional/value/value.d.ts +6 -0
  151. package/dist/types/core/components/functional/value/value.d.ts.map +1 -1
  152. package/dist/types/core/components/ui/_css/rounded.d.ts +3 -0
  153. package/dist/types/core/components/ui/_css/rounded.d.ts.map +1 -0
  154. package/dist/types/core/components/ui/_css/type.d.ts +13 -0
  155. package/dist/types/core/components/ui/_css/type.d.ts.map +1 -1
  156. package/dist/types/core/components/ui/_i18n/ui-aria-labels.d.ts +83 -0
  157. package/dist/types/core/components/ui/_i18n/ui-aria-labels.d.ts.map +1 -0
  158. package/dist/types/core/components/ui/alert/alert.d.ts +14 -12
  159. package/dist/types/core/components/ui/alert/alert.d.ts.map +1 -1
  160. package/dist/types/core/components/ui/alert-messages/alert-messages.d.ts.map +1 -1
  161. package/dist/types/core/components/ui/badge/badge.d.ts +1 -1
  162. package/dist/types/core/components/ui/badge/badge.d.ts.map +1 -1
  163. package/dist/types/core/components/ui/button/button.d.ts +13 -29
  164. package/dist/types/core/components/ui/button/button.d.ts.map +1 -1
  165. package/dist/types/core/components/ui/card/card-header.d.ts.map +1 -1
  166. package/dist/types/core/components/ui/divider/divider.d.ts +2 -1
  167. package/dist/types/core/components/ui/divider/divider.d.ts.map +1 -1
  168. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts +25 -73
  169. package/dist/types/core/components/ui/form/checkbox/checkbox.d.ts.map +1 -1
  170. package/dist/types/core/components/ui/form/input/input.d.ts +14 -29
  171. package/dist/types/core/components/ui/form/input/input.d.ts.map +1 -1
  172. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts +63 -65
  173. package/dist/types/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts.map +1 -1
  174. package/dist/types/core/components/ui/form/radio/radio.d.ts +1 -1
  175. package/dist/types/core/components/ui/form/select/select.d.ts +3 -5
  176. package/dist/types/core/components/ui/form/select/select.d.ts.map +1 -1
  177. package/dist/types/core/components/ui/form/textarea/textarea.d.ts +12 -28
  178. package/dist/types/core/components/ui/form/textarea/textarea.d.ts.map +1 -1
  179. package/dist/types/core/components/ui/image/image.d.ts +2 -1
  180. package/dist/types/core/components/ui/image/image.d.ts.map +1 -1
  181. package/dist/types/core/components/ui/link/link.d.ts +10 -9
  182. package/dist/types/core/components/ui/link/link.d.ts.map +1 -1
  183. package/dist/types/core/components/ui/modal/modal-close.d.ts +2 -2
  184. package/dist/types/core/components/ui/modal/modal-close.d.ts.map +1 -1
  185. package/dist/types/core/components/ui/pop/pop.d.ts +12 -4
  186. package/dist/types/core/components/ui/pop/pop.d.ts.map +1 -1
  187. package/dist/types/core/components/ui/table/table.d.ts +2 -1
  188. package/dist/types/core/components/ui/table/table.d.ts.map +1 -1
  189. package/dist/types/core/components/ui/toast/dismissed.d.ts +3 -0
  190. package/dist/types/core/components/ui/toast/dismissed.d.ts.map +1 -0
  191. package/dist/types/core/components/ui/toast/render-content.d.ts +7 -0
  192. package/dist/types/core/components/ui/toast/render-content.d.ts.map +1 -0
  193. package/dist/types/core/components/ui/toast/toast-item.d.ts +26 -9
  194. package/dist/types/core/components/ui/toast/toast-item.d.ts.map +1 -1
  195. package/dist/types/core/components/ui/toast/toast.d.ts +6 -3
  196. package/dist/types/core/components/ui/toast/toast.d.ts.map +1 -1
  197. package/dist/types/core/components/ui/toast/types.d.ts +12 -2
  198. package/dist/types/core/components/ui/toast/types.d.ts.map +1 -1
  199. package/dist/types/core/components/ui/tooltip/tooltip.d.ts +19 -11
  200. package/dist/types/core/components/ui/tooltip/tooltip.d.ts.map +1 -1
  201. package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts +3 -4
  202. package/dist/types/core/decorators/subscriber/ancestorAttribute.d.ts.map +1 -1
  203. package/dist/types/core/decorators/subscriber/derive.d.ts.map +1 -1
  204. package/dist/types/core/mixins/FormCheckable.d.ts +10 -27
  205. package/dist/types/core/mixins/FormCheckable.d.ts.map +1 -1
  206. package/dist/types/core/mixins/FormElement.d.ts +21 -10
  207. package/dist/types/core/mixins/FormElement.d.ts.map +1 -1
  208. package/dist/types/core/mixins/FormInput.d.ts +11 -27
  209. package/dist/types/core/mixins/FormInput.d.ts.map +1 -1
  210. package/dist/types/core/utils/AncestorAttributeObserver.d.ts +17 -9
  211. package/dist/types/core/utils/AncestorAttributeObserver.d.ts.map +1 -1
  212. package/dist/types/core/utils/LocationHandler.d.ts +3 -2
  213. package/dist/types/core/utils/LocationHandler.d.ts.map +1 -1
  214. package/dist/types/core/utils/dismissed.d.ts +3 -0
  215. package/dist/types/core/utils/dismissed.d.ts.map +1 -0
  216. package/dist/types/core/utils/positioning.d.ts +44 -0
  217. package/dist/types/core/utils/positioning.d.ts.map +1 -0
  218. package/dist/types/directives.d.ts +1 -3
  219. package/dist/types/directives.d.ts.map +1 -1
  220. package/dist/types/mixins.d.ts +22 -55
  221. package/dist/types/mixins.d.ts.map +1 -1
  222. package/docs/assets/{index-FmK4JaIM.js → index-D8MVWqY6.js} +946 -687
  223. package/docs/assets/index-DiD0qYvE.css +1 -0
  224. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +17 -85
  225. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +1 -1
  226. package/docs/crawl/hubs/form-components.html +13 -11
  227. package/docs/docs-mock-api-sw.js +5 -1
  228. package/docs/docs-mock-api-sw.js.map +2 -2
  229. package/docs/index.html +2 -2
  230. package/docs/llms-full.txt +12 -38
  231. package/docs/llms.txt +1 -1
  232. package/docs/src/core/components/functional/sdui/sdui.md +0 -0
  233. package/docs/src/core/components/ui/form/checkbox/checkbox.md +0 -0
  234. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +14 -118
  235. package/docs/src/docs/_getting-started/create-a-component.md +0 -0
  236. package/docs/src/docs/_misc/formelement-subscriber-removal.md +1 -1
  237. package/docs/src/docs/search/docs-search.json +195 -200
  238. package/docs/src/tsconfig.json +324 -0
  239. package/gitlab/job_tests.sh +25 -12
  240. package/index.html +3 -3
  241. package/package.json +181 -9
  242. package/public/docs-mock-api-sw.js +5 -1
  243. package/public/docs-mock-api-sw.js.map +2 -2
  244. package/scripts/build-addons.mjs +2 -2
  245. package/scripts/post-build.mjs +9 -0
  246. package/src/addons/interactive.ts +5 -0
  247. package/src/core/components/functional/if/if.ts +54 -7
  248. package/src/core/components/functional/interactive/action.ts +84 -0
  249. package/src/core/components/functional/interactive/gamepad.ts +197 -0
  250. package/src/core/components/functional/interactive/gesture.ts +136 -0
  251. package/src/core/components/functional/interactive/helpers.spec.ts +50 -0
  252. package/src/core/components/functional/interactive/helpers.ts +97 -0
  253. package/src/core/components/functional/interactive/index.ts +25 -0
  254. package/src/core/components/functional/interactive/interactive.md +33 -0
  255. package/src/core/components/functional/interactive/keyboard.ts +171 -0
  256. package/src/core/components/functional/interactive/matrix.ts +185 -0
  257. package/src/core/components/functional/interactive/registry.ts +46 -0
  258. package/src/core/components/functional/interactive/store.ts +264 -0
  259. package/src/core/components/functional/interactive/ticker.ts +171 -0
  260. package/src/core/components/functional/list/list.ts +0 -0
  261. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  262. package/src/core/components/functional/value/value.ts +44 -4
  263. package/src/core/components/ui/_css/rounded.ts +36 -0
  264. package/src/core/components/ui/_css/type.ts +49 -0
  265. package/src/core/components/ui/_i18n/ui-aria-labels.ts +104 -0
  266. package/src/core/components/ui/alert/alert.md +128 -72
  267. package/src/core/components/ui/alert/alert.spec.ts +145 -0
  268. package/src/core/components/ui/alert/alert.ts +86 -91
  269. package/src/core/components/ui/alert-messages/alert-messages.ts +1 -1
  270. package/src/core/components/ui/badge/badge.md +126 -78
  271. package/src/core/components/ui/badge/badge.ts +29 -81
  272. package/src/core/components/ui/button/button.md +1 -0
  273. package/src/core/components/ui/button/button.ts +12 -10
  274. package/src/core/components/ui/card/card-header.ts +7 -2
  275. package/src/core/components/ui/card/card.md +120 -65
  276. package/src/core/components/ui/divider/divider.ts +4 -9
  277. package/src/core/components/ui/form/checkbox/checkbox.md +1 -1
  278. package/src/core/components/ui/form/checkbox/checkbox.ts +4 -20
  279. package/src/core/components/ui/form/fieldset/legend-description.ts +1 -1
  280. package/src/core/components/ui/form/fieldset/legend.ts +1 -1
  281. package/src/core/components/ui/form/input/input.md +1 -1
  282. package/src/core/components/ui/form/input/input.ts +25 -27
  283. package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +14 -118
  284. package/src/core/components/ui/form/input-autocomplete/input-autocomplete.ts +419 -187
  285. package/src/core/components/ui/form/radio/radio.ts +1 -1
  286. package/src/core/components/ui/form/select/select.ts +3 -6
  287. package/src/core/components/ui/form/textarea/textarea.md +1 -1
  288. package/src/core/components/ui/form/textarea/textarea.ts +1 -2
  289. package/src/core/components/ui/image/image.md +147 -53
  290. package/src/core/components/ui/image/image.ts +10 -44
  291. package/src/core/components/ui/link/link.md +2 -2
  292. package/src/core/components/ui/link/link.ts +42 -37
  293. package/src/core/components/ui/modal/modal-close.ts +8 -12
  294. package/src/core/components/ui/modal/modal.ts +18 -18
  295. package/src/core/components/ui/pop/pop.md +105 -1
  296. package/src/core/components/ui/pop/pop.ts +145 -141
  297. package/src/core/components/ui/table/table.ts +2 -8
  298. package/src/core/components/ui/theme/theme.ts +1 -1
  299. package/src/core/components/ui/toast/dismissed.ts +14 -0
  300. package/src/core/components/ui/toast/render-content.ts +13 -0
  301. package/src/core/components/ui/toast/toast-item.ts +179 -103
  302. package/src/core/components/ui/toast/toast.ts +58 -21
  303. package/src/core/components/ui/toast/types.ts +14 -2
  304. package/src/core/components/ui/tooltip/tooltip.ts +176 -154
  305. package/src/core/decorators/subscriber/ancestorAttribute.spec.ts +26 -0
  306. package/src/core/decorators/subscriber/ancestorAttribute.ts +3 -4
  307. package/src/core/decorators/subscriber/derive.ts +3 -3
  308. package/src/core/mixins/Fetcher.ts +1 -1
  309. package/src/core/mixins/FormCheckable.ts +1 -8
  310. package/src/core/mixins/FormElement.ts +74 -76
  311. package/src/core/mixins/Subscriber.ts +0 -0
  312. package/src/core/utils/AncestorAttributeObserver.ts +183 -70
  313. package/src/core/utils/DataBindObserver.ts +0 -0
  314. package/src/core/utils/LocationHandler.ts +12 -5
  315. package/src/core/utils/Objects.ts +0 -0
  316. package/src/core/utils/dismissed.ts +22 -0
  317. package/src/core/utils/positioning.spec.ts +208 -0
  318. package/src/core/utils/positioning.ts +183 -0
  319. package/src/directives.ts +1 -3
  320. package/src/docs/_core-concept/dataFlow.md +1 -1
  321. package/src/docs/_decorators/ancestor-attribute.md +3 -2
  322. package/src/docs/_getting-started/concorde-outside.md +3 -3
  323. package/src/docs/_misc/formelement-subscriber-removal.md +115 -0
  324. package/src/docs/_misc/html-integration.md +2 -0
  325. package/src/docs/code.ts +3 -1
  326. package/src/docs/components/docs-demo-sources.ts +60 -0
  327. package/src/docs/docs.ts +1 -0
  328. package/src/docs/example/docs-input-autocomplete-demos.ts +110 -0
  329. package/src/docs/mock-api/router.ts +17 -1
  330. package/src/docs/navigation/navigation.ts +4 -0
  331. package/src/docs/search/docs-search.json +943 -2033
  332. package/src/docs/tailwind/css/tailwind.css +13 -6
  333. package/src/tsconfig.json +135 -6
  334. package/src/tsconfig.tsbuildinfo +1 -1
  335. package/tailwind.config.js +50 -3
  336. package/vite/config.js +23 -35
  337. package/vite.config.mts +5 -0
  338. package/vitest.setup.ts +49 -13
  339. package/docs/assets/index-BZiZXMU-.css +0 -1
@@ -1,221 +1,243 @@
1
1
  import { html, LitElement, css, PropertyValues } from "lit";
2
- import { customElement, property } from "lit/decorators.js";
2
+ import { customElement, property, query } from "lit/decorators.js";
3
+ import {
4
+ computeFloatingPosition,
5
+ FloatingPlacement,
6
+ getFloatingBounds,
7
+ parsePlacement,
8
+ startFrameLoop,
9
+ supportsPopover,
10
+ } from "@supersoniks/concorde/core/utils/positioning";
11
+
3
12
  const tagName = "sonic-tooltip";
13
+
14
+ type TooltipPlacement = FloatingPlacement;
15
+
16
+ const GAP = 4;
17
+
4
18
  @customElement(tagName)
5
19
  export class Tooltip extends LitElement {
20
+ static readonly supportsPopover = supportsPopover;
21
+
6
22
  static styles = [
7
23
  css`
8
24
  :host {
9
- position: relative;
10
25
  display: inline-flex;
11
26
  align-items: center;
12
27
  text-align: center;
13
28
  --sc-tooltip-fw: var(--sc-font-weight-base, 400);
14
- --sc-tooltip-position: calc(100% + 0.25rem);
15
29
  }
16
30
 
17
- .tooltip:before {
18
- position: absolute;
19
- content: attr(data-tooltip-text);
20
- font-size: 0.85rem;
21
- display: block;
22
- opacity: 0;
31
+ .tooltip-bubble {
32
+ position: fixed;
33
+ inset: auto;
34
+ margin: 0;
35
+ border: none;
23
36
  pointer-events: none;
37
+ font-size: 0.85rem;
24
38
  background: var(--sc-base-content, #000);
25
39
  padding: 0.32rem 0.55rem;
26
40
  border-radius: var(--sc-rounded);
27
41
  color: var(--sc-base, #fff);
28
- z-index: 999;
29
42
  line-height: 1.1;
30
43
  width: max-content;
31
44
  max-width: 18rem;
32
45
  white-space: pre-line;
33
46
  font-weight: var(--sc-tooltip-fw);
34
- transition: 0.2s;
35
- scale: 0.9;
36
- will-change: opacity, transform;
47
+ opacity: 0;
48
+ transition:
49
+ opacity 0.2s,
50
+ display 0.2s allow-discrete,
51
+ overlay 0.2s allow-discrete;
37
52
  }
38
53
 
39
- :host(:focus-visible) .tooltip:before,
40
- :host(.keyboard-focus) .tooltip:before,
41
- .tooltip:hover:before {
54
+ .tooltip-bubble:popover-open {
42
55
  opacity: 1;
43
- scale: 1;
44
56
  }
45
57
 
46
- .disabled:before {
47
- opacity: 0 !important;
48
- scale: 0.9 !important;
49
- }
50
-
51
- :host(:not([placement])) .tooltip:before,
52
- :host([placement="top"]) .tooltip:before {
53
- bottom: var(--sc-tooltip-position);
54
- left: 50%;
55
- transform: translateX(-50%);
56
- }
57
-
58
- :host([placement="top-end"]) .tooltip:before {
59
- bottom: var(--sc-tooltip-position);
60
- right: 0;
61
- }
62
- :host([placement="top-start"]) .tooltip:before {
63
- bottom: var(--sc-tooltip-position);
64
- left: 0;
65
- }
66
-
67
- :host([placement="bottom"]) .tooltip:before {
68
- top: var(--sc-tooltip-position);
69
- left: 50%;
70
- transform: translateX(-50%);
71
- }
72
-
73
- :host([placement="bottom-start"]) .tooltip:before {
74
- top: var(--sc-tooltip-position);
75
- left: 0;
76
- }
77
- :host([placement="bottom-end"]) .tooltip:before {
78
- top: var(--sc-tooltip-position);
79
- right: 0;
80
- }
81
-
82
- :host([placement="left"]) .tooltip:before {
83
- top: 50%;
84
- right: var(--sc-tooltip-position);
85
- transform: translateY(-50%);
86
- }
87
-
88
- :host([placement="left-start"]) .tooltip:before {
89
- top: 0;
90
- right: var(--sc-tooltip-position);
91
- }
92
-
93
- :host([placement="left-end"]) .tooltip:before {
94
- bottom: 0;
95
- right: var(--sc-tooltip-position);
96
- }
97
-
98
- :host([placement="right"]) .tooltip:before {
99
- top: 50%;
100
- transform: translateY(-50%);
101
- left: var(--sc-tooltip-position);
58
+ @starting-style {
59
+ .tooltip-bubble:popover-open {
60
+ opacity: 0;
61
+ }
102
62
  }
103
63
 
104
- :host([placement="right-start"]) .tooltip:before {
105
- top: 0;
106
- left: var(--sc-tooltip-position);
64
+ .tooltip-bubble.disabled {
65
+ display: none !important;
107
66
  }
108
67
 
109
- :host([placement="right-end"]) .tooltip:before {
110
- bottom: 0;
111
- left: var(--sc-tooltip-position);
68
+ @media (prefers-reduced-motion: reduce) {
69
+ .tooltip-bubble {
70
+ transition: none;
71
+ }
112
72
  }
113
73
  `,
114
74
  ];
115
75
 
116
- @property({ type: String }) label = "";
117
- @property({ type: String, reflect: true }) placement?:
118
- | "top"
119
- | "top-start"
120
- | "top-end"
121
- | "right"
122
- | "right-start"
123
- | "right-end"
124
- | "bottom"
125
- | "bottom-start"
126
- | "bottom-end"
127
- | "left"
128
- | "left-start"
129
- | "left-end";
76
+ @property({ type: String }) label?: string;
77
+ @property({ type: String, reflect: true }) placement?: TooltipPlacement;
130
78
 
131
79
  @property({ type: Boolean }) disabled = false;
132
80
  @property({ type: Boolean }) focusable = false;
133
81
 
134
- private lastKeyWasTab = false;
135
- private boundHandleKeyDown: (e: KeyboardEvent) => void;
136
- private boundHandleMouseDown: () => void;
82
+ @query(".tooltip-bubble") private bubbleEl?: HTMLElement;
137
83
 
138
- constructor() {
139
- super();
140
- this.boundHandleKeyDown = this.handleKeyDown.bind(this);
141
- this.boundHandleMouseDown = this.handleMouseDown.bind(this);
84
+ private stopPositioning?: () => void;
85
+
86
+ private get isEffectivelyDisabled() {
87
+ return this.disabled || !this.formatLabel();
88
+ }
89
+
90
+ private formatLabel() {
91
+ return (this.label ?? "")
92
+ .replaceAll(" ", " ")
93
+ .trim()
94
+ .split("\n")
95
+ .map((line) => line.trim())
96
+ .join("\n");
142
97
  }
143
98
 
144
- private handleKeyDown = (e: KeyboardEvent) => {
145
- // Détecter si Tab ou Shift+Tab a été pressé
146
- if (e.key === "Tab") {
147
- this.lastKeyWasTab = true;
99
+ private computePosition() {
100
+ const bubble = this.bubbleEl;
101
+ if (!bubble) {
102
+ return;
148
103
  }
149
- };
150
104
 
151
- private handleMouseDown = () => {
152
- // Réinitialiser le flag si la souris est utilisée
153
- this.lastKeyWasTab = false;
154
- // Retirer la classe si elle existe (au cas où)
155
- this.classList.remove("keyboard-focus");
105
+ const { side, align } = parsePlacement(this.placement, "top", "center");
106
+
107
+ const { x, y } = computeFloatingPosition({
108
+ anchor: this.getBoundingClientRect(),
109
+ floating: bubble.getBoundingClientRect(),
110
+ side,
111
+ align,
112
+ gap: GAP,
113
+ bounds: getFloatingBounds(this, GAP),
114
+ });
115
+
116
+ Object.assign(bubble.style, {
117
+ left: `${Math.round(x)}px`,
118
+ top: `${Math.round(y)}px`,
119
+ });
120
+ }
121
+
122
+ private showTooltip = () => {
123
+ if (this.isEffectivelyDisabled || !this.bubbleEl) {
124
+ return;
125
+ }
126
+
127
+ if (!this.bubbleEl.matches(":popover-open")) {
128
+ this.bubbleEl.showPopover();
129
+ }
156
130
  };
157
131
 
158
- private handleFocusIn = () => {
159
- // Ajouter la classe seulement si le focus est venu du clavier (Tab)
160
- if (this.lastKeyWasTab) {
161
- this.classList.add("keyboard-focus");
132
+ private hideTooltip = () => {
133
+ if (this.bubbleEl?.matches(":popover-open")) {
134
+ this.bubbleEl.hidePopover();
162
135
  }
163
- this.lastKeyWasTab = false;
164
136
  };
165
137
 
166
- private handleFocusOut = () => {
167
- this.classList.remove("keyboard-focus");
168
- this.lastKeyWasTab = false;
138
+ private handleBeforeToggle = (e: ToggleEvent) => {
139
+ if (e.newState === "open") {
140
+ this.stopPositioning ??= startFrameLoop(() => this.computePosition());
141
+ return;
142
+ }
143
+
144
+ this.endPositioning();
169
145
  };
170
146
 
147
+ private endPositioning() {
148
+ this.stopPositioning?.();
149
+ this.stopPositioning = undefined;
150
+ }
151
+
152
+ private syncTabIndex() {
153
+ if (this.disabled) {
154
+ this.setAttribute("tabindex", "-1");
155
+ } else if (this.focusable) {
156
+ this.setAttribute("tabindex", "0");
157
+ } else {
158
+ this.removeAttribute("tabindex");
159
+ }
160
+ }
161
+
162
+ /** Fallback natif quand Popover API indisponible */
163
+ private syncNativeTitle() {
164
+ if (Tooltip.supportsPopover || this.isEffectivelyDisabled) {
165
+ this.removeAttribute("title");
166
+ return;
167
+ }
168
+
169
+ this.setAttribute("title", this.formatLabel().replaceAll("\n", " "));
170
+ }
171
+
171
172
  connectedCallback() {
172
173
  super.connectedCallback();
173
- this.addEventListener("focusin", this.handleFocusIn);
174
- this.addEventListener("focusout", this.handleFocusOut);
175
- // Écouter les événements au niveau du document avec capture pour détecter Tab
176
- document.addEventListener("keydown", this.boundHandleKeyDown, true);
177
- document.addEventListener("mousedown", this.boundHandleMouseDown, true);
174
+
175
+ if (!Tooltip.supportsPopover) {
176
+ return;
177
+ }
178
+
179
+ this.addEventListener("focusin", this.showTooltip);
180
+ this.addEventListener("focusout", this.hideTooltip);
178
181
  }
179
182
 
180
183
  disconnectedCallback() {
184
+ this.endPositioning();
185
+
186
+ if (Tooltip.supportsPopover) {
187
+ this.removeEventListener("focusin", this.showTooltip);
188
+ this.removeEventListener("focusout", this.hideTooltip);
189
+ }
190
+
181
191
  super.disconnectedCallback();
182
- this.removeEventListener("focusin", this.handleFocusIn);
183
- this.removeEventListener("focusout", this.handleFocusOut);
184
- document.removeEventListener("keydown", this.boundHandleKeyDown, true);
185
- document.removeEventListener("mousedown", this.boundHandleMouseDown, true);
186
192
  }
187
193
 
188
- protected willUpdate(_changedProperties: PropertyValues): void {
189
- if (_changedProperties.has("disabled")) {
190
- const wasDisabledBefore = _changedProperties.get("disabled") === true;
191
- if (this.disabled) {
192
- this.setAttribute("tabindex", "-1");
193
- this.classList.remove("keyboard-focus");
194
- } else if (!this.disabled && wasDisabledBefore) {
195
- if (this.focusable) {
196
- this.setAttribute("tabindex", "0");
197
- } else {
198
- this.removeAttribute("tabindex");
199
- }
200
- }
194
+ protected willUpdate(changedProperties: PropertyValues): void {
195
+ if (
196
+ !this.hasUpdated ||
197
+ changedProperties.has("disabled") ||
198
+ changedProperties.has("focusable")
199
+ ) {
200
+ this.syncTabIndex();
201
201
  }
202
- if (_changedProperties.has("focusable")) {
203
- if (this.focusable && !this.disabled) {
204
- this.setAttribute("tabindex", "0");
205
- } else if (!this.focusable && !this.disabled) {
206
- this.removeAttribute("tabindex");
207
- }
202
+
203
+ if (
204
+ !this.hasUpdated ||
205
+ changedProperties.has("label") ||
206
+ changedProperties.has("disabled")
207
+ ) {
208
+ this.syncNativeTitle();
209
+ }
210
+
211
+ if (changedProperties.has("disabled") && this.disabled) {
212
+ this.hideTooltip();
213
+ }
214
+
215
+ if (changedProperties.has("label") && this.isEffectivelyDisabled) {
216
+ this.hideTooltip();
208
217
  }
209
- super.willUpdate(_changedProperties);
218
+
219
+ super.willUpdate(changedProperties);
210
220
  }
211
221
 
212
222
  render() {
213
- const disabledClass = this.disabled || this.label == "" ? "disabled" : "";
214
- return html`<div
215
- data-tooltip-text="${this.label.trim().replace("&nbsp;", " ")}"
216
- class="tooltip ${disabledClass}"
217
- >
218
- <slot></slot>
219
- </div>`;
223
+ if (!Tooltip.supportsPopover) {
224
+ return html`<slot></slot>`;
225
+ }
226
+
227
+ const disabledClass = this.isEffectivelyDisabled ? "disabled" : "";
228
+ const label = this.formatLabel();
229
+
230
+ return html`
231
+ <slot
232
+ @mouseenter=${this.showTooltip}
233
+ @mouseleave=${this.hideTooltip}
234
+ ></slot>
235
+ <span
236
+ popover="hint"
237
+ class="tooltip-bubble ${disabledClass}"
238
+ @beforetoggle=${this.handleBeforeToggle}
239
+ >${label}</span
240
+ >
241
+ `;
220
242
  }
221
243
  }
@@ -236,4 +236,30 @@ describe("ancestorAttribute", () => {
236
236
 
237
237
  expect(el.dataProvider).toBe("scope-a");
238
238
  });
239
+
240
+ it("suit un wrapper plus proche après reparent (sans opt-in)", async () => {
241
+ const tag = "test-ancestor-attr-dynamic-reparent";
242
+ class C extends HTMLElement {
243
+ @ancestorAttribute("dataProvider", { dynamic: true })
244
+ dataProvider: string | null = null;
245
+ }
246
+ if (!customElements.get(tag)) {
247
+ customElements.define(tag, C);
248
+ }
249
+
250
+ const outer = document.createElement("div");
251
+ outer.setAttribute("dataProvider", "from-outer");
252
+ const el = document.createElement(tag) as InstanceType<typeof C>;
253
+ outer.appendChild(el);
254
+ document.body.appendChild(outer);
255
+ expect(el.dataProvider).toBe("from-outer");
256
+
257
+ const closer = document.createElement("div");
258
+ closer.setAttribute("dataProvider", "from-closer");
259
+ closer.appendChild(el);
260
+ outer.appendChild(closer);
261
+ await flushFrames();
262
+
263
+ expect(el.dataProvider).toBe("from-closer");
264
+ });
239
265
  });
@@ -5,10 +5,9 @@ import { ConnectedComponent, setSubscribable } from "./common";
5
5
 
6
6
  export type AncestorAttributeOptions = {
7
7
  /**
8
- * Si true, le composant reste synchronisé avec les attributs ancêtres via
9
- * `AncestorAttributeObserver` (mutations + reparenting). Requis pour que
10
- * `@bind` / `@subscribe` avec `${dataProvider}` se re-lient quand le scope change.
11
- * Défaut : false (lecture unique au connect, rétrocompat).
8
+ * Si true, reste synchronisé quand un attribut ancêtre change **et** au
9
+ * reparenting (sans flag séparé). MO attributs partagés ; childList seulement
10
+ * sur le parent direct (ignoré pour les siblings). Défaut : false.
12
11
  */
13
12
  dynamic?: boolean;
14
13
  };
@@ -6,6 +6,7 @@ import {
6
6
  derive as deriveFn,
7
7
  type DeriveHandle,
8
8
  } from "../../utils/derive";
9
+ import { compileJsonata } from "../../utils/jsonataRuntime";
9
10
 
10
11
  export type DeriveDecoratorOptions<
11
12
  I extends Record<string, unknown>,
@@ -60,9 +61,8 @@ export function deriveDecorator<
60
61
  if (!options.expr) {
61
62
  throw new Error("@derive : fournir `expr` ou `fn`.");
62
63
  }
63
- const { compileJsonata } = await import(
64
- "../../utils/jsonataRuntime"
65
- );
64
+ // Static import: dynamic import() breaks consumer Vite builds
65
+ // (rewrites to \0vite/preload-helper → load-fallback null-byte error).
66
66
  const expr = compileJsonata(options.expr);
67
67
  return expr.evaluate({}, {
68
68
  ...(vars as Record<string, unknown>),
@@ -160,7 +160,7 @@ const Fetcher = <
160
160
  * Elles sont ensuite injectées dans le publisher en accord avec la cible définie dans la propriété key
161
161
  * Un Toast est affiché si le chargement échoue
162
162
  */
163
- protected async _fetchData() {
163
+ async _fetchData() {
164
164
  this.requestUpdate();
165
165
  if (!this.isFetchEnabled) return;
166
166
  this.api = new API(this.getApiConfiguration());
@@ -118,11 +118,6 @@ const Form = <T extends Constructor<FormElementInterface>>(superClass: T) => {
118
118
  this.requestUpdate();
119
119
  setTimeout(() => this.updateAllChecked(), 1);
120
120
 
121
- // Désactivation du checked sur le publisher
122
- // Pas sur de l'utilité mais provoque un bug
123
- // if (this.publisher && !this.radio && !this.unique) {
124
- // this.publisher.checked = this._checked;
125
- // }
126
121
  }
127
122
 
128
123
  handleChange() {
@@ -300,9 +295,7 @@ const Form = <T extends Constructor<FormElementInterface>>(superClass: T) => {
300
295
  if (!this.hasAttribute("checked")) {
301
296
  return;
302
297
  }
303
- if (!this.publisher || this.publisher.get().checked !== false) {
304
- setTimeout(() => (this.checked = true), 1);
305
- }
298
+ setTimeout(() => (this.checked = true), 1);
306
299
  }
307
300
  }
308
301
  return FormCheckable;