@supersoniks/concorde 5.1.2 → 5.1.3-immutable.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 (497) hide show
  1. package/.agents/skills/concorde-docs/SKILL.md +1 -1
  2. package/.claude/skills +1 -0
  3. package/.github/workflows/ci.yml +21 -0
  4. package/.github-export-ignore +30 -0
  5. package/CONTRIBUTING.md +59 -0
  6. package/DEV.md +54 -0
  7. package/LICENSE +21 -0
  8. package/OPEN_SOURCE_CHECKPOINT.md +133 -0
  9. package/README.md +1 -1
  10. package/ai/README.md +29 -41
  11. package/ai/skills/concorde/SKILL.md +54 -324
  12. package/ai/skills/concorde/rules/composition.md +32 -0
  13. package/ai/skills/concorde/rules/data.md +47 -0
  14. package/ai/skills/concorde/rules/http.md +25 -0
  15. package/ai/skills/concorde/rules/lists-forms.md +35 -0
  16. package/ai/skills/concorde/rules/styling.md +46 -0
  17. package/ai/skills/concorde/rules/troubleshooting.md +45 -0
  18. package/build-infos.json +1 -1
  19. package/concorde-core.bundle.js +177 -177
  20. package/concorde-core.es.js +5183 -5018
  21. package/custom-elements-manifest.public.config.mjs +8 -0
  22. package/{.tmp-cem/custom-elements.json → custom-elements.json} +11722 -8868
  23. package/dist/concorde-core.bundle.js +177 -177
  24. package/dist/concorde-core.es.js +5183 -5018
  25. package/dist/docs-mock-api-sw.js +58 -223
  26. package/dist/docs-mock-api-sw.js.map +4 -4
  27. package/dist/img/og-concorde.jpg +0 -0
  28. package/dist/robots.txt +11 -10
  29. package/docs/assets/index-CD4WyL6o.css +1 -0
  30. package/docs/assets/index-D_alEsng.js +12122 -0
  31. package/docs/crawl/core/components/functional/date/date.html +190 -0
  32. package/docs/crawl/core/components/functional/fetch/fetch.html +109 -0
  33. package/docs/crawl/core/components/functional/if/if.html +27 -0
  34. package/docs/crawl/core/components/functional/jsonata/jsonata.html +79 -0
  35. package/docs/crawl/core/components/functional/list/list.html +70 -0
  36. package/docs/crawl/core/components/functional/mix/mix.html +45 -0
  37. package/docs/crawl/core/components/functional/queue/queue.html +96 -0
  38. package/docs/crawl/core/components/functional/router/router.html +106 -0
  39. package/docs/{core → crawl/core}/components/functional/sdui/sdui-extension-points.html +8 -9
  40. package/docs/crawl/core/components/functional/sdui/sdui.html +368 -0
  41. package/docs/crawl/core/components/functional/states/states.html +66 -0
  42. package/docs/crawl/core/components/functional/submit/submit.html +160 -0
  43. package/docs/{core → crawl/core}/components/functional/subscriber/subscriber.html +5 -6
  44. package/docs/crawl/core/components/functional/value/value.html +51 -0
  45. package/docs/{core → crawl/core}/components/ui/alert/alert.html +63 -53
  46. package/docs/{core → crawl/core}/components/ui/alert-messages/alert-messages.html +5 -6
  47. package/docs/{core → crawl/core}/components/ui/badge/badge.html +33 -33
  48. package/docs/crawl/core/components/ui/button/button.html +150 -0
  49. package/docs/crawl/core/components/ui/captcha/captcha.html +112 -0
  50. package/docs/{core → crawl/core}/components/ui/card/card.html +11 -12
  51. package/docs/{core → crawl/core}/components/ui/divider/divider.html +14 -14
  52. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +73 -0
  53. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +266 -0
  54. package/docs/{core → crawl/core}/components/ui/form/form-actions/form-actions.html +23 -23
  55. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +121 -0
  56. package/docs/crawl/core/components/ui/form/input/input.html +109 -0
  57. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +38 -0
  58. package/docs/crawl/core/components/ui/form/radio/radio.html +56 -0
  59. package/docs/crawl/core/components/ui/form/select/select.html +73 -0
  60. package/docs/crawl/core/components/ui/form/switch/switch.html +56 -0
  61. package/docs/crawl/core/components/ui/form/textarea/textarea.html +59 -0
  62. package/docs/crawl/core/components/ui/group/group.html +104 -0
  63. package/docs/{core → crawl/core}/components/ui/icon/icon.html +9 -10
  64. package/docs/crawl/core/components/ui/image/image.html +298 -0
  65. package/docs/{core → crawl/core}/components/ui/link/link.html +11 -12
  66. package/docs/crawl/core/components/ui/loader/loader.html +124 -0
  67. package/docs/{core → crawl/core}/components/ui/menu/menu.html +33 -34
  68. package/docs/crawl/core/components/ui/modal/modal.html +342 -0
  69. package/docs/crawl/core/components/ui/pop/pop.html +296 -0
  70. package/docs/{core → crawl/core}/components/ui/progress/progress.html +7 -8
  71. package/docs/crawl/core/components/ui/table/table.html +545 -0
  72. package/docs/crawl/core/components/ui/theme/theme.html +131 -0
  73. package/docs/crawl/core/components/ui/toast/toast.html +233 -0
  74. package/docs/crawl/core/components/ui/tooltip/tooltip.html +140 -0
  75. package/docs/{docs/getting-started → crawl/docs/_core-concept}/dataFlow.html +29 -26
  76. package/docs/crawl/docs/_core-concept/overview.html +66 -0
  77. package/docs/crawl/docs/_core-concept/subscriber.html +75 -0
  78. package/docs/crawl/docs/_decorators/ancestor-attribute.html +117 -0
  79. package/docs/crawl/docs/_decorators/auto-subscribe.html +202 -0
  80. package/docs/crawl/docs/_decorators/bind.html +141 -0
  81. package/docs/crawl/docs/_decorators/get.html +149 -0
  82. package/docs/crawl/docs/_decorators/handle.html +165 -0
  83. package/docs/crawl/docs/_decorators/on-assign.html +355 -0
  84. package/docs/crawl/docs/_decorators/patch.html +78 -0
  85. package/docs/crawl/docs/_decorators/post.html +139 -0
  86. package/docs/crawl/docs/_decorators/publish.html +61 -0
  87. package/docs/crawl/docs/_decorators/put.html +78 -0
  88. package/docs/crawl/docs/_decorators/subscribe.html +109 -0
  89. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +137 -0
  90. package/docs/crawl/docs/_directives/sub.html +93 -0
  91. package/docs/{docs/getting-started → crawl/docs/_getting-started}/ai-agents.html +11 -12
  92. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +100 -0
  93. package/docs/crawl/docs/_getting-started/concorde-outside.html +58 -0
  94. package/docs/{docs/getting-started → crawl/docs/_getting-started}/create-a-component.html +14 -11
  95. package/docs/{docs/getting-started → crawl/docs/_getting-started}/my-first-component.html +22 -13
  96. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +110 -0
  97. package/docs/crawl/docs/_getting-started/pubsub.html +62 -0
  98. package/docs/crawl/docs/_getting-started/start.html +76 -0
  99. package/docs/{docs/getting-started → crawl/docs/_getting-started}/theming.html +9 -10
  100. package/docs/{docs/misc → crawl/docs/_misc}/api-configuration.html +18 -18
  101. package/docs/{docs/misc → crawl/docs/_misc}/dataProviderKey.html +11 -12
  102. package/docs/{docs/misc → crawl/docs/_misc}/docs-mock-api.html +28 -25
  103. package/docs/{docs/misc → crawl/docs/_misc}/dynamic-path.html +15 -16
  104. package/docs/{docs/misc → crawl/docs/_misc}/endpoint.html +15 -16
  105. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +138 -0
  106. package/docs/{docs/misc → crawl/docs/_misc}/html-integration.html +15 -12
  107. package/docs/crawl/hubs/decorators.html +547 -0
  108. package/docs/crawl/hubs/form-components.html +381 -0
  109. package/docs/crawl/hubs/remote-data.html +452 -0
  110. package/docs/crawl/index.html +103 -0
  111. package/docs/docs-mock-api-sw.js +223 -58
  112. package/docs/docs-mock-api-sw.js.map +4 -4
  113. package/docs/index.html +68 -95
  114. package/docs/llms-full.txt +3610 -2231
  115. package/docs/llms.txt +86 -94
  116. package/docs/robots.txt +10 -11
  117. package/docs/sitemap.xml +84 -78
  118. package/docs/src/core/components/functional/date/date.md +231 -91
  119. package/docs/src/core/components/functional/fetch/fetch.md +83 -66
  120. package/docs/src/core/components/functional/if/if.md +3 -28
  121. package/docs/src/core/components/functional/jsonata/jsonata.md +37 -42
  122. package/docs/src/core/components/functional/list/list.md +43 -99
  123. package/docs/src/core/components/functional/mix/mix.md +26 -31
  124. package/docs/src/core/components/functional/queue/queue.md +61 -40
  125. package/docs/src/core/components/functional/router/router.md +65 -64
  126. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  127. package/docs/src/core/components/functional/sdui/component-catalog.json +1 -1
  128. package/docs/src/core/components/functional/sdui/example.json +86 -19
  129. package/docs/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
  130. package/docs/src/core/components/functional/sdui/sdui.md +358 -187
  131. package/docs/src/core/components/functional/states/states.md +61 -86
  132. package/docs/src/core/components/functional/submit/submit.md +72 -64
  133. package/docs/src/core/components/functional/value/value.md +22 -34
  134. package/docs/src/core/components/ui/alert/alert.md +58 -48
  135. package/docs/src/core/components/ui/badge/badge.md +34 -27
  136. package/docs/src/core/components/ui/button/button.md +106 -139
  137. package/docs/src/core/components/ui/captcha/captcha.md +32 -17
  138. package/docs/src/core/components/ui/card/card.md +6 -6
  139. package/docs/src/core/components/ui/divider/divider.md +11 -8
  140. package/docs/src/core/components/ui/form/checkbox/checkbox.md +42 -90
  141. package/docs/src/core/components/ui/form/fieldset/fieldset.md +75 -31
  142. package/docs/src/core/components/ui/form/form-actions/form-actions.md +16 -14
  143. package/docs/src/core/components/ui/form/form-layout/form-layout.md +29 -19
  144. package/docs/src/core/components/ui/form/input/input.md +95 -95
  145. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +29 -0
  146. package/docs/src/core/components/ui/form/radio/radio.md +34 -55
  147. package/docs/src/core/components/ui/form/select/select.md +45 -60
  148. package/docs/src/core/components/ui/form/switch/switch.md +34 -57
  149. package/docs/src/core/components/ui/form/textarea/textarea.md +38 -55
  150. package/docs/src/core/components/ui/group/group.md +33 -35
  151. package/docs/src/core/components/ui/icon/icon.md +4 -4
  152. package/docs/src/core/components/ui/image/image.md +107 -41
  153. package/docs/src/core/components/ui/link/link.md +6 -6
  154. package/docs/src/core/components/ui/loader/loader.md +55 -30
  155. package/docs/src/core/components/ui/menu/menu.md +27 -27
  156. package/docs/src/core/components/ui/modal/modal.md +96 -72
  157. package/docs/src/core/components/ui/pop/pop.md +158 -80
  158. package/docs/src/core/components/ui/progress/progress.md +2 -2
  159. package/docs/src/core/components/ui/table/table.md +255 -91
  160. package/docs/src/core/components/ui/theme/theme.md +36 -11
  161. package/docs/src/core/components/ui/toast/toast.md +117 -48
  162. package/docs/src/core/components/ui/tooltip/tooltip.md +62 -27
  163. package/docs/{docs/getting-started → src/docs/_core-concept}/dataFlow.md +18 -17
  164. package/docs/src/docs/_core-concept/overview.md +57 -0
  165. package/docs/src/docs/_core-concept/subscriber.md +75 -0
  166. package/docs/src/docs/_decorators/ancestor-attribute.md +128 -0
  167. package/docs/src/docs/_decorators/auto-subscribe.md +202 -0
  168. package/docs/src/docs/_decorators/bind.md +167 -0
  169. package/docs/src/docs/_decorators/get.md +162 -0
  170. package/docs/src/docs/_decorators/handle.md +175 -0
  171. package/docs/src/docs/_decorators/on-assign.md +390 -0
  172. package/docs/src/docs/_decorators/patch.md +70 -0
  173. package/docs/src/docs/_decorators/post.md +146 -0
  174. package/docs/src/docs/_decorators/publish.md +55 -0
  175. package/docs/src/docs/_decorators/put.md +70 -0
  176. package/docs/src/docs/_decorators/subscribe.md +100 -0
  177. package/docs/src/docs/_decorators/wait-for-ancestors.md +163 -0
  178. package/docs/src/docs/_directives/sub.md +91 -0
  179. package/docs/src/docs/{getting-started → _getting-started}/ai-agents.md +3 -3
  180. package/docs/src/docs/_getting-started/concorde-manual-install.md +133 -0
  181. package/docs/src/docs/_getting-started/concorde-outside.md +33 -0
  182. package/docs/{docs/getting-started → src/docs/_getting-started}/create-a-component.md +6 -3
  183. package/docs/src/docs/{getting-started → _getting-started}/my-first-component.md +14 -5
  184. package/docs/src/docs/_getting-started/my-first-subscriber.md +120 -0
  185. package/docs/src/docs/_getting-started/pubsub.md +37 -0
  186. package/docs/src/docs/{getting-started → _getting-started}/start.md +13 -1
  187. package/docs/src/docs/{getting-started → _getting-started}/theming.md +2 -2
  188. package/docs/src/docs/{misc → _misc}/api-configuration.md +12 -10
  189. package/docs/src/docs/{misc → _misc}/dataProviderKey.md +4 -4
  190. package/docs/{docs/misc → src/docs/_misc}/docs-mock-api.md +13 -12
  191. package/docs/{docs/misc → src/docs/_misc}/dynamic-path.md +8 -8
  192. package/docs/{docs/misc → src/docs/_misc}/endpoint.md +8 -8
  193. package/docs/src/docs/_misc/formelement-subscriber-removal.md +115 -0
  194. package/docs/{docs/misc → src/docs/_misc}/html-integration.md +5 -4
  195. package/docs/src/docs/search/docs-search.json +4375 -2420
  196. package/docs/src/tsconfig.declarations.json +22 -0
  197. package/docs/src/tsconfig.emit.json +23 -0
  198. package/docs/src/tsconfig.json +2 -23
  199. package/gitlab/job_github_mirror.sh +39 -0
  200. package/index.html +89 -0
  201. package/package.json +22 -4
  202. package/public/img/og-concorde.jpg +0 -0
  203. package/scripts/ai-init.mjs +104 -379
  204. package/scripts/ai-init.test.mjs +81 -239
  205. package/scripts/docs-markdown-vite-plugin.ts +11 -5
  206. package/scripts/docs-public-url.mjs +6 -0
  207. package/scripts/docs.htaccess +7 -0
  208. package/scripts/generate-cem.mjs +244 -0
  209. package/scripts/generate-cem.test.mjs +122 -0
  210. package/scripts/generate-crawl-docs.mjs +29 -5
  211. package/scripts/generate-sdui-catalog.mjs +11 -10
  212. package/scripts/github-export.mjs +150 -0
  213. package/scripts/post-build-docs.js +3 -0
  214. package/scripts/post-build.mjs +0 -0
  215. package/scripts/pre-publish.mjs +2 -1
  216. package/scripts/site-pages.mjs +212 -0
  217. package/scripts/site-pages.test.mjs +116 -0
  218. package/site-pages/about.md +22 -0
  219. package/site-pages/privacy.md +32 -0
  220. package/src/core/components/functional/date/date.md +1 -1
  221. package/src/core/components/functional/example/example.ts +3 -1
  222. package/src/core/components/functional/if/if.ts +0 -0
  223. package/src/core/components/functional/list/list.demo.ts +0 -0
  224. package/src/core/components/functional/list/list.md +6 -2
  225. package/src/core/components/functional/list/list.ts +17 -4
  226. package/src/core/components/functional/mix/mix.md +0 -0
  227. package/src/core/components/functional/router/router.demo.ts +0 -0
  228. package/src/core/components/functional/router/router.ts +0 -0
  229. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
  230. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  231. package/src/core/components/functional/sdui/component-catalog.json +2 -2
  232. package/src/core/components/functional/sdui/example.json +0 -0
  233. package/src/core/components/functional/sdui/sdui-immutable.spec.ts +74 -0
  234. package/src/core/components/functional/sdui/sdui.ts +33 -8
  235. package/src/core/components/functional/sdui/types.ts +0 -0
  236. package/src/core/components/functional/states/states.ts +0 -0
  237. package/src/core/components/functional/submit/submit.spec.ts +60 -0
  238. package/src/core/components/functional/submit/submit.ts +6 -3
  239. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  240. package/src/core/components/functional/value/value.md +0 -0
  241. package/src/core/components/functional/value/value.ts +0 -0
  242. package/src/core/components/ui/_css/size.ts +0 -0
  243. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  244. package/src/core/components/ui/card/card.md +1 -1
  245. package/src/core/components/ui/form/input/input.md +19 -1
  246. package/src/core/components/ui/form/input/input.ts +8 -2
  247. package/src/core/components/ui/form/radio/radio.md +14 -0
  248. package/src/core/components/ui/image/image.md +17 -17
  249. package/src/core/components/ui/modal/modal.md +2 -2
  250. package/src/core/decorators/subscriber/bind.ts +9 -14
  251. package/src/core/decorators/subscriber/subscribe.ts +15 -9
  252. package/src/core/decorators/subscriber/subscribe.type-test.ts +14 -5
  253. package/src/core/mixins/Subscriber.ts +0 -0
  254. package/src/core/utils/DataBindObserver.ts +0 -0
  255. package/src/core/utils/Objects.ts +0 -0
  256. package/src/core/utils/PublisherProxy.ts +166 -125
  257. package/src/core/utils/deepReadonly.spec.ts +66 -0
  258. package/src/core/utils/deepReadonly.ts +71 -0
  259. package/src/core/utils/immutableValue.spec.ts +58 -0
  260. package/src/core/utils/immutableValue.ts +116 -0
  261. package/src/core/utils/nestedDotForm.spec.ts +88 -0
  262. package/src/core/utils/publisherImmutable.spec.ts +127 -0
  263. package/src/core/utils/route.ts +0 -0
  264. package/src/core/utils/strictGet.spec.ts +61 -0
  265. package/src/core/utils/strictGet.ts +102 -0
  266. package/src/css.d.ts +19 -0
  267. package/src/docs/components/docs-demo-sources.ts +3 -3
  268. package/src/docs/decorators/bind.md +23 -24
  269. package/src/docs/docs-location.spec.ts +10 -0
  270. package/src/docs/docs-location.ts +10 -0
  271. package/src/docs/example/decorators-demo-bind-demos.ts +11 -28
  272. package/src/docs/example/docs-toggle-demos.ts +1 -1
  273. package/src/docs/example/users.ts +0 -0
  274. package/src/docs/getting-started/ai-agents.md +51 -51
  275. package/src/docs/getting-started/dataFlow.md +2 -2
  276. package/src/docs/home/home.ts +3 -1
  277. package/src/docs/misc/publisher-get-immutability-docs-crawl.json +902 -0
  278. package/src/docs/misc/publisher-get-immutability-docs-recheck.json +13 -0
  279. package/src/docs/misc/publisher-get-immutability-study.md +229 -0
  280. package/src/docs/navigation/navigation.ts +5 -1
  281. package/src/docs/search/docs-search.json +358 -58
  282. package/src/docs/search/markdown-renderer.ts +6 -1
  283. package/src/docs/tailwind/css/docs/content.css +4 -5
  284. package/src/tsconfig.declarations.json +22 -0
  285. package/src/tsconfig.emit.json +23 -0
  286. package/src/tsconfig.json +53 -5
  287. package/src/tsconfig.tsbuildinfo +1 -1
  288. package/.taste-skill/after/desktop-fold.jpg +0 -0
  289. package/.taste-skill/after/desktop-page-01.jpg +0 -0
  290. package/.taste-skill/after/desktop-page-02.jpg +0 -0
  291. package/.taste-skill/after/desktop-page-03.jpg +0 -0
  292. package/.taste-skill/after/mobile-fold.jpg +0 -0
  293. package/.taste-skill/after/mobile-page-01.jpg +0 -0
  294. package/.taste-skill/after/report.json +0 -4103
  295. package/.taste-skill/after/tablet-fold.jpg +0 -0
  296. package/.taste-skill/after/tablet-page-01.jpg +0 -0
  297. package/.taste-skill/after/tablet-page-02.jpg +0 -0
  298. package/.taste-skill/before/desktop-fold.jpg +0 -0
  299. package/.taste-skill/before/desktop-page-01.jpg +0 -0
  300. package/.taste-skill/before/desktop-page-02.jpg +0 -0
  301. package/.taste-skill/before/mobile-fold.jpg +0 -0
  302. package/.taste-skill/before/mobile-page-01.jpg +0 -0
  303. package/.taste-skill/before/report.json +0 -2556
  304. package/.taste-skill/before/tablet-fold.jpg +0 -0
  305. package/.taste-skill/before/tablet-page-01.jpg +0 -0
  306. package/.taste-skill/direction.json +0 -510
  307. package/.taste-skill/notes.md +0 -84
  308. package/.taste-skill/prod/desktop-fold.jpg +0 -0
  309. package/.taste-skill/prod/desktop-page-01.jpg +0 -0
  310. package/.taste-skill/prod/desktop-page-02.jpg +0 -0
  311. package/.taste-skill/prod/desktop-page-03.jpg +0 -0
  312. package/.taste-skill/prod/mobile-fold.jpg +0 -0
  313. package/.taste-skill/prod/mobile-page-01.jpg +0 -0
  314. package/.taste-skill/prod/mobile-page-02.jpg +0 -0
  315. package/.taste-skill/prod/report.json +0 -1973
  316. package/.taste-skill/prod/tablet-fold.jpg +0 -0
  317. package/.taste-skill/prod/tablet-page-01.jpg +0 -0
  318. package/.taste-skill/prod/tablet-page-02.jpg +0 -0
  319. package/AUDIT.md +0 -228
  320. package/PLAN-AMELIORATION.md +0 -220
  321. package/PLAN-DOCS-AGENTS.md +0 -80
  322. package/ai/AGENTS.md +0 -56
  323. package/ai/cursor/rules/concorde-menu.mdc +0 -15
  324. package/ai/cursor/rules/concorde-scope.mdc +0 -14
  325. package/ai/cursor/rules/concorde-theme.mdc +0 -13
  326. package/ai/cursor/rules/concorde.mdc +0 -66
  327. package/ai/jetbrains/rules/concorde.md +0 -53
  328. package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
  329. package/ai/skills/concorde-imports/SKILL.md +0 -78
  330. package/ai/skills/concorde-menu/SKILL.md +0 -74
  331. package/ai/skills/concorde-scope/SKILL.md +0 -70
  332. package/ai/skills/concorde-theme/SKILL.md +0 -57
  333. package/docs/.htaccess +0 -75
  334. package/docs/404.html +0 -15
  335. package/docs/404.md +0 -5
  336. package/docs/assets/index-BgG6FFPt.js +0 -11765
  337. package/docs/assets/index-x89XINSG.css +0 -1
  338. package/docs/core/components/functional/date/date.html +0 -211
  339. package/docs/core/components/functional/date/date.md +0 -150
  340. package/docs/core/components/functional/fetch/fetch.html +0 -180
  341. package/docs/core/components/functional/fetch/fetch.md +0 -108
  342. package/docs/core/components/functional/if/if.html +0 -65
  343. package/docs/core/components/functional/if/if.md +0 -34
  344. package/docs/core/components/functional/jsonata/jsonata.html +0 -110
  345. package/docs/core/components/functional/jsonata/jsonata.md +0 -61
  346. package/docs/core/components/functional/list/list.html +0 -198
  347. package/docs/core/components/functional/list/list.md +0 -121
  348. package/docs/core/components/functional/mix/mix.html +0 -78
  349. package/docs/core/components/functional/mix/mix.md +0 -46
  350. package/docs/core/components/functional/queue/queue.html +0 -155
  351. package/docs/core/components/functional/queue/queue.md +0 -51
  352. package/docs/core/components/functional/router/router.html +0 -154
  353. package/docs/core/components/functional/router/router.md +0 -93
  354. package/docs/core/components/functional/sdui/sdui-extension-points.md +0 -94
  355. package/docs/core/components/functional/sdui/sdui.html +0 -397
  356. package/docs/core/components/functional/sdui/sdui.md +0 -307
  357. package/docs/core/components/functional/states/states.html +0 -141
  358. package/docs/core/components/functional/states/states.md +0 -112
  359. package/docs/core/components/functional/submit/submit.html +0 -178
  360. package/docs/core/components/functional/submit/submit.md +0 -106
  361. package/docs/core/components/functional/subscriber/subscriber.md +0 -91
  362. package/docs/core/components/functional/translation/translation.html +0 -60
  363. package/docs/core/components/functional/translation/translation.md +0 -38
  364. package/docs/core/components/functional/value/value.html +0 -81
  365. package/docs/core/components/functional/value/value.md +0 -47
  366. package/docs/core/components/ui/alert/alert.md +0 -186
  367. package/docs/core/components/ui/alert-messages/alert-messages.md +0 -85
  368. package/docs/core/components/ui/badge/badge.md +0 -181
  369. package/docs/core/components/ui/button/button.html +0 -309
  370. package/docs/core/components/ui/button/button.md +0 -216
  371. package/docs/core/components/ui/captcha/captcha.html +0 -80
  372. package/docs/core/components/ui/captcha/captcha.md +0 -56
  373. package/docs/core/components/ui/card/card.md +0 -215
  374. package/docs/core/components/ui/divider/divider.md +0 -126
  375. package/docs/core/components/ui/form/checkbox/checkbox.html +0 -200
  376. package/docs/core/components/ui/form/checkbox/checkbox.md +0 -125
  377. package/docs/core/components/ui/form/fieldset/fieldset.html +0 -238
  378. package/docs/core/components/ui/form/fieldset/fieldset.md +0 -161
  379. package/docs/core/components/ui/form/form-actions/form-actions.md +0 -98
  380. package/docs/core/components/ui/form/form-layout/form-layout.html +0 -115
  381. package/docs/core/components/ui/form/form-layout/form-layout.md +0 -109
  382. package/docs/core/components/ui/form/input/input.html +0 -235
  383. package/docs/core/components/ui/form/input/input.md +0 -142
  384. package/docs/core/components/ui/form/radio/radio.html +0 -144
  385. package/docs/core/components/ui/form/radio/radio.md +0 -78
  386. package/docs/core/components/ui/form/select/select.html +0 -178
  387. package/docs/core/components/ui/form/select/select.md +0 -86
  388. package/docs/core/components/ui/form/switch/switch.html +0 -146
  389. package/docs/core/components/ui/form/switch/switch.md +0 -80
  390. package/docs/core/components/ui/form/textarea/textarea.html +0 -162
  391. package/docs/core/components/ui/form/textarea/textarea.md +0 -82
  392. package/docs/core/components/ui/group/group.html +0 -113
  393. package/docs/core/components/ui/group/group.md +0 -77
  394. package/docs/core/components/ui/icon/icon.md +0 -214
  395. package/docs/core/components/ui/image/image.html +0 -194
  396. package/docs/core/components/ui/image/image.md +0 -167
  397. package/docs/core/components/ui/link/link.md +0 -81
  398. package/docs/core/components/ui/loader/loader.html +0 -114
  399. package/docs/core/components/ui/loader/loader.md +0 -87
  400. package/docs/core/components/ui/menu/menu.md +0 -370
  401. package/docs/core/components/ui/modal/modal.html +0 -324
  402. package/docs/core/components/ui/modal/modal.md +0 -211
  403. package/docs/core/components/ui/pop/pop.html +0 -250
  404. package/docs/core/components/ui/pop/pop.md +0 -216
  405. package/docs/core/components/ui/progress/progress.md +0 -109
  406. package/docs/core/components/ui/table/table.html +0 -333
  407. package/docs/core/components/ui/table/table.md +0 -267
  408. package/docs/core/components/ui/theme/theme.html +0 -116
  409. package/docs/core/components/ui/theme/theme.md +0 -97
  410. package/docs/core/components/ui/toast/toast.html +0 -185
  411. package/docs/core/components/ui/toast/toast.md +0 -147
  412. package/docs/core/components/ui/tooltip/tooltip.html +0 -112
  413. package/docs/core/components/ui/tooltip/tooltip.md +0 -89
  414. package/docs/docs/decorators/ancestor-attribute.html +0 -71
  415. package/docs/docs/decorators/ancestor-attribute.md +0 -59
  416. package/docs/docs/decorators/auto-subscribe.html +0 -61
  417. package/docs/docs/decorators/auto-subscribe.md +0 -40
  418. package/docs/docs/decorators/bind.html +0 -86
  419. package/docs/docs/decorators/bind.md +0 -77
  420. package/docs/docs/decorators/get.html +0 -166
  421. package/docs/docs/decorators/get.md +0 -160
  422. package/docs/docs/decorators/handle.html +0 -139
  423. package/docs/docs/decorators/handle.md +0 -119
  424. package/docs/docs/decorators/on-assign.html +0 -72
  425. package/docs/docs/decorators/on-assign.md +0 -63
  426. package/docs/docs/decorators/patch.html +0 -76
  427. package/docs/docs/decorators/patch.md +0 -44
  428. package/docs/docs/decorators/post.html +0 -150
  429. package/docs/docs/decorators/post.md +0 -134
  430. package/docs/docs/decorators/publish.html +0 -74
  431. package/docs/docs/decorators/publish.md +0 -56
  432. package/docs/docs/decorators/put.html +0 -83
  433. package/docs/docs/decorators/put.md +0 -51
  434. package/docs/docs/decorators/subscribe.html +0 -91
  435. package/docs/docs/decorators/subscribe.md +0 -87
  436. package/docs/docs/decorators/wait-for-ancestors.html +0 -82
  437. package/docs/docs/decorators/wait-for-ancestors.md +0 -76
  438. package/docs/docs/directives/sub.html +0 -79
  439. package/docs/docs/directives/sub.md +0 -75
  440. package/docs/docs/directives/t.html +0 -91
  441. package/docs/docs/directives/t.md +0 -73
  442. package/docs/docs/getting-started/ai-agents.md +0 -76
  443. package/docs/docs/getting-started/components.html +0 -27
  444. package/docs/docs/getting-started/components.md +0 -5
  445. package/docs/docs/getting-started/installation.html +0 -69
  446. package/docs/docs/getting-started/installation.md +0 -36
  447. package/docs/docs/getting-started/my-first-component.md +0 -227
  448. package/docs/docs/getting-started/start.html +0 -47
  449. package/docs/docs/getting-started/start.md +0 -35
  450. package/docs/docs/getting-started/theming.md +0 -253
  451. package/docs/docs/index.html +0 -99
  452. package/docs/docs/misc/api-configuration.md +0 -79
  453. package/docs/docs/misc/dataProviderKey.md +0 -168
  454. package/docs/hubs/decorators.html +0 -443
  455. package/docs/hubs/form-components.html +0 -404
  456. package/docs/hubs/remote-data.html +0 -371
  457. package/docs/img/archive/concorde-001-2cv.webp +0 -0
  458. package/docs/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  459. package/docs/img/archive/concorde-red-arrows-2002.webm +0 -0
  460. package/docs/img/archive/credits.json +0 -28
  461. package/docs/index.md +0 -22
  462. package/docs/src/core/components/functional/translation/translation.md +0 -38
  463. package/docs/src/docs/decorators/ancestor-attribute.md +0 -59
  464. package/docs/src/docs/decorators/auto-subscribe.md +0 -40
  465. package/docs/src/docs/decorators/bind.md +0 -77
  466. package/docs/src/docs/decorators/get.md +0 -160
  467. package/docs/src/docs/decorators/handle.md +0 -119
  468. package/docs/src/docs/decorators/on-assign.md +0 -63
  469. package/docs/src/docs/decorators/patch.md +0 -44
  470. package/docs/src/docs/decorators/post.md +0 -134
  471. package/docs/src/docs/decorators/publish.md +0 -56
  472. package/docs/src/docs/decorators/put.md +0 -51
  473. package/docs/src/docs/decorators/subscribe.md +0 -87
  474. package/docs/src/docs/decorators/wait-for-ancestors.md +0 -76
  475. package/docs/src/docs/directives/sub.md +0 -75
  476. package/docs/src/docs/directives/t.md +0 -73
  477. package/docs/src/docs/getting-started/components.md +0 -5
  478. package/docs/src/docs/getting-started/create-a-component.md +0 -136
  479. package/docs/src/docs/getting-started/dataFlow.md +0 -87
  480. package/docs/src/docs/getting-started/installation.md +0 -36
  481. package/docs/src/docs/misc/docs-mock-api.md +0 -62
  482. package/docs/src/docs/misc/dynamic-path.md +0 -71
  483. package/docs/src/docs/misc/endpoint.md +0 -45
  484. package/docs/src/docs/misc/html-integration.md +0 -14
  485. /package/{docs → dist}/img/concorde/plane_01.jpg +0 -0
  486. /package/{docs → dist}/img/concorde/plane_02.jpg +0 -0
  487. /package/{docs → dist}/img/concorde/plane_03.jpg +0 -0
  488. /package/{docs → dist}/img/concorde/plane_04.jpg +0 -0
  489. /package/{docs → dist}/img/concorde/plane_05.jpg +0 -0
  490. /package/{docs → dist}/img/concorde/plane_06.jpg +0 -0
  491. /package/{docs → dist}/img/concorde/plane_07.jpg +0 -0
  492. /package/{docs → dist}/img/concorde/plane_08.jpg +0 -0
  493. /package/{docs → dist}/img/concorde/plane_09.jpg +0 -0
  494. /package/{docs → dist}/img/concorde/plane_10.jpg +0 -0
  495. /package/{docs → dist}/img/concorde/plane_11.jpg +0 -0
  496. /package/{docs → dist}/img/concorde/plane_12.jpg +0 -0
  497. /package/{docs → dist}/img/concorde/plane_13.jpg +0 -0
