@supersoniks/concorde 5.1.1 → 5.1.3-immutable.1

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 (459) hide show
  1. package/.agents/skills/concorde-docs/SKILL.md +153 -0
  2. package/.agents/skills/{concorde-component-docs/template.md → concorde-docs/templates/component.md} +6 -2
  3. package/.agents/skills/concorde-docs/templates/decorator.md +43 -0
  4. package/.agents/skills/concorde-docs/templates/guide.md +25 -0
  5. package/.claude/skills +1 -0
  6. package/.github/workflows/ci.yml +21 -0
  7. package/.github-export-ignore +30 -0
  8. package/CONTRIBUTING.md +59 -0
  9. package/DEV.md +54 -0
  10. package/LICENSE +21 -0
  11. package/OPEN_SOURCE_CHECKPOINT.md +133 -0
  12. package/README.md +4 -4
  13. package/ai/README.md +29 -41
  14. package/ai/skills/concorde/SKILL.md +54 -324
  15. package/ai/skills/concorde/rules/composition.md +32 -0
  16. package/ai/skills/concorde/rules/data.md +47 -0
  17. package/ai/skills/concorde/rules/http.md +25 -0
  18. package/ai/skills/concorde/rules/lists-forms.md +35 -0
  19. package/ai/skills/concorde/rules/styling.md +46 -0
  20. package/ai/skills/concorde/rules/troubleshooting.md +45 -0
  21. package/build-infos.json +1 -1
  22. package/concorde-core.bundle.js +177 -177
  23. package/concorde-core.es.js +4993 -4833
  24. package/custom-elements-manifest.public.config.mjs +8 -0
  25. package/{.tmp-cem/custom-elements.json → custom-elements.json} +11758 -8904
  26. package/dist/concorde-core.bundle.js +177 -177
  27. package/dist/concorde-core.es.js +4993 -4833
  28. package/dist/docs-mock-api-sw.js +58 -223
  29. package/dist/docs-mock-api-sw.js.map +4 -4
  30. package/dist/img/concorde/plane_01.jpg +0 -0
  31. package/dist/img/concorde/plane_02.jpg +0 -0
  32. package/dist/img/concorde/plane_03.jpg +0 -0
  33. package/dist/img/concorde/plane_04.jpg +0 -0
  34. package/dist/img/concorde/plane_05.jpg +0 -0
  35. package/dist/img/concorde/plane_06.jpg +0 -0
  36. package/dist/img/concorde/plane_07.jpg +0 -0
  37. package/dist/img/concorde/plane_08.jpg +0 -0
  38. package/dist/img/concorde/plane_09.jpg +0 -0
  39. package/dist/img/concorde/plane_10.jpg +0 -0
  40. package/dist/img/concorde/plane_11.jpg +0 -0
  41. package/dist/img/concorde/plane_12.jpg +0 -0
  42. package/dist/img/concorde/plane_13.jpg +0 -0
  43. package/dist/img/og-concorde.jpg +0 -0
  44. package/dist/robots.txt +11 -10
  45. package/docs/assets/index-D_alEsng.js +12122 -0
  46. package/docs/crawl/core/components/functional/date/date.html +190 -0
  47. package/docs/crawl/core/components/functional/fetch/fetch.html +109 -0
  48. package/docs/crawl/core/components/functional/if/if.html +27 -0
  49. package/docs/crawl/core/components/functional/jsonata/jsonata.html +79 -0
  50. package/docs/crawl/core/components/functional/list/list.html +70 -0
  51. package/docs/crawl/core/components/functional/mix/mix.html +45 -0
  52. package/docs/crawl/core/components/functional/queue/queue.html +96 -0
  53. package/docs/crawl/core/components/functional/router/router.html +106 -0
  54. package/docs/crawl/core/components/functional/sdui/sdui-extension-points.html +126 -0
  55. package/docs/crawl/core/components/functional/sdui/sdui.html +368 -0
  56. package/docs/crawl/core/components/functional/states/states.html +66 -0
  57. package/docs/crawl/core/components/functional/submit/submit.html +160 -0
  58. package/docs/crawl/core/components/functional/subscriber/subscriber.html +67 -0
  59. package/docs/crawl/core/components/functional/value/value.html +51 -0
  60. package/docs/crawl/core/components/ui/alert/alert.html +211 -0
  61. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +131 -0
  62. package/docs/crawl/core/components/ui/badge/badge.html +197 -0
  63. package/docs/crawl/core/components/ui/button/button.html +150 -0
  64. package/docs/crawl/core/components/ui/captcha/captcha.html +112 -0
  65. package/docs/crawl/core/components/ui/card/card.html +253 -0
  66. package/docs/crawl/core/components/ui/divider/divider.html +144 -0
  67. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +73 -0
  68. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +266 -0
  69. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +122 -0
  70. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +121 -0
  71. package/docs/crawl/core/components/ui/form/input/input.html +109 -0
  72. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +38 -0
  73. package/docs/crawl/core/components/ui/form/radio/radio.html +56 -0
  74. package/docs/crawl/core/components/ui/form/select/select.html +73 -0
  75. package/docs/crawl/core/components/ui/form/switch/switch.html +56 -0
  76. package/docs/crawl/core/components/ui/form/textarea/textarea.html +59 -0
  77. package/docs/crawl/core/components/ui/group/group.html +104 -0
  78. package/docs/crawl/core/components/ui/icon/icon.html +222 -0
  79. package/docs/crawl/core/components/ui/image/image.html +298 -0
  80. package/docs/crawl/core/components/ui/link/link.html +100 -0
  81. package/docs/crawl/core/components/ui/loader/loader.html +124 -0
  82. package/docs/crawl/core/components/ui/menu/menu.html +394 -0
  83. package/docs/crawl/core/components/ui/modal/modal.html +342 -0
  84. package/docs/crawl/core/components/ui/pop/pop.html +296 -0
  85. package/docs/crawl/core/components/ui/progress/progress.html +131 -0
  86. package/docs/crawl/core/components/ui/table/table.html +545 -0
  87. package/docs/crawl/core/components/ui/theme/theme.html +131 -0
  88. package/docs/crawl/core/components/ui/toast/toast.html +233 -0
  89. package/docs/crawl/core/components/ui/tooltip/tooltip.html +140 -0
  90. package/docs/crawl/docs/_core-concept/dataFlow.html +177 -0
  91. package/docs/crawl/docs/_core-concept/overview.html +66 -0
  92. package/docs/crawl/docs/_core-concept/subscriber.html +75 -0
  93. package/docs/crawl/docs/_decorators/ancestor-attribute.html +117 -0
  94. package/docs/crawl/docs/_decorators/auto-subscribe.html +202 -0
  95. package/docs/crawl/docs/_decorators/bind.html +141 -0
  96. package/docs/crawl/docs/_decorators/get.html +149 -0
  97. package/docs/crawl/docs/_decorators/handle.html +165 -0
  98. package/docs/crawl/docs/_decorators/on-assign.html +355 -0
  99. package/docs/crawl/docs/_decorators/patch.html +78 -0
  100. package/docs/crawl/docs/_decorators/post.html +139 -0
  101. package/docs/crawl/docs/_decorators/publish.html +61 -0
  102. package/docs/crawl/docs/_decorators/put.html +78 -0
  103. package/docs/crawl/docs/_decorators/subscribe.html +109 -0
  104. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +137 -0
  105. package/docs/crawl/docs/_directives/sub.html +93 -0
  106. package/docs/crawl/docs/_getting-started/ai-agents.html +173 -0
  107. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +100 -0
  108. package/docs/crawl/docs/_getting-started/concorde-outside.html +58 -0
  109. package/docs/crawl/docs/_getting-started/create-a-component.html +111 -0
  110. package/docs/crawl/docs/_getting-started/my-first-component.html +189 -0
  111. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +110 -0
  112. package/docs/crawl/docs/_getting-started/pubsub.html +62 -0
  113. package/docs/crawl/docs/_getting-started/start.html +76 -0
  114. package/docs/crawl/docs/_getting-started/theming.html +333 -0
  115. package/docs/crawl/docs/_misc/api-configuration.html +149 -0
  116. package/docs/crawl/docs/_misc/dataProviderKey.html +135 -0
  117. package/docs/crawl/docs/_misc/docs-mock-api.html +158 -0
  118. package/docs/crawl/docs/_misc/dynamic-path.html +180 -0
  119. package/docs/crawl/docs/_misc/endpoint.html +50 -0
  120. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +138 -0
  121. package/docs/crawl/docs/_misc/html-integration.html +48 -0
  122. package/docs/crawl/hubs/decorators.html +547 -0
  123. package/docs/crawl/hubs/form-components.html +381 -0
  124. package/docs/crawl/hubs/remote-data.html +452 -0
  125. package/docs/crawl/index.html +103 -0
  126. package/docs/index.html +1 -1
  127. package/docs/llms-full.txt +7174 -0
  128. package/docs/llms.txt +98 -0
  129. package/docs/sitemap.xml +243 -0
  130. package/docs/src/core/components/functional/date/date.md +290 -0
  131. package/docs/src/core/components/functional/fetch/fetch.md +125 -0
  132. package/docs/src/core/components/functional/if/if.md +9 -0
  133. package/docs/src/core/components/functional/jsonata/jsonata.md +56 -0
  134. package/docs/src/core/components/functional/list/list.md +65 -0
  135. package/docs/src/core/components/functional/mix/mix.md +41 -0
  136. package/docs/src/core/components/functional/queue/queue.md +72 -0
  137. package/docs/src/core/components/functional/router/router.md +94 -0
  138. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  139. package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
  140. package/docs/src/core/components/functional/sdui/default-library.json +108 -0
  141. package/docs/src/core/components/functional/sdui/example.json +99 -0
  142. package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  143. package/docs/src/core/components/functional/sdui/sdui.md +478 -0
  144. package/docs/src/core/components/functional/states/states.md +87 -0
  145. package/docs/src/core/components/functional/submit/submit.md +114 -0
  146. package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
  147. package/docs/src/core/components/functional/value/value.md +35 -0
  148. package/docs/src/core/components/ui/alert/alert.md +196 -0
  149. package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  150. package/docs/src/core/components/ui/badge/badge.md +188 -0
  151. package/docs/src/core/components/ui/button/button.md +183 -0
  152. package/docs/src/core/components/ui/captcha/captcha.md +71 -0
  153. package/docs/src/core/components/ui/card/card.md +215 -0
  154. package/docs/src/core/components/ui/divider/divider.md +129 -0
  155. package/docs/src/core/components/ui/form/checkbox/checkbox.md +77 -0
  156. package/docs/src/core/components/ui/form/fieldset/fieldset.md +205 -0
  157. package/docs/src/core/components/ui/form/form-actions/form-actions.md +100 -0
  158. package/docs/src/core/components/ui/form/form-layout/form-layout.md +119 -0
  159. package/docs/src/core/components/ui/form/input/input.md +142 -0
  160. package/docs/src/core/components/ui/form/radio/radio.md +57 -0
  161. package/docs/src/core/components/ui/form/select/select.md +71 -0
  162. package/docs/src/core/components/ui/form/switch/switch.md +57 -0
  163. package/docs/src/core/components/ui/form/textarea/textarea.md +65 -0
  164. package/docs/src/core/components/ui/group/group.md +75 -0
  165. package/docs/src/core/components/ui/icon/icon.md +214 -0
  166. package/docs/src/core/components/ui/icon/icons.json +1 -0
  167. package/docs/src/core/components/ui/image/image.md +233 -0
  168. package/docs/src/core/components/ui/link/link.md +81 -0
  169. package/docs/src/core/components/ui/loader/loader.md +112 -0
  170. package/docs/src/core/components/ui/menu/menu.md +370 -0
  171. package/docs/src/core/components/ui/modal/modal.md +235 -0
  172. package/docs/src/core/components/ui/pop/pop.md +294 -0
  173. package/docs/src/core/components/ui/progress/progress.md +109 -0
  174. package/docs/src/core/components/ui/table/table.md +431 -0
  175. package/docs/src/core/components/ui/theme/theme.md +122 -0
  176. package/docs/src/core/components/ui/toast/toast.md +216 -0
  177. package/docs/src/core/components/ui/tooltip/tooltip.md +124 -0
  178. package/{src → docs/src}/docs/_core-concept/subscriber.md +0 -0
  179. package/{src → docs/src}/docs/_getting-started/my-first-subscriber.md +0 -0
  180. package/{src → docs/src}/docs/_getting-started/pubsub.md +0 -0
  181. package/docs/src/docs/_getting-started/theming.md +253 -0
  182. package/docs/src/docs/search/docs-search.json +12242 -0
  183. package/docs/src/tag-list.json +1 -0
  184. package/docs/src/tsconfig-model.json +23 -0
  185. package/docs/src/tsconfig.declarations.json +22 -0
  186. package/docs/src/tsconfig.emit.json +23 -0
  187. package/docs/src/tsconfig.json +1332 -0
  188. package/gitlab/job_github_mirror.sh +39 -0
  189. package/index.html +157 -5
  190. package/package.json +22 -4
  191. package/public/docs-mock-api-sw.js +58 -223
  192. package/public/docs-mock-api-sw.js.map +4 -4
  193. package/public/img/concorde/plane_01.jpg +0 -0
  194. package/public/img/concorde/plane_02.jpg +0 -0
  195. package/public/img/concorde/plane_03.jpg +0 -0
  196. package/public/img/concorde/plane_04.jpg +0 -0
  197. package/public/img/concorde/plane_05.jpg +0 -0
  198. package/public/img/concorde/plane_06.jpg +0 -0
  199. package/public/img/concorde/plane_07.jpg +0 -0
  200. package/public/img/concorde/plane_08.jpg +0 -0
  201. package/public/img/concorde/plane_09.jpg +0 -0
  202. package/public/img/concorde/plane_10.jpg +0 -0
  203. package/public/img/concorde/plane_11.jpg +0 -0
  204. package/public/img/concorde/plane_12.jpg +0 -0
  205. package/public/img/concorde/plane_13.jpg +0 -0
  206. package/public/img/og-concorde.jpg +0 -0
  207. package/public/robots.txt +11 -10
  208. package/scripts/ai-init.mjs +104 -379
  209. package/scripts/ai-init.test.mjs +81 -239
  210. package/scripts/docs-markdown-vite-plugin.ts +43 -0
  211. package/scripts/docs-public-url.mjs +56 -0
  212. package/scripts/docs.htaccess +82 -0
  213. package/scripts/generate-cem.mjs +244 -0
  214. package/scripts/generate-cem.test.mjs +122 -0
  215. package/scripts/generate-crawl-docs.mjs +233 -118
  216. package/scripts/generate-crawl-docs.test.mjs +124 -0
  217. package/scripts/generate-sdui-catalog.mjs +11 -10
  218. package/scripts/github-export.mjs +150 -0
  219. package/scripts/post-build-docs.js +37 -50
  220. package/scripts/post-build.mjs +0 -0
  221. package/scripts/pre-publish.mjs +2 -1
  222. package/scripts/site-pages.mjs +212 -0
  223. package/scripts/site-pages.test.mjs +116 -0
  224. package/site-pages/about.md +22 -0
  225. package/site-pages/privacy.md +32 -0
  226. package/src/core/components/functional/date/date.md +91 -231
  227. package/src/core/components/functional/example/example.ts +3 -1
  228. package/src/core/components/functional/fetch/fetch.md +66 -83
  229. package/src/core/components/functional/if/if.md +28 -3
  230. package/src/core/components/functional/if/if.ts +0 -0
  231. package/src/core/components/functional/jsonata/jsonata.md +42 -37
  232. package/src/core/components/functional/list/list.demo.ts +0 -0
  233. package/src/core/components/functional/list/list.md +103 -43
  234. package/src/core/components/functional/list/list.ts +17 -4
  235. package/src/core/components/functional/mix/mix.md +31 -26
  236. package/src/core/components/functional/queue/queue.demo.ts +10 -7
  237. package/src/core/components/functional/queue/queue.md +40 -61
  238. package/src/core/components/functional/router/router.demo.ts +16 -16
  239. package/src/core/components/functional/router/router.md +64 -65
  240. package/src/core/components/functional/router/router.ts +0 -0
  241. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
  242. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  243. package/src/core/components/functional/sdui/component-catalog.json +2 -2
  244. package/src/core/components/functional/sdui/example.json +19 -86
  245. package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
  246. package/src/core/components/functional/sdui/sdui-immutable.spec.ts +74 -0
  247. package/src/core/components/functional/sdui/sdui.md +187 -358
  248. package/src/core/components/functional/sdui/sdui.ts +33 -8
  249. package/src/core/components/functional/sdui/types.ts +0 -0
  250. package/src/core/components/functional/states/states.demo.ts +21 -22
  251. package/src/core/components/functional/states/states.md +86 -61
  252. package/src/core/components/functional/states/states.ts +1 -1
  253. package/src/core/components/functional/submit/submit.md +64 -72
  254. package/src/core/components/functional/submit/submit.spec.ts +60 -0
  255. package/src/core/components/functional/submit/submit.ts +6 -3
  256. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  257. package/src/core/components/functional/translation/translation.md +38 -0
  258. package/src/core/components/functional/value/value.md +34 -22
  259. package/src/core/components/functional/value/value.ts +0 -0
  260. package/src/core/components/ui/_css/size.ts +0 -0
  261. package/src/core/components/ui/alert/alert.md +48 -58
  262. package/src/core/components/ui/badge/badge.md +27 -34
  263. package/src/core/components/ui/button/button.md +139 -106
  264. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  265. package/src/core/components/ui/captcha/captcha.md +17 -32
  266. package/src/core/components/ui/card/card.md +6 -6
  267. package/src/core/components/ui/divider/divider.md +8 -11
  268. package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
  269. package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
  270. package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
  271. package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
  272. package/src/core/components/ui/form/input/input.md +108 -90
  273. package/src/core/components/ui/form/input/input.ts +8 -2
  274. package/src/core/components/ui/form/radio/radio.md +65 -30
  275. package/src/core/components/ui/form/select/select.md +60 -45
  276. package/src/core/components/ui/form/switch/switch.md +57 -34
  277. package/src/core/components/ui/form/textarea/textarea.md +55 -38
  278. package/src/core/components/ui/group/group.md +35 -33
  279. package/src/core/components/ui/icon/icon.md +4 -4
  280. package/src/core/components/ui/image/image.md +41 -107
  281. package/src/core/components/ui/link/link.md +6 -6
  282. package/src/core/components/ui/loader/loader.md +30 -55
  283. package/src/core/components/ui/menu/menu.md +27 -27
  284. package/src/core/components/ui/modal/modal.md +72 -96
  285. package/src/core/components/ui/pop/pop.md +80 -158
  286. package/src/core/components/ui/progress/progress.md +2 -2
  287. package/src/core/components/ui/table/table.md +91 -255
  288. package/src/core/components/ui/theme/theme.md +11 -36
  289. package/src/core/components/ui/toast/toast.md +48 -117
  290. package/src/core/components/ui/tooltip/tooltip.md +27 -62
  291. package/src/core/decorators/subscriber/bind.ts +9 -14
  292. package/src/core/decorators/subscriber/subscribe.ts +15 -9
  293. package/src/core/decorators/subscriber/subscribe.type-test.ts +14 -5
  294. package/src/core/mixins/Subscriber.ts +0 -0
  295. package/src/core/utils/DataBindObserver.ts +0 -0
  296. package/src/core/utils/LocationHandler.spec.ts +80 -0
  297. package/src/core/utils/LocationHandler.ts +5 -9
  298. package/src/core/utils/Objects.ts +0 -0
  299. package/src/core/utils/PublisherProxy.ts +166 -125
  300. package/src/core/utils/deepReadonly.spec.ts +66 -0
  301. package/src/core/utils/deepReadonly.ts +71 -0
  302. package/src/core/utils/immutableValue.spec.ts +54 -0
  303. package/src/core/utils/immutableValue.ts +102 -0
  304. package/src/core/utils/nestedDotForm.spec.ts +88 -0
  305. package/src/core/utils/publisherImmutable.spec.ts +76 -0
  306. package/src/core/utils/route.ts +0 -0
  307. package/src/core/utils/strictGet.spec.ts +61 -0
  308. package/src/core/utils/strictGet.ts +102 -0
  309. package/src/css.d.ts +19 -0
  310. package/src/docs/components/docs-demo-sources.ts +55 -140
  311. package/src/docs/components/docs-lit-demo.ts +1 -3
  312. package/src/docs/components/docs-source-link.ts +0 -82
  313. package/src/docs/decorators/ancestor-attribute.md +59 -0
  314. package/src/docs/decorators/auto-subscribe.md +40 -0
  315. package/src/docs/decorators/bind.md +76 -0
  316. package/src/docs/decorators/get.md +160 -0
  317. package/src/docs/decorators/handle.md +119 -0
  318. package/src/docs/decorators/on-assign.md +63 -0
  319. package/src/docs/decorators/patch.md +44 -0
  320. package/src/docs/decorators/post.md +134 -0
  321. package/src/docs/decorators/publish.md +56 -0
  322. package/src/docs/decorators/put.md +51 -0
  323. package/src/docs/decorators/subscribe.md +87 -0
  324. package/src/docs/decorators/wait-for-ancestors.md +76 -0
  325. package/src/docs/directives/sub.md +75 -0
  326. package/src/docs/directives/t.md +73 -0
  327. package/src/docs/docs-location.spec.ts +56 -0
  328. package/src/docs/docs-location.ts +133 -32
  329. package/src/docs/docs.ts +1 -2
  330. package/src/docs/example/decorators-demo-bind-demos.ts +83 -135
  331. package/src/docs/example/decorators-demo-geo.ts +30 -19
  332. package/src/docs/example/decorators-demo-post.ts +88 -186
  333. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
  334. package/src/docs/example/decorators-demo.ts +85 -98
  335. package/src/docs/example/docs-api-config-demos.ts +19 -20
  336. package/src/docs/example/docs-flight-demos.ts +147 -0
  337. package/src/docs/example/docs-jsonata-demos.ts +52 -52
  338. package/src/docs/example/docs-list-demos.ts +43 -123
  339. package/src/docs/example/docs-provider-keys.ts +21 -28
  340. package/src/docs/example/docs-queue-demos.ts +37 -77
  341. package/src/docs/example/docs-router-demos.ts +20 -25
  342. package/src/docs/example/docs-submit-demos.ts +48 -48
  343. package/src/docs/example/docs-toggle-demos.ts +4 -3
  344. package/src/docs/example/users.ts +0 -0
  345. package/src/docs/getting-started/ai-agents.md +50 -0
  346. package/src/docs/getting-started/create-a-component.md +136 -0
  347. package/src/docs/getting-started/dataFlow.md +87 -0
  348. package/src/docs/getting-started/installation.md +36 -0
  349. package/src/docs/getting-started/my-first-component.md +227 -0
  350. package/src/docs/getting-started/start.md +35 -0
  351. package/src/docs/header/header.ts +11 -6
  352. package/src/docs/home/catalog.ts +1 -1
  353. package/src/docs/home/home.ts +20 -11
  354. package/src/docs/layout.ts +12 -13
  355. package/src/docs/misc/api-configuration.md +79 -0
  356. package/src/docs/misc/dataProviderKey.md +168 -0
  357. package/src/docs/misc/docs-mock-api.md +62 -0
  358. package/src/docs/misc/dynamic-path.md +71 -0
  359. package/src/docs/misc/endpoint.md +45 -0
  360. package/src/docs/misc/html-integration.md +14 -0
  361. package/src/docs/misc/publisher-get-immutability-docs-crawl.json +902 -0
  362. package/src/docs/misc/publisher-get-immutability-docs-recheck.json +13 -0
  363. package/src/docs/misc/publisher-get-immutability-study.md +229 -0
  364. package/src/docs/mock-api/api-config-mock.ts +5 -0
  365. package/src/docs/mock-api/fixtures.ts +0 -278
  366. package/src/docs/mock-api/flights.ts +89 -0
  367. package/src/docs/mock-api/router.ts +3 -4
  368. package/src/docs/mock-api/urls.ts +1 -2
  369. package/src/docs/navigation/navigation.ts +84 -101
  370. package/src/docs/navigation/toc.ts +7 -4
  371. package/src/docs/search/docs-search.json +3188 -5153
  372. package/src/docs/search/markdown-renderer.ts +31 -8
  373. package/src/docs/search/page.ts +9 -6
  374. package/src/docs/search/search.ts +154 -122
  375. package/src/docs/tailwind/css/docs/content.css +4 -5
  376. package/src/tsconfig.declarations.json +22 -0
  377. package/src/tsconfig.emit.json +23 -0
  378. package/src/tsconfig.json +53 -5
  379. package/src/tsconfig.tsbuildinfo +1 -1
  380. package/vite.config.mts +11 -2
  381. package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
  382. package/.taste-skill/after/desktop-fold.jpg +0 -0
  383. package/.taste-skill/after/desktop-page-01.jpg +0 -0
  384. package/.taste-skill/after/desktop-page-02.jpg +0 -0
  385. package/.taste-skill/after/desktop-page-03.jpg +0 -0
  386. package/.taste-skill/after/mobile-fold.jpg +0 -0
  387. package/.taste-skill/after/mobile-page-01.jpg +0 -0
  388. package/.taste-skill/after/report.json +0 -4103
  389. package/.taste-skill/after/tablet-fold.jpg +0 -0
  390. package/.taste-skill/after/tablet-page-01.jpg +0 -0
  391. package/.taste-skill/after/tablet-page-02.jpg +0 -0
  392. package/.taste-skill/before/desktop-fold.jpg +0 -0
  393. package/.taste-skill/before/desktop-page-01.jpg +0 -0
  394. package/.taste-skill/before/desktop-page-02.jpg +0 -0
  395. package/.taste-skill/before/mobile-fold.jpg +0 -0
  396. package/.taste-skill/before/mobile-page-01.jpg +0 -0
  397. package/.taste-skill/before/report.json +0 -2556
  398. package/.taste-skill/before/tablet-fold.jpg +0 -0
  399. package/.taste-skill/before/tablet-page-01.jpg +0 -0
  400. package/.taste-skill/direction.json +0 -510
  401. package/.taste-skill/notes.md +0 -84
  402. package/.taste-skill/prod/desktop-fold.jpg +0 -0
  403. package/.taste-skill/prod/desktop-page-01.jpg +0 -0
  404. package/.taste-skill/prod/desktop-page-02.jpg +0 -0
  405. package/.taste-skill/prod/desktop-page-03.jpg +0 -0
  406. package/.taste-skill/prod/mobile-fold.jpg +0 -0
  407. package/.taste-skill/prod/mobile-page-01.jpg +0 -0
  408. package/.taste-skill/prod/mobile-page-02.jpg +0 -0
  409. package/.taste-skill/prod/report.json +0 -1973
  410. package/.taste-skill/prod/tablet-fold.jpg +0 -0
  411. package/.taste-skill/prod/tablet-page-01.jpg +0 -0
  412. package/.taste-skill/prod/tablet-page-02.jpg +0 -0
  413. package/AUDIT.md +0 -228
  414. package/PLAN-AMELIORATION.md +0 -220
  415. package/ai/AGENTS.md +0 -56
  416. package/ai/cursor/rules/concorde-menu.mdc +0 -15
  417. package/ai/cursor/rules/concorde-scope.mdc +0 -14
  418. package/ai/cursor/rules/concorde-theme.mdc +0 -13
  419. package/ai/cursor/rules/concorde.mdc +0 -66
  420. package/ai/jetbrains/rules/concorde.md +0 -53
  421. package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
  422. package/ai/skills/concorde-imports/SKILL.md +0 -78
  423. package/ai/skills/concorde-menu/SKILL.md +0 -74
  424. package/ai/skills/concorde-scope/SKILL.md +0 -70
  425. package/ai/skills/concorde-theme/SKILL.md +0 -57
  426. package/docs/assets/index-Bb-_LRyY.js +0 -12280
  427. package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
  428. package/src/docs/example/docs-joke-demos.ts +0 -297
  429. /package/{src → docs/src}/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -0
  430. /package/{src → docs/src}/docs/_core-concept/dataFlow.md +0 -0
  431. /package/{src → docs/src}/docs/_core-concept/overview.md +0 -0
  432. /package/{src → docs/src}/docs/_decorators/ancestor-attribute.md +0 -0
  433. /package/{src → docs/src}/docs/_decorators/auto-subscribe.md +0 -0
  434. /package/{src → docs/src}/docs/_decorators/bind.md +0 -0
  435. /package/{src → docs/src}/docs/_decorators/get.md +0 -0
  436. /package/{src → docs/src}/docs/_decorators/handle.md +0 -0
  437. /package/{src → docs/src}/docs/_decorators/on-assign.md +0 -0
  438. /package/{src → docs/src}/docs/_decorators/patch.md +0 -0
  439. /package/{src → docs/src}/docs/_decorators/post.md +0 -0
  440. /package/{src → docs/src}/docs/_decorators/publish.md +0 -0
  441. /package/{src → docs/src}/docs/_decorators/put.md +0 -0
  442. /package/{src → docs/src}/docs/_decorators/subscribe.md +0 -0
  443. /package/{src → docs/src}/docs/_decorators/wait-for-ancestors.md +0 -0
  444. /package/{src → docs/src}/docs/_directives/sub.md +0 -0
  445. /package/{src → docs/src}/docs/_getting-started/ai-agents.md +0 -0
  446. /package/{src → docs/src}/docs/_getting-started/concorde-manual-install.md +0 -0
  447. /package/{src → docs/src}/docs/_getting-started/concorde-outside.md +0 -0
  448. /package/{src → docs/src}/docs/_getting-started/create-a-component.md +0 -0
  449. /package/{src → docs/src}/docs/_getting-started/my-first-component.md +0 -0
  450. /package/{src → docs/src}/docs/_getting-started/start.md +0 -0
  451. /package/{src → docs/src}/docs/_misc/api-configuration.md +0 -0
  452. /package/{src → docs/src}/docs/_misc/dataProviderKey.md +0 -0
  453. /package/{src → docs/src}/docs/_misc/docs-mock-api.md +0 -0
  454. /package/{src → docs/src}/docs/_misc/dynamic-path.md +0 -0
  455. /package/{src → docs/src}/docs/_misc/endpoint.md +0 -0
  456. /package/{src → docs/src}/docs/_misc/formelement-subscriber-removal.md +0 -0
  457. /package/{src → docs/src}/docs/_misc/html-integration.md +0 -0
  458. /package/src/docs/{_getting-started → getting-started}/components.md +0 -0
  459. /package/src/docs/{_getting-started → getting-started}/theming.md +0 -0
