@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,77 +1,125 @@
1
1
  # Checkbox
2
2
 
3
- ## Size
3
+ **`sonic-checkbox`** is a styled checkbox that writes its `value` into form data. Give it a `name` and a `formDataProvider` (on the field or an ancestor); checkboxes sharing a `name` build an array of the checked values. Label goes in the default slot or `label`, helper text in the `description` slot.
4
+
5
+ ## Basic example
6
+
4
7
  <sonic-code>
5
8
  <template>
6
- <div class="grid gap-2">
7
- <sonic-checkbox size="2xs">2xs checkbox</sonic-checkbox>
8
- <sonic-checkbox size="xs">xs checkbox</sonic-checkbox>
9
- <sonic-checkbox size="sm">sm checkbox</sonic-checkbox>
10
- <sonic-checkbox>default checkbox</sonic-checkbox>
11
- <sonic-checkbox size="lg">lg checkbox</sonic-checkbox>
12
- <sonic-checkbox size="xl">xl checkbox</sonic-checkbox>
13
- <sonic-checkbox size="2xl">2xl checkbox</sonic-checkbox>
14
- </div>
9
+ <sonic-checkbox>
10
+ Notify me of gate changes
11
+ <span slot="description">One message per change, no spam.</span>
12
+ </sonic-checkbox>
15
13
  </template>
16
14
  </sonic-code>
17
15
 
18
- ## Checked
16
+ ## Size
17
+
18
+ With no `size`, the checkbox follows `md` (1rem).
19
+
19
20
  <sonic-code>
20
21
  <template>
21
- <sonic-checkbox checked
22
- >Already checked checkbox
23
- </sonic-checkbox>
22
+ <div class="grid gap-2">
23
+ <sonic-checkbox size="2xs">2xs</sonic-checkbox>
24
+ <sonic-checkbox size="xs">xs</sonic-checkbox>
25
+ <sonic-checkbox size="sm">sm</sonic-checkbox>
26
+ <sonic-checkbox>Default</sonic-checkbox>
27
+ <sonic-checkbox size="lg">lg</sonic-checkbox>
28
+ <sonic-checkbox size="xl">xl</sonic-checkbox>
29
+ <sonic-checkbox size="2xl">2xl</sonic-checkbox>
30
+ </div>
24
31
  </template>
25
32
  </sonic-code>
26
33
 
27
- ## Disabled
34
+ ## Checked and disabled
35
+
36
+ `checked` sets the initial state. `disabled` blocks interaction and dims the control.
37
+
28
38
  <sonic-code>
29
39
  <template>
30
- <sonic-checkbox disabled
31
- >Disabled checkbox
32
- </sonic-checkbox>
40
+ <div class="grid gap-2">
41
+ <sonic-checkbox checked>Checked</sonic-checkbox>
42
+ <sonic-checkbox disabled>Disabled</sonic-checkbox>
43
+ <sonic-checkbox disabled checked>Disabled and checked</sonic-checkbox>
44
+ <sonic-checkbox>I accept the <sonic-link href="#" class="underline">terms</sonic-link></sonic-checkbox>
45
+ </div>
33
46
  </template>
34
47
  </sonic-code>
35
48
 
36
- ## Disabled and checked
49
+ ## Form binding
50
+
51
+ Checkboxes with the same `name` under one `formDataProvider` store an array of the checked `value`s. Initial state is read from that data, so a value already present checks the matching box. See [Data flow](/docs/getting-started/dataFlow).
52
+
37
53
  <sonic-code>
38
54
  <template>
39
- <sonic-checkbox disabled checked
40
- >Disabled but already checked checkbox
41
- </sonic-checkbox>
55
+ <div formDataProvider="checkbox-multiple-demo" class="grid gap-2">
56
+ <sonic-checkbox name="extras" value="baggage" checked>Extra baggage</sonic-checkbox>
57
+ <sonic-checkbox name="extras" value="meal">Meal</sonic-checkbox>
58
+ <sonic-checkbox name="extras" value="lounge">Lounge access</sonic-checkbox>
59
+ <div>Selected: <sonic-value dataProvider="checkbox-multiple-demo" key="extras"></sonic-value></div>
60
+ </div>
42
61
  </template>
43
62
  </sonic-code>
44
63
 
