@supersoniks/concorde 5.1.2 → 5.1.3-immutable.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +4993 -4833
  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 +4993 -4833
  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 +54 -0
  260. package/src/core/utils/immutableValue.ts +102 -0
  261. package/src/core/utils/nestedDotForm.spec.ts +88 -0
  262. package/src/core/utils/publisherImmutable.spec.ts +76 -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 +29 -55
  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,128 @@
1
+ # @ancestorAttribute
2
+
3
+ The `@ancestorAttribute` decorator automatically injects the value of an ancestor's attribute into a class property at the time of `connectedCallback`.
4
+
5
+ ## Principle
6
+
7
+ This decorator uses `HTML.getAncestorAttributeValue` to traverse up the DOM tree from the current element and find the first ancestor that has the specified attribute. The value of this attribute is then assigned to the decorated property.
8
+
9
+ ## Usage
10
+
11
+ ### Import
12
+
13
+ <sonic-code language="typescript">
14
+ <template>
15
+ import { ancestorAttribute } from "@supersoniks/concorde/decorators";
16
+ </template>
17
+ </sonic-code>
18
+
19
+ ### Basic example
20
+
21
+ The component reads `dataProvider` and `testAttribute` from its ancestor wrapper. By default (`dynamic: false`), values are read once at connect.
22
+
23
+ <sonic-code language="typescript">
24
+ <template>
25
+ import { html, LitElement } from "lit";
26
+ import { customElement } from "lit/decorators.js";
27
+ import { ancestorAttribute } from "@supersoniks/concorde/decorators";
28
+
29
+ @customElement("demo-ancestor-attribute")
30
+ export class DemoAncestorAttribute extends LitElement {
31
+ @ancestorAttribute("dataProvider")
32
+ dataProvider: string | null = null;
33
+
34
+ @ancestorAttribute("testAttribute")
35
+ testAttribute: string | null = null;
36
+
37
+ render() {
38
+ return html`
39
+ <p>dataProvider: <strong>${this.dataProvider ?? "null"}</strong></p>
40
+ <p>testAttribute: <strong>${this.testAttribute ?? "null"}</strong></p>
41
+ `;
42
+ }
43
+ }
44
+ </template>
45
+ </sonic-code>
46
+
47
+ <sonic-code>
48
+ <template>
49
+ <div dataProvider="demoDataProvider" testAttribute="test-value-123">
50
+ <docs-demo-sources for="demo-ancestor-attribute"></docs-demo-sources>
51
+ <demo-ancestor-attribute></demo-ancestor-attribute>
52
+ </div>
53
+ </template>
54
+ </sonic-code>
55
+
56
+ ## Use cases
57
+
58
+ This decorator is particularly useful for:
59
+
60
+ - **Retrieving the `dataProvider`** from an ancestor without having to pass it explicitly
61
+ - **Retrieving the `formDataProvider`** in form components
62
+ - **Retrieving the `wordingProvider`** for translation
63
+ - **Retrieving any other attribute** defined on an ancestor
64
+
65
+ ## Behavior
66
+
67
+ - The search starts from the current element and traverses up the DOM tree
68
+ - The injection happens automatically at the time of `connectedCallback`
69
+ - By default (`dynamic: false`), the value is read once at connect time and is not updated afterward
70
+ - With `{ dynamic: true }`, the property stays in sync when:
71
+ - an ancestor **changes** the attribute value
72
+ - a **closer** ancestor **gains** / **loses** the attribute (fallback / `null`)
73
+ - the component is **reparented** (no extra opt-in) — parent `childList` only reacts if *this* node moves
74
+ - Observers are **shared** (one per ancestor attribute / one per parent) so large lists of `sonic-icon` stay cheap on Firefox.
75
+ - When `dynamic` is enabled, updates also propagate to `@subscribe` / `@bind` paths that depend on the decorated property (e.g. `${dataProvider}`)
76
+
77
+ ### Dynamic mode
78
+
79
+ Use `{ dynamic: true }` when the decorated property must follow the DOM. With Lit, add **`@state()`** on the same property so template updates are visible when the observer assigns a new value.
80
+
81
+ The live demo below shows only the resolved attribute value — no store, no reparenting.
82
+
83
+ <sonic-code language="typescript">
84
+ <template>
85
+ @customElement("demo-ancestor-attribute-dynamic")
86
+ export class DemoAncestorAttributeDynamic extends LitElement {
87
+ @ancestorAttribute("dataProvider", { dynamic: true })
88
+ @state()
89
+ dataProvider: string | null = null;
90
+
91
+ render() {
92
+ return html`
93
+ &lt;p&gt;Nearest ancestor: &lt;strong&gt;${this.dataProvider ?? "null"}&lt;/strong&gt;&lt;/p&gt;
94
+ `;
95
+ }
96
+ }
97
+ </template>
98
+ </sonic-code>
99
+
100
+ Try in the demo:
101
+
102
+ - **parent-a** / **parent-b** — change the value on the direct parent
103
+ - **Remove parent attr** — falls back to **outer**
104
+ - **Add closer** — a wrapper with `from-closer` becomes the nearest ancestor
105
+ - **Remove closer** — back to parent or outer
106
+ - **Remove outer attr** — if parent has no attribute either, the child shows `null`
107
+
108
+ <sonic-code>
109
+ <template>
110
+ <docs-demo-sources for="demo-ancestor-attribute-dynamic-section"></docs-demo-sources>
111
+ <demo-ancestor-attribute-dynamic-section></demo-ancestor-attribute-dynamic-section>
112
+ </template>
113
+ </sonic-code>
114
+
115
+ Static mode (default) — read once at connect, no observer:
116
+
117
+ <sonic-code language="typescript">
118
+ <template>
119
+ @ancestorAttribute("dataProvider")
120
+ dataProvider: string | null = null;
121
+ </template>
122
+ </sonic-code>
123
+
124
+ ## Notes
125
+
126
+ - This decorator works with any component that has a `connectedCallback` method (such as `LitElement` or components extending `Subscriber`)
127
+ - The search also traverses Shadow DOM if necessary
128
+ - If multiple ancestors have the attribute, the closest one will be used
@@ -0,0 +1,202 @@
1
+ # @autoSubscribe
2
+
3
+ > **Legacy:** prefer [@subscribe](#docs/_decorators/subscribe.md/subscribe) + `DataProviderKey`. Examples below may still show `PublisherManager` for existing codebases.
4
+
5
+ The `@autoSubscribe` decorator automatically detects which publishers are accessed within a method and subscribes to them. When any of these publishers change, the method is automatically re-executed.
6
+
7
+ ## Principle
8
+
9
+ This decorator wraps a method to track which publishers are accessed during its execution. It then subscribes to all accessed publishers, and when any of them change, the method is re-executed. This provides automatic reactivity without manually managing subscriptions.
10
+
11
+ ## Usage
12
+
13
+ ### Import
14
+
15
+ <sonic-code language="typescript">
16
+ <template>
17
+ import { autoSubscribe } from "@supersoniks/concorde/decorators";
18
+ </template>
19
+ </sonic-code>
20
+
21
+ ### Basic example
22
+
23
+
24
+ <sonic-code language="typescript">
25
+ <template>
26
+ @customElement("demo-auto-subscribe")
27
+ export class DemoAutoSubscribe extends LitElement {
28
+ static styles = [tailwind];
29
+
30
+ @state() displayText: string = "";
31
+ @state() computedValue: number = 0;
32
+
33
+ @autoSubscribe()
34
+ updateDisplay() {
35
+ const value1 = PublisherManager.get("autoValue1").get() || 0;
36
+ const value2 = PublisherManager.get("autoValue2").get() || 0;
37
+ this.computedValue = value1 + value2;
38
+ this.displayText = `${value1} + ${value2} = ${this.computedValue}`;
39
+ }
40
+
41
+ render() {
42
+ return html`
43
+ <p><strong>${this.displayText}</strong></p>
44
+ <div>
45
+ <sonic-button @click=${() => this.randomizeValue("autoValue1")}>
46
+ Randomize Value 1
47
+ </sonic-button>
48
+ <sonic-button @click=${() => this.randomizeValue("autoValue2")}>
49
+ Randomize Value 2
50
+ </sonic-button>
51
+ </div>
52
+ `;
53
+ }
54
+
55
+ randomizeValue(publisherId: string) {
56
+ const value = PublisherManager.get(publisherId);
57
+ value.set(Math.floor(Math.random() * 100));
58
+ }
59
+ }
60
+ </template>
61
+ </sonic-code>
62
+
63
+
64
+ <sonic-code >
65
+ <template>
66
+ <docs-demo-sources for="demo-auto-subscribe"></docs-demo-sources>
67
+ <demo-auto-subscribe></demo-auto-subscribe>
68
+ </template>
69
+ </sonic-code>
70
+
71
+ ### Example with render method
72
+
73
+ <sonic-code language="typescript">
74
+ <template>
75
+ @customElement("reactive-view")
76
+ export class ReactiveView extends LitElement {
77
+ @autoSubscribe()
78
+ render() {
79
+ const data = PublisherManager.get("myData");
80
+ const config = PublisherManager.get("config");
81
+
82
+ // This render method will be automatically re-executed
83
+ // when myData or config change
84
+ const value = data.get()?.value || 0;
85
+ const multiplier = config.get()?.multiplier || 1;
86
+
87
+ return html`
88
+ <div>
89
+ <h1>Result: ${value * multiplier}</h1>
90
+ <p>Value: ${value}</p>
91
+ <p>Multiplier: ${multiplier}</p>
92
+ </div>
93
+ `;
94
+ }
95
+ }
96
+ </template>
97
+ </sonic-code>
98
+
99
+ ## How it works
100
+
101
+ 1. **First execution**: When the method is called, `PublisherManager.collectModifiedPublisher()` is used to track which publishers are accessed
102
+ 2. **Subscription**: After execution, the decorator subscribes to all detected publishers
103
+ 3. **Re-execution**: When any subscribed publisher changes, the method is automatically called again
104
+ 4. **Cleanup**: On `disconnectedCallback`, all subscriptions are automatically removed
105
+
106
+ ## Behavior
107
+
108
+ - The method is automatically called on `connectedCallback`
109
+ - The method is re-executed whenever any accessed publisher changes
110
+ - Subscriptions are managed automatically (no manual cleanup needed)
111
+ - Only publishers accessed during method execution are subscribed to
112
+ - The decorator uses `queueMicrotask` to batch multiple updates and avoid unnecessary re-renders
113
+
114
+ ## Use cases
115
+
116
+ This decorator is particularly useful for:
117
+
118
+ - **Reactive rendering** where the render method depends on multiple publishers
119
+ - **Data transformation** that needs to update when source data changes
120
+ - **Computed properties** that depend on multiple data sources
121
+ - **Automatic synchronization** between publishers and component state
122
+
123
+ ## Complete example
124
+
125
+ <sonic-code language="typescript">
126
+ <template>
127
+ import { html, LitElement } from "lit";
128
+ import { customElement } from "lit/decorators.js";
129
+ import { autoSubscribe } from "@supersoniks/concorde/decorators";
130
+ import { PublisherManager } from "@supersoniks/concorde/core/utils/PublisherProxy";
131
+
132
+ @customElement("shopping-cart")
133
+ export class ShoppingCart extends LitElement {
134
+ items: any[] = [];
135
+ total: number = 0;
136
+ discount: number = 0;
137
+
138
+ @autoSubscribe()
139
+ calculateTotal() {
140
+ const cart = PublisherManager.get("cart");
141
+ const promo = PublisherManager.get("promo");
142
+
143
+ // Access cart items
144
+ this.items = cart.items.get() || [];
145
+
146
+ // Access promo code
147
+ const promoCode = promo.code.get() || "";
148
+ const discountPercent = promoCode === "SAVE10" ? 0.1 : 0;
149
+
150
+ // Calculate totals
151
+ const subtotal = this.items.reduce((sum, item) =>
152
+ sum + (item.price * item.quantity), 0
153
+ );
154
+ this.discount = subtotal * discountPercent;
155
+ this.total = subtotal - this.discount;
156
+
157
+ this.requestUpdate();
158
+ }
159
+
160
+ connectedCallback() {
161
+ super.connectedCallback();
162
+ this.calculateTotal();
163
+ }
164
+
165
+ render() {
166
+ return html`
167
+ <div class="cart">
168
+ <h2>Shopping Cart</h2>
169
+ ${this.items.map(item => html`
170
+ <div>${item.name} x${item.quantity} - ${item.price}€</div>
171
+ `)}
172
+ <div class="total">
173
+ <p>Subtotal: ${this.total + this.discount}€</p>
174
+ <p>Discount: -${this.discount}€</p>
175
+ <p><strong>Total: ${this.total}€</strong></p>
176
+ </div>
177
+ </div>
178
+ `;
179
+ }
180
+ }
181
+
182
+ // When you update the publishers, calculateTotal is automatically called:
183
+ const cart = PublisherManager.get("cart");
184
+ cart.items.set([
185
+ { name: "Product 1", price: 10, quantity: 2 },
186
+ { name: "Product 2", price: 15, quantity: 1 }
187
+ ]);
188
+
189
+ const promo = PublisherManager.get("promo");
190
+ promo.code.set("SAVE10");
191
+ // calculateTotal will be automatically called and the UI will update
192
+ </template>
193
+ </sonic-code>
194
+
195
+ ## Notes
196
+
197
+ - This decorator works with any component that has `connectedCallback` and `disconnectedCallback` methods (such as `LitElement` or components extending `Subscriber`)
198
+ - The method is called automatically on `connectedCallback`
199
+ - Remember to call `this.requestUpdate()` if you're updating component properties
200
+ - The decorator uses debouncing via `queueMicrotask` to prevent excessive re-executions
201
+ - For more information about publishers, see the documentation on [Sharing data](#docs/_getting-started/pubsub.md/pubsub)
202
+
@@ -0,0 +1,167 @@
1
+ # @bind
2
+
3
+ Binds a class property to a path in a publisher. The property updates when publisher data changes.
4
+
5
+ For Lit re-renders, also add `@state()` on the same property.
6
+
7
+ **See also:** [@subscribe](#docs/_decorators/subscribe.md/subscribe), [@handle](#docs/_decorators/handle.md/handle), [@publish](#docs/_decorators/publish.md/publish), [@get](#docs/_decorators/get.md/get), [@post](#docs/_decorators/post.md/post), [@put](#docs/_decorators/put.md/put), [@patch](#docs/_decorators/patch.md/patch).
8
+
9
+ ## Principle
10
+
11
+ The decorator subscribes to the DataProvider store using dot notation or a `DataProviderKey`. Updates flow into the decorated property ([Data flow](#docs/_core-concept/dataFlow.md/dataFlow)).
12
+
13
+ ## Import
14
+
15
+ <sonic-code language="typescript">
16
+ <template>
17
+ import { bind } from "@supersoniks/concorde/decorators";
18
+ </template>
19
+ </sonic-code>
20
+
21
+ ## Example
22
+
23
+ <sonic-code language="typescript">
24
+ <template>
25
+ @customElement("demo-bind")
26
+ export class DemoBind extends LitElement {
27
+ static styles = [tailwind];
28
+
29
+ @bind("demoData.firstName")
30
+ @state()
31
+ firstName = "";
32
+
33
+ @bind("demoData.lastName")
34
+ @state()
35
+ lastName: string = "";
36
+
37
+ @bind("demoData.count")
38
+ @state()
39
+ count: number = 0;
40
+
41
+ render() {
42
+ return //......
43
+ }
44
+
45
+ updateData() {
46
+ set(demoDataKey, { ...get(demoDataKey), count: get(demoDataKey).count + 1 });
47
+ // see demo-bind in src/docs/example/decorators-demo-bind-demos.ts
48
+ const randomIndex = Math.floor(Math.random() * demoUsers.get().length);
49
+ const randomUser = demoUsers.get()[randomIndex];
50
+ demoData.set({
51
+ firstName: randomUser.firstName,
52
+ lastName: randomUser.lastName,
53
+ count: (demoData.count.get() || 0) + 1,
54
+ });
55
+ }
56
+ }
57
+
58
+ </template>
59
+ </sonic-code>
60
+
61
+ <sonic-code>
62
+ <template>
63
+ <docs-demo-sources for="demo-bind"></docs-demo-sources>
64
+ <demo-bind></demo-bind>
65
+ </template>
66
+ </sonic-code>
67
+
68
+ ## `DataProviderKey` (strict typing)
69
+
70
+ `@bind` accepts either a string path (legacy) or a `DataProviderKey<T>`. The property type must match `T`. Use `reflect: true` to push local writes back to the publisher (see below). See [DataProviderKey](#docs/_misc/dataProviderKey.md/dataProviderKey).
71
+
72
+ <sonic-code language="typescript">
73
+ <template>
74
+ import { bind } from "@supersoniks/concorde/decorators";
75
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
76
+
77
+ type Data = { count: number };
78
+ const dataKey = new DataProviderKey<Data>("data");
79
+
80
+ @bind(dataKey.count, { reflect: true })
81
+ @state()
82
+ count: number = 0;
83
+ </template>
84
+ </sonic-code>
85
+
86
+ ## Reflect (`reflect: true`)
87
+
88
+ Two-way sync: reads from the publisher and local assignments call `publisher.set(...)`. An internal guard avoids infinite loops.
89
+
90
+ <sonic-code language="typescript">
91
+ <template>
92
+ @bind("userData.profile.avatarUrl", { reflect: true })
93
+ @state()
94
+ avatar: string;
95
+ </template>
96
+ </sonic-code>
97
+
98
+ <sonic-code language="typescript">
99
+ <template>
100
+ @customElement("demo-bind-reflect")
101
+ export class DemoBindReflect extends LitElement {
102
+ static styles = [tailwind];
103
+
104
+ @bind("bindReflectDemo.count", { reflect: true })
105
+ @state()
106
+ withReflect: number = 0;
107
+
108
+ @bind("bindReflectDemo.count")
109
+ @state()
110
+ withoutReflect: number = 0;
111
+
112
+ render() {
113
+ return html`
114
+ <div class="mb-3">
115
+ from publisher : ${sub("bindReflectDemo.count") || 0} <br />
116
+ from component with reflect : ${this.withReflect || 0} <br />
117
+ from component without reflect : ${this.withoutReflect || 0}
118
+ </div>
119
+ <sonic-button @click=${() => this.withReflect++}
120
+ >Increment with reflect</sonic-button
121
+ >
122
+ <sonic-button @click=${() => this.withoutReflect++}
123
+ >Increment without reflect</sonic-button
124
+ >
125
+ `;
126
+ }
127
+ }
128
+
129
+ </template>
130
+ </sonic-code>
131
+
132
+ <sonic-code toggleCode>
133
+ <template>
134
+ <docs-demo-sources for="demo-bind-reflect"></docs-demo-sources>
135
+ <demo-bind-reflect></demo-bind-reflect>
136
+ </template>
137
+ </sonic-code>
138
+
139
+ ## Path syntax
140
+
141
+ - First segment: data provider id.
142
+ - Nested properties: dot notation.
143
+ - Arrays: numeric index (`items.0`).
144
+
145
+ ### Dynamic paths
146
+
147
+ Use `${prop}` or `${this.prop}` inside a **normal string literal** (not a JS template literal with backticks). `@bind` re-subscribes when a reactive dependency changes. While a placeholder is `null`/`undefined`, the bind is inactive; optional `{ skipEmptyPlaceholder: true }` also waits on `""`. See [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path).
148
+
149
+ > Properties referenced in the pattern must be reactive (`@property`, etc.) or you must call `requestUpdate` manually.
150
+
151
+ <sonic-code>
152
+ <template>
153
+ <docs-demo-sources for="demo-bind-dynamic"></docs-demo-sources>
154
+ <demo-bind-dynamic></demo-bind-dynamic>
155
+ </template>
156
+ </sonic-code>
157
+
158
+ ## Behavior
159
+
160
+ - Subscribes at `connectedCallback`, unsubscribes at `disconnectedCallback`.
161
+ - If the path does not exist yet, a publisher may be created with `null`.
162
+
163
+ ## Notes
164
+
165
+ Works with any component that has the usual DOM lifecycle (`LitElement`, `Subscriber` mixin, etc.).
166
+
167
+ Shared data: [Sharing data](#docs/_getting-started/pubsub.md/pubsub).
@@ -0,0 +1,162 @@
1
+ # @get
2
+
3
+ `@get` loads data and stores the result in an optional `ApiResult<T>` property.
4
+ The property is `undefined` until a result is available.
5
+
6
+ - `payload.result`: typed data;
7
+ - `payload.response`: the HTTP response;
8
+ - `payload.request`: the request that was sent.
9
+
10
+ ## Minimal usage
11
+
12
+ ```typescript
13
+ const usersEndpoint = new Endpoint<User[]>("users");
14
+
15
+ @get(usersEndpoint)
16
+ @state()
17
+ payload?: ApiResult<User[]>;
18
+ ```
19
+
20
+ The same decorator adapts to a method. The method receives the complete
21
+ `ApiResult<T>` payload after each GET:
22
+
23
+ ```typescript
24
+ @get(usersEndpoint)
25
+ handleUsers(payload?: ApiResult<User[]>) {
26
+ if (!payload) return;
27
+
28
+ console.log(payload.response?.status);
29
+ console.log(payload.result);
30
+ }
31
+ ```
32
+
33
+ The first argument is always an
34
+ [`Endpoint<T>`](#docs/_misc/endpoint.md/endpoint). API configuration is read
35
+ from the HTML scope (`serviceURL`, token, etc.), so the component is usually
36
+ placed below an element that provides this configuration.
37
+
38
+ ## Refetching a GET
39
+
40
+ ### From the component
41
+
42
+ Keep the decorator in a constant to access `refetch(component)`. Refetch only
43
+ targets the instance passed as the argument, even before it has received a
44
+ result.
45
+
46
+ ```typescript
47
+ const usersGet = get(new Endpoint<User[]>("users"));
48
+
49
+ @usersGet
50
+ @state()
51
+ payload?: ApiResult<User[]>;
52
+
53
+ async refresh() {
54
+ const payload = await usersGet.refetch(this);
55
+ console.log(payload?.result);
56
+ }
57
+ ```
58
+
59
+ `refetch(component)` returns a `Promise<ApiResult<T> | undefined>` that resolves
60
+ after the GET has completed.
61
+
62
+ The named handle can also decorate a method and be reused for refetching:
63
+
64
+ ```typescript
65
+ const usersGet = get(new Endpoint<User[]>("users"));
66
+
67
+ @usersGet
68
+ handleUsers(payload?: ApiResult<User[]>) {
69
+ // ...
70
+ }
71
+
72
+ @refetch(usersGet)
73
+ reloadUsers() {
74
+ // The GET runs and handleUsers receives its payload.
75
+ }
76
+ ```
77
+
78
+ ### From a method decorator
79
+
80
+ The refetch can decorate a local method. The default is `after`; if the
81
+ method returns a Promise, the GET waits for its resolution. The decorated method
82
+ call also waits for the refetch to complete.
83
+
84
+ ```typescript
85
+ import { refetch } from "@supersoniks/concorde/decorators";
86
+
87
+ @refetch(usersGet)
88
+ async reload() {
89
+ this.userId = "42";
90
+ }
91
+ ```
92
+
93
+ Use `{ when: "before" }` when the GET must complete before the method runs:
94
+
95
+ ```typescript
96
+ @refetch(usersGet, { when: "before" })
97
+ reloadBefore() {
98
+ // The refetch has completed before this method runs.
99
+ }
100
+ ```
101
+
102
+ The method decorator adds an explicit trigger; changes to dynamic endpoint
103
+ properties and configuration publishers keep their existing automatic behavior.
104
+
105
+ ## Options (`GetOptions`)
106
+
107
+ Options are the second argument, or the third argument when an API
108
+ configuration key is provided.
109
+
110
+ - `skipEmptyPlaceholder`: blocks the GET when `${prop}` is `""`.
111
+ - `refetchEveryMs`: automatically runs the GET again after this interval
112
+ (milliseconds). Omit the option, or use `0`, to disable polling.
113
+ - `triggerKey`: a publisher whose `invalidate()` runs the GET again.
114
+
115
+ With a configuration key, use:
116
+
117
+ ```typescript
118
+ @get(usersEndpoint, apiConfigurationKey)
119
+ ```
120
+
121
+ ## When the GET runs again
122
+
123
+ - when the component connects and configuration is available;
124
+ - when a property used in `${...}` changes;
125
+ - when a configuration publisher changes;
126
+ - when the `triggerKey` publisher is invalidated;
127
+ - after each response when `refetchEveryMs` is set.
128
+
129
+ See [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path) for
130
+ dynamic path details.
131
+
132
+ ## Import
133
+
134
+ <sonic-code language="typescript">
135
+ <template>
136
+ import { get, type ApiResult } from "@supersoniks/concorde/decorators";
137
+ import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
138
+ import { Endpoint } from "@supersoniks/concorde/utils/endpoint";
139
+ </template>
140
+ </sonic-code>
141
+
142
+ ## Demos
143
+
144
+ <sonic-code>
145
+ <template>
146
+ <docs-demo-sources for="demo-api-get"></docs-demo-sources>
147
+ <demo-api-get></demo-api-get>
148
+ <docs-demo-sources for="demo-api-get-method"></docs-demo-sources>
149
+ <demo-api-get-method></demo-api-get-method>
150
+ <docs-demo-sources for="demo-api-get-configuration-key"></docs-demo-sources>
151
+ <demo-api-get-configuration-key></demo-api-get-configuration-key>
152
+ </template>
153
+ </sonic-code>
154
+
155
+ See [@post](#docs/_decorators/post.md/post),
156
+ [@put](#docs/_decorators/put.md/put), and
157
+ [@patch](#docs/_decorators/patch.md/patch) for write operations.
158
+
159
+ ## Advanced
160
+
161
+ External invalidation is currently available through `triggerKey`; it is kept
162
+ out of the main usage examples.