@@ -1,6 +1,11 @@
1
1
  # Button
2
2
 
3
+ **`sonic-button`** is the clickable control of the library: a plain button, a link when `href` is set, or a form toggle when it has a `name` and `value`. It shares `type` / `variant` / `size` with **`sonic-badge`**, and exposes `prefix` / `suffix` slots for icons.
4
+
3
5
  ## Type
6
+
7
+ With no `type`, the button is `default`. Use `custom` with `--sc-btn-custom-color` and `--sc-btn-custom-bg` for a one-off color.
8
+
4
9
  <sonic-code>
5
10
  <template>
6
11
  <div class="flex flex-wrap gap-2">
@@ -16,168 +21,196 @@
16
21
  </template>
17
22
  </sonic-code>
18
23
 
19
- ## Outline
24
+ ## Variant
25
+
26
+ With no `variant`, the button is filled. The `outline` / `ghost` / `link` variants take their color from `type`. `unstyled` removes all styling so you can apply your own classes.
27
+
20
28
  <sonic-code>
21
29
  <template>
22
30
  <div class="flex flex-wrap gap-2">
23
- <sonic-button variant="outline">Default</sonic-button>
24
- <sonic-button variant="outline" type="primary">Primary</sonic-button>
25
- <sonic-button variant="outline" type="neutral">Neutral</sonic-button>
26
- <sonic-button variant="outline" type="warning">Warning</sonic-button>
27
- <sonic-button variant="outline" type="info">Info</sonic-button>
28
- <sonic-button variant="outline" type="success">Success</sonic-button>
29
- <sonic-button variant="outline" type="danger">Danger</sonic-button>
30
- <sonic-button variant="outline" type="custom" style="--sc-btn-custom-bg: #5b21b6">Custom</sonic-button>
31
+ <sonic-button type="primary">Default</sonic-button>
32
+ <sonic-button type="primary" variant="outline">Outline</sonic-button>
33
+ <sonic-button type="primary" variant="ghost">Ghost</sonic-button>
34
+ <sonic-button type="primary" variant="link">Link</sonic-button>
35
+ <sonic-button variant="unstyled">Unstyled</sonic-button>
31
36
  </div>