45
- ## Checkbox with link
64
+ ## Single value
65
+
66
+ `unique` stores a single value instead of an array: checking one box unchecks the others with the same `name`, and the checked box can be unchecked again (value `null`). `radio` does the same but cannot be unchecked by a click.
67
+
46
68
  <sonic-code>
47
69
  <template>
48
- <sonic-checkbox>Checkbox with <sonic-link href="#" class="underline text-info">link</sonic-link>
70
+ <div formDataProvider="checkbox-unique-demo" class="grid gap-2">
71
+ <sonic-checkbox unique name="cabin" value="economy">Economy</sonic-checkbox>
72
+ <sonic-checkbox unique name="cabin" value="business">Business</sonic-checkbox>
73
+ <div>Cabin: <sonic-value dataProvider="checkbox-unique-demo" key="cabin"></sonic-value></div>
74
+ </div>
49
75
  </template>
50
76
  </sonic-code>
51
77
 
52
- ## Check all checkbox
78
+ ## Check all and indeterminate
79
+
80
+ A checkbox with `checksAll` and the same `name` toggles every sibling value. It shows the indeterminate icon when only some are checked; its own `value` is never stored. With `unsetOnDisconnect`, a checkbox removes its value from the data when it leaves the DOM. `showAsIndeterminate` forces the indeterminate icon on any checkbox.
81
+
53
82
  <sonic-code>
54
- <template>
55
- <div formDataProvider="checkbox-check-all-demo">
56
- <sonic-checkbox name='someSharedName' value="all" checksAll>All</sonic-checkbox>
57
- <sonic-divider></sonic-divider>
58
- <div class="grid gap-2">
59
- <sonic-checkbox name="someSharedName" value="foo">Foo</sonic-checkbox>
60
- <sonic-checkbox name="someSharedName" value="bar">Bar</sonic-checkbox>
83
+ <template>
84
+ <div formDataProvider="checkbox-check-all-demo" class="grid gap-2">
85
+ <sonic-checkbox name="alerts" value="all" checksAll>All alerts</sonic-checkbox>
86
+ <sonic-checkbox name="alerts" value="boarding">Boarding</sonic-checkbox>
87
+ <sonic-checkbox name="alerts" value="gate">Gate change</sonic-checkbox>
88
+ <div id="checkbox-removable" class="flex gap-2 items-center">
89
+ <sonic-checkbox name="alerts" value="delay" unsetOnDisconnect>Delay</sonic-checkbox>
90
+ <sonic-button size="xs" variant="ghost" onclick="document.getElementById('checkbox-removable').remove()">Remove</sonic-button>
61
91
  </div>
62
- <sonic-divider></sonic-divider>
63
- <div>
64
- <span>Enabling unsetOnDisconect ensures that outdated or irrelevant values are not retained in the form state once their associated inputs are no longer rendered.</span>
65
- <div id="prunable-checkbox" class="flex gap-2 items-center">
66
- <sonic-checkbox name="someSharedName" value="baz">Baz</sonic-checkbox>
67
- <sonic-button variant="ghost" shape="circle" unique name="toggleCheckboxExistance" onclick="document.getElementById('prunable-checkbox').remove();" value="true"><sonic-icon library="fontAwesome" prefix="solid" name="trash"></sonic-icon></sonic-button>
68
- </div>
92
+ <div>Selected: <sonic-value dataProvider="checkbox-check-all-demo" key="alerts"></sonic-value></div>
69
93
  </div>
70
94
  </template>
71
95
  </sonic-code>
72
96
 