@@ -0,0 +1,146 @@
1
+ # @post
2
+
3
+ `@post` sends the contents of a publisher and stores the response in an
4
+ optional `ApiResult<T>` property. The property is `undefined` until a result
5
+ is available.
6
+
7
+ ## Minimal usage
8
+
9
+ Pass an `Endpoint<T>` and a `DataProviderKey<B>` for the request body.
10
+
11
+ ```typescript
12
+ const userBodyKey = new DataProviderKey<CreateUser>("users.form");
13
+ const createUser = post(new Endpoint<User>("users"), userBodyKey);
14
+
15
+ @createUser
16
+ @state()
17
+ payload?: ApiResult<User>;
18
+ ```
19
+
20
+ The same decorator adapts to a method and receives the complete payload:
21
+
22
+ ```typescript
23
+ @post(new Endpoint<User>("users"), userBodyKey)
24
+ handleCreate(payload?: ApiResult<User>) {
25
+ if (payload?.response?.ok) console.log(payload.result);
26
+ }
27
+ ```
28
+
29
+ The current body is read from `userBodyKey`. By default, the POST is sent when
30
+ the component connects and after each body mutation. Mutations in the same
31
+ frame are coalesced into one request.
32
+
33
+ API configuration is read from the HTML scope, as with
34
+ [@get](#docs/_decorators/get.md/get).
35
+
36
+ ## Sending the POST again
37
+
38
+ ### From the component
39
+
40
+ Keep the decorator to access `send(component)`. The body is read again when the
41
+ operation runs.
42
+
43
+ ```typescript
44
+ async saveAgain() {
45
+ const payload = await createUser.send(this);
46
+ console.log(payload?.result);
47
+ }
48
+ ```
49
+
50
+ `send()` returns a `Promise<ApiResult<T> | undefined>` that resolves after the
51
+ operation completes. It is useful for “Save” or “Retry” buttons and can repeat
52
+ an operation with side effects.
53
+
54
+ ### From a method decorator
55
+
56
+ The send action can decorate a local method. It runs after the method by
57
+ default, waits for an eventual Promise to resolve, and the decorated method
58
+ call waits for the send to complete:
59
+
60
+ ```typescript
61
+ import { send } from "@supersoniks/concorde/decorators";
62
+
63
+ @send(createUser)
64
+ async save() {
65
+ // Prepare local state or validate the form.
66
+ }
67
+ ```
68
+
69
+ Use `{ when: "before" }` when the send must complete before the method runs:
70
+
71
+ ```typescript
72
+ @send(createUser, { when: "before" })
73
+ saveBefore() {
74
+ // The POST has completed before this method runs.
75
+ }
76
+ ```
77
+
78
+ The method decorator adds an explicit send. If the method also mutates the body
79
+ publisher, set `autoPostOnBodyMutation: false` when the decorated method must
80
+ be the only trigger.
81
+
82
+ ## Options (`PostOptions`)
83
+
84
+ Options are the third argument, or the fourth argument when a configuration key
85
+ is provided.
86
+
87
+ - `autoPostOnBodyMutation`: send after a body mutation (default: `true`). Set
88
+ it to `false` to use `send()`.
89
+ - `skipIfBodyMissing`: skip when the body is `null` or `undefined` (default:
90
+ `true`).
91
+ - `refetchEveryMs`: repeat the POST at this interval. Use it only when
92
+ repeating the operation is intended.
93
+ - `skipEmptyPlaceholder`: block the request when a `${...}` placeholder is
94
+ `""`.
95
+ - `triggerKey`: a publisher whose `invalidate()` sends the POST again.
96
+
97
+ With a configuration key:
98
+
99
+ ```typescript
100
+ @post(endpoint, userBodyKey, apiConfigurationKey)
101
+ ```
102
+
103
+ See [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path) for
104
+ dynamic path details.
105
+
106
+ ## When the POST is sent
107
+
108
+ - when the component connects and the body and configuration are available;
109
+ - after a body mutation, unless `autoPostOnBodyMutation: false`;
110
+ - when a property used in `${...}` changes;
111
+ - when a configuration publisher changes;
112
+ - when the `triggerKey` publisher is invalidated;
113
+ - when `send()` is called;
114
+ - after each response when `refetchEveryMs` is set.
115
+
116
+ ## Import
117
+
118
+ <sonic-code language="typescript">
119
+ <template>
120
+ import { post, type ApiResult } from "@supersoniks/concorde/decorators";
121
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
122
+ import { Endpoint } from "@supersoniks/concorde/utils/endpoint";
123
+ </template>
124
+ </sonic-code>
125
+
126
+ ## Demos
127
+
128
+ <sonic-code>
129
+ <template>
130
+ <docs-demo-sources for="demo-api-post"></docs-demo-sources>
131
+ <demo-api-post></demo-api-post>
132
+ <docs-demo-sources for="demo-api-post-method"></docs-demo-sources>
133
+ <demo-api-post-method></demo-api-post-method>
134
+ <docs-demo-sources for="demo-api-post-dynamic"></docs-demo-sources>
135
+ <demo-api-post-dynamic></demo-api-post-dynamic>
136
+ </template>
137
+ </sonic-code>
138
+
139
+ See [@put](#docs/_decorators/put.md/put) and
140
+ [@patch](#docs/_decorators/patch.md/patch): they use the same model with a
141
+ different HTTP method.
142
+
143
+ ## Advanced
144
+
145
+ External invalidation is currently available through `triggerKey`; it is kept
146
+ out of the main usage examples.
@@ -0,0 +1,55 @@
1
+ # @publish
2
+
3
+ Write-only binding: assigning to the property publishes to the `DataProviderKey` path. No read subscription (inverse of [@subscribe](#docs/_decorators/subscribe.md/subscribe)).
4
+
5
+ Similar to the “reflect” half of [@bind](#docs/_decorators/bind.md/bind) without listening to the publisher.
6
+
7
+ ## Import
8
+
9
+ <sonic-code language="typescript">
10
+ <template>
11
+ import { publish } from "@supersoniks/concorde/decorators";
12
+ import { sub } from "@supersoniks/concorde/directives";
13
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
14
+ </template>
15
+ </sonic-code>
16
+
17
+ ## Example
18
+
19
+ <sonic-code language="typescript">
20
+ <template>
21
+ type PublishDemoData = { email: string; message: string };
22
+ const publishDemoKey = new DataProviderKey<PublishDemoData>("publishDemo");
23
+ //
24
+ @customElement("demo-publish")
25
+ export class DemoPublish extends LitElement {
26
+ @publish(publishDemoKey.email)
27
+ @state()
28
+ email = "";
29
+ //
30
+ @publish(publishDemoKey.message)
31
+ @state()
32
+ message = "";
33
+ //
34
+ render() {
35
+ return html`
36
+ <sonic-input
37
+ .value=${this.email}
38
+ @input=${(e) => (this.email = (e.target as HTMLInputElement).value)}
39
+ label="Email"
40
+ ></sonic-input>
41
+ <p>${sub(publishDemoKey.email)}</p>
42
+ `;
43
+ }
44
+ }
45
+ </template>
46
+ </sonic-code>
47
+
48
+ <sonic-code>
49
+ <template>
50
+ <docs-demo-sources for="demo-publish"></docs-demo-sources>
51
+ <demo-publish></demo-publish>
52
+ </template>
53
+ </sonic-code>
54
+
55
+ Dynamic paths use the same placeholder rules as `@bind` / `@subscribe`. Resolution and `skipEmptyPlaceholder`: [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path).
@@ -0,0 +1,70 @@
1
+ # @put
2
+
3
+ `@put` replaces a resource with the body from a publisher. It uses exactly the
4
+ same model as [@post](#docs/_decorators/post.md/post):
5
+ `Endpoint<T>`, `DataProviderKey<B>`, `ApiResult<T>`, options, and the
6
+ `send(component)` handle.
7
+
8
+ ## Minimal usage
9
+
10
+ ```typescript
11
+ const bodyKey = new DataProviderKey<UpdateUser>("users.form");
12
+ const updateUser = put(new Endpoint<User>("users/42"), bodyKey);
13
+
14
+ @updateUser
15
+ @state()
16
+ payload?: ApiResult<User>;
17
+ ```
18
+
19
+ The same decorator adapts to a method:
20
+
21
+ ```typescript
22
+ @put(new Endpoint<User>("users/42"), bodyKey)
23
+ handleUpdate(payload?: ApiResult<User>) {
24
+ if (payload?.response?.ok) console.log(payload.result);
25
+ }
26
+ ```
27
+
28
+ To run the operation again from the component:
29
+
30
+ ```typescript
31
+ async update() {
32
+ await updateUser.send(this);
33
+ }
34
+ ```
35
+
36
+ `send(component)` returns a Promise resolved after the PUT completes. See
37
+ [@post](#docs/_decorators/post.md/post) for the method-decorator form and the
38
+ `when: "before"` option.
39
+
40
+ The PUT is also sent automatically when the body mutates, unless
41
+ `autoPostOnBodyMutation: false` is set. See
42
+ [@post](#docs/_decorators/post.md/post) for the option details:
43
+
44
+ - `autoPostOnBodyMutation`
45
+ - `skipIfBodyMissing`
46
+ - `refetchEveryMs`
47
+ - `skipEmptyPlaceholder`
48
+ - `triggerKey`
49
+
50
+ Pass explicit API configuration as the third argument:
51
+
52
+ ```typescript
53
+ @put(endpoint, bodyKey, apiConfigurationKey)
54
+ ```
55
+
56
+ ## Import
57
+
58
+ <sonic-code language="typescript">
59
+ <template>
60
+ import { put, type ApiResult } from "@supersoniks/concorde/decorators";
61
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
62
+ import { Endpoint } from "@supersoniks/concorde/utils/endpoint";
63
+ </template>
64
+ </sonic-code>
65
+
66
+ ## See also
67
+
68
+ - [@post](#docs/_decorators/post.md/post) — options and triggers
69
+ - [@patch](#docs/_decorators/patch.md/patch) — partial update
70
+ - [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path)
@@ -0,0 +1,100 @@
1
+ # @subscribe
2
+
3
+ Keeps a **Lit property** in sync with a **read-only** slice of the DataProvider store. You pass a [`DataProviderKey`](#docs/_misc/dataProviderKey.md/dataProviderKey); when that path changes, the property updates and the component re-renders.
4
+
5
+ Typical setup (same idea as [My first component](#docs/_getting-started/my-first-component.md/my-first-component)):
6
+
7
+ | Piece | Role |
8
+ |-------|------|
9
+ | **Type** `T` | Shape of the object at that path (`DocsUserData`, `{ count: number }`, …) |
10
+ | **Key** | `DataProviderKey<T, U>` — static path (`"cart"`) or dynamic (`"users.${userIndex}"`, `"${dataProvider}"`) |
11
+ | **Scope on the host** | Properties listed in `U` (e.g. `dataProvider`, `userIndex`) — often filled via [`@ancestorAttribute`](#docs/_decorators/ancestor-attribute.md/ancestor-attribute) |
12
+ | **`@subscribe(key)`** | Mirrors the store into `@state()` (or another property); read-only from the component side |
13
+
14
+ For **writing** back to the store from component state, use [@publish](#docs/_decorators/publish.md/publish). In templates, the same paths work with [sub()](#docs/_directives/sub.md/sub).
15
+
16
+ ## Import
17
+
18
+ <sonic-code language="typescript">
19
+ <template>
20
+ import { subscribe } from "@supersoniks/concorde/decorators";
21
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
22
+
23
+ type Data = { count: number };
24
+ const dataKey = new DataProviderKey&lt;Data&gt;("data");
25
+
26
+ @subscribe(dataKey.count)
27
+ @state()
28
+ count = 0;
29
+ </template>
30
+ </sonic-code>
31
+
32
+ ## Static path
33
+
34
+ The key path is fixed. The property type must match `T` at that segment.
35
+
36
+ <sonic-code language="typescript">
37
+ <template>
38
+ const cartKey = new DataProviderKey&lt;{ items: string[] }&gt;("cart");
39
+
40
+ @subscribe(cartKey)
41
+ @state()
42
+ cart: { items: string[] } | null = null;
43
+ </template>
44
+ </sonic-code>
45
+
46
+ ## Dynamic path and scope
47
+
48
+ Placeholders `${prop}` in the key string are resolved from **properties on the same component**. While a value is `null`/`undefined`, the subscription is inactive; optional `{ skipEmptyPlaceholder: true }` also waits on `""`. Full rules: [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path).
49
+
50
+ Declare dynamic props in the key’s second generic so TypeScript expects them on the host:
51
+
52
+ <sonic-code language="typescript">
53
+ <template>
54
+ type User = { firstName: string; lastName: string; email: string };
55
+
56
+ @subscribe(new DataProviderKey&lt;User, { userIndex: number }&gt;("demoUsers.${userIndex}"))
57
+ @state()
58
+ user: User | null = null;
59
+
60
+ @property({ type: Number }) userIndex = 0;
61
+ </template>
62
+ </sonic-code>
63
+
64
+ When `userIndex` changes, `@subscribe` re-resolves the path and refreshes `user`.
65
+
66
+ ## Row / ancestor scope
67
+
68
+ List items (and wrappers like `<div dataProvider="…">`) set which branch the child reads. Pattern from the tutorial:
69
+
70
+ <sonic-code language="typescript">
71
+ <template>
72
+ export const rowKey = new DataProviderKey&lt;
73
+ User,
74
+ { dataProvider: string | null }
75
+ &gt;("${dataProvider}");
76
+
77
+ @ancestorAttribute("dataProvider")
78
+ dataProvider: string | null = null;
79
+
80
+ @subscribe(rowKey)
81
+ @state()
82
+ user: User | null = null;
83
+ </template>
84
+ </sonic-code>
85
+
86
+ ## Demo
87
+
88
+ <sonic-code>
89
+ <template>
90
+ <docs-demo-sources for="demo-subscribe-dynamic"></docs-demo-sources>
91
+ <demo-subscribe-dynamic></demo-subscribe-dynamic>
92
+ </template>
93
+ </sonic-code>
94
+
95
+ ## See also
96
+
97
+ - [Data flow](#docs/_core-concept/dataFlow.md/dataFlow) — overview
98
+ - [DataProviderKey](#docs/_misc/dataProviderKey.md/dataProviderKey) — paths and host generics
99
+ - [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path) — `${prop}` resolution and `skipEmptyPlaceholder`
100
+ - [sub()](#docs/_directives/sub.md/sub) — same paths inside `html` templates
@@ -0,0 +1,163 @@
1
+ # @awaitConnectedAncestors and @dispatchConnectedEvent
2
+
3
+ The `@awaitConnectedAncestors` and `@dispatchConnectedEvent` decorators delay a web component's initialization until its matching ancestors have executed their `connectedCallback`. This is when contextual elements (publisher, dataProvider, etc.) are configured.
4
+
5
+ ## Principle
6
+
7
+ When a child component attaches to the DOM, its ancestors may not yet be initialized (especially if custom element definitions are loaded asynchronously). The `@awaitConnectedAncestors` decorator delays the component's `connectedCallback` until all ancestors matching the provided CSS selectors have executed their `connectedCallback`.
8
+
9
+ The `@dispatchConnectedEvent` decorator allows ancestors to signal they are ready by dispatching the `sonic-connected` event at the end of their `connectedCallback`. The event bubbles, so it can be listened to from anywhere (e.g. `document.addEventListener(CONNECTED, handler)`).
10
+
11
+ Ancestors that are not web components (no hyphen in tag name) are considered connected by default and do not need to emit the event.
12
+
13
+ ## Usage
14
+
15
+ ### Import
16
+
17
+ <sonic-code language="typescript">
18
+ <template>
19
+ import { awaitConnectedAncestors, dispatchConnectedEvent, ancestorAttribute } from "@supersoniks/concorde/decorators";
20
+ </template>
21
+ </sonic-code>
22
+
23
+ ### Basic example
24
+
25
+ An ancestor container decorated with `@dispatchConnectedEvent()` signals when it is ready. A child component decorated with `@awaitConnectedAncestors("demo-wait-ancestor-container[dataProvider]")` waits for this container to be initialized before initializing itself. Parameters are CSS selectors (`element.matches()`).
26
+
27
+ The parent is registered via `customElements.define()` (vanilla JS) rather than `@customElement`, so it can be defined later—e.g. when the user clicks a button. This demonstrates the child waiting until the parent exists.
28
+
29
+ <sonic-code language="typescript">
30
+ <template>
31
+ import { html, LitElement } from "lit";
32
+ import { customElement, state } from "lit/decorators.js";
33
+
34
+ // Parent: registered later via customElements.define(), not @customElement
35
+ @dispatchConnectedEvent()
36
+ export class DemoWaitAncestorContainer extends LitElement {
37
+ render() {
38
+ return html`<slot></slot>`;
39
+ }
40
+ }
41
+
42
+ // Child: waits for parent before initializing
43
+ @customElement("demo-wait-ancestor-value")
44
+ @awaitConnectedAncestors("demo-wait-ancestor-container[dataProvider]")
45
+ export class DemoWaitAncestorValue extends LitElement {
46
+ @ancestorAttribute("dataProvider")
47
+ dataProvider: string | null = null;
48
+
49
+ @state() initializedAt: string = "";
50
+
51
+ connectedCallback() {
52
+ super.connectedCallback();
53
+ this.initializedAt = new Date().toISOString();
54
+ }
55
+
56
+ render() {
57
+ return html`
58
+ <p>DataProvider from ancestor: <strong>${this.dataProvider || "—"}</strong></p>
59
+ <p>Initialized at: ${this.initializedAt || "(waiting for parent…)"}</p>
60
+ `;
61
+ }
62
+ }
63
+
64
+ // Demo section: register parent via customElements.define() when user clicks
65
+ @customElement("demo-wait-ancestors-section")
66
+ export class DemoWaitAncestorsSection extends LitElement {
67
+ registerParent() {
68
+ if (!customElements.get("demo-wait-ancestor-container")) {
69
+ customElements.define("demo-wait-ancestor-container", DemoWaitAncestorContainer);
70
+ }
71
+ }
72
+ render() {
73
+ return html`
74
+ <sonic-button @click=${this.registerParent}>Register parent component</sonic-button>
75
+ <demo-wait-ancestor-container dataProvider="waitAncestorDemo">
76
+ <demo-wait-ancestor-value></demo-wait-ancestor-value>
77
+ </demo-wait-ancestor-container>
78
+ `;
79
+ }
80
+ }
81
+ </template>
82
+ </sonic-code>
83
+
84
+ <sonic-code>
85
+ <template>
86
+ <docs-demo-sources for="demo-wait-ancestors-section"></docs-demo-sources>
87
+ <demo-wait-ancestors-section></demo-wait-ancestors-section>
88
+ </template>
89
+ </sonic-code>
90
+
91
+ ### Multiple ancestors
92
+
93
+ The child waits for all specified ancestors. Register outer first, then inner — the child initializes only when both are ready.
94
+
95
+ <sonic-code>
96
+ <template>
97
+ <demo-wait-ancestors-multi-section></demo-wait-ancestors-multi-section>
98
+ </template>
99
+ </sonic-code>
100
+
101
+ ### Ancestors already connected
102
+
103
+ When the parent is defined at load and already in the DOM, the child initializes immediately (no delay).
104
+
105
+ **Static (both in DOM from start):**
106
+
107
+ <sonic-code>
108
+ <template>
109
+ <docs-demo-sources for="demo-wait-ancestors-static-section"></docs-demo-sources>
110
+ <demo-wait-ancestors-static-section></demo-wait-ancestors-static-section>
111
+ </template>
112
+ </sonic-code>
113
+
114
+ **Dynamic (child added on button click):**
115
+
116
+ <sonic-code>
117
+ <template>
118
+ <docs-demo-sources for="demo-wait-ancestors-ready-section"></docs-demo-sources>
119
+ <demo-wait-ancestors-ready-section></demo-wait-ancestors-ready-section>
120
+ </template>
121
+ </sonic-code>
122
+
123
+ ## CSS selector support
124
+
125
+ Parameters are CSS selectors matched via `element.matches()` — e.g. `"sonic-subscriber"`, `"sonic-subscriber[dataProvider]"`, `".my-container"`, or multiple: `"sonic-subscriber", "sonic-sdui"`.
126
+
127
+ ## Behavior
128
+
129
+ - Ancestor search uses CSS selectors (`element.matches(selector)`) — supports tag names, classes, attributes, combinators, etc.
130
+ - Traversal includes shadow roots (parentNode / host)
131
+ - Non-web components (no hyphen in tag name) are considered connected by default
132
+ - For web component ancestors, it waits for `customElements.whenDefined(tagName)` and the `sonic-connected` event (or a timeout as fallback)
133
+ - If no matching ancestor is found, the original `connectedCallback` is called immediately
134
+ - Ancestors that do not emit `sonic-connected` trigger the fallback after the timeout (compatibility with existing components)
135
+
136
+ ## Use cases
137
+
138
+ These decorators are particularly useful for:
139
+
140
+ - **sonic-value** inside a **sonic-subscriber**: the value waits for the subscriber to configure its publisher
141
+ - **Components inside sonic-sdui**: wait for the SDUI to load and configure its context
142
+ - **Any component** depending on context provided by an ancestor custom element
143
+
144
+ ## Listening to the connected event
145
+
146
+ The `sonic-connected` event bubbles, so you can listen to it from anywhere:
147
+
148
+ <sonic-code language="typescript">
149
+ <template>
150
+ import { CONNECTED } from "@supersoniks/concorde/decorators";
151
+
152
+ someConnectable.addEventListener(CONNECTED, (e) => {
153
+ console.log("Component connected:", e.target);
154
+ });
155
+ </template>
156
+ </sonic-code>
157
+
158
+ ## Notes
159
+
160
+ - These decorators apply only to web components (classes extending `HTMLElement`)
161
+ - The fallback timeout ensures compatibility with components that do not yet use `@dispatchConnectedEvent`
162
+ - Traversal includes shadow roots
163
+ - For a guarantee without relying on the timeout, decorate ancestors (Subscriber, Fetcher, etc.) with `@dispatchConnectedEvent`
@@ -0,0 +1,91 @@
1
+ # sub()
2
+
3
+ Read-only Lit directive: displays the current **DataProvider** value and updates whenever it is assigned.
4
+
5
+ ## Import
6
+
7
+ <sonic-code language="typescript">
8
+ <template>
9
+ import { sub } from "@supersoniks/concorde/directives";
10
+ </template>
11
+ </sonic-code>
12
+
13
+ ## String path
14
+
15
+ <sonic-code language="typescript">
16
+ <template>
17
+ render() {
18
+ return html`&lt;p&gt;Count: ${sub("myCounter.count")}&lt;/p&gt;`;
19
+ }
20
+ </template>
21
+ </sonic-code>
22
+
23
+ ## DataProviderKey (static)
24
+
25
+ <sonic-code language="typescript">
26
+ <template>
27
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
28
+ import { sub } from "@supersoniks/concorde/directives";
29
+
30
+ const counterKey = new DataProviderKey&lt;{ count: number }&gt;("myCounter");
31
+
32
+ render() {
33
+ return html`&lt;p&gt;${sub(counterKey.count)}&lt;/p&gt;`;
34
+ }
35
+ </template>
36
+ </sonic-code>
37
+
38
+ ## Dynamic DataProviderKey (`${prop}`)
39
+
40
+ Like `@subscribe`: the path is resolved on the template **host component**; the directive re-subscribes when observed props change. Placeholder values (`null`, `""`, `0`, …): [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path) (`skipEmptyPlaceholder` not available on `sub()` yet).
41
+
42
+ <sonic-code language="typescript">
43
+ <template>
44
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
45
+ import { sub } from "@supersoniks/concorde/directives";
46
+
47
+ type User = { firstName: string; lastName: string; email: string };
48
+ const userKey = new DataProviderKey&lt;User, { userIndex: number }&gt;(
49
+ "demoUsers.${userIndex}",
50
+ );
51
+
52
+ @customElement("demo-sub-dynamic")
53
+ export class DemoSubDynamic extends LitElement {
54
+ @property({ type: Number }) userIndex = 0;
55
+
56
+ render() {
57
+ return html`
58
+ &lt;p&gt;${sub(userKey.email)}&lt;/p&gt;
59
+ `;
60
+ }
61
+ }
62
+ </template>
63
+ </sonic-code>
64
+
65
+ ## Demo
66
+
67
+ <sonic-code toggleCode>
68
+ <template>
69
+ <docs-demo-sources for="demo-sub-template"></docs-demo-sources>
70
+ <demo-sub-template></demo-sub-template>
71
+ </template>
72
+ </sonic-code>
73
+
74
+ ## Concatenation (forms)
75
+
76
+ <sonic-code language="typescript">
77
+ <template>
78
+ html`&lt;span&gt;${sub(this.formDataProvider + ".email")}&lt;/span&gt;`
79
+ </template>
80
+ </sonic-code>
81
+
82
+ ## sub() vs get() / set() / dp()
83
+
84
+ | API | Context | Dynamic `${…}` |
85
+ |-----|----------|------------------|
86
+ | `sub()` | Lit template, reactive | Yes |
87
+ | `get` / `set` / `dp` | Imperative code | No |
88
+
89
+ Do not replace `sub(path)` with `get(path)` in a template: `get` returns a one-time snapshot.
90
+
91
+ See [DataProviderKey](#docs/_misc/dataProviderKey.md/dataProviderKey), [@subscribe](#docs/_decorators/subscribe.md/subscribe), and the `concorde-get-set-dp` migration skill.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Concorde ships **skills**, **rules**, and a root **`AGENTS.md`** so Cursor, JetBrains AI Assistant, and other coding agents follow framework patterns (DataProvider, decorators, short imports, scope, theme, migrations).
4
4
 
5
- On a [starter](/docs/getting-started/installation) project, run `yarn ai:sync` after install. On an existing project, install Concorde first, then use `ai-init` below.
5
+ On a [starter](#docs/_getting-started/concorde-outside.md/concorde-outside) project, run `yarn ai:sync` after install. On a [manual / brownfield](#docs/_getting-started/concorde-manual-install.md/concorde-manual-install) project, install Concorde first, then use `ai-init` below.
6
6
 
7
7
  ## Dedicated commands
8
8
 
@@ -67,8 +67,8 @@ Everything **after** `<!-- concorde-ai -->` is replaced on each `ai-init` run (i
67
67
 
68
68
  ## Workflow
69
69
 
70
- 1. **Starter project:** [Installation](/docs/getting-started/installation) — `yarn ai:sync` is wired in the kit.
71
- 2. **Existing project:** run **`ai-init`** after `yarn add @supersoniks/concorde`.
70
+ 1. **Starter project:** [Installation](#docs/_getting-started/concorde-outside.md/concorde-outside) — `yarn ai:sync` is wired in the kit.
71
+ 2. **Existing / manual Vite project:** [Manual installation](#docs/_getting-started/concorde-manual-install.md/concorde-manual-install), then **`ai-init`** after `yarn add @supersoniks/concorde`.
72
72
  3. Commit `.cursor/` and `.aiassistant/` (and `AGENTS.md` only if you opted in / it was created) if your team shares agent settings.
73
73
  4. Re-run the same command when you bump `@supersoniks/concorde` to refresh skills from `node_modules/@supersoniks/concorde/ai/`.
74
74
  5. In Cursor, skills under `.cursor/skills/` are picked up automatically; mention a skill in chat for focused tasks (e.g. migration → `concorde-get-set-dp`).