32
37
  </template>
33
38
  </sonic-code>
34
39
 
35
- ## Variant
36
- <sonic-code>
37
- <template>
38
- <sonic-button variant="default">Default</sonic-button>
39
- <sonic-button variant="outline">Outline</sonic-button>
40
- <sonic-button variant="ghost">Ghost</sonic-button>
41
- <sonic-button variant="link">Link</sonic-button>
42
- <sonic-button variant="unstyled">Unstyled</sonic-button>
43
- </template>
44
- </sonic-code>
45
-
46
40
  ## Size
41
+
42
+ With no `size`, the button is `md`.
43
+
47
44
  <sonic-code>
48
45
  <template>
49
- <sonic-button size="2xs">2Xs button</sonic-button>
50
- <sonic-button size="xs">Xs button</sonic-button>
51
- <sonic-button size="sm">Sm button</sonic-button>
52
- <sonic-button size="md">Md button</sonic-button>
53
- <sonic-button>Default button</sonic-button>
54
- <sonic-button size="lg">Lg button</sonic-button>
55
- <sonic-button size="xl">Xl button</sonic-button>
56
- <sonic-button size="2xl">2Xl button</sonic-button>
46
+ <div class="flex flex-wrap items-center gap-2">
47
+ <sonic-button size="2xs">2xs</sonic-button>
48
+ <sonic-button size="xs">xs</sonic-button>
49
+ <sonic-button size="sm">sm</sonic-button>
50
+ <sonic-button>md</sonic-button>
51
+ <sonic-button size="lg">lg</sonic-button>
52
+ <sonic-button size="xl">xl</sonic-button>
53
+ <sonic-button size="2xl">2xl</sonic-button>
54
+ </div>
57
55
  </template>
