@supersoniks/concorde 5.1.0 → 5.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) 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/launch.json +15 -0
  6. package/.claude/vite.http.config.mjs +7 -0
  7. package/.taste-skill/after/desktop-fold.jpg +0 -0
  8. package/.taste-skill/after/desktop-page-01.jpg +0 -0
  9. package/.taste-skill/after/desktop-page-02.jpg +0 -0
  10. package/.taste-skill/after/desktop-page-03.jpg +0 -0
  11. package/.taste-skill/after/mobile-fold.jpg +0 -0
  12. package/.taste-skill/after/mobile-page-01.jpg +0 -0
  13. package/.taste-skill/after/report.json +4103 -0
  14. package/.taste-skill/after/tablet-fold.jpg +0 -0
  15. package/.taste-skill/after/tablet-page-01.jpg +0 -0
  16. package/.taste-skill/after/tablet-page-02.jpg +0 -0
  17. package/.taste-skill/before/desktop-fold.jpg +0 -0
  18. package/.taste-skill/before/desktop-page-01.jpg +0 -0
  19. package/.taste-skill/before/desktop-page-02.jpg +0 -0
  20. package/.taste-skill/before/mobile-fold.jpg +0 -0
  21. package/.taste-skill/before/mobile-page-01.jpg +0 -0
  22. package/.taste-skill/before/report.json +2556 -0
  23. package/.taste-skill/before/tablet-fold.jpg +0 -0
  24. package/.taste-skill/before/tablet-page-01.jpg +0 -0
  25. package/.taste-skill/direction.json +510 -0
  26. package/.taste-skill/notes.md +84 -0
  27. package/.taste-skill/prod/desktop-fold.jpg +0 -0
  28. package/.taste-skill/prod/desktop-page-01.jpg +0 -0
  29. package/.taste-skill/prod/desktop-page-02.jpg +0 -0
  30. package/.taste-skill/prod/desktop-page-03.jpg +0 -0
  31. package/.taste-skill/prod/mobile-fold.jpg +0 -0
  32. package/.taste-skill/prod/mobile-page-01.jpg +0 -0
  33. package/.taste-skill/prod/mobile-page-02.jpg +0 -0
  34. package/.taste-skill/prod/report.json +1973 -0
  35. package/.taste-skill/prod/tablet-fold.jpg +0 -0
  36. package/.taste-skill/prod/tablet-page-01.jpg +0 -0
  37. package/.taste-skill/prod/tablet-page-02.jpg +0 -0
  38. package/.tmp-cem/custom-elements.json +2013 -2013
  39. package/AUDIT.md +228 -0
  40. package/PLAN-AMELIORATION.md +220 -0
  41. package/PLAN-DOCS-AGENTS.md +80 -0
  42. package/README.md +3 -3
  43. package/ai/skills/concorde/SKILL.md +1 -1
  44. package/ai/skills/concorde-get-set-dp/SKILL.md +3 -3
  45. package/ai/skills/concorde-theme/SKILL.md +1 -1
  46. package/build-infos.json +1 -1
  47. package/concorde-core.bundle.js +16 -16
  48. package/concorde-core.es.js +235 -233
  49. package/dist/concorde-core.bundle.js +16 -16
  50. package/dist/concorde-core.es.js +235 -233
  51. package/dist/img/archive/concorde-001-2cv.webp +0 -0
  52. package/dist/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  53. package/dist/img/archive/concorde-red-arrows-2002.webm +0 -0
  54. package/dist/img/archive/credits.json +28 -0
  55. package/docs/.htaccess +75 -0
  56. package/docs/404.html +15 -0
  57. package/docs/404.md +5 -0
  58. package/docs/assets/index-BgG6FFPt.js +11765 -0
  59. package/docs/assets/index-x89XINSG.css +1 -0
  60. package/docs/core/components/functional/date/date.html +211 -0
  61. package/docs/core/components/functional/date/date.md +150 -0
  62. package/docs/core/components/functional/fetch/fetch.html +180 -0
  63. package/docs/core/components/functional/fetch/fetch.md +108 -0
  64. package/docs/core/components/functional/if/if.html +65 -0
  65. package/docs/core/components/functional/if/if.md +34 -0
  66. package/docs/core/components/functional/jsonata/jsonata.html +110 -0
  67. package/docs/core/components/functional/jsonata/jsonata.md +61 -0
  68. package/docs/core/components/functional/list/list.html +198 -0
  69. package/docs/core/components/functional/list/list.md +121 -0
  70. package/docs/core/components/functional/mix/mix.html +78 -0
  71. package/docs/core/components/functional/mix/mix.md +46 -0
  72. package/docs/core/components/functional/queue/queue.html +155 -0
  73. package/docs/core/components/functional/queue/queue.md +51 -0
  74. package/docs/core/components/functional/router/router.html +154 -0
  75. package/docs/core/components/functional/router/router.md +93 -0
  76. package/docs/core/components/functional/sdui/sdui-extension-points.html +127 -0
  77. package/docs/core/components/functional/sdui/sdui-extension-points.md +94 -0
  78. package/docs/core/components/functional/sdui/sdui.html +397 -0
  79. package/docs/core/components/functional/sdui/sdui.md +307 -0
  80. package/docs/core/components/functional/states/states.html +141 -0
  81. package/docs/core/components/functional/states/states.md +112 -0
  82. package/docs/core/components/functional/submit/submit.html +178 -0
  83. package/docs/core/components/functional/submit/submit.md +106 -0
  84. package/docs/{crawl/core → core}/components/functional/subscriber/subscriber.html +6 -5
  85. package/docs/core/components/functional/subscriber/subscriber.md +91 -0
  86. package/docs/core/components/functional/translation/translation.html +60 -0
  87. package/docs/core/components/functional/translation/translation.md +38 -0
  88. package/docs/core/components/functional/value/value.html +81 -0
  89. package/docs/core/components/functional/value/value.md +47 -0
  90. package/docs/core/components/ui/alert/alert.html +201 -0
  91. package/docs/core/components/ui/alert/alert.md +186 -0
  92. package/docs/core/components/ui/alert-messages/alert-messages.html +132 -0
  93. package/docs/core/components/ui/alert-messages/alert-messages.md +85 -0
  94. package/docs/core/components/ui/badge/badge.html +197 -0
  95. package/docs/core/components/ui/badge/badge.md +181 -0
  96. package/docs/core/components/ui/button/button.html +309 -0
  97. package/docs/core/components/ui/button/button.md +216 -0
  98. package/docs/core/components/ui/captcha/captcha.html +80 -0
  99. package/docs/core/components/ui/captcha/captcha.md +56 -0
  100. package/docs/core/components/ui/card/card.html +254 -0
  101. package/docs/core/components/ui/card/card.md +215 -0
  102. package/docs/core/components/ui/divider/divider.html +144 -0
  103. package/docs/core/components/ui/divider/divider.md +126 -0
  104. package/docs/core/components/ui/form/checkbox/checkbox.html +200 -0
  105. package/docs/core/components/ui/form/checkbox/checkbox.md +125 -0
  106. package/docs/core/components/ui/form/fieldset/fieldset.html +238 -0
  107. package/docs/core/components/ui/form/fieldset/fieldset.md +161 -0
  108. package/docs/core/components/ui/form/form-actions/form-actions.html +122 -0
  109. package/docs/core/components/ui/form/form-actions/form-actions.md +98 -0
  110. package/docs/core/components/ui/form/form-layout/form-layout.html +115 -0
  111. package/docs/core/components/ui/form/form-layout/form-layout.md +109 -0
  112. package/docs/core/components/ui/form/input/input.html +235 -0
  113. package/docs/core/components/ui/form/input/input.md +142 -0
  114. package/docs/core/components/ui/form/radio/radio.html +144 -0
  115. package/docs/core/components/ui/form/radio/radio.md +78 -0
  116. package/docs/core/components/ui/form/select/select.html +178 -0
  117. package/docs/core/components/ui/form/select/select.md +86 -0
  118. package/docs/core/components/ui/form/switch/switch.html +146 -0
  119. package/docs/core/components/ui/form/switch/switch.md +80 -0
  120. package/docs/core/components/ui/form/textarea/textarea.html +162 -0
  121. package/docs/core/components/ui/form/textarea/textarea.md +82 -0
  122. package/docs/core/components/ui/group/group.html +113 -0
  123. package/docs/core/components/ui/group/group.md +77 -0
  124. package/docs/core/components/ui/icon/icon.html +223 -0
  125. package/docs/core/components/ui/icon/icon.md +214 -0
  126. package/docs/core/components/ui/image/image.html +194 -0
  127. package/docs/core/components/ui/image/image.md +167 -0
  128. package/docs/core/components/ui/link/link.html +101 -0
  129. package/docs/core/components/ui/link/link.md +81 -0
  130. package/docs/core/components/ui/loader/loader.html +114 -0
  131. package/docs/core/components/ui/loader/loader.md +87 -0
  132. package/docs/{crawl/core → core}/components/ui/menu/menu.html +189 -116
  133. package/docs/core/components/ui/menu/menu.md +370 -0
  134. package/docs/core/components/ui/modal/modal.html +324 -0
  135. package/docs/core/components/ui/modal/modal.md +211 -0
  136. package/docs/core/components/ui/pop/pop.html +250 -0
  137. package/docs/core/components/ui/pop/pop.md +216 -0
  138. package/docs/core/components/ui/progress/progress.html +132 -0
  139. package/docs/core/components/ui/progress/progress.md +109 -0
  140. package/docs/core/components/ui/table/table.html +333 -0
  141. package/docs/core/components/ui/table/table.md +267 -0
  142. package/docs/core/components/ui/theme/theme.html +116 -0
  143. package/docs/core/components/ui/theme/theme.md +97 -0
  144. package/docs/core/components/ui/toast/toast.html +185 -0
  145. package/docs/core/components/ui/toast/toast.md +147 -0
  146. package/docs/core/components/ui/tooltip/tooltip.html +112 -0
  147. package/docs/core/components/ui/tooltip/tooltip.md +89 -0
  148. package/docs/docs/decorators/ancestor-attribute.html +71 -0
  149. package/docs/docs/decorators/ancestor-attribute.md +59 -0
  150. package/docs/docs/decorators/auto-subscribe.html +61 -0
  151. package/docs/docs/decorators/auto-subscribe.md +40 -0
  152. package/docs/docs/decorators/bind.html +86 -0
  153. package/docs/docs/decorators/bind.md +77 -0
  154. package/docs/docs/decorators/get.html +166 -0
  155. package/docs/docs/decorators/get.md +160 -0
  156. package/docs/docs/decorators/handle.html +139 -0
  157. package/docs/docs/decorators/handle.md +119 -0
  158. package/docs/docs/decorators/on-assign.html +72 -0
  159. package/docs/docs/decorators/on-assign.md +63 -0
  160. package/docs/docs/decorators/patch.html +76 -0
  161. package/docs/docs/decorators/patch.md +44 -0
  162. package/docs/docs/decorators/post.html +150 -0
  163. package/docs/docs/decorators/post.md +134 -0
  164. package/docs/docs/decorators/publish.html +74 -0
  165. package/docs/docs/decorators/publish.md +56 -0
  166. package/docs/docs/decorators/put.html +83 -0
  167. package/docs/docs/decorators/put.md +51 -0
  168. package/docs/docs/decorators/subscribe.html +91 -0
  169. package/docs/docs/decorators/subscribe.md +87 -0
  170. package/docs/docs/decorators/wait-for-ancestors.html +82 -0
  171. package/docs/docs/decorators/wait-for-ancestors.md +76 -0
  172. package/docs/docs/directives/sub.html +79 -0
  173. package/docs/docs/directives/sub.md +75 -0
  174. package/docs/docs/directives/t.html +91 -0
  175. package/docs/docs/directives/t.md +73 -0
  176. package/docs/{crawl/docs/_getting-started → docs/getting-started}/ai-agents.html +12 -11
  177. package/{src/docs/_getting-started → docs/docs/getting-started}/ai-agents.md +3 -3
  178. package/docs/docs/getting-started/components.html +27 -0
  179. package/docs/docs/getting-started/components.md +5 -0
  180. package/docs/{crawl/docs/_getting-started → docs/getting-started}/create-a-component.html +11 -14
  181. package/docs/{src/docs/_getting-started → docs/getting-started}/create-a-component.md +3 -6
  182. package/docs/{crawl/docs/_core-concept → docs/getting-started}/dataFlow.html +26 -29
  183. package/docs/{src/docs/_core-concept → docs/getting-started}/dataFlow.md +17 -18
  184. package/docs/docs/getting-started/installation.html +69 -0
  185. package/docs/docs/getting-started/installation.md +36 -0
  186. package/docs/{crawl/docs/_getting-started → docs/getting-started}/my-first-component.html +13 -22
  187. package/docs/{src/docs/_getting-started → docs/getting-started}/my-first-component.md +5 -14
  188. package/docs/docs/getting-started/start.html +47 -0
  189. package/{src/docs/_getting-started → docs/docs/getting-started}/start.md +1 -13
  190. package/docs/docs/getting-started/theming.html +334 -0
  191. package/{src/docs/_getting-started → docs/docs/getting-started}/theming.md +2 -2
  192. package/docs/docs/index.html +99 -0
  193. package/docs/{crawl/docs/_misc → docs/misc}/api-configuration.html +18 -18
  194. package/docs/{src/docs/_misc → docs/misc}/api-configuration.md +10 -12
  195. package/docs/{crawl/docs/_misc → docs/misc}/dataProviderKey.html +12 -11
  196. package/{src/docs/_misc → docs/docs/misc}/dataProviderKey.md +4 -4
  197. package/docs/{crawl/docs/_misc → docs/misc}/docs-mock-api.html +25 -28
  198. package/docs/{src/docs/_misc → docs/misc}/docs-mock-api.md +12 -13
  199. package/docs/{crawl/docs/_misc → docs/misc}/dynamic-path.html +16 -15
  200. package/{src/docs/_misc → docs/docs/misc}/dynamic-path.md +8 -8
  201. package/docs/{crawl/docs/_misc → docs/misc}/endpoint.html +16 -15
  202. package/{src/docs/_misc → docs/docs/misc}/endpoint.md +8 -8
  203. package/docs/{crawl/docs/_misc → docs/misc}/html-integration.html +12 -15
  204. package/docs/{src/docs/_misc → docs/misc}/html-integration.md +4 -5
  205. package/docs/docs-mock-api-sw.js +60 -223
  206. package/docs/docs-mock-api-sw.js.map +4 -4
  207. package/docs/hubs/decorators.html +443 -0
  208. package/docs/hubs/form-components.html +404 -0
  209. package/docs/hubs/remote-data.html +371 -0
  210. package/docs/img/archive/concorde-001-2cv.webp +0 -0
  211. package/docs/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  212. package/docs/img/archive/concorde-red-arrows-2002.webm +0 -0
  213. package/docs/img/archive/credits.json +28 -0
  214. package/docs/img/concorde/plane_01.jpg +0 -0
  215. package/docs/img/concorde/plane_02.jpg +0 -0
  216. package/docs/img/concorde/plane_03.jpg +0 -0
  217. package/docs/img/concorde/plane_04.jpg +0 -0
  218. package/docs/img/concorde/plane_05.jpg +0 -0
  219. package/docs/img/concorde/plane_06.jpg +0 -0
  220. package/docs/img/concorde/plane_07.jpg +0 -0
  221. package/docs/img/concorde/plane_08.jpg +0 -0
  222. package/docs/img/concorde/plane_09.jpg +0 -0
  223. package/docs/img/concorde/plane_10.jpg +0 -0
  224. package/docs/img/concorde/plane_11.jpg +0 -0
  225. package/docs/img/concorde/plane_12.jpg +0 -0
  226. package/docs/img/concorde/plane_13.jpg +0 -0
  227. package/docs/index.html +96 -67
  228. package/docs/index.md +22 -0
  229. package/docs/llms-full.txt +3329 -3295
  230. package/docs/llms.txt +94 -92
  231. package/docs/robots.txt +11 -10
  232. package/docs/sitemap.xml +78 -78
  233. package/docs/src/core/components/functional/date/date.md +91 -231
  234. package/docs/src/core/components/functional/fetch/fetch.md +66 -83
  235. package/docs/src/core/components/functional/if/if.md +28 -3
  236. package/docs/src/core/components/functional/jsonata/jsonata.md +42 -37
  237. package/docs/src/core/components/functional/list/list.md +99 -43
  238. package/docs/src/core/components/functional/mix/mix.md +31 -26
  239. package/docs/src/core/components/functional/queue/queue.md +40 -61
  240. package/docs/src/core/components/functional/router/router.md +64 -65
  241. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  242. package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
  243. package/docs/src/core/components/functional/sdui/example.json +19 -86
  244. package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  245. package/docs/src/core/components/functional/sdui/sdui.md +196 -245
  246. package/docs/src/core/components/functional/states/states.md +86 -61
  247. package/docs/src/core/components/functional/submit/submit.md +64 -72
  248. package/docs/src/core/components/functional/translation/translation.md +38 -0
  249. package/docs/src/core/components/functional/value/value.md +34 -22
  250. package/docs/src/core/components/ui/alert/alert.md +139 -74
  251. package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  252. package/docs/src/core/components/ui/badge/badge.md +137 -83
  253. package/docs/src/core/components/ui/button/button.md +139 -105
  254. package/docs/src/core/components/ui/captcha/captcha.md +50 -6
  255. package/docs/src/core/components/ui/card/card.md +183 -65
  256. package/docs/src/core/components/ui/divider/divider.md +104 -13
  257. package/docs/src/core/components/ui/form/checkbox/checkbox.md +90 -42
  258. package/docs/src/core/components/ui/form/fieldset/fieldset.md +135 -103
  259. package/docs/src/core/components/ui/form/form-actions/form-actions.md +71 -50
  260. package/docs/src/core/components/ui/form/form-layout/form-layout.md +99 -34
  261. package/docs/src/core/components/ui/form/input/input.md +95 -95
  262. package/docs/src/core/components/ui/form/radio/radio.md +55 -34
  263. package/docs/src/core/components/ui/form/select/select.md +60 -45
  264. package/docs/src/core/components/ui/form/switch/switch.md +57 -34
  265. package/docs/src/core/components/ui/form/textarea/textarea.md +55 -38
  266. package/docs/src/core/components/ui/group/group.md +49 -47
  267. package/docs/src/core/components/ui/icon/icon.md +132 -43
  268. package/docs/src/core/components/ui/image/image.md +132 -72
  269. package/docs/src/core/components/ui/link/link.md +46 -8
  270. package/docs/src/core/components/ui/loader/loader.md +55 -23
  271. package/docs/src/core/components/ui/menu/menu.md +155 -114
  272. package/docs/src/core/components/ui/modal/modal.md +154 -62
  273. package/docs/src/core/components/ui/pop/pop.md +185 -65
  274. package/docs/src/core/components/ui/progress/progress.md +76 -30
  275. package/docs/src/core/components/ui/table/table.md +146 -334
  276. package/docs/src/core/components/ui/theme/theme.md +97 -0
  277. package/docs/src/core/components/ui/toast/toast.md +80 -99
  278. package/docs/src/core/components/ui/tooltip/tooltip.md +52 -45
  279. package/docs/src/docs/decorators/ancestor-attribute.md +59 -0
  280. package/docs/src/docs/decorators/auto-subscribe.md +40 -0
  281. package/docs/src/docs/decorators/bind.md +77 -0
  282. package/docs/src/docs/decorators/get.md +160 -0
  283. package/docs/src/docs/decorators/handle.md +119 -0
  284. package/docs/src/docs/decorators/on-assign.md +63 -0
  285. package/docs/src/docs/decorators/patch.md +44 -0
  286. package/docs/src/docs/decorators/post.md +134 -0
  287. package/docs/src/docs/decorators/publish.md +56 -0
  288. package/docs/src/docs/decorators/put.md +51 -0
  289. package/docs/src/docs/decorators/subscribe.md +87 -0
  290. package/docs/src/docs/decorators/wait-for-ancestors.md +76 -0
  291. package/docs/src/docs/directives/sub.md +75 -0
  292. package/docs/src/docs/directives/t.md +73 -0
  293. package/docs/src/docs/{_getting-started → getting-started}/ai-agents.md +3 -3
  294. package/docs/src/docs/getting-started/components.md +5 -0
  295. package/{src/docs/_getting-started → docs/src/docs/getting-started}/create-a-component.md +3 -6
  296. package/{src/docs/_core-concept → docs/src/docs/getting-started}/dataFlow.md +17 -18
  297. package/docs/src/docs/getting-started/installation.md +36 -0
  298. package/{src/docs/_getting-started → docs/src/docs/getting-started}/my-first-component.md +5 -14
  299. package/docs/src/docs/getting-started/start.md +35 -0
  300. package/docs/src/docs/getting-started/theming.md +253 -0
  301. package/{src/docs/_misc → docs/src/docs/misc}/api-configuration.md +10 -12
  302. package/docs/src/docs/{_misc → misc}/dataProviderKey.md +4 -4
  303. package/{src/docs/_misc → docs/src/docs/misc}/docs-mock-api.md +12 -13
  304. package/docs/src/docs/{_misc → misc}/dynamic-path.md +8 -8
  305. package/docs/src/docs/{_misc → misc}/endpoint.md +8 -8
  306. package/{src/docs/_misc → docs/src/docs/misc}/html-integration.md +4 -5
  307. package/docs/src/docs/search/docs-search.json +3729 -2949
  308. package/docs/src/tsconfig.json +176 -5
  309. package/index.html +94 -67
  310. package/package.json +11 -4
  311. package/public/docs-mock-api-sw.js +58 -223
  312. package/public/docs-mock-api-sw.js.map +4 -4
  313. package/public/img/archive/concorde-001-2cv.webp +0 -0
  314. package/public/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  315. package/public/img/archive/concorde-red-arrows-2002.webm +0 -0
  316. package/public/img/archive/credits.json +28 -0
  317. package/public/img/concorde/plane_01.jpg +0 -0
  318. package/public/img/concorde/plane_02.jpg +0 -0
  319. package/public/img/concorde/plane_03.jpg +0 -0
  320. package/public/img/concorde/plane_04.jpg +0 -0
  321. package/public/img/concorde/plane_05.jpg +0 -0
  322. package/public/img/concorde/plane_06.jpg +0 -0
  323. package/public/img/concorde/plane_07.jpg +0 -0
  324. package/public/img/concorde/plane_08.jpg +0 -0
  325. package/public/img/concorde/plane_09.jpg +0 -0
  326. package/public/img/concorde/plane_10.jpg +0 -0
  327. package/public/img/concorde/plane_11.jpg +0 -0
  328. package/public/img/concorde/plane_12.jpg +0 -0
  329. package/public/img/concorde/plane_13.jpg +0 -0
  330. package/public/robots.txt +11 -10
  331. package/scripts/docs-markdown-vite-plugin.ts +37 -0
  332. package/scripts/docs-public-url.mjs +50 -0
  333. package/scripts/docs.htaccess +75 -0
  334. package/scripts/generate-crawl-docs.mjs +207 -116
  335. package/scripts/generate-crawl-docs.test.mjs +124 -0
  336. package/scripts/post-build-docs.js +34 -50
  337. package/scripts/post-build.mjs +0 -0
  338. package/src/core/components/functional/date/date.md +91 -231
  339. package/src/core/components/functional/fetch/fetch.md +66 -83
  340. package/src/core/components/functional/if/if.md +28 -3
  341. package/src/core/components/functional/if/if.ts +0 -0
  342. package/src/core/components/functional/jsonata/jsonata.md +42 -37
  343. package/src/core/components/functional/list/list.demo.ts +0 -0
  344. package/src/core/components/functional/list/list.md +99 -43
  345. package/src/core/components/functional/mix/mix.md +31 -26
  346. package/src/core/components/functional/queue/queue.demo.ts +10 -7
  347. package/src/core/components/functional/queue/queue.md +40 -61
  348. package/src/core/components/functional/router/router.demo.ts +16 -16
  349. package/src/core/components/functional/router/router.md +64 -65
  350. package/src/core/components/functional/router/router.ts +0 -0
  351. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
  352. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  353. package/src/core/components/functional/sdui/component-catalog.json +1 -1
  354. package/src/core/components/functional/sdui/example.json +19 -86
  355. package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
  356. package/src/core/components/functional/sdui/sdui.md +187 -358
  357. package/src/core/components/functional/sdui/types.ts +0 -0
  358. package/src/core/components/functional/states/states.demo.ts +21 -22
  359. package/src/core/components/functional/states/states.md +86 -61
  360. package/src/core/components/functional/states/states.ts +1 -1
  361. package/src/core/components/functional/submit/submit.md +64 -72
  362. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  363. package/src/core/components/functional/translation/translation.md +38 -0
  364. package/src/core/components/functional/value/value.md +34 -22
  365. package/src/core/components/functional/value/value.ts +0 -0
  366. package/src/core/components/ui/_css/size.ts +0 -0
  367. package/src/core/components/ui/alert/alert.md +48 -58
  368. package/src/core/components/ui/badge/badge.md +27 -34
  369. package/src/core/components/ui/button/button.md +139 -106
  370. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  371. package/src/core/components/ui/captcha/captcha.md +17 -32
  372. package/src/core/components/ui/card/card.md +6 -6
  373. package/src/core/components/ui/divider/divider.md +8 -11
  374. package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
  375. package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
  376. package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
  377. package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
  378. package/src/core/components/ui/form/input/input.md +95 -95
  379. package/src/core/components/ui/form/radio/radio.md +55 -34
  380. package/src/core/components/ui/form/select/select.md +60 -45
  381. package/src/core/components/ui/form/switch/switch.md +57 -34
  382. package/src/core/components/ui/form/textarea/textarea.md +55 -38
  383. package/src/core/components/ui/group/group.md +35 -33
  384. package/src/core/components/ui/icon/icon.md +4 -4
  385. package/src/core/components/ui/image/image.md +41 -107
  386. package/src/core/components/ui/link/link.md +6 -6
  387. package/src/core/components/ui/loader/loader.md +30 -55
  388. package/src/core/components/ui/menu/menu.md +27 -27
  389. package/src/core/components/ui/modal/modal.md +72 -96
  390. package/src/core/components/ui/modal/modal.ts +14 -11
  391. package/src/core/components/ui/pop/pop.md +80 -158
  392. package/src/core/components/ui/progress/progress.md +2 -2
  393. package/src/core/components/ui/table/table.md +91 -255
  394. package/src/core/components/ui/theme/theme.md +11 -36
  395. package/src/core/components/ui/toast/toast.md +48 -117
  396. package/src/core/components/ui/tooltip/tooltip.md +27 -62
  397. package/src/core/mixins/Subscriber.ts +0 -0
  398. package/src/core/utils/DataBindObserver.ts +0 -0
  399. package/src/core/utils/LocationHandler.spec.ts +80 -0
  400. package/src/core/utils/LocationHandler.ts +5 -9
  401. package/src/core/utils/Objects.ts +0 -0
  402. package/src/core/utils/route.ts +0 -0
  403. package/src/docs/code.ts +88 -75
  404. package/src/docs/components/docs-demo-sources.ts +70 -147
  405. package/src/docs/components/docs-lit-demo.ts +20 -40
  406. package/src/docs/components/docs-source-link.ts +0 -82
  407. package/src/docs/decorators/ancestor-attribute.md +59 -0
  408. package/src/docs/decorators/auto-subscribe.md +40 -0
  409. package/src/docs/decorators/bind.md +77 -0
  410. package/src/docs/decorators/get.md +160 -0
  411. package/src/docs/decorators/handle.md +119 -0
  412. package/src/docs/decorators/on-assign.md +63 -0
  413. package/src/docs/decorators/patch.md +44 -0
  414. package/src/docs/decorators/post.md +134 -0
  415. package/src/docs/decorators/publish.md +56 -0
  416. package/src/docs/decorators/put.md +51 -0
  417. package/src/docs/decorators/subscribe.md +87 -0
  418. package/src/docs/decorators/wait-for-ancestors.md +76 -0
  419. package/src/docs/directives/sub.md +75 -0
  420. package/src/docs/directives/t.md +73 -0
  421. package/src/docs/docs-location.spec.ts +46 -0
  422. package/src/docs/docs-location.ts +123 -32
  423. package/src/docs/docs.ts +6 -2
  424. package/src/docs/example/decorators-demo-bind-demos.ts +81 -116
  425. package/src/docs/example/decorators-demo-geo.ts +30 -19
  426. package/src/docs/example/decorators-demo-post.ts +88 -186
  427. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
  428. package/src/docs/example/decorators-demo.ts +85 -98
  429. package/src/docs/example/docs-api-config-demos.ts +19 -20
  430. package/src/docs/example/docs-boarding-pass-demo.ts +134 -0
  431. package/src/docs/example/docs-flight-demos.ts +147 -0
  432. package/src/docs/example/docs-jsonata-demos.ts +52 -52
  433. package/src/docs/example/docs-list-demos.ts +43 -123
  434. package/src/docs/example/docs-provider-keys.ts +33 -28
  435. package/src/docs/example/docs-queue-demos.ts +37 -77
  436. package/src/docs/example/docs-router-demos.ts +20 -25
  437. package/src/docs/example/docs-submit-demos.ts +48 -48
  438. package/src/docs/example/docs-toggle-demos.ts +4 -3
  439. package/src/docs/example/users.ts +0 -0
  440. package/src/docs/getting-started/ai-agents.md +76 -0
  441. package/src/docs/getting-started/components.md +5 -0
  442. package/src/docs/getting-started/create-a-component.md +136 -0
  443. package/src/docs/getting-started/dataFlow.md +87 -0
  444. package/src/docs/getting-started/installation.md +36 -0
  445. package/src/docs/getting-started/my-first-component.md +227 -0
  446. package/src/docs/getting-started/start.md +35 -0
  447. package/src/docs/getting-started/theming.md +253 -0
  448. package/src/docs/header/header.ts +240 -71
  449. package/src/docs/home/catalog.ts +44 -0
  450. package/src/docs/home/home.ts +520 -0
  451. package/src/docs/home/mach-stage.ts +389 -0
  452. package/src/docs/layout.ts +12 -11
  453. package/src/docs/misc/api-configuration.md +79 -0
  454. package/src/docs/misc/dataProviderKey.md +168 -0
  455. package/src/docs/misc/docs-mock-api.md +62 -0
  456. package/src/docs/misc/dynamic-path.md +71 -0
  457. package/src/docs/misc/endpoint.md +45 -0
  458. package/src/docs/misc/html-integration.md +14 -0
  459. package/src/docs/mock-api/api-config-mock.ts +5 -0
  460. package/src/docs/mock-api/fixtures.ts +0 -278
  461. package/src/docs/mock-api/flights.ts +89 -0
  462. package/src/docs/mock-api/router.ts +3 -4
  463. package/src/docs/mock-api/urls.ts +1 -2
  464. package/src/docs/navigation/components-index.ts +56 -0
  465. package/src/docs/navigation/navigation.ts +219 -232
  466. package/src/docs/navigation/pager.ts +67 -0
  467. package/src/docs/navigation/toc.ts +101 -0
  468. package/src/docs/search/docs-search.json +2419 -4374
  469. package/src/docs/search/markdown-renderer.ts +33 -7
  470. package/src/docs/search/page.ts +9 -6
  471. package/src/docs/search/search.ts +154 -122
  472. package/src/docs/shiki/index.ts +109 -0
  473. package/src/docs/tailwind/css/base/scrollbar.css +22 -0
  474. package/src/docs/tailwind/css/base/theme.css +96 -0
  475. package/src/docs/tailwind/css/base/typography.css +4 -0
  476. package/src/docs/tailwind/css/docs/boarding-pass.css +65 -0
  477. package/src/docs/tailwind/css/docs/content.css +32 -0
  478. package/src/docs/tailwind/css/docs/page.css +10 -0
  479. package/src/docs/tailwind/css/docs.css +9 -0
  480. package/src/docs/tailwind/css/home/hero.css +210 -0
  481. package/src/docs/tailwind/css/home/motion.css +84 -0
  482. package/src/docs/tailwind/css/home/sections.css +416 -0
  483. package/src/docs/tailwind/css/tailwind.css +7 -185
  484. package/src/tsconfig.json +23 -2
  485. package/src/tsconfig.tsbuildinfo +1 -1
  486. package/tailwind.config.js +8 -4
  487. package/vite.config.mts +11 -2
  488. package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
  489. package/.github/workflows/ci.yml +0 -21
  490. package/.github-export-ignore +0 -30
  491. package/CONTRIBUTING.md +0 -59
  492. package/DEV.md +0 -54
  493. package/LICENSE +0 -21
  494. package/OPEN_SOURCE_CHECKPOINT.md +0 -133
  495. package/concorde-3d.bundle.js +0 -3960
  496. package/concorde-3d.es.js +0 -33433
  497. package/concorde-hugging-face-infer.bundle.js +0 -32
  498. package/concorde-hugging-face-infer.es.js +0 -2952
  499. package/concorde-interactive.bundle.js +0 -1157
  500. package/concorde-interactive.es.js +0 -10734
  501. package/concorde-shader.bundle.js +0 -116
  502. package/concorde-shader.es.js +0 -8353
  503. package/concorde-webgpu.bundle.js +0 -307
  504. package/concorde-webgpu.es.js +0 -8627
  505. package/docs/assets/index-D8MVWqY6.js +0 -12251
  506. package/docs/assets/index-DiD0qYvE.css +0 -1
  507. package/docs/crawl/core/components/functional/date/date.html +0 -190
  508. package/docs/crawl/core/components/functional/fetch/fetch.html +0 -109
  509. package/docs/crawl/core/components/functional/if/if.html +0 -27
  510. package/docs/crawl/core/components/functional/jsonata/jsonata.html +0 -79
  511. package/docs/crawl/core/components/functional/list/list.html +0 -70
  512. package/docs/crawl/core/components/functional/mix/mix.html +0 -45
  513. package/docs/crawl/core/components/functional/queue/queue.html +0 -96
  514. package/docs/crawl/core/components/functional/router/router.html +0 -106
  515. package/docs/crawl/core/components/functional/sdui/sdui.html +0 -269
  516. package/docs/crawl/core/components/functional/states/states.html +0 -66
  517. package/docs/crawl/core/components/functional/submit/submit.html +0 -160
  518. package/docs/crawl/core/components/functional/value/value.html +0 -51
  519. package/docs/crawl/core/components/ui/alert/alert.html +0 -110
  520. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +0 -23
  521. package/docs/crawl/core/components/ui/badge/badge.html +0 -119
  522. package/docs/crawl/core/components/ui/button/button.html +0 -149
  523. package/docs/crawl/core/components/ui/captcha/captcha.html +0 -30
  524. package/docs/crawl/core/components/ui/card/card.html +0 -99
  525. package/docs/crawl/core/components/ui/divider/divider.html +0 -58
  526. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +0 -73
  527. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +0 -135
  528. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +0 -79
  529. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +0 -62
  530. package/docs/crawl/core/components/ui/form/input/input.html +0 -109
  531. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +0 -38
  532. package/docs/crawl/core/components/ui/form/radio/radio.html +0 -56
  533. package/docs/crawl/core/components/ui/form/select/select.html +0 -73
  534. package/docs/crawl/core/components/ui/form/switch/switch.html +0 -56
  535. package/docs/crawl/core/components/ui/form/textarea/textarea.html +0 -59
  536. package/docs/crawl/core/components/ui/group/group.html +0 -82
  537. package/docs/crawl/core/components/ui/icon/icon.html +0 -133
  538. package/docs/crawl/core/components/ui/image/image.html +0 -110
  539. package/docs/crawl/core/components/ui/link/link.html +0 -42
  540. package/docs/crawl/core/components/ui/loader/loader.html +0 -50
  541. package/docs/crawl/core/components/ui/modal/modal.html +0 -117
  542. package/docs/crawl/core/components/ui/pop/pop.html +0 -102
  543. package/docs/crawl/core/components/ui/progress/progress.html +0 -58
  544. package/docs/crawl/core/components/ui/table/table.html +0 -413
  545. package/docs/crawl/core/components/ui/toast/toast.html +0 -122
  546. package/docs/crawl/core/components/ui/tooltip/tooltip.html +0 -79
  547. package/docs/crawl/docs/_core-concept/overview.html +0 -66
  548. package/docs/crawl/docs/_core-concept/subscriber.html +0 -75
  549. package/docs/crawl/docs/_decorators/ancestor-attribute.html +0 -116
  550. package/docs/crawl/docs/_decorators/auto-subscribe.html +0 -202
  551. package/docs/crawl/docs/_decorators/bind.html +0 -141
  552. package/docs/crawl/docs/_decorators/get.html +0 -149
  553. package/docs/crawl/docs/_decorators/handle.html +0 -165
  554. package/docs/crawl/docs/_decorators/on-assign.html +0 -355
  555. package/docs/crawl/docs/_decorators/patch.html +0 -78
  556. package/docs/crawl/docs/_decorators/post.html +0 -139
  557. package/docs/crawl/docs/_decorators/publish.html +0 -61
  558. package/docs/crawl/docs/_decorators/put.html +0 -78
  559. package/docs/crawl/docs/_decorators/subscribe.html +0 -109
  560. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +0 -137
  561. package/docs/crawl/docs/_directives/sub.html +0 -93
  562. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +0 -100
  563. package/docs/crawl/docs/_getting-started/concorde-outside.html +0 -58
  564. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +0 -110
  565. package/docs/crawl/docs/_getting-started/pubsub.html +0 -62
  566. package/docs/crawl/docs/_getting-started/start.html +0 -76
  567. package/docs/crawl/docs/_getting-started/theming.html +0 -85
  568. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +0 -138
  569. package/docs/crawl/hubs/decorators.html +0 -547
  570. package/docs/crawl/hubs/form-components.html +0 -359
  571. package/docs/crawl/hubs/remote-data.html +0 -452
  572. package/docs/crawl/index.html +0 -101
  573. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
  574. package/docs/src/docs/_core-concept/overview.md +0 -57
  575. package/docs/src/docs/_core-concept/subscriber.md +0 -75
  576. package/docs/src/docs/_decorators/ancestor-attribute.md +0 -127
  577. package/docs/src/docs/_decorators/auto-subscribe.md +0 -202
  578. package/docs/src/docs/_decorators/bind.md +0 -167
  579. package/docs/src/docs/_decorators/get.md +0 -162
  580. package/docs/src/docs/_decorators/handle.md +0 -175
  581. package/docs/src/docs/_decorators/on-assign.md +0 -390
  582. package/docs/src/docs/_decorators/patch.md +0 -70
  583. package/docs/src/docs/_decorators/post.md +0 -146
  584. package/docs/src/docs/_decorators/publish.md +0 -55
  585. package/docs/src/docs/_decorators/put.md +0 -70
  586. package/docs/src/docs/_decorators/subscribe.md +0 -100
  587. package/docs/src/docs/_decorators/wait-for-ancestors.md +0 -163
  588. package/docs/src/docs/_directives/sub.md +0 -91
  589. package/docs/src/docs/_getting-started/concorde-manual-install.md +0 -133
  590. package/docs/src/docs/_getting-started/concorde-outside.md +0 -33
  591. package/docs/src/docs/_getting-started/my-first-subscriber.md +0 -120
  592. package/docs/src/docs/_getting-started/pubsub.md +0 -37
  593. package/docs/src/docs/_getting-started/start.md +0 -47
  594. package/docs/src/docs/_getting-started/theming.md +0 -91
  595. package/docs/src/docs/_misc/formelement-subscriber-removal.md +0 -115
  596. package/docs/src/tsconfig.declarations.json +0 -22
  597. package/docs/src/tsconfig.emit.json +0 -23
  598. package/gitlab/job_github_mirror.sh +0 -39
  599. package/scripts/github-export.mjs +0 -150
  600. package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
  601. package/src/css.d.ts +0 -19
  602. package/src/docs/_core-concept/overview.md +0 -57
  603. package/src/docs/_core-concept/subscriber.md +0 -75
  604. package/src/docs/_decorators/ancestor-attribute.md +0 -128
  605. package/src/docs/_decorators/auto-subscribe.md +0 -202
  606. package/src/docs/_decorators/bind.md +0 -167
  607. package/src/docs/_decorators/get.md +0 -162
  608. package/src/docs/_decorators/handle.md +0 -175
  609. package/src/docs/_decorators/on-assign.md +0 -390
  610. package/src/docs/_decorators/patch.md +0 -70
  611. package/src/docs/_decorators/post.md +0 -146
  612. package/src/docs/_decorators/publish.md +0 -55
  613. package/src/docs/_decorators/put.md +0 -70
  614. package/src/docs/_decorators/subscribe.md +0 -100
  615. package/src/docs/_decorators/wait-for-ancestors.md +0 -163
  616. package/src/docs/_directives/sub.md +0 -91
  617. package/src/docs/_getting-started/concorde-manual-install.md +0 -133
  618. package/src/docs/_getting-started/concorde-outside.md +0 -33
  619. package/src/docs/_getting-started/my-first-subscriber.md +0 -120
  620. package/src/docs/_getting-started/pubsub.md +0 -37
  621. package/src/docs/_misc/formelement-subscriber-removal.md +0 -115
  622. package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
  623. package/src/docs/example/docs-joke-demos.ts +0 -297
  624. package/src/docs/prism/index.ts +0 -6
  625. package/src/docs/prism/prism.css +0 -158
  626. package/src/docs/prism/prism.js +0 -1022
  627. package/src/tsconfig.declarations.json +0 -22
  628. package/src/tsconfig.emit.json +0 -23
