@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,141 @@
1
+ <!DOCTYPE html>
2
+ <html lang="fr" data-crawl-url="https://concorde.supersoniks.org/crawl/docs/_decorators/bind.html" data-doc-id="docs/_decorators/bind">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>@bind — Concorde</title>
7
+ <meta name="description" content="Binds a class property to a path in a publisher. The property updates when publisher data changes.">
8
+ <meta name="keywords" content="Concorde, supersoniks, docs/_decorators/bind, bind, @bind, decorator, @state(), DataProviderKey, . Use , reflect: true, publisher.set(...)">
9
+ <meta name="concorde-doc-id" content="docs/_decorators/bind">
10
+ <link rel="canonical" href="https://concorde.supersoniks.org/crawl/docs/_decorators/bind.html">
11
+ </head>
12
+ <body>
13
+ <header>
14
+ <p><a href="../../index.html">Concorde documentation (crawl)</a> · <a href="https://concorde.supersoniks.org/#docs/_decorators/bind.md/bind" rel="nofollow">interactive version</a></p>
15
+ </header>
16
+ <main>
17
+ <article>
18
+ <p class="doc-lead" id="doc-summary"><strong>Concorde decorator — @bind</strong>. Binds a class property to a path in a publisher. The property updates when publisher data changes. <span>Doc ID: <code>docs/_decorators/bind</code>. Keywords: Concorde, supersoniks, docs/_decorators/bind, bind, @bind, decorator, @state(), DataProviderKey, . Use , reflect: true, publisher.set(...). URL: <a href="https://concorde.supersoniks.org/crawl/docs/_decorators/bind.html">https://concorde.supersoniks.org/crawl/docs/_decorators/bind.html</a>.</span></p>
19
+ <h1 id="bind">@bind</h1>
20
+ <p>Binds a class property to a path in a publisher. The property updates when publisher data changes.</p>
21
+ <p>For Lit re-renders, also add <code>@state()</code> on the same property.</p>
22
+ <p><strong>See also:</strong> <a href="./subscribe.html#subscribe">@subscribe</a>, <a href="./handle.html#handle">@handle</a>, <a href="./publish.html#publish">@publish</a>, <a href="./get.html#get">@get</a>, <a href="./post.html#post">@post</a>, <a href="./put.html#put">@put</a>, <a href="./patch.html#patch">@patch</a>.</p>
23
+ <h2 id="principle">Principle</h2>
24
+ <p>The decorator subscribes to the DataProvider store using dot notation or a <code>DataProviderKey</code>. Updates flow into the decorated property (<a href="../_core-concept/dataFlow.html#dataFlow">Data flow</a>).</p>
25
+ <h2 id="import">Import</h2>
26
+ <pre><code class="language-typescript">import { bind } from &quot;@supersoniks/concorde/decorators&quot;;
27
+ </code></pre>
28
+ <h2 id="example">Example</h2>
29
+ <pre><code class="language-typescript">@customElement(&quot;demo-bind&quot;)
30
+ export class DemoBind extends LitElement {
31
+ static styles = [tailwind];
32
+
33
+ @bind(&quot;demoData.firstName&quot;)
34
+ @state()
35
+ firstName = &quot;&quot;;
36
+
37
+ @bind(&quot;demoData.lastName&quot;)
38
+ @state()
39
+ lastName: string = &quot;&quot;;
40
+
41
+ @bind(&quot;demoData.count&quot;)
42
+ @state()
43
+ count: number = 0;
44
+
45
+ render() {
46
+ return //......
47
+ }
48
+
49
+ updateData() {
50
+ set(demoDataKey, { ...get(demoDataKey), count: get(demoDataKey).count + 1 });
51
+ // see demo-bind in src/docs/example/decorators-demo-bind-demos.ts
52
+ const randomIndex = Math.floor(Math.random() * demoUsers.get().length);
53
+ const randomUser = demoUsers.get()[randomIndex];
54
+ demoData.set({
55
+ firstName: randomUser.firstName,
56
+ lastName: randomUser.lastName,
57
+ count: (demoData.count.get() || 0) + 1,
58
+ });
59
+ }
60
+ }
61
+ </code></pre>
62
+ <pre><code>&lt;docs-demo-sources for=&quot;demo-bind&quot;&gt;&lt;/docs-demo-sources&gt;
63
+ &lt;demo-bind&gt;&lt;/demo-bind&gt;
64
+ </code></pre>
65
+ <h2 id="dataproviderkey-strict-typing"><code>DataProviderKey</code> (strict typing)</h2>
66
+ <p><code>@bind</code> accepts either a string path (legacy) or a <code>DataProviderKey&lt;T&gt;</code>. The property type must match <code>T</code>. Use <code>reflect: true</code> to push local writes back to the publisher (see below). See <a href="../_misc/dataProviderKey.html#dataProviderKey">DataProviderKey</a>.</p>
67
+ <pre><code class="language-typescript">import { bind } from &quot;@supersoniks/concorde/decorators&quot;;
68
+ import { DataProviderKey } from &quot;@supersoniks/concorde/dataProviderKey&quot;;
69
+
70
+ type Data = { count: number };
71
+ const dataKey = new DataProviderKey&lt;Data&gt;(&quot;data&quot;);
72
+
73
+ @bind(dataKey.count, { reflect: true })
74
+ @state()
75
+ count: number = 0;
76
+ </code></pre>
77
+ <h2 id="reflect-reflect-true">Reflect (<code>reflect: true</code>)</h2>
78
+ <p>Two-way sync: reads from the publisher and local assignments call <code>publisher.set(...)</code>. An internal guard avoids infinite loops.</p>
79
+ <pre><code class="language-typescript">@bind(&quot;userData.profile.avatarUrl&quot;, { reflect: true })
80
+ @state()
81
+ avatar: string;
82
+ </code></pre>
83
+ <pre><code class="language-typescript">@customElement(&quot;demo-bind-reflect&quot;)
84
+ export class DemoBindReflect extends LitElement {
85
+ static styles = [tailwind];
86
+
87
+ @bind(&quot;bindReflectDemo.count&quot;, { reflect: true })
88
+ @state()
89
+ withReflect: number = 0;
90
+
91
+ @bind(&quot;bindReflectDemo.count&quot;)
92
+ @state()
93
+ withoutReflect: number = 0;
94
+
95
+ render() {
96
+ return html`
97
+ &lt;div class=&quot;mb-3&quot;&gt;
98
+ from publisher : ${sub(&quot;bindReflectDemo.count&quot;) || 0} &lt;br /&gt;
99
+ from component with reflect : ${this.withReflect || 0} &lt;br /&gt;
100
+ from component without reflect : ${this.withoutReflect || 0}
101
+ &lt;/div&gt;
102
+ &lt;sonic-button @click=${() =&gt; this.withReflect++}
103
+ &gt;Increment with reflect&lt;/sonic-button
104
+ &gt;
105
+ &lt;sonic-button @click=${() =&gt; this.withoutReflect++}
106
+ &gt;Increment without reflect&lt;/sonic-button
107
+ &gt;
108
+ `;
109
+ }
110
+ }
111
+ </code></pre>
112
+ <pre><code>&lt;docs-demo-sources for=&quot;demo-bind-reflect&quot;&gt;&lt;/docs-demo-sources&gt;
113
+ &lt;demo-bind-reflect&gt;&lt;/demo-bind-reflect&gt;
114
+ </code></pre>
115
+ <h2 id="path-syntax">Path syntax</h2>
116
+ <ul>
117
+ <li>First segment: data provider id.</li>
118
+ <li>Nested properties: dot notation.</li>
119
+ <li>Arrays: numeric index (<code>items.0</code>).</li>
120
+ </ul>
121
+ <h3 id="dynamic-paths">Dynamic paths</h3>
122
+ <p>Use <code>${prop}</code> or <code>${this.prop}</code> inside a <strong>normal string literal</strong> (not a JS template literal with backticks). <code>@bind</code> re-subscribes when a reactive dependency changes. While a placeholder is <code>null</code>/<code>undefined</code>, the bind is inactive; optional <code>{ skipEmptyPlaceholder: true }</code> also waits on <code>&quot;&quot;</code>. See <a href="../_misc/dynamic-path.html#dynamic-path">Dynamic path placeholders</a>.</p>
123
+ <blockquote>
124
+ <p>Properties referenced in the pattern must be reactive (<code>@property</code>, etc.) or you must call <code>requestUpdate</code> manually.</p>
125
+ </blockquote>
126
+ <pre><code>&lt;docs-demo-sources for=&quot;demo-bind-dynamic&quot;&gt;&lt;/docs-demo-sources&gt;
127
+ &lt;demo-bind-dynamic&gt;&lt;/demo-bind-dynamic&gt;
128
+ </code></pre>
129
+ <h2 id="behavior">Behavior</h2>
130
+ <ul>
131
+ <li>Subscribes at <code>connectedCallback</code>, unsubscribes at <code>disconnectedCallback</code>.</li>
132
+ <li>If the path does not exist yet, a publisher may be created with <code>null</code>.</li>
133
+ </ul>
134
+ <h2 id="notes">Notes</h2>
135
+ <p>Works with any component that has the usual DOM lifecycle (<code>LitElement</code>, <code>Subscriber</code> mixin, etc.).</p>
136
+ <p>Shared data: <a href="../_getting-started/pubsub.html#pubsub">Sharing data</a>.</p>
137
+
138
+ </article>
139
+ </main>
140
+ </body>
141
+ </html>
@@ -0,0 +1,149 @@
1
+ <!DOCTYPE html>
2
+ <html lang="fr" data-crawl-url="https://concorde.supersoniks.org/crawl/docs/_decorators/get.html" data-doc-id="docs/_decorators/get">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>@get — Concorde</title>
7
+ <meta name="description" content="@get loads data and stores the result in an optional ApiResult&lt;T&gt; property.">
8
+ <meta name="keywords" content="Concorde, supersoniks, docs/_decorators/get, get, @get, decorator, ApiResult, undefined, payload.result, payload.response, payload.request,
9
+
10
+ The first argument is always an
11
+ [, serviceURL, refetch(component)">
12
+ <meta name="concorde-doc-id" content="docs/_decorators/get">
13
+ <link rel="canonical" href="https://concorde.supersoniks.org/crawl/docs/_decorators/get.html">
14
+ </head>
15
+ <body>
16
+ <header>
17
+ <p><a href="../../index.html">Concorde documentation (crawl)</a> · <a href="https://concorde.supersoniks.org/#docs/_decorators/get.md/get" rel="nofollow">interactive version</a></p>
18
+ </header>
19
+ <main>
20
+ <article>
21
+ <p class="doc-lead" id="doc-summary"><strong>Concorde decorator — @get</strong>. @get loads data and stores the result in an optional ApiResult&lt;T&gt; property. <span>Doc ID: <code>docs/_decorators/get</code>. Keywords: Concorde, supersoniks, docs/_decorators/get, get, @get, decorator, ApiResult, undefined, payload.result, payload.response, payload.request,
22
+
23
+ The first argument is always an
24
+ [, serviceURL, refetch(component). URL: <a href="https://concorde.supersoniks.org/crawl/docs/_decorators/get.html">https://concorde.supersoniks.org/crawl/docs/_decorators/get.html</a>.</span></p>
25
+ <h1 id="get">@get</h1>
26
+ <p><code>@get</code> loads data and stores the result in an optional <code>ApiResult&lt;T&gt;</code> property.
27
+ The property is <code>undefined</code> until a result is available.</p>
28
+ <ul>
29
+ <li><code>payload.result</code>: typed data;</li>
30
+ <li><code>payload.response</code>: the HTTP response;</li>
31
+ <li><code>payload.request</code>: the request that was sent.</li>
32
+ </ul>
33
+ <h2 id="minimal-usage">Minimal usage</h2>
34
+ <pre><code class="language-typescript">const usersEndpoint = new Endpoint&lt;User[]&gt;(&quot;users&quot;);
35
+
36
+ @get(usersEndpoint)
37
+ @state()
38
+ payload?: ApiResult&lt;User[]&gt;;
39
+ </code></pre>
40
+ <p>The same decorator adapts to a method. The method receives the complete
41
+ <code>ApiResult&lt;T&gt;</code> payload after each GET:</p>
42
+ <pre><code class="language-typescript">@get(usersEndpoint)
43
+ handleUsers(payload?: ApiResult&lt;User[]&gt;) {
44
+ if (!payload) return;
45
+
46
+ console.log(payload.response?.status);
47
+ console.log(payload.result);
48
+ }
49
+ </code></pre>
50
+ <p>The first argument is always an
51
+ <a href="../_misc/endpoint.html#endpoint"><code>Endpoint&lt;T&gt;</code></a>. API configuration is read
52
+ from the HTML scope (<code>serviceURL</code>, token, etc.), so the component is usually
53
+ placed below an element that provides this configuration.</p>
54
+ <h2 id="refetching-a-get">Refetching a GET</h2>
55
+ <h3 id="from-the-component">From the component</h3>
56
+ <p>Keep the decorator in a constant to access <code>refetch(component)</code>. Refetch only
57
+ targets the instance passed as the argument, even before it has received a
58
+ result.</p>
59
+ <pre><code class="language-typescript">const usersGet = get(new Endpoint&lt;User[]&gt;(&quot;users&quot;));
60
+
61
+ @usersGet
62
+ @state()
63
+ payload?: ApiResult&lt;User[]&gt;;
64
+
65
+ async refresh() {
66
+ const payload = await usersGet.refetch(this);
67
+ console.log(payload?.result);
68
+ }
69
+ </code></pre>
70
+ <p><code>refetch(component)</code> returns a <code>Promise&lt;ApiResult&lt;T&gt; | undefined&gt;</code> that resolves
71
+ after the GET has completed.</p>
72
+ <p>The named handle can also decorate a method and be reused for refetching:</p>
73
+ <pre><code class="language-typescript">const usersGet = get(new Endpoint&lt;User[]&gt;(&quot;users&quot;));
74
+
75
+ @usersGet
76
+ handleUsers(payload?: ApiResult&lt;User[]&gt;) {
77
+ // ...
78
+ }
79
+
80
+ @refetch(usersGet)
81
+ reloadUsers() {
82
+ // The GET runs and handleUsers receives its payload.
83
+ }
84
+ </code></pre>
85
+ <h3 id="from-a-method-decorator">From a method decorator</h3>
86
+ <p>The refetch can decorate a local method. The default is <code>after</code>; if the
87
+ method returns a Promise, the GET waits for its resolution. The decorated method
88
+ call also waits for the refetch to complete.</p>
89
+ <pre><code class="language-typescript">import { refetch } from &quot;@supersoniks/concorde/decorators&quot;;
90
+
91
+ @refetch(usersGet)
92
+ async reload() {
93
+ this.userId = &quot;42&quot;;
94
+ }
95
+ </code></pre>
96
+ <p>Use <code>{ when: &quot;before&quot; }</code> when the GET must complete before the method runs:</p>
97
+ <pre><code class="language-typescript">@refetch(usersGet, { when: &quot;before&quot; })
98
+ reloadBefore() {
99
+ // The refetch has completed before this method runs.
100
+ }
101
+ </code></pre>
102
+ <p>The method decorator adds an explicit trigger; changes to dynamic endpoint
103
+ properties and configuration publishers keep their existing automatic behavior.</p>
104
+ <h2 id="options-getoptions">Options (<code>GetOptions</code>)</h2>
105
+ <p>Options are the second argument, or the third argument when an API
106
+ configuration key is provided.</p>
107
+ <ul>
108
+ <li><code>skipEmptyPlaceholder</code>: blocks the GET when <code>${prop}</code> is <code>&quot;&quot;</code>.</li>
109
+ <li><code>refetchEveryMs</code>: automatically runs the GET again after this interval
110
+ (milliseconds). Omit the option, or use <code>0</code>, to disable polling.</li>
111
+ <li><code>triggerKey</code>: a publisher whose <code>invalidate()</code> runs the GET again.</li>
112
+ </ul>
113
+ <p>With a configuration key, use:</p>
114
+ <pre><code class="language-typescript">@get(usersEndpoint, apiConfigurationKey)
115
+ </code></pre>
116
+ <h2 id="when-the-get-runs-again">When the GET runs again</h2>
117
+ <ul>
118
+ <li>when the component connects and configuration is available;</li>
119
+ <li>when a property used in <code>${...}</code> changes;</li>
120
+ <li>when a configuration publisher changes;</li>
121
+ <li>when the <code>triggerKey</code> publisher is invalidated;</li>
122
+ <li>after each response when <code>refetchEveryMs</code> is set.</li>
123
+ </ul>
124
+ <p>See <a href="../_misc/dynamic-path.html#dynamic-path">Dynamic path placeholders</a> for
125
+ dynamic path details.</p>
126
+ <h2 id="import">Import</h2>
127
+ <pre><code class="language-typescript">import { get, type ApiResult } from &quot;@supersoniks/concorde/decorators&quot;;
128
+ import { DataProviderKey } from &quot;@supersoniks/concorde/dataProviderKey&quot;;
129
+ import { Endpoint } from &quot;@supersoniks/concorde/utils/endpoint&quot;;
130
+ </code></pre>
131
+ <h2 id="demos">Demos</h2>
132
+ <pre><code>&lt;docs-demo-sources for=&quot;demo-api-get&quot;&gt;&lt;/docs-demo-sources&gt;
133
+ &lt;demo-api-get&gt;&lt;/demo-api-get&gt;
134
+ &lt;docs-demo-sources for=&quot;demo-api-get-method&quot;&gt;&lt;/docs-demo-sources&gt;
135
+ &lt;demo-api-get-method&gt;&lt;/demo-api-get-method&gt;
136
+ &lt;docs-demo-sources for=&quot;demo-api-get-configuration-key&quot;&gt;&lt;/docs-demo-sources&gt;
137
+ &lt;demo-api-get-configuration-key&gt;&lt;/demo-api-get-configuration-key&gt;
138
+ </code></pre>
139
+ <p>See <a href="./post.html#post">@post</a>,
140
+ <a href="./put.html#put">@put</a>, and
141
+ <a href="./patch.html#patch">@patch</a> for write operations.</p>
142
+ <h2 id="advanced">Advanced</h2>
143
+ <p>External invalidation is currently available through <code>triggerKey</code>; it is kept
144
+ out of the main usage examples.</p>
145
+
146
+ </article>
147
+ </main>
148
+ </body>
149
+ </html>
@@ -0,0 +1,165 @@
1
+ <!DOCTYPE html>
2
+ <html lang="fr" data-crawl-url="https://concorde.supersoniks.org/crawl/docs/_decorators/handle.html" data-doc-id="docs/_decorators/handle">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>@handle — Concorde</title>
7
+ <meta name="description" content="Typed callback on one or more DataProviderKey&lt;T&gt; paths: invokes the decorated method when a publisher assigns a value (calculations, side effects, updating other @state properties, etc.).">
8
+ <meta name="keywords" content="Concorde, supersoniks, docs/_decorators/handle, handle, @handle, decorator, DataProviderKey, @state, HandleOptions, null, undefined, @bind, @subscribe, ${user.firstName} ${user.lastName}">
9
+ <meta name="concorde-doc-id" content="docs/_decorators/handle">
10
+ <link rel="canonical" href="https://concorde.supersoniks.org/crawl/docs/_decorators/handle.html">
11
+ </head>
12
+ <body>
13
+ <header>
14
+ <p><a href="../../index.html">Concorde documentation (crawl)</a> · <a href="https://concorde.supersoniks.org/#docs/_decorators/handle.md/handle" rel="nofollow">interactive version</a></p>
15
+ </header>
16
+ <main>
17
+ <article>
18
+ <p class="doc-lead" id="doc-summary"><strong>Concorde decorator — @handle</strong>. Typed callback on one or more DataProviderKey&lt;T&gt; paths: invokes the decorated method when a publisher assigns a value (calculations, side effects, updating other @state properties, etc.). <span>Doc ID: <code>docs/_decorators/handle</code>. Keywords: Concorde, supersoniks, docs/_decorators/handle, handle, @handle, decorator, DataProviderKey, @state, HandleOptions, null, undefined, @bind, @subscribe, ${user.firstName} ${user.lastName}. URL: <a href="https://concorde.supersoniks.org/crawl/docs/_decorators/handle.html">https://concorde.supersoniks.org/crawl/docs/_decorators/handle.html</a>.</span></p>
19
+ <h1 id="handle">@handle</h1>
20
+ <p>Typed callback on one or more <code>DataProviderKey&lt;T&gt;</code> paths: invokes the decorated <strong>method</strong> when a publisher assigns a value (calculations, side effects, updating other <code>@state</code> properties, etc.).</p>
21
+ <p>Unlike <a href="./subscribe.html#subscribe">@subscribe</a>, nothing is bound to the decorated member — only your method runs. <code>@handle</code> is typed and accepts up to <strong>3 keys</strong> plus an optional trailing <code>HandleOptions</code> object. It supersedes the string-based <a href="./on-assign.html#on-assign">@onAssign</a>.</p>
22
+ <p>By default the method is called on <strong>every</strong> assignment, even when the value is <code>null</code> / <code>undefined</code>. Use the options below to restrict that.</p>
23
+ <h2 id="import">Import</h2>
24
+ <pre><code class="language-typescript">import { handle, Skip } from &quot;@supersoniks/concorde/decorators&quot;;
25
+ import { DataProviderKey } from &quot;@supersoniks/concorde/dataProviderKey&quot;;
26
+ import { get, set } from &quot;@supersoniks/concorde/utils&quot;;
27
+ </code></pre>
28
+ <h2 id="basic-example">Basic example</h2>
29
+ <pre><code class="language-typescript">type DemoCounterData = { count: number };
30
+ const demoDataKey = new DataProviderKey&amp;lt;DemoCounterData&amp;gt;(&quot;demoData&quot;);
31
+
32
+ @customElement(&quot;demo-handle&quot;)
33
+ export class DemoHandle extends LitElement {
34
+ @state() doubled = 0;
35
+ @state() lastUpdate = &quot;&quot;;
36
+
37
+ @handle(demoDataKey.count)
38
+ onCountChange(count: number) {
39
+ this.doubled = count * 2;
40
+ this.lastUpdate = new Date().toLocaleTimeString();
41
+ }
42
+
43
+ incrementCount() {
44
+ const data = get(demoDataKey);
45
+ set(demoDataKey, { ...data, count: data.count + 1 });
46
+ }
47
+
48
+ render() {
49
+ return html`
50
+ &amp;lt;p&amp;gt;Doubled count: ${this.doubled}&amp;lt;/p&amp;gt;
51
+ &amp;lt;p&amp;gt;&amp;lt;small&amp;gt;Last update: ${this.lastUpdate}&amp;lt;/small&amp;gt;&amp;lt;/p&amp;gt;
52
+ &amp;lt;sonic-button @click=${this.incrementCount}&amp;gt;Increment&amp;lt;/sonic-button&amp;gt;
53
+ `;
54
+ }
55
+ }
56
+ </code></pre>
57
+ <pre><code>&lt;docs-demo-sources for=&quot;demo-handle&quot;&gt;&lt;/docs-demo-sources&gt;
58
+ &lt;demo-handle&gt;&lt;/demo-handle&gt;
59
+ </code></pre>
60
+ <h2 id="dynamic-path">Dynamic path</h2>
61
+ <p>Placeholders in <code>DataProviderKey</code> resolve from the host component’s properties (same rules as <code>@bind</code> / <code>@subscribe</code>).</p>
62
+ <pre><code class="language-typescript">type User = { firstName: string; lastName: string; email: string };
63
+
64
+ @customElement(&quot;demo-handle-dynamic&quot;)
65
+ export class DemoHandleDynamic extends LitElement {
66
+ @property({ type: Number })
67
+ userIndex = 0;
68
+
69
+ @state() displayName = &quot;&quot;;
70
+ @state() lastUpdate = &quot;&quot;;
71
+
72
+ @handle(new DataProviderKey&amp;lt;User, { userIndex: number }&amp;gt;(&quot;demoUsers.${userIndex}&quot;))
73
+ onUserAssigned(user: User) {
74
+ this.displayName = `${user.firstName} ${user.lastName}`;
75
+ this.lastUpdate = new Date().toLocaleTimeString();
76
+ }
77
+
78
+ render() {
79
+ return html`...`;
80
+ }
81
+ }
82
+ </code></pre>
83
+ <pre><code>&lt;docs-demo-sources for=&quot;demo-handle-dynamic&quot;&gt;&lt;/docs-demo-sources&gt;
84
+ &lt;demo-handle-dynamic&gt;&lt;/demo-handle-dynamic&gt;
85
+ </code></pre>
86
+ <h2 id="multiple-paths">Multiple paths</h2>
87
+ <p><code>@handle</code> accepts up to <strong>3 keys</strong>; the method receives one strongly-typed argument per key, in order. Each assignment triggers the method, so make your method safe against partial values (or use <code>waitForAllDefined</code>, see below).</p>
88
+ <pre><code class="language-typescript">type QueueConfig = { onInactivity: { stillHere: { show: boolean } } };
89
+ const config = new DataProviderKey&amp;lt;QueueConfig&amp;gt;(&quot;sessionQueueConfig&quot;);
90
+ const idle = new DataProviderKey&amp;lt;{ isIdle: boolean }&amp;gt;(&quot;idleStatus&quot;);
91
+
92
+ @customElement(&quot;demo-handle-multi&quot;)
93
+ export class DemoHandleMulti extends LitElement {
94
+
95
+ // show: boolean, isIdle: boolean — fully typed from the keys
96
+ @handle(config.onInactivity.stillHere.show, idle.isIdle)
97
+ onInactivity(show: boolean, isIdle: boolean) {
98
+ if (show === true &amp;&amp; isIdle === true) this.openModal();
99
+ else this.closeModal();
100
+ }
101
+ }
102
+ </code></pre>
103
+ <h2 id="options-handleoptions">Options (<code>HandleOptions</code>)</h2>
104
+ <p>Pass an options object as the <strong>last</strong> argument. The names map to real situations seen in the apps.</p>
105
+ <h3 id="waitforalldefined"><code>waitForAllDefined</code></h3>
106
+ <p>Only call the method once <strong>all</strong> watched keys are defined (non <code>null</code> / <code>undefined</code>). This reproduces the historical <code>@onAssign</code> semantics — use it when the logic only makes sense with every source ready (e.g. building a date from <code>date</code> + <code>timeZone</code> + <code>direction</code>).</p>
107
+ <pre><code class="language-typescript">@handle(trip.departureDate, trip.event.timeZone, form.direction, {
108
+ waitForAllDefined: true,
109
+ })
110
+ updateDepartureDate(date: number, timeZone: string, direction: string) {
111
+ // called only when the three values are all available
112
+ this.formDate = formatDate(date, timeZone, direction);
113
+ }
114
+ </code></pre>
115
+ <h3 id="skip"><code>skip</code></h3>
116
+ <p>Do <strong>not</strong> call the method when a received value belongs to one of the listed <strong>categories</strong> (the <code>Skip</code> enum). Each entry is a named category — not a value — so there is no value/pattern ambiguity (e.g. <code>{}</code> is <code>Skip.EmptyObject</code>, an explicit &quot;empty object&quot; category, never a value comparison).</p>
117
+ <table>
118
+ <thead>
119
+ <tr>
120
+ <th>Category</th>
121
+ <th>Matches</th>
122
+ </tr>
123
+ </thead>
124
+ <tbody><tr>
125
+ <td><code>Skip.Nullish</code></td>
126
+ <td><code>null</code> or <code>undefined</code> (a publisher always emits <code>null</code>, never <code>undefined</code>)</td>
127
+ </tr>
128
+ <tr>
129
+ <td><code>Skip.EmptyString</code></td>
130
+ <td><code>&quot;&quot;</code></td>
131
+ </tr>
132
+ <tr>
133
+ <td><code>Skip.EmptyObject</code></td>
134
+ <td>object with no keys (<code>{}</code>), arrays excluded</td>
135
+ </tr>
136
+ <tr>
137
+ <td><code>Skip.EmptyArray</code></td>
138
+ <td>empty array (<code>[]</code>)</td>
139
+ </tr>
140
+ </tbody></table>
141
+ <p>Useful when a not-yet-initialized publisher emits <code>{}</code> as a &quot;loading&quot; state. For a <strong>specific value</strong> (e.g. a particular string), guard inside the method instead.</p>
142
+ <pre><code class="language-typescript">@handle(user.profile, { skip: [Skip.Nullish, Skip.EmptyObject] })
143
+ onProfile(profile: Profile) {
144
+ // not called while the publisher still holds {} (not loaded yet)
145
+ this.displayName = profile.firstName;
146
+ }
147
+ </code></pre>
148
+ <blockquote>
149
+ <p>Options can be combined, e.g. <code>@handle(a, b, { waitForAllDefined: true, skip: [Skip.Nullish] })</code>. For any <strong>arbitrary</strong> validation on a specific value, just guard inside the method (<code>if (!isValid(v)) return;</code>) — that is exactly what an <code>accept</code>-style predicate would do, since <code>@handle</code> only runs your method.</p>
150
+ </blockquote>
151
+ <h3 id="skipemptyplaceholder"><code>skipEmptyPlaceholder</code></h3>
152
+ <p>On a <strong>dynamic key path</strong> (<code>&quot;items.${itemId}&quot;</code>), if <code>true</code>, a placeholder resolved to <code>&#39;&#39;</code> is treated as not ready (no subscription) — <strong>empty string only</strong>, not <code>0</code> or <code>false</code>. See <a href="../_misc/dynamic-path.html#dynamic-path">Dynamic path placeholders</a>.</p>
153
+ <h2 id="highlights">Highlights</h2>
154
+ <ul>
155
+ <li>Strict typing: the method receives one argument per key, in order.</li>
156
+ <li>Up to 3 keys; for 4+ keys (rare), keep <a href="./on-assign.html#on-assign">@onAssign</a> for now.</li>
157
+ <li>By default the method runs on <strong>every</strong> assignment, even with <code>null</code> / <code>undefined</code> (unlike <code>@onAssign</code>, which waits for all values). Opt back into that behavior with <code>waitForAllDefined</code>.</li>
158
+ <li><code>skip</code> filters out values by <strong>named category</strong> (e.g. <code>[Skip.Nullish, Skip.EmptyObject]</code>); for arbitrary checks on a specific value, guard inside the method.</li>
159
+ </ul>
160
+ <p>See also <a href="../_misc/dataProviderKey.html#dataProviderKey">DataProviderKey</a> and <a href="../_misc/dynamic-path.html#dynamic-path">Dynamic path placeholders</a>.</p>
161
+
162
+ </article>
163
+ </main>
164
+ </body>
165
+ </html>