58
56
  </sonic-code>
59
57
 
60
58
  ## Shape
61
- <sonic-code>
62
- <template>
63
- <sonic-button shape="circle"> 😂 </sonic-button>
64
- <sonic-button shape="square"> 🚀 </sonic-button>
65
- </template>
66
- </sonic-code>
67
59
 
68
- ## Loading
69
- The length of the button depends on the size of its content
60
+ `circle` and `square` make a fixed-size icon button. `block` stretches to the full width of the parent.
61
+
70
62
  <sonic-code>
71
63
  <template>
72
- <sonic-button loading></sonic-button>
73
- <sonic-button loading>Loading button</sonic-button>
74
- <sonic-button loading><span slot="prefix">🚀</span>Loading with prefix<span slot="suffix">😂</span></sonic-button>
64
+ <div class="flex flex-wrap items-center gap-2 mb-2">
65
+ <sonic-button shape="circle" type="primary"><sonic-icon library="iconoir" name="plus"></sonic-icon></sonic-button>
66
+ <sonic-button shape="square" type="primary"><sonic-icon library="iconoir" name="plus"></sonic-icon></sonic-button>
67
+ </div>
68
+ <sonic-button shape="block" type="primary">Block</sonic-button>
75
69
  </template>
76
70
  </sonic-code>