@@ -0,0 +1,134 @@
1
+ # @post
2
+
3
+ Sends the value of a publisher as the body of a `POST` request and stores the response in an `ApiResult<T>` property. Pass an [Endpoint](/docs/misc/endpoint) and a [DataProviderKey](/docs/misc/dataProviderKey) for the body; the request runs on connect and again whenever the body changes. [@put](/docs/decorators/put) and [@patch](/docs/decorators/patch) work the same way.
4
+
5
+ ## Import
6
+
7
+ <sonic-code language="typescript">
8
+ <template>
9
+ import { post, type ApiResult } from "@supersoniks/concorde/decorators";
10
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
11
+ import { Endpoint } from "@supersoniks/concorde/utils/endpoint";
12
+
13
+ type SignUp = { email: string; password: string };
14
+ type CrewMember = { id: number; email: string };
15
+
16
+ const signUpKey = new DataProviderKey&lt;SignUp&gt;("crewSignUp");
17
+
18
+ @post(new Endpoint&lt;CrewMember&gt;("api/register"), signUpKey)
19
+ @state()
20
+ payload?: ApiResult&lt;CrewMember&gt;;
21
+ </template>
22
+ </sonic-code>
23
+
24
+ ## Basic usage
25
+
26
+ The property is `undefined` until a response arrives, then holds `request` · `response` · the typed `result`. Each body mutation sends a new request; mutations in the same frame are coalesced into one. The demo posts to the local mock `POST /docs-mock-api/api/register`.
27
+
28
+ <sonic-code>
29
+ <template>
30
+ <docs-demo-sources for="demo-api-post"></docs-demo-sources>
31
+ <demo-api-post></demo-api-post>
32
+ </template>
33
+ </sonic-code>
34
+
35
+ ## Method form
36
+
37
+ On a method, the decorator calls it with the full `ApiResult<T>` after each request instead of assigning a property.
38
+
39
+ <sonic-code>
40
+ <template>
41
+ <docs-demo-sources for="demo-api-post-method"></docs-demo-sources>
42
+ <demo-api-post-method></demo-api-post-method>
43
+ </template>
44
+ </sonic-code>
45
+
46
+ ## Sending again
47
+
48
+ Keep the decorator in a constant to call `send(component)`. It reads the current body and returns a `Promise<ApiResult<T> | undefined>` resolved once the request completes. Use it for "Save" or "Retry" buttons.
49
+
50
+ <sonic-code language="typescript">
51
+ <template>
52
+ const signUp = post(new Endpoint&lt;CrewMember&gt;("api/register"), signUpKey);
53
+
54
+ @signUp
55
+ @state()
56
+ payload?: ApiResult&lt;CrewMember&gt;;
57
+
58
+ async retry() {
59
+ const payload = await signUp.send(this);
60
+ console.log(payload?.result?.id);
61
+ }
62
+ </template>
63
+ </sonic-code>
64
+
65
+ The `send` method decorator does the same around a method. It runs after the method by default (waiting for a returned Promise); `{ when: "before" }` sends first.
66
+
67
+ <sonic-code language="typescript">
68
+ <template>
69
+ import { send } from "@supersoniks/concorde/decorators";
70
+
71
+ @send(signUp)
72
+ async confirmCheckIn() {
73
+ // Validate the check-in form, then the POST is sent.
74
+ }
75
+ </template>
76
+ </sonic-code>
77
+
78
+ ## Manual trigger
79
+
80
+ Set `autoPostOnBodyMutation: false` when the body is edited field by field (a check-in form) and the request must only go out on `send()` or `triggerKey`. A `triggerKey` publisher lets another component resend: calling `invalidate()` on it sends the current body.
81
+
82
+ <sonic-code language="typescript">
83
+ <template>
84
+ const submitKey = new DataProviderKey&lt;number&gt;("checkInSubmit");
85
+
86
+ @post(checkInEndpoint, checkInKey, {
87
+ autoPostOnBodyMutation: false,
88
+ triggerKey: submitKey,
89
+ })
90
+ @state()
91
+ payload?: ApiResult&lt;CheckIn&gt;;
92
+
93
+ // Anywhere: dp(submitKey).invalidate();
94
+ </template>
95
+ </sonic-code>
96
+
97
+ By default (`skipIfBodyMissing: true`) nothing is sent while the body is `null` or `undefined`. `refetchEveryMs` repeats the request at a fixed interval after each response; use it only when repeating the operation is safe.
98
+
99
+ ## API configuration
100
+
101
+ Without a configuration key, `serviceURL` and credentials come from the HTML scope, as with [@get](/docs/decorators/get). Pass a `DataProviderKey<APIConfiguration>` as third argument to read them from a publisher; options then move to the fourth argument. See [API configuration](/docs/misc/api-configuration).
102
+
103
+ <sonic-code language="typescript">
104
+ <template>
105
+ @post(signUpEndpoint, signUpKey, apiConfigurationKey, { skipIfBodyMissing: false })
106
+ </template>
107
+ </sonic-code>
108
+
109
+ ## Dynamic path
110
+
111
+ Placeholders in the endpoint (`${flight}`) are read from the host component; changing the property sends the same body to the new URL. See [Dynamic paths](/docs/misc/dynamic-path).
112
+
113
+ <sonic-code>
114
+ <template>
115
+ <docs-demo-sources for="demo-api-post-dynamic"></docs-demo-sources>
116
+ <demo-api-post-dynamic></demo-api-post-dynamic>
117
+ </template>
118
+ </sonic-code>
119
+
120
+ ## API reference
121
+
122
+ `post(endpoint, bodyKey, configurationKey?, options?)` returns a decorator for a property or a method, with a `send(component)` method.
123
+
124
+ | Argument | Type | Description |
125
+ |----------|------|-------------|
126
+ | `endpoint` | `Endpoint<T>` | Path and response type. Supports `${prop}` placeholders |
127
+ | `bodyKey` | `DataProviderKey<B>` | Publisher read as request body |
128
+ | `configurationKey` | `DataProviderKey<APIConfiguration>` (optional) | API configuration publisher. Default: HTML scope |
129
+ | `options.autoPostOnBodyMutation` | `boolean` (default `true`) | Send on connect and after each body mutation |
130
+ | `options.skipIfBodyMissing` | `boolean` (default `true`) | Skip while the body is `null` or `undefined` |
131
+ | `options.triggerKey` | `DataProviderKey<unknown>` | Publisher whose `invalidate()` resends |
132
+ | `options.refetchEveryMs` | `number` (default `0`, off) | Resend interval in ms after each response |
133
+ | `options.skipEmptyPlaceholder` | `boolean` (default `false`) | Treat a placeholder resolved to `""` as not ready |
134
+ | `send(handle, { when })` | `"after"` (default) or `"before"` | Method decorator sending after or before the method |
@@ -0,0 +1,56 @@
1
+ # @publish
2
+
3
+ `@publish(key)` writes a component property to one path of the store: every assignment to the property is published there. It never reads back from the store; it is the inverse of [@subscribe](/docs/decorators/subscribe). See [Data flow](/docs/getting-started/dataFlow) for the overall model.
4
+
5
+ ## Import
6
+
7
+ <sonic-code language="typescript">
8
+ <template>
9
+ import { publish } from "@supersoniks/concorde/decorators";
10
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
11
+
12
+ type CheckIn = { passenger: string; seat: string };
13
+ const checkInKey = new DataProviderKey&lt;CheckIn&gt;("checkIn");
14
+
15
+ @publish(checkInKey.passenger)
16
+ @state()
17
+ passenger = "Ada Lindqvist";
18
+ </template>
19
+ </sonic-code>
20
+
21
+ ## Basic usage
22
+
23
+ Each assignment calls `set()` on the publisher at the [DataProviderKey](/docs/misc/dataProviderKey) path. **On connect, a defined property value is published immediately**, so the initializer overwrites what the store held. Leave the property `undefined` to keep the store value. To read and write the same path, use [@bind](/docs/decorators/bind) with `reflect: true`.
24
+
25
+ The check-in form below publishes `passenger` and `seat`; the boarding pass reads them back with [sub()](/docs/directives/sub).
26
+
27
+ <sonic-code>
28
+ <template>
29
+ <docs-demo-sources for="demo-publish"></docs-demo-sources>
30
+ <demo-publish></demo-publish>
31
+ </template>
32
+ </sonic-code>
33
+
34
+ ## Dynamic path
35
+
36
+ `${prop}` placeholders resolve from properties of the same component. When a placeholder changes, the property is published to the new path. While it is `null` or `undefined`, nothing is published. Rules and `skipEmptyPlaceholder`: [Dynamic paths](/docs/misc/dynamic-path).
37
+
38
+ <sonic-code language="typescript">
39
+ <template>
40
+ @property({ type: Number }) seatIndex = 0;
41
+
42
+ @publish(
43
+ new DataProviderKey&lt;string, { seatIndex: number }&gt;("onBoard.${seatIndex}.seat"),
44
+ { skipEmptyPlaceholder: true },
45
+ )
46
+ @state()
47
+ seat = "1A";
48
+ </template>
49
+ </sonic-code>
50
+
51
+ ## API reference
52
+
53
+ | Argument | Type | Description |
54
+ |----------|------|-------------|
55
+ | `key` | `DataProviderKey<T, U>` | Path to write. `U` lists the host properties used by `${…}` placeholders |
56
+ | `options.skipEmptyPlaceholder` | `boolean` (default `false`) | Treat a placeholder resolved to `""` as not ready |
@@ -0,0 +1,51 @@
1
+ # @put
2
+
3
+ Sends the value of a publisher as the body of a `PUT` request, to replace a resource, and stores the response in an `ApiResult<T>` property. It takes the same arguments, options and `send(component)` handle as [@post](/docs/decorators/post); only the HTTP method differs.
4
+
5
+ ## Import
6
+
7
+ <sonic-code language="typescript">
8
+ <template>
9
+ import { put, type ApiResult } from "@supersoniks/concorde/decorators";
10
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
11
+ import { Endpoint } from "@supersoniks/concorde/utils/endpoint";
12
+ </template>
13
+ </sonic-code>
14
+
15
+ ## Basic usage
16
+
17
+ The full passenger record is sent on connect and after each body mutation. Placeholders such as `${passengerId}` are resolved on the host component.
18
+
19
+ <sonic-code language="typescript">
20
+ <template>
21
+ type Passenger = { name: string; flight: string; seat: string };
22
+
23
+ const passengerKey = new DataProviderKey&lt;Passenger&gt;("passengerForm");
24
+ const savePassenger = put(
25
+ new Endpoint&lt;Passenger, { passengerId: string }&gt;("passengers/${passengerId}"),
26
+ passengerKey,
27
+ { autoPostOnBodyMutation: false },
28
+ );
29
+
30
+ @property() passengerId = "ada-lindqvist";
31
+
32
+ @savePassenger
33
+ @state()
34
+ payload?: ApiResult&lt;Passenger&gt;;
35
+
36
+ async save() {
37
+ await savePassenger.send(this);
38
+ }
39
+ </template>
40
+ </sonic-code>
41
+
42
+ Triggers, the `send` method decorator and every option are described on [@post](/docs/decorators/post).
43
+
44
+ ## API reference
45
+
46
+ | Argument | Type | Description |
47
+ |----------|------|-------------|
48
+ | `endpoint` | `Endpoint<T>` | Resource path and response type |
49
+ | `bodyKey` | `DataProviderKey<B>` | Publisher read as the full replacement body |
50
+ | `configurationKey` | `DataProviderKey<APIConfiguration>` (optional) | API configuration publisher. Default: HTML scope |
51
+ | `options` | `PutOptions` | Same as [@post options](/docs/decorators/post) |
@@ -0,0 +1,87 @@
1
+ # @subscribe
2
+
3
+ `@subscribe(key)` keeps a component property in sync with one path of the store: when a publisher assigns that path, the property updates and the component re-renders. It is read-only; use [@publish](/docs/decorators/publish) to write and [sub()](/docs/directives/sub) to read inside a template. See [Data flow](/docs/getting-started/dataFlow) for the overall model.
4
+
5
+ ## Import
6
+
7
+ <sonic-code language="typescript">
8
+ <template>
9
+ import { subscribe } from "@supersoniks/concorde/decorators";
10
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
11
+
12
+ type Cockpit = { altitude: number };
13
+ const cockpitKey = new DataProviderKey&lt;Cockpit&gt;("cockpit");
14
+
15
+ @subscribe(cockpitKey.altitude)
16
+ @state()
17
+ altitude = 0;
18
+ </template>
19
+ </sonic-code>
20
+
21
+ ## Static path
22
+
23
+ The key is a [DataProviderKey](/docs/misc/dataProviderKey): the property type must match `T` at that path. Add `@state()` so Lit re-renders. Until the publisher holds a value, the property keeps its initializer.
24
+
25
+ <sonic-code language="typescript">
26
+ <template>
27
+ type Flight = { code: string; gate: string; status: string };
28
+ const flightKey = new DataProviderKey&lt;Flight&gt;("flight");
29
+
30
+ @subscribe(flightKey)
31
+ @state()
32
+ flight: Flight | null = null;
33
+ </template>
34
+ </sonic-code>
35
+
36
+ ## Dynamic path
37
+
38
+ `${prop}` placeholders resolve from properties of the same component. Declare them in the key's second generic so TypeScript requires them on the host. When `seatIndex` changes, the path is resolved again and `person` refreshes; while the placeholder is `null` or `undefined`, the subscription is inactive. Resolution rules: [Dynamic paths](/docs/misc/dynamic-path).
39
+
40
+ <sonic-code language="typescript">
41
+ <template>
42
+ type OnBoard = { name: string; role: string; seat: string };
43
+ const personKey = new DataProviderKey&lt;OnBoard, { seatIndex: number }&gt;(
44
+ "demoOnBoard.${seatIndex}",
45
+ );
46
+
47
+ @property({ type: Number }) seatIndex = 0;
48
+
49
+ @subscribe(personKey)
50
+ @state()
51
+ person: OnBoard | null = null;
52
+ </template>
53
+ </sonic-code>
54
+
55
+ <sonic-code>
56
+ <template>
57
+ <docs-demo-sources for="demo-subscribe-dynamic"></docs-demo-sources>
58
+ <demo-subscribe-dynamic></demo-subscribe-dynamic>
59
+ </template>
60
+ </sonic-code>
61
+
62
+ ## Ancestor scope
63
+
64
+ Inside a list row or a `dataProvider` wrapper, read the path from the closest ancestor with [@ancestorAttribute](/docs/decorators/ancestor-attribute), then use it as the placeholder.
65
+
66
+ <sonic-code language="typescript">
67
+ <template>
68
+ const rowKey = new DataProviderKey&lt;OnBoard, { dataProvider: string | null }&gt;(
69
+ "${dataProvider}",
70
+ );
71
+
72
+ @ancestorAttribute("dataProvider")
73
+ dataProvider: string | null = null;
74
+
75
+ @subscribe(rowKey)
76
+ @state()
77
+ person: OnBoard | null = null;
78
+ </template>
79
+ </sonic-code>
80
+
81
+ ## API reference
82
+
83
+ | Argument | Type | Description |
84
+ |----------|------|-------------|
85
+ | `key` | `DataProviderKey<T, U>` | Path to read. `U` lists the host properties used by `${…}` placeholders |
86
+
87
+ The decorated property is typed `T` (optionally `| null` or `| undefined`). The subscription starts when the component connects and stops when it disconnects.
@@ -0,0 +1,76 @@
1
+ # @awaitConnectedAncestors
2
+
3
+ Delays a component's `connectedCallback` until its matching ancestors are defined and connected, so context they set up (a `dataProvider`, a publisher, a fetched payload) is ready when the child starts. Pair it with `@dispatchConnectedEvent` on the ancestors, which signals readiness.
4
+
5
+ ## Import
6
+
7
+ <sonic-code language="typescript">
8
+ <template>
9
+ import {
10
+ awaitConnectedAncestors,
11
+ dispatchConnectedEvent,
12
+ } from "@supersoniks/concorde/decorators";
13
+
14
+ @customElement("flight-scope")
15
+ @dispatchConnectedEvent()
16
+ export class FlightScope extends LitElement {}
17
+
18
+ @customElement("gate-panel")
19
+ @awaitConnectedAncestors("flight-scope")
20
+ export class GatePanel extends LitElement {}
21
+ </template>
22
+ </sonic-code>
23
+
24
+ ## Wait for an ancestor
25
+
26
+ Arguments are CSS selectors tested with `element.matches()` on each ancestor, across shadow roots. Here the parent element is not defined yet: the child stays uninitialized until you register it.
27
+
28
+ <sonic-code>
29
+ <template>
30
+ <docs-demo-sources for="demo-wait-ancestors-section"></docs-demo-sources>
31
+ <demo-wait-ancestors-section></demo-wait-ancestors-section>
32
+ </template>
33
+ </sonic-code>
34
+
35
+ ## Several ancestors
36
+
37
+ With several selectors, the child waits for every matching ancestor. Register both to initialize it, in any order.
38
+
39
+ <sonic-code>
40
+ <template>
41
+ <docs-demo-sources for="demo-wait-ancestors-multi-section"></docs-demo-sources>
42
+ <demo-wait-ancestors-multi-section></demo-wait-ancestors-multi-section>
43
+ </template>
44
+ </sonic-code>
45
+
46
+ ## Ancestor already connected
47
+
48
+ When the ancestor is already connected, or no ancestor matches, the child initializes immediately.
49
+
50
+ <sonic-code>
51
+ <template>
52
+ <docs-demo-sources for="demo-wait-ancestors-ready-section"></docs-demo-sources>
53
+ <demo-wait-ancestors-ready-section></demo-wait-ancestors-ready-section>
54
+ </template>
55
+ </sonic-code>
56
+
57
+ ## Signal readiness
58
+
59
+ `@dispatchConnectedEvent()` dispatches a bubbling `sonic-connected` event (exported as `CONNECTED`) at the end of the ancestor's `connectedCallback`. You can listen to it anywhere:
60
+
61
+ <sonic-code language="typescript">
62
+ <template>
63
+ import { CONNECTED } from "@supersoniks/concorde/decorators";
64
+
65
+ document.addEventListener(CONNECTED, (e) => console.log("ready:", e.target));
66
+ </template>
67
+ </sonic-code>
68
+
69
+ Elements without a hyphen in their tag name count as connected. A custom element ancestor that never dispatches the event releases the child after a **5 second** timeout, so decorate the ancestors you wait for.
70
+
71
+ ## API reference
72
+
73
+ | Decorator | Argument | Description |
74
+ |-----------|----------|-------------|
75
+ | `@awaitConnectedAncestors` | `...selectors: string[]` | Class decorator. CSS selectors of the ancestors to wait for; with no selector, the class is left unchanged |
76
+ | `@dispatchConnectedEvent` | none | Class decorator. Dispatches `CONNECTED` (`"sonic-connected"`, bubbles) after `connectedCallback` |
@@ -0,0 +1,75 @@
1
+ # sub()
2
+
3
+ `sub(path)` is a Lit directive that renders the current value of a store path and updates in place on every assignment. Use it inside `html` templates for read-only display; in a decorator, the same path goes to [@subscribe](/docs/decorators/subscribe). See [Data flow](/docs/getting-started/dataFlow) for the overall model.
4
+
5
+ ## Import
6
+
7
+ <sonic-code language="typescript">
8
+ <template>
9
+ import { sub } from "@supersoniks/concorde/directives";
10
+
11
+ render() {
12
+ return html`&lt;p&gt;Altitude: ${sub("cockpit.altitude")} ft&lt;/p&gt;`;
13
+ }
14
+ </template>
15
+ </sonic-code>
16
+
17
+ ## DataProviderKey
18
+
19
+ Pass a [DataProviderKey](/docs/misc/dataProviderKey) instead of a string to get a typo-safe path. Until the publisher holds a value, nothing is rendered.
20
+
21
+ <sonic-code language="typescript">
22
+ <template>
23
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
24
+
25
+ const flightKey = new DataProviderKey&lt;{ code: string; gate: string }&gt;("flight");
26
+
27
+ render() {
28
+ return html`&lt;p&gt;${sub(flightKey.code)} · gate ${sub(flightKey.gate)}&lt;/p&gt;`;
29
+ }
30
+ </template>
31
+ </sonic-code>
32
+
33
+ ## Dynamic path
34
+
35
+ `${prop}` placeholders resolve from properties of the component that renders the template; the directive re-subscribes when they change. While a placeholder is `null` or `undefined`, nothing is rendered. Rules: [Dynamic paths](/docs/misc/dynamic-path). `skipEmptyPlaceholder` is not available on `sub()`.
36
+
37
+ <sonic-code language="typescript">
38
+ <template>
39
+ const personKey = new DataProviderKey&lt;OnBoard, { seatIndex: number }&gt;(
40
+ "demoOnBoard.${seatIndex}",
41
+ );
42
+
43
+ @property({ type: Number }) seatIndex = 0;
44
+
45
+ render() {
46
+ return html`&lt;strong&gt;${sub(personKey.name)}&lt;/strong&gt; · ${sub(personKey.role)}`;
47
+ }
48
+ </template>
49
+ </sonic-code>
50
+
51
+ <sonic-code>
52
+ <template>
53
+ <docs-demo-sources for="demo-sub-template"></docs-demo-sources>
54
+ <demo-sub-template></demo-sub-template>
55
+ </template>
56
+ </sonic-code>
57
+
58
+ ## sub() or get()
59
+
60
+ `get(path)` from `@supersoniks/concorde/utils` returns a one-time snapshot: in a template it never updates. Use `sub()` in templates and `get` / `set` / `dp` in imperative code.
61
+
62
+ <sonic-code language="typescript">
63
+ <template>
64
+ html`${sub(flightKey.gate)}`; // updates on gate change
65
+ html`${get(flightKey.gate)}`; // frozen at first render
66
+ </template>
67
+ </sonic-code>
68
+
69
+ ## API reference
70
+
71
+ | Argument | Type | Description |
72
+ |----------|------|-------------|
73
+ | `path` | `string` or `DataProviderKey<T, U>` | Path to read. Placeholders resolve on the template host |
74
+
75
+ The directive subscribes when its part connects and unsubscribes when it disconnects.
@@ -0,0 +1,73 @@
1
+ # t()
2
+
3
+ Lit directive that renders a translated label by key. Keys are batched into one GET to the endpoint set by the nearest `wordingProvider` ancestor attribute, and results are cached in `localStorage`.
4
+
5
+ ## Import
6
+
7
+ <sonic-code language="typescript">
8
+ <template>
9
+ import { t } from "@supersoniks/concorde/directives/Wording";
10
+ </template>
11
+ </sonic-code>
12
+
13
+ `wording` and `w` are aliases of `t`. In plain HTML, use the [`sonic-t`](/core/components/functional/translation) element.
14
+
15
+ ## Usage
16
+
17
+ Set `serviceURL` and `wordingProvider` on the host component or one of its ancestors, then call `t(key)` in a template. Attributes on elements **inside** the component's own template are not read. Click the button to bump the version and reload the labels.
18
+
19
+ <docs-lit-demo for="docs-api-config-wording-demo"></docs-lit-demo>
20
+
21
+ ## Endpoint contract
22
+
23
+ All keys requested in the same tick are sent in one request, appended to `wordingProvider` as `labels[]`:
24
+
25
+ <sonic-code language="shell">
26
+ <template>
27
+ GET {serviceURL}/wording/labels?lang=fr&labels[]=greeting&labels[]=farewell
28
+ </template>
29
+ </sonic-code>
30
+
31
+ The response is a flat map of key to label:
32
+
33
+ <sonic-code language="json">
34
+ <template>
35
+ { "greeting": "Bonjour", "farewell": "Au revoir" }
36
+ </template>
37
+ </sonic-code>
38
+
39
+ Until the label arrives, `t()` renders an empty string.
40
+
41
+ ## HTML labels
42
+
43
+ `t()` escapes the label. Use `unsafeWording(key)` for labels that contain trusted HTML.
44
+
45
+ <sonic-code language="typescript">
46
+ <template>
47
+ import { unsafeWording } from "@supersoniks/concorde/directives/Wording";
48
+
49
+ html`&lt;p&gt;${unsafeWording("terms.notice")}&lt;/p&gt;`;
50
+ </template>
51
+ </sonic-code>
52
+
53
+ ## Reloading labels
54
+
55
+ Labels are fetched again when:
56
+
57
+ - the `lang` attribute of `<html>` changes
58
+ - the number stored at `wordingVersionProvider` changes — bump it after publishing new labels to invalidate the `localStorage` cache
59
+
60
+ ## API reference
61
+
62
+ | Function | Description |
63
+ |----------|-------------|
64
+ | `t(key)` · `wording(key)` · `w(key)` | Renders the escaped label for `key` |
65
+ | `unsafeWording(key)` | Renders the label as HTML |
66
+ | `isWordingReady(key)` | `true` once the label for `key` is loaded |
67
+
68
+ | Ancestor attribute | Description |
69
+ |--------------------|-------------|
70
+ | `wordingProvider` | Endpoint path and query, relative to `serviceURL` |
71
+ | `wordingVersionProvider` | DataProvider path holding a version number |
72
+
73
+ Other ancestor attributes (`serviceURL`, `token`, …) apply as for any request: see [API configuration](/docs/misc/api-configuration).
@@ -0,0 +1,46 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { docsPageHref, docsPagePath, parseDocsLocation } from "./docs-location";
3
+
4
+ describe("docsPagePath / docsPageHref", () => {
5
+ it("builds pretty public pathnames", () => {
6
+ expect(docsPagePath("docs/getting-started/start.md")).toBe(
7
+ "/docs/getting-started/start",
8
+ );
9
+ expect(docsPageHref("core/components/ui/button/button.md")).toBe(
10
+ "/core/components/ui/button",
11
+ );
12
+ expect(docsPageHref("docs/decorators/get.md", "options")).toBe(
13
+ "/docs/decorators/get#options",
14
+ );
15
+ expect(
16
+ docsPagePath("core/components/functional/sdui/sdui-extension-points.md"),
17
+ ).toBe("/core/components/functional/sdui/sdui-extension-points");
18
+ });
19
+ });
20
+
21
+ describe("parseDocsLocation", () => {
22
+ it("parses pretty pathname doc URLs", () => {
23
+ const r = parseDocsLocation("/docs/getting-started/start");
24
+ expect(r.url).toBe("docs/getting-started/start.md");
25
+ expect(r.pagePath).toBe("/docs/getting-started/start");
26
+ expect(r.anchor).toBe("");
27
+ });
28
+
29
+ it("parses pretty component paths and heading fragments", () => {
30
+ const r = parseDocsLocation("/core/components/ui/button#Size");
31
+ expect(r.url).toBe("core/components/ui/button.md");
32
+ expect(r.anchor).toBe("Size");
33
+ expect(r.pagePath).toBe("/core/components/ui/button");
34
+ });
35
+
36
+ it("treats / as home", () => {
37
+ const r = parseDocsLocation("/");
38
+ expect(r.url).toBe("");
39
+ expect(r.pagePath).toBe("/");
40
+ });
41
+
42
+ it("ignores raw .md / .html file URLs (not SPA routes)", () => {
43
+ expect(parseDocsLocation("/docs/getting-started/start.md").url).toBe("");
44
+ expect(parseDocsLocation("/docs/getting-started/start.html").url).toBe("");
45
+ });
46
+ });