73
- ## Example of use — blacklist + queue
97
+ ## API reference
98
+
99
+ | Attribute | Values | Description |
100
+ |----------|---------|-------------|
101
+ | `name` | string | Key in the form data (dot notation supported) |
102
+ | `value` | string | Value stored when checked |
103
+ | `formDataProvider` | string | Form data id; inherited from the closest ancestor when omitted |
104
+ | `checked` | boolean | Initial checked state |
105
+ | `unique` | boolean | Stores a single value; can be unchecked |
106
+ | `radio` | boolean | Stores a single value; cannot be unchecked by a click |
107
+ | `checksAll` | boolean | Toggles every checkbox with the same `name` |
108
+ | `unsetOnDisconnect` | boolean | Removes the value from the data when the element is removed |
109
+ | `showAsIndeterminate` | boolean | Forces the indeterminate icon |
110
+ | `label` | string (HTML) | Label, rendered before the default slot |
111
+ | `description` | string (HTML) | Helper text, rendered in the `description` slot |
112
+ | `size` | `2xs` … `2xl` · `inherit` (default `md`) | Font size and box size |
113
+ | `disabled` | boolean | Blocks interaction |
114
+ | `required` | boolean | Native validation on form submit |
115
+ | `autofocus` | boolean | Focuses the input on load |
116
+ | `iconName` | string (default `check`) | Icon shown when checked |
117
+ | `indeterminateIconName` | string (default `minus-small`) | Icon shown when indeterminate |
118
+ | `data-aria-label` · `data-aria-labelledby` | string | Forwarded to the inner input as `aria-label` / `aria-labelledby` |
74
119
 
75
- Checked **`blacklistFlags`** values are sent to the mock API (`?blacklistFlags=racist,sexist,…`), which excludes jokes whose **`flags`** match (see `filterDocsJokes` in `src/docs/mock-api/fixtures.ts`).
120
+ | Slot | Description |
121
+ |------|-------------|
122
+ | *(default)* | Label content (text, links) |
123
+ | `description` | Helper text under the label |
76
124
 
77
- <docs-lit-demo for="docs-joke-blacklist-demo"></docs-lit-demo>
125
+ Fires a `change` event on each click.
@@ -1,13 +1,13 @@
1
1
  # Fieldset
2
2
 
3
- **`sonic-fieldset`** groups related form controls with a bordered container and an accessible **`<fieldset>`** semantics layer. Put fields in the **default slot**; add a title with **`sonic-legend`** or the shorthand **`label`** / **`description`** / **`iconName`** attributes. Default **`variant`** is `default`. Pair the body with **`sonic-form-layout`** for responsive columns.
3
+ **`sonic-fieldset`** groups related form controls in a bordered container rendered as a native `<fieldset>`. Put fields in the default slot and title the group with a slotted `sonic-legend` or with the `label` and `description` shorthand. Pair the body with `sonic-form-layout` for responsive columns.
4
4
 
5
5
  ## Basic example
6
6
 
7
7
  <sonic-code>
8
8
  <template>
9
9
  <sonic-fieldset>
10
- <sonic-legend label="Contact details"></sonic-legend>
10
+ <sonic-legend label="Passenger contact"></sonic-legend>
11
11
  <sonic-form-layout>
12
12
  <sonic-input autocomplete="email" label="Email" name="email" type="email"></sonic-input>
13
13
  <sonic-input autocomplete="tel" label="Phone" name="phone" type="tel"></sonic-input>
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## Variant
20
20
 
21
- **`ghost`** and **`shadow`** use a transparent border; **`shadow`** also applies **`--sc-shadow-lg`**.
21
+ With no `variant`, the fieldset is `default` (bordered). `ghost` and `shadow` hide the border; `shadow` adds `--sc-shadow-lg`.
22
22
 
23
23
  <sonic-code>
24
24
  <template>
@@ -39,9 +39,9 @@
39
39
  </template>
40
40
  </sonic-code>
41
41
 
42
- ## Tight layout
42
+ ## Tight
43
43
 
44
- Set **`tight`** to remove horizontal padding and side borders (flat strip inside a parent).
44
+ `tight` removes horizontal padding, side borders and rounding, for a flat strip inside a parent.
45
45
 
46
46
  <sonic-code>
47
47
  <template>