77
71
 
78
- ## Swap
72
+ ## Prefix and suffix slots
73
+
79
74
  <sonic-code>
80
75
  <template>
81
- <sonic-button formDataProvider="button_swap_example" name="youpi" value="youpla" type="primary" shape="circle" variant="outline" class="mr-4">
82
- <sonic-icon library="iconoir" swap="on" name="eye-empty"></sonic-icon>
83
- <sonic-icon library="iconoir" swap="off" name="eye-off"></sonic-icon>
84
- </sonic-button>
85
- <sonic-button formDataProvider="button_swap_example" name="youpi" value="youpla" type="primary" variant="outline">
86
- <sonic-icon library="iconoir" swap="on" slot="prefix" name="eye-empty"></sonic-icon>
87
- <sonic-icon library="iconoir" swap="off" slot="prefix" name="eye-off"></sonic-icon>
88
- Révélez
89
- <span swap="off">...</span>
90
- <span swap="on">moi !</span>
91
- </sonic-button>
76
+ <div class="flex flex-wrap gap-2">
77
+ <sonic-button type="primary" variant="outline">
78
+ <sonic-icon library="iconoir" slot="prefix" name="arrow-left"></sonic-icon>
79
+ Previous flight
80
+ </sonic-button>
81
+ <sonic-button type="primary">
82
+ Next flight
83
+ <sonic-icon library="iconoir" slot="suffix" name="arrow-right"></sonic-icon>
84
+ </sonic-button>
85
+ </div>
92
86
  </template>
93
87
  </sonic-code>
94
88
 
95
- ## Reset
89
+ ## Loading
90
+
91
+ `loading` replaces the content with a spinner and blocks clicks. The button keeps the width of its content.
92
+
96
93
  <sonic-code>
97
94
  <template>
98
- <div formDataProvider="button-reset-demo" class="mb-2">
99
- <sonic-checkbox name="aChexbox" value="AValueToSet">Set A value</sonic-checkbox><br>
100
- <sonic-button reset>Reset current formDataProvider</sonic-button>
95
+ <div class="flex flex-wrap gap-2">
96
+ <sonic-button loading></sonic-button>
97
+ <sonic-button loading>Loading button</sonic-button>
98
+ <sonic-button loading type="primary">
99
+ <sonic-icon library="iconoir" slot="prefix" name="check"></sonic-icon>
100
+ Checking in
101
+ </sonic-button>
101
102
  </div>
102
- <sonic-button reset="button-reset-demo">Reset formDataProvider by name</sonic-button>
103
103
  </template>
104
104
  </sonic-code>
105
105
 
106
+ ## Link
107
+
108
+ With `href`, the button renders as a link. For a relative `href`, the button gets `active` when the current URL matches, according to `autoActive` (default `partial`). Add `pushState` to navigate without reloading the page.
106
109
 
107
- ## GoBack
108
110
  <sonic-code>
109
111
  <template>
110
- <sonic-button goBack type="primary" variant="outline" class="mr-4">
111
- <sonic-icon library="iconoir" slot="prefix" name="arrow-left"></sonic-icon>
112
- Retour classique
113
- </sonic-button>
114
- <sonic-button goBack="http://la-billetterie.net" type="primary" variant="outline" class="mr-4">
115
- <sonic-icon library="iconoir" slot="prefix" name="arrow-left"></sonic-icon>
116
- Retour url prédéfinie
117
- </sonic-button>
112
+ <div class="flex flex-wrap gap-2">
113
+ <sonic-button href="https://example.com" target="_blank" type="primary">External link</sonic-button>
114
+ <sonic-button href="/core/components/ui/button" variant="ghost">Current page</sonic-button>
115
+ </div>
118
116
  </template>
119
117
  </sonic-code>
120
118
 
121
- ## Button with icon
119
+ ## Toggle and radio
120
+
121
+ A button with `name` and `value` writes to its `formDataProvider` and toggles `active` when clicked. Add `radio` for a single choice in a group, or `unique` to also allow deselecting. Children marked `swap="on"` / `swap="off"` show only in the active / inactive state.
122
+
122
123
  <sonic-code>
123
124
  <template>
124
- <sonic-button goBack type="primary" variant="outline" class="mr-4">
125
- <sonic-icon library="iconoir" slot="prefix" name="arrow-right" ></sonic-icon>
126
- Button with icon
127
- </sonic-button>
125
+ <div class="flex flex-wrap items-center gap-4">
126
+ <sonic-button formDataProvider="button-toggle-demo" name="visible" value="yes" type="primary" shape="circle" variant="outline">
127
+ <sonic-icon library="iconoir" swap="on" name="eye-empty"></sonic-icon>
128
+ <sonic-icon library="iconoir" swap="off" name="eye-off"></sonic-icon>
129
+ </sonic-button>
130
+ <sonic-group formDataProvider="button-radio-demo">
131
+ <sonic-button radio minWidth="7rem" name="plan" value="free">Free</sonic-button>
132
+ <sonic-button radio minWidth="7rem" name="plan" value="pro">Pro</sonic-button>
133
+ <sonic-button radio minWidth="7rem" name="plan" value="team">Team</sonic-button>
134
+ </sonic-group>
135
+ </div>
128
136
  </template>
129
137
  </sonic-code>
130
138
 
139
+ ## Reset
140
+
141
+ `reset` clears the button's own `formDataProvider`. Give it a value to clear another one by name.
131
142
 
132
- ## Button group
133
143
  <sonic-code>
134
144
  <template>
135
- <sonic-group label="Code promo" class="mr-4">
136
- <sonic-input placeholder="Entrez votre code ici..."></sonic-input>
137
- <sonic-button type="primary" shape="square">
138
- <sonic-icon library="iconoir" library="iconoir" name="gift"></sonic-icon>
139
- </sonic-button>
140
- </sonic-group>
141
- <sonic-divider size="lg"></sonic-divider>
142
- <div class="text-lg mb-2">Choose a subscription</div>
143
- <sonic-group formDataProvider="subscriptionData">
144
- <sonic-button radio minWidth="10rem" name="subscription" value="standard" type="default"
145
- >😎 Standard</sonic-button
146
- >
147
- <sonic-button radio minWidth="10rem" name="subscription" value="premium" type="default">⭐ Premium</sonic-button>
148
- <sonic-button radio minWidth="10rem" name="subscription" value="diamond" type="default">💎 Diamond</sonic-button>
149
- </sonic-group>
145
+ <div formDataProvider="button-reset-demo" class="mb-2">
146
+ <sonic-checkbox name="agree" value="yes">Extra baggage</sonic-checkbox>
147
+ <sonic-button reset>Reset this form</sonic-button>
148
+ </div>
149
+ <sonic-button reset="button-reset-demo">Reset by name</sonic-button>
150
150
  </template>
151
151
  </sonic-code>
152
152
 
153
+ ## Go back
154
+
155
+ `goBack` navigates back in history. When there is no previous page on the same origin, it goes to the attribute value, or to the site root if empty.
153
156
 
154
- ## Aria-label
155
157
  <sonic-code>
156
158
  <template>
157
- <sonic-button data-aria-label="Custom aria label" type="primary" >
158
- Button with aria label
159
- </sonic-button>
160
- <sonic-button data-aria-label="Custom aria label" href="https://google.fr" type="primary" >
161
- Button link with aria label
162
- </sonic-button>
159
+ <sonic-button goBack="/" variant="outline">
160
+ <sonic-icon library="iconoir" slot="prefix" name="arrow-left"></sonic-icon>
161
+ Back
162
+ </sonic-button>
163
163
  </template>
164
164
  </sonic-code>
165
165
 
166
+ ## Accessibility
167
+
168
+ Icon-only buttons need a label. Use `data-aria-label`, which is forwarded to the inner `button` (and link).
166
169
 
167
- ## Custom styles & active states with tailwind
168
170
  <sonic-code>
169
171
  <template>
170
- <div formDataProvider="subscriptionData2">
171
- <sonic-button
172
- class="bg-neutral-100 transition-all text-center text-lg text-neutral-400 rounded-md min-w-[8rem] [&[active]]:text-danger-content [&[active]]:min-w-[13rem] [&[active]]:bg-danger [&[active]]:font-black [&[active]]:rounded-full"
173
- variant="unstyled"
174
- checkable unique
175
- name="subscription"
176
- value="premium"
177
- type="default">
178
- <span swap="off" class="inline-block py-2 px-3" >subscribe</span>
179
- <span swap="on" class="inline-block py-2 px-3" >⭐ Premium</span>
180
- </sonic-button>
181
- </div>
172
+ <sonic-button shape="circle" data-aria-label="Close">
173
+ <sonic-icon library="iconoir" name="cancel"></sonic-icon>
174
+ </sonic-button>
182
175
  </template>