@@ -54,9 +54,7 @@ Set **`tight`** to remove horizontal padding and side borders (flat strip inside
54
54
 
55
55
  ## Legend
56
56
 
57
- Use **`sonic-legend`** for the group title. Set **`label`** and **`description`** for simple copy, or use the **default slot** for custom markup. Add secondary text with **`sonic-legend-description`**. Place actions in **`slot="suffix"`** on the legend.
58
-
59
- Attribute values on **`sonic-legend`** are rendered as HTML—use only trusted content.
57
+ `sonic-legend` takes `label` and `description`, or custom markup in its default slot with `sonic-legend-description` for the secondary line. `iconName` adds a leading `sonic-icon`. **`label` and `description` are rendered as HTML**: pass trusted content only.
60
58
 
61
59
  <sonic-code>
62
60
  <template>
@@ -76,15 +74,15 @@ Attribute values on **`sonic-legend`** are rendered as HTML—use only trusted c
76
74
  </template>
77
75
  </sonic-code>
78
76
 
79
- ## Shorthand legend on the fieldset
77
+ ## Shorthand legend
80
78
 
81
- When **`label`** is set on **`sonic-fieldset`**, the component renders **`sonic-legend`** for you. Pass **`description`** **`iconName`** **`iconLibrary`** and **`iconPrefix`** the same way. Do not combine shorthand **`label`** with a separate slotted **`sonic-legend`**—you will get two legends.
79
+ When `label` is set on `sonic-fieldset`, it renders the `sonic-legend` itself and forwards `description` · `iconName` · `iconLibrary` · `iconPrefix`. Do not also slot a `sonic-legend`, or the group gets two titles.
82
80
 
83
81
  <sonic-code>
84
82
  <template>
85
83
  <sonic-fieldset
86
- label="Account"
87
- description="Basic profile fields"
84
+ label="Crew profile"
85
+ description="Basic crew member fields"
88
86
  iconLibrary="iconoir"
89
87
  iconName="user"
90
88
  >
@@ -95,12 +93,12 @@ When **`label`** is set on **`sonic-fieldset`**, the component renders **`sonic-
95
93
 
96
94
  ## Legend actions
97
95
 
98
- Use **`slot="suffix"`** on **`sonic-legend`** for menus or icon buttons aligned to the end of the legend row.
96
+ `slot="suffix"` on `sonic-legend` aligns menus or icon buttons to the end of the title row.
99
97
 
100
98
  <sonic-code>
101
99
  <template>
102
100
  <sonic-fieldset>
103
- <sonic-legend label="Personal information">
101
+ <sonic-legend label="Passenger details">
104
102
  <sonic-pop class="inline-block" slot="suffix">
105
103
  <sonic-button shape="circle" variant="ghost">
106
104
  <sonic-icon library="iconoir" size="lg" name="more-vert"></sonic-icon>
@@ -119,49 +117,7 @@ Use **`slot="suffix"`** on **`sonic-legend`** for menus or icon buttons aligned
119
117
  </template>
120
118
  </sonic-code>
121
119
 
122
- ## Form association and disabled state
123
-
124
- ### Associating a distant `form`
125
-
126
- Set **`form`** on **`sonic-fieldset`** to the **`id`** of a **`<form>`** elsewhere in the page (same as the native **`form`** attribute on **`<fieldset>`**). Named fields in the fieldset then belong to that form for submit and constraint validation—for example a toolbar **`form`** and a field group rendered lower on the layout.
127
-
128
- <sonic-code>
129
- <template>
130
- <div class="grid gap-4">
131
- <form id="billing-form" class="flex flex-wrap items-center gap-2">
132
- <sonic-button submit type="primary">Save billing</sonic-button>
133
- </form>
134
- <sonic-fieldset form="billing-form" label="Billing address">
135
- <sonic-form-layout>
136
- <sonic-input label="Street" name="street" autocomplete="street-address"></sonic-input>
137
- <sonic-input label="Postal code" required name="postal_code" autocomplete="postal-code"></sonic-input>
138
- <sonic-input label="City" name="city" autocomplete="address-level2"></sonic-input>
139
- </sonic-form-layout>
140
- </sonic-fieldset>
141
- </div>
142
- </template>
143
- </sonic-code>
144
-
145
- ### Disabling a group
146
-
147
- Set **`disabled`** on **`sonic-fieldset`** to disable the inner **`<fieldset>`** and every control in the group (same as a native fieldset). Use it for read-only steps or sections gated by permissions.
148
-
149
- <sonic-code>
150
- <template>
151
- <div class="grid gap-4">
152
- <sonic-fieldset label="Editable">
153
- <sonic-input label="Display name" name="display_name"></sonic-input>
154
- </sonic-fieldset>
155
- <sonic-fieldset label="Locked" disabled>
156
- <sonic-input label="Account ID" name="account_id" value="acct_42"></sonic-input>
157
- </sonic-fieldset>
158
- </div>
159
- </template>
160
- </sonic-code>
161
-
162
- ## Accessibility
163
-
164
- The inner **`<fieldset>`** carries grouping semantics. **`disabled`** is applied on that element so nested controls are disabled in the usual way. **`sonic-legend`** renders a native **`<legend>`** for the group label.
120
+ <sonic-alert status="warning" label="Disabled state and form association" text="Both attributes are set on the inner native fieldset only. Slotted Concorde fields are not disabled or re-associated by them: set disabled on each field instead."></sonic-alert>
165
121
 
166
122
  ## API reference
167
123
 
@@ -170,36 +126,36 @@ The inner **`<fieldset>`** carries grouping semantics. **`disabled`** is applied
170
126
  | Attribute | Values | Description |
171
127
  |----------|---------|-------------|
172
128
  | `variant` | `default` · `ghost` · `shadow` (default `default`) | Border and shadow treatment |
173
- | `tight` | boolean | Removes horizontal padding and side borders |
174
- | `label` | string | Shorthand legend title; renders **`sonic-legend`** when set |
175
- | `description` | string | Shorthand legend description (HTML) |
176
- | `iconName` | string | Shorthand legend icon **`name`** |
177
- | `iconLibrary` | string | Shorthand legend icon **`library`** |
178
- | `iconPrefix` | string | Shorthand legend icon **`prefix`** |
179
- | `disabled` | boolean | Disables the native **`<fieldset>`** and its controls |
180
- | `form` | string | **`id`** of an associated **`form`** |
181
- | `dataProvider` | string | Subscriber key; can autofill properties that match publisher fields (e.g. **`label`**) |
129
+ | `tight` | boolean | Removes horizontal padding, side borders and rounding |
130
+ | `label` | string | Shorthand title; renders a `sonic-legend` when set |
131
+ | `description` | string | Shorthand description (HTML) |
132
+ | `iconName` | string | Shorthand legend icon `name` |
133
+ | `iconLibrary` | string | Shorthand legend icon `library` |
134
+ | `iconPrefix` | string | Shorthand legend icon `prefix` |
135
+ | `disabled` | boolean | Sets `disabled` on the inner native `<fieldset>` |
136
+ | `form` | string | Sets `form` on the inner native `<fieldset>` |
137
+ | `dataProvider` | string | Publisher key; matching publisher fields (e.g. `label`) fill the properties |
182
138
 
183
139
  | Slot | Description |
184
140
  |------|-------------|
185
- | *(default)* | Legend (optional) and field group content in visual order |
141
+ | *(default)* | Optional `sonic-legend`, then the grouped fields |
186
142
 
187
143
  ### `sonic-legend`
188
144
 
189
145
  | Attribute | Values | Description |
190
146
  |----------|---------|-------------|
191
- | `label` | string | Title HTML when not using the default slot |
192
- | `description` | string | Description HTML (wrapped in **`sonic-legend-description`**) |
193
- | `iconName` | string | Leading **`sonic-icon`** **`name`** |
194
- | `iconLibrary` | string | Icon **`library`** |
195
- | `iconPrefix` | string | Icon **`prefix`** |
196
- | `forceAutoFill` | boolean | Allows Subscriber autofill to override attribute-backed **`label`** / **`description`** |
147
+ | `label` | string | Title (HTML) |
148
+ | `description` | string | Description (HTML), wrapped in `sonic-legend-description` |
149
+ | `iconName` | string | Leading `sonic-icon` `name` |
150
+ | `iconLibrary` | string | Icon `library` |
151
+ | `iconPrefix` | string | Icon `prefix` |
152
+ | `forceAutoFill` | boolean | Lets a `label` or `description` set as a property override the attribute value |
197
153
 
198
154
  | Slot | Description |
199
155
  |------|-------------|
200
- | *(default)* | Legend title and description components |
156
+ | *(default)* | Custom title and `sonic-legend-description` |
201
157
  | `suffix` | Trailing actions (menus, icon buttons) |
202
158
 
203
159
  ### `sonic-legend-description`
204
160
 
205
- Muted description line below the legend title. No attributes—project content through the **default slot**.
161
+ No attributes. The default slot holds the muted line under the legend title.
@@ -1,10 +1,10 @@
1
1
  # Form actions
2
2
 
3
- **`sonic-form-actions`** lays out submit / cancel and other **form footer controls** in a **wrapping flex row** with a small fixed gap. Place it inside **`sonic-form-layout`** (full-width row) or any block that should end with actions. Defaults: **`direction`** `row` · **`justify`** `flex-start` · **`alignItems`** `center`.
3
+ **`sonic-form-actions`** lays out form footer controls (submit, cancel) in a wrapping flex row with a `0.3rem` gap. Place it inside `sonic-form-layout`, where it spans the full width, or at the end of any block. Use `justify` and `direction` to arrange the controls.
4
4
 
5
5
  ## Basic example
6
6
 
7
- With no attributes, actions align to the **start** of the row (typical for left-to-right forms).
7
+ With no attributes, actions align to the start of the row.
8
8
 
9
9
  <sonic-code>
10
10
  <template>
@@ -13,7 +13,7 @@ With no attributes, actions align to the **start** of the row (typical for left-
13
13
  <sonic-input label="First name"></sonic-input>
14
14
  <sonic-input label="Last name"></sonic-input>
15
15
  <sonic-form-actions>
16
- <sonic-button type="success"><sonic-icon name="check" library="iconoir"></sonic-icon> Submit</sonic-button>
16
+ <sonic-button type="success"><sonic-icon name="check" library="iconoir"></sonic-icon> Check in</sonic-button>
17
17
  <sonic-button type="danger" variant="ghost"><sonic-icon name="undo" library="iconoir"></sonic-icon> Cancel</sonic-button>
18
18
  </sonic-form-actions>
19
19
  </sonic-form-layout>
@@ -21,9 +21,9 @@ With no attributes, actions align to the **start** of the row (typical for left-
21
21
  </template>
22
22
  </sonic-code>
23
23
 
24
- ## Justify content
24
+ ## Justify
25
25
 
26
- **`justify`** maps to CSS **`justify-content`**. Use **`flex-end`** for dialog-style footers or **`center`** for balanced toolbars.
26
+ `justify` is the CSS `justify-content` of the row (default `flex-start`). Use `flex-end` for dialog-style footers or `center` for toolbars.
27
27
 
28
28
  <sonic-code>
29
29
  <template>
@@ -40,9 +40,9 @@ With no attributes, actions align to the **start** of the row (typical for left-
40
40
  </template>
41
41
  </sonic-code>
42
42
 
43
- ## Flex direction
43
+ ## Direction
44
44
 
45
- **`direction`** maps to **`flex-direction`**. **`row-reverse`** swaps visual order while keeping DOM order (focus order unchanged).
45
+ `direction` is the CSS `flex-direction` (default `row`). `row-reverse` swaps the visual order but keeps the DOM and focus order.
46
46
 
47
47
  <sonic-code>
48
48
  <template>
@@ -61,7 +61,7 @@ With no attributes, actions align to the **start** of the row (typical for left-
61
61
 
62
62
  ## Mixed controls
63
63
 
64
- Combine **`sonic-button`** with **`sonic-divider vertical`** or other slotted content. Default **`alignItems`** `center` keeps unlike heights aligned on the cross axis.
64
+ Any content can be slotted, such as a vertical `sonic-divider`. The default `alignItems` (`center`) keeps items of different heights aligned.
65
65
 
66
66
  <sonic-code>
67
67
  <template>
@@ -72,12 +72,12 @@ Combine **`sonic-button`** with **`sonic-divider vertical`** or other slotted co
72
72
  <sonic-form-actions justify="center">
73
73
  <sonic-button type="info" minWidth="12rem">
74
74
  <sonic-icon name="nav-arrow-left" library="iconoir" slot="prefix"></sonic-icon>
75
- Left seats
75
+ Previous step
76
76
  </sonic-button>
77
77
  <sonic-divider vertical></sonic-divider>
78
78
  <sonic-button type="info" minWidth="12rem">
79
79
  <sonic-icon name="nav-arrow-right" library="iconoir" slot="suffix"></sonic-icon>
80
- Right seats
80
+ Next step
81
81
  </sonic-button>
82
82
  </sonic-form-actions>
83
83
  </sonic-form-layout>
@@ -89,12 +89,10 @@ Combine **`sonic-button`** with **`sonic-divider vertical`** or other slotted co
89
89
 
90
90
  | Attribute | Values | Description |
91
91
  |----------|---------|-------------|
92
- | `direction` | `row` (default) · `column` · `row-reverse` · `column-reverse` | Main-axis layout of slotted controls |
93
- | `justify` | CSS justify-content (default `flex-start`) | Distribution along the main axis |
94
- | `alignItems` | CSS align-items (default `center`) | Cross-axis alignment when items differ in height |
95
-
96
- The component exposes a single unnamed slot; there are no named slots. Slotted nodes use the host’s flex **`gap`** (`0.3rem`) and **`flex-wrap`**.
92
+ | `direction` | `row` (default) · `column` · `row-reverse` · `column-reverse` | CSS `flex-direction` of the row |
93
+ | `justify` | CSS `justify-content` value (default `flex-start`) | Distribution along the main axis |
94
+ | `alignItems` | CSS `align-items` value (default `center`) | Cross-axis alignment |
97
95
 
98
96
  | Slot | Description |
99
97
  |------|-------------|
100
- | *(default)* | Footer actions (**`sonic-button`** and related controls) |
98
+ | *(default)* | Footer controls |
@@ -1,11 +1,9 @@
1
1
  # Form layout
2
2
 
3
- **`sonic-form-layout`** arranges slotted form controls in a **responsive CSS grid** with consistent vertical spacing. Pair **`sonic-input`** · **`sonic-select`** and **`sonic-input-autocomplete`** fields side by side when the host is wider than **440px**; **textareas**, **toggles**, **dividers**, and **`sonic-form-actions`** span the full width. Wrap a **`form`** or **`sonic-fieldset`** body—no attributes are required.
3
+ **`sonic-form-layout`** arranges slotted form controls in a responsive grid. Short fields (`sonic-input` · `sonic-select`) sit two per row when the host is wider than `440px`; every other child spans the full width. It has no attributes: wrap the body of a `form` or `sonic-fieldset` with it.
4
4
 
5
5
  ## Basic example
6
6
 
7
- Typical registration-style form: short fields flow in two columns on wide layouts; long or grouped blocks stay full width.
8
-
9
7
  <sonic-code>
10
8
  <template>
11
9
  <form>
@@ -35,15 +33,15 @@ Typical registration-style form: short fields flow in two columns on wide layout
35
33
  type="password"
36
34
  ></sonic-input>
37
35
  <sonic-divider></sonic-divider>
38
- <sonic-textarea label="Message" rows="5"></sonic-textarea>
39
- <sonic-switch>Enable optional feature</sonic-switch>
36
+ <sonic-textarea label="Special assistance" rows="5"></sonic-textarea>
37
+ <sonic-switch>Add priority boarding</sonic-switch>
40
38
  <sonic-checkbox>Subscribe to newsletter</sonic-checkbox>
41
39
  <sonic-checkbox>
42
40
  I accept the
43
41
  <sonic-link href="#" class="underline">terms and conditions</sonic-link>
44
42
  </sonic-checkbox>
45
43
  <sonic-form-actions>
46
- <sonic-button type="success">Submit</sonic-button>
44
+ <sonic-button type="success">Confirm passenger</sonic-button>
47
45
  </sonic-form-actions>
48
46
  </sonic-form-layout>
49
47
  </form>
@@ -52,24 +50,18 @@ Typical registration-style form: short fields flow in two columns on wide layout
52
50
 
53
51
  ## Responsive columns
54
52
 
55
- When the host **`offsetWidth`** is **greater than 440px**, the grid uses **two equal columns** with slightly larger gap (**1.75rem**). Below that breakpoint, fields stack in a **single column** (**1.5rem** gap).
56
-
57
- If the slot contains **exactly one** direct **`sonic-input`**, **`sonic-select`**, or **`sonic-input-autocomplete`**, the layout stays **one column** even above the breakpoint so a lone field does not sit in half an empty row.
53
+ The column count depends on the host width, not the viewport: two columns above `440px`, one below. When the layout holds exactly one short field, it stays single-column so the field does not sit in half an empty row.
58
54
 
59
55
  <sonic-code>
60
56
  <template>
61
- <div class="grid gap-8 md:grid-cols-2 mb-6">
62
- <div>
63
- <sonic-form-layout style="max-width: 20rem">
64
- <sonic-divider align="left">Narrow host (single column)</sonic-divider>
65
- <sonic-input label="Email" name="email_narrow" type="email"></sonic-input>
66
- <sonic-input label="Confirm email" name="email_confirm_narrow" type="email"></sonic-input>
67
- </sonic-form-layout>
68
- </div>
69
- </div>
70
- <div>
57
+ <div class="grid gap-8">
58
+ <sonic-form-layout style="max-width: 20rem">
59
+ <sonic-divider align="left">Narrow host</sonic-divider>
60
+ <sonic-input label="Email" name="email_narrow" type="email"></sonic-input>
61
+ <sonic-input label="Confirm email" name="email_confirm_narrow" type="email"></sonic-input>
62
+ </sonic-form-layout>
71
63
  <sonic-form-layout>
72
- <sonic-divider align="left">Wide host (two columns for inputs)</sonic-divider>
64
+ <sonic-divider align="left">Wide host</sonic-divider>
73
65
  <sonic-input label="Email" name="email_wide" type="email"></sonic-input>
74
66
  <sonic-input label="Confirm email" name="email_confirm_wide" type="email"></sonic-input>
75
67
  </sonic-form-layout>
@@ -77,11 +69,9 @@ If the slot contains **exactly one** direct **`sonic-input`**, **`sonic-select`*
77
69
  </template>
78
70
  </sonic-code>
79
71
 
80
- ## Full-width slotted blocks
81
-
82
- Everything except **`sonic-input`**, **`sonic-select`**, **`sonic-input-autocomplete`**, and slotted elements with class **`form-item-container`** is assigned **`grid-column: 1 / -1`**. Use this for **`sonic-textarea`**, **`sonic-checkbox`**, **`sonic-switch`**, **`sonic-form-actions`**, **`sonic-divider`**, and similar blocks.
72
+ ## Full-width children
83
73
 
84
- Slotted **`sonic-divider`** sets **`--sc-divider-my: 0`** so divider spacing matches the grid rhythm. Slotted **`sonic-submit`** uses **`display: contents`** so submit controls participate in the grid without an extra wrapper box.
74
+ Any child that is not a short field spans the full row: `sonic-textarea` · `sonic-checkbox` · `sonic-switch` · `sonic-divider` · `sonic-form-actions` and plain elements. Slotted dividers lose their vertical margin to match the grid gap, and `sonic-submit` uses `display: contents` so its button joins the grid directly.
85
75
 
86
76
  <sonic-code>
87
77
  <template>
@@ -97,14 +87,14 @@ Slotted **`sonic-divider`** sets **`--sc-divider-my: 0`** so divider spacing mat
97
87
 
98
88
  ## Custom column wrapper
99
89
 
100
- Add class **`form-item-container`** on a slotted wrapper (for example a **`div`**) when a field is not a direct **`sonic-input`** / **`sonic-select`** / **`sonic-input-autocomplete`** but should still share the two-column flow with short inputs.
90
+ Add the class `form-item-container` to a wrapper element to keep it in the two-column flow like a short field.
101
91
 
102
92
  <sonic-code>
103
93
  <template>
104
94
  <sonic-form-layout>
105
- <sonic-input label="City" name="city"></sonic-input>
95
+ <sonic-input label="From" name="from" placeholder="CDG"></sonic-input>
106
96
  <div class="form-item-container">
107
- <sonic-input label="Postal code" name="postal_code"></sonic-input>
97
+ <sonic-input label="To" name="to" placeholder="JFK"></sonic-input>
108
98
  </div>
109
99
  </sonic-form-layout>
110
100
  </template>
@@ -112,8 +102,8 @@ Add class **`form-item-container`** on a slotted wrapper (for example a **`div`*
112
102
 
113
103
  ## API reference
114
104
 
115
- No public attributes — layout follows slotted children and host width.
105
+ No attributes.
116
106
 
117
107
  | Slot | Description |
118
108
  |------|-------------|
119
- | *(default)* | Form fields and blocks in visual order; column vs full-width rules apply per slotted tag or **`form-item-container`** class |
109
+ | *(default)* | Fields and blocks in visual order; short fields and `form-item-container` share rows, everything else spans the full width |