183
176
  </sonic-code>
177
+
178
+ ## API reference
179
+
180
+ | Attribute | Values | Description |
181
+ |----------|---------|-------------|
182
+ | `type` | `default` (default) · `primary` · `neutral` · `warning` · `info` · `success` · `danger` · `custom` | Color; `custom` reads `--sc-btn-custom-color` and `--sc-btn-custom-bg` |
183
+ | `variant` | `default` (default) · `outline` · `ghost` · `link` · `unstyled` | Visual style |
184
+ | `size` | `2xs` … `2xl` (default `md`) · `inherit` | Typography and padding |
185
+ | `shape` | `default` (default) · `circle` · `square` · `block` | Icon button or full width |
186
+ | `icon` | boolean | Enlarges a lone icon |
187
+ | `loading` | boolean | Shows a spinner and blocks clicks |
188
+ | `disabled` | boolean | Dims the button and blocks clicks |
189
+ | `active` | boolean | Active state, set automatically for links and toggles |
190
+ | `align` | `left` · `center` · `right` | Text alignment |
191
+ | `direction` | flex direction (default `row`) | Layout of slots |
192
+ | `alignItems` | flex `align-items` (default `center`) | Cross-axis alignment of slots |
193
+ | `justify` | flex `justify-content` (default `center`) | Main-axis alignment of slots |
194
+ | `minWidth` | CSS length (default `0`) | Minimum width of the button |
195
+ | `href` | URL | Renders the button as a link |
196
+ | `target` | `_self` · `_blank` · `_parent` · `_top` | Link target |
197
+ | `download` | string | Link `download` attribute |
198
+ | `pushState` | boolean | Navigates with `history.pushState` |
199
+ | `autoActive` | `partial` (default) · `strict` · `strict-path-only` · `disabled` | URL matching for `active` |
200
+ | `goBack` | URL or empty | Goes back in history, with a fallback URL |
201
+ | `reset` | empty or provider name | Clears the current or named form data provider |
202
+ | `name` / `value` | string | Form field written to the data provider |
203
+ | `formDataProvider` | string | Data provider to write to (default: nearest ancestor) |
204
+ | `radio` | boolean | Single choice among buttons with the same `name` |
205
+ | `unique` | boolean | Like `radio`, but can be deselected |
206
+ | `autoRepeat` | boolean | Repeats the click while the pointer is held |
207
+ | `data-aria-label` | string | `aria-label` of the inner button |
208
+ | `data-aria-labelledby` | string | `aria-labelledby` of the inner button |
209
+ | `data-aria-controls` | string | `aria-controls` of the inner button |
210
+ | `data-aria-expanded` | boolean | `aria-expanded` of the inner button |
211
+
212
+ | Slot | Description |
213
+ |------|-------------|
214
+ | *(default)* | Label |
215
+ | `prefix` | Icon or text before the label |
216
+ | `suffix` | Icon or text after the label |
File without changes
@@ -1,12 +1,10 @@
1
1
  # Captcha
2
2
 
3
- **`sonic-captcha`** embeds an **ALTCHA** widget and wires **`captchaToken`** / **`needsCaptchaValidation`** on the ancestor **`formDataProvider`** (or **`headersDataProvider`**). **`sonic-submit`** waits for a token before sending when validation is required. The widget loads only on **HTTPS**; on plain HTTP the host renders nothing.
4
-
5
- > Live widget calls the Supersoniks challenge service — not part of [docs mock API](#docs/_misc/docs-mock-api.md/docs-mock-api).
3
+ **`sonic-captcha`** embeds an [ALTCHA](https://altcha.org) proof-of-work widget and makes the nearest form wait for it. Place it inside a form scope and put **`sonic-submit`** in its default slot: the widget renders above the slot content, and the submit sends only once a token is available.
6
4
 
7
5
  ## Basic example
8
6
 
9
- Wrap the form scope and place **`sonic-submit`** in the default slot so the challenge appears above the action.
7
+ The widget loads only on **HTTPS**. On plain HTTP the component renders nothing and the form is not blocked.
10
8
 
11
9
  <sonic-code>
12
10
  <template>
@@ -15,57 +13,44 @@ Wrap the form scope and place **`sonic-submit`** in the default slot so the chal
15
13
  formDataProvider="captcha-docs-form"
16
14
  submitResultDataProvider="captcha-docs-result"
17
15
  >
18
- <sonic-captcha formDataProvider="captcha-docs-form">
19
- <sonic-input class="mb-3" name="email" type="email" label="Email" value="demo@example.com"></sonic-input>
16
+ <sonic-captcha>
17
+ <sonic-input class="mb-3 block" name="email" type="email" label="Email" value="demo@example.com"></sonic-input>
20
18
  <sonic-submit endPoint="api/register" onClick>
21
- <sonic-button type="primary">Submit with captcha</sonic-button>
19
+ <sonic-button type="primary">Join the crew</sonic-button>
22
20
  </sonic-submit>
23
21
  </sonic-captcha>
24
22
  </sonic-scope>
25
23
  </template>
26
24
  </sonic-code>
27
25
 
28
- ## Encrypted site key
29
-
30
- Optional **`key`** skips client-side key generation. When omitted, the component derives an encrypted key on connect (after **`generateEncryptedKey`**).
31
-
32
- <sonic-code>
33
- <template>
34
- <sonic-captcha formDataProvider="captcha-docs-form" key="6Leq5V0iAAAAAB-41DlWN335jDlcIuXmhNtdd00t">
35
- <sonic-button type="outline" disabled>Complete the challenge above to enable submit</sonic-button>
36
- </sonic-captcha>
37
- </template>
38
- </sonic-code>
39
-
40
- ## Form publisher fields
26
+ ## Form integration
41
27
 
42
- On connect (HTTPS only), **`needsCaptchaValidation`** is set to **`true`** and **`captchaToken`** is cleared. When the ALTCHA widget reaches **`verified`**, **`captchaToken`** is written on the form publisher and **`sonic-captcha-validate`** fires (`detail.valid` · **`detail.state`** · optional **`detail.token`** / **`detail.payload`**). **`sonic-submit`** still listens for **`request_token`** to refresh the token immediately before send.
28
+ The component writes to the publisher named by the closest `headersDataProvider`, or else `formDataProvider`, on itself or an ancestor. On connect it sets `needsCaptchaValidation` to `true`. When **`sonic-submit`** sees that flag, it requests a token, the captcha copies the solved ALTCHA payload into `captchaToken` and its key into `captchaKey`, and the request is sent. `needsCaptchaValidation` is stripped from the payload. On disconnect both fields are reset.
43
29
 
44
30
  <sonic-code language="typescript">
45
31
  <template>
46
32
  {
47
- needsCaptchaValidation: true,
33
+ email: "demo@example.com",
48
34
  captchaKey: "…",
49
35
  captchaToken: "…"
50
36
  }
51
37
  </template>
52
38
  </sonic-code>
53
39
 
40
+ ## Key and challenge endpoint
41
+
42
+ With no `key`, the component generates an encrypted key on connect. The widget fetches its challenge from the `chalengeUrl` property (a JavaScript property, not an attribute) with `key` and `maxNumber` (default `50000`) as query parameters. Point it at your own ALTCHA server and verify `captchaToken` there.
43
+
44
+ Labels follow the page language: French when `<html lang>` starts with `fr`, English otherwise.
45
+
54
46
  ## API reference
55
47
 
56
48
  | Attribute | Values | Description |
57
49
  |----------|---------|-------------|
58
- | `formDataProvider` | publisher id | Same as ancestor form scope; reads/writes **`needsCaptchaValidation`** · **`captchaKey`** · **`captchaToken`** |
59
- | `key` | string | ALTCHA site key; auto-generated when empty |
60
- | `action` | string | Optional action name forwarded to the widget |
61
- | `zIndex` | number (default `9999`) | Stacking for the challenge overlay |
50
+ | `key` | string (default generated) | Key sent to the challenge endpoint and copied to `captchaKey` |
62
51
 
63
52
  | Slot | Description |
64
53
  |------|-------------|
65
- | *(default)* | Form actions (typically **`sonic-submit`** and fields) rendered below the widget |
66
-
67
- | Event | Description |
68
- |-------|-------------|
69
- | `sonic-captcha-validate` | Fired when **`state`** is **`verified`** · **`error`** or **`expired`**; **`detail.valid`** is **`true`** only for **`verified`** |
54
+ | *(default)* | Form fields and actions, rendered below the widget |
70
55
 
71
- Related: [Submit](#core/components/functional/submit/submit.md/submit) — **`needsCaptchaValidation`** and deferred send.
56
+ No events.
@@ -7,7 +7,7 @@ Cards **group related content** on a padded surface with radius, theme **`type`*
7
7
  <sonic-code>
8
8
  <template>
9
9
  <sonic-card class="max-w-sm">
10
- <p class="m-0">Related content on a raised surface.</p>
10
+ <p class="m-0">CN 001 · CDG → JFK · On time.</p>
11
11
  </sonic-card>
12
12
  </template>
13
13
  </sonic-code>
@@ -153,23 +153,23 @@ Header, media, body, and footer together.
153
153
  <sonic-code>
154
154
  <template>
155
155
  <sonic-card class="max-w-md">
156
- <sonic-card-header label="Featured route" description="San Francisco → New York">
156
+ <sonic-card-header label="Featured route" description="CDG → JFK">
157
157
  <sonic-icon slot="suffix" library="iconoir" name="airplane" aria-hidden="true"></sonic-icon>
158
158
  </sonic-card-header>
159
159
  <sonic-card-main>
160
160
  <sonic-image
161
161
  rounded
162
162
  ratio="16/9"
163
- src="https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg"
164
- alt="Airplane wing above the clouds"
163
+ src="/img/concorde/plane_04.jpg"
164
+ alt="Concorde on the apron under a blue sky"
165
165
  ></sonic-image>
166
166
  <p class="mb-0">
167
- Nonstop flight with flexible dates. Prices shown include taxes and fees.
167
+ Nonstop at Mach 2.04, with flexible dates.
168
168
  </p>
169
169
  </sonic-card-main>
170
170
  <sonic-card-footer>
171
171
  <div class="flex items-center justify-between gap-3 flex-wrap">
172
- <span class="text-sm font-semibold">From $249</span>
172
+ <span class="text-sm font-semibold">Cabin class: Business</span>
173
173
  <sonic-button type="primary" size="sm">Book</sonic-button>
174
174
  </div>
175
175
  </sonic-card-footer>
@@ -14,7 +14,7 @@ A bare divider is a full-width line with vertical margin. Omit **`size`** to use
14
14
 
15
15
  ## Label and align
16
16
 
17
- **`label`** renders inside the line (HTML via the same pipeline as other form labels). **`align`** controls which side(s) of the line remain visible: **`left`** drops the leading segment, **`right`** drops the trailing segment, **`center`** keeps both.
17
+ **`label`** renders inside the line (as HTML). **`align`** controls which side(s) of the line remain visible: **`left`** drops the leading segment, **`right`** drops the trailing segment, **`center`** keeps both.
18
18
 
19
19
  <sonic-code>
20
20
  <template>
@@ -80,13 +80,12 @@ Slotted content replaces or augments **`label`**. Useful for badges, icons, or m
80
80
  <sonic-code>
81
81
  <template>
82
82
  <sonic-divider>
83
- <span class="mr-2">Section title</span>
83
+ <span class="mr-2">Departures</span>
84
84
  <sonic-badge type="danger">+25</sonic-badge>
85
85
  </sonic-divider>
86
86
  </template>
87
87
  </sonic-code>
88
88
 
89
-
90
89
  ## Inside typed cards
91
90
 
92
91
  On **`sonic-card`** with semantic **`type`** (`primary` · `warning` · `danger` · `info` · `success`), the rule uses the card’s text color at reduced opacity so it stays visible on tinted surfaces. **`label`** and slotted captions use the same foreground color as surrounding copy.
@@ -95,15 +94,15 @@ On **`sonic-card`** with semantic **`type`** (`primary` · `warning` · `danger`
95
94
  <template>
96
95
  <div class="grid gap-4 max-w-xl">
97
96
  <sonic-card type="danger">
98
- <div>This action cannot be undone.</div>
99
- <sonic-divider label="Affected resources"></sonic-divider>
97
+ <div>CN 001 is cancelled.</div>
98
+ <sonic-divider label="Affected passengers"></sonic-divider>
100
99
  <ul class="m-0 pl-5 text-sm">
101
- <li>Project files</li>
102
- <li>Shared links</li>
100
+ <li>Ada Lindqvist</li>
101
+ <li>Captain Leo Marchand</li>
103
102
  </ul>
104
103
  </sonic-card>
105
104
  <sonic-card type="info">
106
- <div>Maintenance is scheduled for tonight.</div>
105
+ <div>Aircraft maintenance is scheduled for tonight.</div>
107
106
  <sonic-divider></sonic-divider>
108
107
  <div class="opacity-60">Expected downtime: about 15 minutes.</div>
109
108
  </sonic-card>
@@ -117,7 +116,7 @@ On **`sonic-card`** with semantic **`type`** (`primary` · `warning` · `danger`
117
116
  |----------|---------|-------------|
118
117
  | `label` | string (HTML) | Caption centered on the rule; combined with default-slot content when both are set |
119
118
  | `align` | `left` · `center` · `right` (default `center`) | Hides the leading or trailing line segment for left/right alignment |
120
- | `size` | `2xs` · `xs` · `sm` · `md` · `lg` · `xl` · `2xl` · `inherit` | Vertical margin and label `font-size`; omit for host defaults |
119
+ | `size` | `2xs` … `2xl` · `inherit` | Vertical margin and label `font-size`; omit for host defaults |
121
120
  | `lineStyle` | `solid` · `dashed` · `dotted` (default `solid`) | Stroke style of the rule (HTML attribute `linestyle`) |
122
121
  | `vertical` | boolean | Renders a vertical rule; swap block/inline margins |
123
122
  | `noMargin` | boolean | Sets host margin to `0` |
@@ -125,5 +124,3 @@ On **`sonic-card`** with semantic **`type`** (`primary` · `warning` · `danger`
125
124
  | Slot | Description |
126
125
  |------|-------------|
127
126
  | *(default)* | Label markup when **`label`** is insufficient or empty |
128
-
129
- The inner flex container exposes **`part="divider"`** for theme overrides.