@supersoniks/concorde 5.0.0 → 5.0.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 (287) hide show
  1. package/.gitlab-ci.yml +0 -13
  2. package/build-infos.json +1 -1
  3. package/concorde-core.bundle.js +257 -273
  4. package/concorde-core.es.js +4127 -4039
  5. package/dist/concorde-core.bundle.js +257 -273
  6. package/dist/concorde-core.es.js +4127 -4039
  7. package/gitlab/job_tests.sh +25 -12
  8. package/index.html +1 -1
  9. package/package.json +3 -1
  10. package/scripts/post-build-docs.js +0 -0
  11. package/scripts/post-build.mjs +0 -0
  12. package/src/core/components/functional/fetch/fetch.md +0 -0
  13. package/src/core/components/functional/if/if.md +0 -0
  14. package/src/core/components/functional/list/list.demo.ts +0 -0
  15. package/src/core/components/functional/list/list.md +0 -0
  16. package/src/core/components/functional/list/list.ts +0 -0
  17. package/src/core/components/functional/router/router.md +0 -0
  18. package/src/core/components/functional/router/router.ts +0 -0
  19. package/src/core/components/functional/sdui/sdui.md +0 -0
  20. package/src/core/components/functional/states/states.md +0 -0
  21. package/src/core/components/functional/submit/submit.md +0 -0
  22. package/src/core/components/ui/_css/size.ts +0 -0
  23. package/src/core/components/ui/alert/alert.ts +0 -0
  24. package/src/core/components/ui/button/button.md +0 -0
  25. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  26. package/src/core/components/ui/captcha/captcha.md +0 -0
  27. package/src/core/components/ui/card/card.md +0 -0
  28. package/src/core/components/ui/divider/divider.ts +0 -0
  29. package/src/core/components/ui/form/input/input.md +0 -0
  30. package/src/core/components/ui/form/radio/radio.md +0 -0
  31. package/src/core/components/ui/form/select/select.md +0 -0
  32. package/src/core/components/ui/form/switch/switch.md +0 -0
  33. package/src/core/components/ui/loader/loader.md +0 -0
  34. package/src/core/components/ui/menu/menu.md +0 -0
  35. package/src/core/components/ui/modal/modal-close.ts +0 -0
  36. package/src/core/components/ui/modal/modal.md +0 -0
  37. package/src/core/components/ui/pop/pop.md +103 -1
  38. package/src/core/components/ui/pop/pop.ts +70 -115
  39. package/src/core/components/ui/table/table-caption.ts +0 -0
  40. package/src/core/components/ui/table/table.md +0 -0
  41. package/src/core/components/ui/theme/theme.ts +1 -1
  42. package/src/core/components/ui/tooltip/tooltip.ts +178 -154
  43. package/src/core/utils/positioning.spec.ts +180 -0
  44. package/src/core/utils/positioning.ts +164 -0
  45. package/src/core/utils/route.ts +0 -0
  46. package/src/directives.ts +2 -3
  47. package/src/docs/_core-concept/subscriber.md +0 -0
  48. package/src/docs/_getting-started/concorde-outside.md +0 -0
  49. package/src/docs/_getting-started/my-first-subscriber.md +0 -0
  50. package/src/docs/_getting-started/pubsub.md +0 -0
  51. package/src/docs/_getting-started/start.md +0 -0
  52. package/src/docs/example/users.ts +0 -0
  53. package/src/docs/search/docs-search.json +90 -0
  54. package/src/docs/search/page.ts +0 -0
  55. package/src/docs/tailwind/css/tailwind.css +7 -6
  56. package/src/tsconfig.json +387 -381
  57. package/src/tsconfig.tsbuildinfo +1 -1
  58. package/vitest.setup.ts +49 -13
  59. package/.github/workflows/ci.yml +0 -21
  60. package/.github-export-ignore +0 -30
  61. package/CONTRIBUTING.md +0 -59
  62. package/DEV.md +0 -54
  63. package/LICENSE +0 -21
  64. package/OPEN_SOURCE_CHECKPOINT.md +0 -133
  65. package/concorde-3d.bundle.js +0 -3960
  66. package/concorde-3d.es.js +0 -33433
  67. package/concorde-hugging-face-infer.bundle.js +0 -32
  68. package/concorde-hugging-face-infer.es.js +0 -2952
  69. package/concorde-shader.bundle.js +0 -116
  70. package/concorde-shader.es.js +0 -8353
  71. package/concorde-webgpu.bundle.js +0 -307
  72. package/concorde-webgpu.es.js +0 -8627
  73. package/docs/altcha-widget.js +0 -2662
  74. package/docs/assets/index-BZiZXMU-.css +0 -1
  75. package/docs/assets/index-FmK4JaIM.js +0 -11992
  76. package/docs/crawl/core/components/functional/date/date.html +0 -190
  77. package/docs/crawl/core/components/functional/fetch/fetch.html +0 -109
  78. package/docs/crawl/core/components/functional/if/if.html +0 -27
  79. package/docs/crawl/core/components/functional/jsonata/jsonata.html +0 -79
  80. package/docs/crawl/core/components/functional/list/list.html +0 -70
  81. package/docs/crawl/core/components/functional/mix/mix.html +0 -45
  82. package/docs/crawl/core/components/functional/queue/queue.html +0 -96
  83. package/docs/crawl/core/components/functional/router/router.html +0 -106
  84. package/docs/crawl/core/components/functional/sdui/sdui.html +0 -269
  85. package/docs/crawl/core/components/functional/states/states.html +0 -66
  86. package/docs/crawl/core/components/functional/submit/submit.html +0 -160
  87. package/docs/crawl/core/components/functional/subscriber/subscriber.html +0 -67
  88. package/docs/crawl/core/components/functional/value/value.html +0 -51
  89. package/docs/crawl/core/components/ui/alert/alert.html +0 -110
  90. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +0 -23
  91. package/docs/crawl/core/components/ui/badge/badge.html +0 -119
  92. package/docs/crawl/core/components/ui/button/button.html +0 -149
  93. package/docs/crawl/core/components/ui/captcha/captcha.html +0 -30
  94. package/docs/crawl/core/components/ui/card/card.html +0 -99
  95. package/docs/crawl/core/components/ui/divider/divider.html +0 -58
  96. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +0 -73
  97. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +0 -135
  98. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +0 -79
  99. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +0 -62
  100. package/docs/crawl/core/components/ui/form/input/input.html +0 -109
  101. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +0 -106
  102. package/docs/crawl/core/components/ui/form/radio/radio.html +0 -56
  103. package/docs/crawl/core/components/ui/form/select/select.html +0 -73
  104. package/docs/crawl/core/components/ui/form/switch/switch.html +0 -56
  105. package/docs/crawl/core/components/ui/form/textarea/textarea.html +0 -59
  106. package/docs/crawl/core/components/ui/group/group.html +0 -82
  107. package/docs/crawl/core/components/ui/icon/icon.html +0 -133
  108. package/docs/crawl/core/components/ui/image/image.html +0 -110
  109. package/docs/crawl/core/components/ui/link/link.html +0 -42
  110. package/docs/crawl/core/components/ui/loader/loader.html +0 -50
  111. package/docs/crawl/core/components/ui/menu/menu.html +0 -322
  112. package/docs/crawl/core/components/ui/modal/modal.html +0 -117
  113. package/docs/crawl/core/components/ui/pop/pop.html +0 -102
  114. package/docs/crawl/core/components/ui/progress/progress.html +0 -58
  115. package/docs/crawl/core/components/ui/table/table.html +0 -413
  116. package/docs/crawl/core/components/ui/toast/toast.html +0 -122
  117. package/docs/crawl/core/components/ui/tooltip/tooltip.html +0 -79
  118. package/docs/crawl/docs/_core-concept/dataFlow.html +0 -177
  119. package/docs/crawl/docs/_core-concept/overview.html +0 -66
  120. package/docs/crawl/docs/_core-concept/subscriber.html +0 -75
  121. package/docs/crawl/docs/_decorators/ancestor-attribute.html +0 -116
  122. package/docs/crawl/docs/_decorators/auto-subscribe.html +0 -202
  123. package/docs/crawl/docs/_decorators/bind.html +0 -141
  124. package/docs/crawl/docs/_decorators/get.html +0 -149
  125. package/docs/crawl/docs/_decorators/handle.html +0 -165
  126. package/docs/crawl/docs/_decorators/on-assign.html +0 -355
  127. package/docs/crawl/docs/_decorators/patch.html +0 -78
  128. package/docs/crawl/docs/_decorators/post.html +0 -139
  129. package/docs/crawl/docs/_decorators/publish.html +0 -61
  130. package/docs/crawl/docs/_decorators/put.html +0 -78
  131. package/docs/crawl/docs/_decorators/subscribe.html +0 -109
  132. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +0 -137
  133. package/docs/crawl/docs/_directives/sub.html +0 -93
  134. package/docs/crawl/docs/_getting-started/ai-agents.html +0 -173
  135. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +0 -100
  136. package/docs/crawl/docs/_getting-started/concorde-outside.html +0 -58
  137. package/docs/crawl/docs/_getting-started/create-a-component.html +0 -111
  138. package/docs/crawl/docs/_getting-started/my-first-component.html +0 -189
  139. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +0 -110
  140. package/docs/crawl/docs/_getting-started/pubsub.html +0 -62
  141. package/docs/crawl/docs/_getting-started/start.html +0 -76
  142. package/docs/crawl/docs/_getting-started/theming.html +0 -85
  143. package/docs/crawl/docs/_misc/api-configuration.html +0 -149
  144. package/docs/crawl/docs/_misc/dataProviderKey.html +0 -135
  145. package/docs/crawl/docs/_misc/docs-mock-api.html +0 -158
  146. package/docs/crawl/docs/_misc/dynamic-path.html +0 -180
  147. package/docs/crawl/docs/_misc/endpoint.html +0 -50
  148. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +0 -138
  149. package/docs/crawl/docs/_misc/html-integration.html +0 -48
  150. package/docs/crawl/hubs/decorators.html +0 -547
  151. package/docs/crawl/hubs/form-components.html +0 -357
  152. package/docs/crawl/hubs/remote-data.html +0 -452
  153. package/docs/crawl/index.html +0 -101
  154. package/docs/css/docs.css +0 -0
  155. package/docs/docs-mock-api-sw.js +0 -720
  156. package/docs/docs-mock-api-sw.js.map +0 -7
  157. package/docs/fonts/ClashGrotesk-Bold.eot +0 -0
  158. package/docs/fonts/ClashGrotesk-Bold.ttf +0 -0
  159. package/docs/fonts/ClashGrotesk-Bold.woff +0 -0
  160. package/docs/fonts/ClashGrotesk-Bold.woff2 +0 -0
  161. package/docs/fonts/ClashGrotesk-Extralight.eot +0 -0
  162. package/docs/fonts/ClashGrotesk-Extralight.ttf +0 -0
  163. package/docs/fonts/ClashGrotesk-Extralight.woff +0 -0
  164. package/docs/fonts/ClashGrotesk-Extralight.woff2 +0 -0
  165. package/docs/fonts/ClashGrotesk-Light.eot +0 -0
  166. package/docs/fonts/ClashGrotesk-Light.ttf +0 -0
  167. package/docs/fonts/ClashGrotesk-Light.woff +0 -0
  168. package/docs/fonts/ClashGrotesk-Light.woff2 +0 -0
  169. package/docs/fonts/ClashGrotesk-Medium.eot +0 -0
  170. package/docs/fonts/ClashGrotesk-Medium.ttf +0 -0
  171. package/docs/fonts/ClashGrotesk-Medium.woff +0 -0
  172. package/docs/fonts/ClashGrotesk-Medium.woff2 +0 -0
  173. package/docs/fonts/ClashGrotesk-Regular.eot +0 -0
  174. package/docs/fonts/ClashGrotesk-Regular.ttf +0 -0
  175. package/docs/fonts/ClashGrotesk-Regular.woff +0 -0
  176. package/docs/fonts/ClashGrotesk-Regular.woff2 +0 -0
  177. package/docs/fonts/ClashGrotesk-Semibold.eot +0 -0
  178. package/docs/fonts/ClashGrotesk-Semibold.ttf +0 -0
  179. package/docs/fonts/ClashGrotesk-Semibold.woff +0 -0
  180. package/docs/fonts/ClashGrotesk-Semibold.woff2 +0 -0
  181. package/docs/fonts/ClashGrotesk-Variable.eot +0 -0
  182. package/docs/fonts/ClashGrotesk-Variable.ttf +0 -0
  183. package/docs/fonts/ClashGrotesk-Variable.woff +0 -0
  184. package/docs/fonts/ClashGrotesk-Variable.woff2 +0 -0
  185. package/docs/img/concorde-icon.svg +0 -5
  186. package/docs/img/concorde-logo.svg +0 -1
  187. package/docs/img/concorde.png +0 -0
  188. package/docs/img/concorde_def.png +0 -0
  189. package/docs/img/concorde_seuil.png.webp +0 -0
  190. package/docs/img/concorde_seuil_invert.png +0 -0
  191. package/docs/img/paul_metrand.jpg +0 -0
  192. package/docs/img/paul_metrand_xs.jpg +0 -0
  193. package/docs/index.html +0 -93
  194. package/docs/llms-full.txt +0 -5787
  195. package/docs/llms.txt +0 -104
  196. package/docs/robots.txt +0 -16
  197. package/docs/sitemap.xml +0 -237
  198. package/docs/src/core/components/functional/date/date.md +0 -290
  199. package/docs/src/core/components/functional/fetch/fetch.md +0 -125
  200. package/docs/src/core/components/functional/if/if.md +0 -9
  201. package/docs/src/core/components/functional/jsonata/jsonata.md +0 -56
  202. package/docs/src/core/components/functional/list/list.md +0 -65
  203. package/docs/src/core/components/functional/mix/mix.md +0 -41
  204. package/docs/src/core/components/functional/queue/queue.md +0 -72
  205. package/docs/src/core/components/functional/router/router.md +0 -94
  206. package/docs/src/core/components/functional/sdui/default-library.json +0 -108
  207. package/docs/src/core/components/functional/sdui/example.json +0 -99
  208. package/docs/src/core/components/functional/sdui/sdui.md +0 -356
  209. package/docs/src/core/components/functional/states/states.md +0 -87
  210. package/docs/src/core/components/functional/submit/submit.md +0 -114
  211. package/docs/src/core/components/functional/subscriber/subscriber.md +0 -91
  212. package/docs/src/core/components/functional/value/value.md +0 -35
  213. package/docs/src/core/components/ui/alert/alert.md +0 -121
  214. package/docs/src/core/components/ui/alert-messages/alert-messages.md +0 -0
  215. package/docs/src/core/components/ui/badge/badge.md +0 -127
  216. package/docs/src/core/components/ui/button/button.md +0 -182
  217. package/docs/src/core/components/ui/captcha/captcha.md +0 -12
  218. package/docs/src/core/components/ui/card/card.md +0 -97
  219. package/docs/src/core/components/ui/divider/divider.md +0 -35
  220. package/docs/src/core/components/ui/form/checkbox/checkbox.md +0 -77
  221. package/docs/src/core/components/ui/form/fieldset/fieldset.md +0 -129
  222. package/docs/src/core/components/ui/form/form-actions/form-actions.md +0 -77
  223. package/docs/src/core/components/ui/form/form-layout/form-layout.md +0 -44
  224. package/docs/src/core/components/ui/form/input/input.md +0 -142
  225. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -133
  226. package/docs/src/core/components/ui/form/radio/radio.md +0 -57
  227. package/docs/src/core/components/ui/form/select/select.md +0 -71
  228. package/docs/src/core/components/ui/form/switch/switch.md +0 -57
  229. package/docs/src/core/components/ui/form/textarea/textarea.md +0 -65
  230. package/docs/src/core/components/ui/group/group.md +0 -75
  231. package/docs/src/core/components/ui/icon/icon.md +0 -125
  232. package/docs/src/core/components/ui/icon/icons.json +0 -1
  233. package/docs/src/core/components/ui/image/image.md +0 -107
  234. package/docs/src/core/components/ui/link/link.md +0 -43
  235. package/docs/src/core/components/ui/loader/loader.md +0 -55
  236. package/docs/src/core/components/ui/menu/menu.md +0 -329
  237. package/docs/src/core/components/ui/modal/modal.md +0 -119
  238. package/docs/src/core/components/ui/pop/pop.md +0 -96
  239. package/docs/src/core/components/ui/progress/progress.md +0 -63
  240. package/docs/src/core/components/ui/table/table.md +0 -455
  241. package/docs/src/core/components/ui/toast/toast.md +0 -166
  242. package/docs/src/core/components/ui/tooltip/tooltip.md +0 -82
  243. package/docs/src/docs/_core-concept/dataFlow.md +0 -88
  244. package/docs/src/docs/_core-concept/overview.md +0 -57
  245. package/docs/src/docs/_core-concept/subscriber.md +0 -75
  246. package/docs/src/docs/_decorators/ancestor-attribute.md +0 -127
  247. package/docs/src/docs/_decorators/auto-subscribe.md +0 -202
  248. package/docs/src/docs/_decorators/bind.md +0 -167
  249. package/docs/src/docs/_decorators/get.md +0 -162
  250. package/docs/src/docs/_decorators/handle.md +0 -175
  251. package/docs/src/docs/_decorators/on-assign.md +0 -390
  252. package/docs/src/docs/_decorators/patch.md +0 -70
  253. package/docs/src/docs/_decorators/post.md +0 -146
  254. package/docs/src/docs/_decorators/publish.md +0 -55
  255. package/docs/src/docs/_decorators/put.md +0 -70
  256. package/docs/src/docs/_decorators/subscribe.md +0 -100
  257. package/docs/src/docs/_decorators/wait-for-ancestors.md +0 -163
  258. package/docs/src/docs/_directives/sub.md +0 -91
  259. package/docs/src/docs/_getting-started/ai-agents.md +0 -76
  260. package/docs/src/docs/_getting-started/concorde-manual-install.md +0 -133
  261. package/docs/src/docs/_getting-started/concorde-outside.md +0 -33
  262. package/docs/src/docs/_getting-started/create-a-component.md +0 -139
  263. package/docs/src/docs/_getting-started/my-first-component.md +0 -236
  264. package/docs/src/docs/_getting-started/my-first-subscriber.md +0 -120
  265. package/docs/src/docs/_getting-started/pubsub.md +0 -37
  266. package/docs/src/docs/_getting-started/start.md +0 -47
  267. package/docs/src/docs/_getting-started/theming.md +0 -91
  268. package/docs/src/docs/_misc/api-configuration.md +0 -81
  269. package/docs/src/docs/_misc/dataProviderKey.md +0 -168
  270. package/docs/src/docs/_misc/docs-mock-api.md +0 -63
  271. package/docs/src/docs/_misc/dynamic-path.md +0 -71
  272. package/docs/src/docs/_misc/endpoint.md +0 -45
  273. package/docs/src/docs/_misc/formelement-subscriber-removal.md +0 -115
  274. package/docs/src/docs/_misc/html-integration.md +0 -15
  275. package/docs/src/docs/search/docs-search.json +0 -9512
  276. package/docs/src/tag-list.json +0 -1
  277. package/docs/src/tsconfig-model.json +0 -23
  278. package/docs/src/tsconfig.declarations.json +0 -22
  279. package/docs/src/tsconfig.emit.json +0 -23
  280. package/docs/src/tsconfig.json +0 -858
  281. package/docs/svg/regular/plane.svg +0 -1
  282. package/docs/svg/solid/plane.svg +0 -1
  283. package/gitlab/job_github_mirror.sh +0 -39
  284. package/scripts/github-export.mjs +0 -150
  285. package/src/css.d.ts +0 -19
  286. package/src/tsconfig.declarations.json +0 -22
  287. package/src/tsconfig.emit.json +0 -23
@@ -1,547 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="fr" data-crawl-url="https://concorde.supersoniks.org/crawl/hubs/decorators.html" data-doc-id="hubs/decorators">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Concorde decorators reference — Concorde</title>
7
- <meta name="description" content="Hub for all Concorde Lit decorators: @get @post @put @patch @subscribe @publish @bind @handle and related. Use this page when asking about any decorator.">
8
- <meta name="keywords" content="decorator, @get, @post, @put, @patch, @subscribe, @publish, @bind, @handle, ApiResult, Endpoint, DataProviderKey">
9
- <meta name="concorde-doc-id" content="hubs/decorators">
10
- <link rel="canonical" href="https://concorde.supersoniks.org/crawl/hubs/decorators.html">
11
- </head>
12
- <body>
13
- <header>
14
- <p><a href="../index.html">Concorde documentation (crawl)</a></p>
15
- </header>
16
- <main>
17
- <article>
18
- <p class="doc-lead" id="doc-summary"><strong>Concorde documentation — Concorde decorators reference</strong>. Hub for all Concorde Lit decorators: @get @post @put @patch @subscribe @publish @bind @handle and related. Use this page when asking about any decorator. <span>Doc ID: <code>hubs/decorators</code>. Keywords: decorator, @get, @post, @put, @patch, @subscribe, @publish, @bind, @handle, ApiResult, Endpoint, DataProviderKey. URL: <a href="https://concorde.supersoniks.org/crawl/hubs/decorators.html">https://concorde.supersoniks.org/crawl/hubs/decorators.html</a>.</span></p>
19
- <section id="docs-_decorators-ancestor-attribute" data-doc-id="docs/_decorators/ancestor-attribute">
20
- <h2><a href="../docs/_decorators/ancestor-attribute.html">@ancestorAttribute</a></h2>
21
- <p><strong>Doc ID:</strong> <code>docs/_decorators/ancestor-attribute</code> · <a href="../docs/_decorators/ancestor-attribute.html">full page</a></p>
22
- <p>The @ancestorAttribute decorator automatically injects the value of an ancestor's attribute into a class property at the time of connectedCallback.</p>
23
- <pre class="doc-excerpt">@ancestorAttribute
24
-
25
- The @ancestorAttribute decorator automatically injects the value of an ancestor's attribute into a class property at the time of connectedCallback.
26
-
27
- Principle
28
-
29
- 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.
30
-
31
- Usage
32
-
33
- Import
34
-
35
- import { ancestorAttribute } from &quot;@supersoniks/concorde/decorators&quot;;
36
-
37
- Basic example
38
-
39
- The component reads dataProvider and testAttribute from its ancestor wrapper. By default (dynamic: false), values are read once at connect.
40
-
41
- import { html, LitElement } from &quot;lit&quot;;
42
- import { customElement } from &quot;lit/decorators.js&quot;;
43
- import { ancestorAttribute } from &quot;@supersoniks/concorde/decorators&quot;;
44
-
45
- @customElement(&quot;demo-ancestor-attribute&quot;)
46
- export class DemoAncestorAttribute extends LitElement {
47
- @ancestorAttribute(&quot;dataProvider&quot;)
48
- dataProvider: string | null = null;
49
-
50
- @ancestorAttribute(&quot;testAttribute&quot;)
51
- testAttribute: string | null = null;
52
-
53
- render() {
54
- return html
55
- dataProvider: ${this.dataProvider ?? &quot;null&quot;}
56
- testAttribute: ${this.testAttribute</pre>
57
- </section>
58
- <section id="docs-_decorators-auto-subscribe" data-doc-id="docs/_decorators/auto-subscribe">
59
- <h2><a href="../docs/_decorators/auto-subscribe.html">@autoSubscribe</a></h2>
60
- <p><strong>Doc ID:</strong> <code>docs/_decorators/auto-subscribe</code> · <a href="../docs/_decorators/auto-subscribe.html">full page</a></p>
61
- <p>&gt; Legacy: prefer @subscribe + DataProviderKey. Examples below may still show PublisherManager for existing codebases.</p>
62
- <pre class="doc-excerpt">@autoSubscribe
63
-
64
- &gt; Legacy: prefer @subscribe + DataProviderKey. Examples below may still show PublisherManager for existing codebases.
65
-
66
- 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.
67
-
68
- Principle
69
-
70
- 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.
71
-
72
- Usage
73
-
74
- Import
75
-
76
- import { autoSubscribe } from &quot;@supersoniks/concorde/decorators&quot;;
77
-
78
- Basic example
79
-
80
- @customElement(&quot;demo-auto-subscribe&quot;)
81
- export class DemoAutoSubscribe extends LitElement {
82
- static styles = [tailwind];
83
-
84
- @state() displayText: string = &quot;&quot;;
85
- @state() computedValue: number = 0;
86
-
87
- @autoSubscribe()
88
- updateDisplay() {
89
- const value1 = PublisherManager.get(&quot;autoValue1&quot;).get() || 0;
90
- const value2 = PublisherManager.get(&quot;autoValue2&quot;).get() || 0;
91
- this.computedValue = value1 + value2;
92
- this.displayText = ${value1} + ${value2} = ${this.computedValue};
93
- }
94
-
95
- </pre>
96
- </section>
97
- <section id="docs-_decorators-bind" data-doc-id="docs/_decorators/bind">
98
- <h2><a href="../docs/_decorators/bind.html">@bind</a></h2>
99
- <p><strong>Doc ID:</strong> <code>docs/_decorators/bind</code> · <a href="../docs/_decorators/bind.html">full page</a></p>
100
- <p>Binds a class property to a path in a publisher. The property updates when publisher data changes.</p>
101
- <pre class="doc-excerpt">@bind
102
-
103
- Binds a class property to a path in a publisher. The property updates when publisher data changes.
104
-
105
- For Lit re-renders, also add @state() on the same property.
106
-
107
- See also: @subscribe, @handle, @publish, @get, @post, @put, @patch.
108
-
109
- Principle
110
-
111
- The decorator subscribes to the DataProvider store using dot notation or a DataProviderKey. Updates flow into the decorated property (Data flow).
112
-
113
- Import
114
-
115
- import { bind } from &quot;@supersoniks/concorde/decorators&quot;;
116
-
117
- Example
118
-
119
- @customElement(&quot;demo-bind&quot;)
120
- export class DemoBind extends LitElement {
121
- static styles = [tailwind];
122
-
123
- @bind(&quot;demoData.firstName&quot;)
124
- @state()
125
- firstName = &quot;&quot;;
126
-
127
- @bind(&quot;demoData.lastName&quot;)
128
- @state()
129
- lastName: string = &quot;&quot;;
130
-
131
- @bind(&quot;demoData.count&quot;)
132
- @state()
133
- count: number = 0;
134
-
135
- render() {
136
- return //......
137
- }
138
-
139
- updateData() {
140
- set(demoDataKey, { ...get(demoDataKey), count: get(demoDataKey).count + 1 });
141
- // see demo-bind in src/docs/example/decorators-demo-bind-demos.ts
142
- const randomIndex = Math.floor(Math.random() demoUsers.get().length);
143
- const randomUser = demoUsers.get()[randomIndex];
144
- demoData.set({
145
- firstName: randomUser.firstName,
146
- lastName: randomUser.lastName,
147
- count:</pre>
148
- </section>
149
- <section id="docs-_decorators-get" data-doc-id="docs/_decorators/get">
150
- <h2><a href="../docs/_decorators/get.html">@get</a></h2>
151
- <p><strong>Doc ID:</strong> <code>docs/_decorators/get</code> · <a href="../docs/_decorators/get.html">full page</a></p>
152
- <p>@get loads data and stores the result in an optional ApiResult&lt;T&gt; property.</p>
153
- <pre class="doc-excerpt">@get
154
-
155
- @get loads data and stores the result in an optional ApiResult property.
156
- The property is undefined until a result is available.
157
-
158
- - payload.result: typed data;
159
- - payload.response: the HTTP response;
160
- - payload.request: the request that was sent.
161
-
162
- Minimal usage
163
-
164
- const usersEndpoint = new Endpoint (&quot;users&quot;);
165
-
166
- @get(usersEndpoint)
167
- @state()
168
- payload?: ApiResult ;
169
-
170
- The same decorator adapts to a method. The method receives the complete
171
- ApiResult payload after each GET:
172
-
173
- @get(usersEndpoint)
174
- handleUsers(payload?: ApiResult ) {
175
- if (!payload) return;
176
-
177
- console.log(payload.response?.status);
178
- console.log(payload.result);
179
- }
180
-
181
- The first argument is always an
182
- Endpoint . API configuration is read
183
- from the HTML scope (serviceURL, token, etc.), so the component is usually
184
- placed below an element that provides this configuration.
185
-
186
- Refetching a GET
187
-
188
- From the component
189
-
190
- Keep the decorator in a constant to access refetch(component). Refetch only
191
- targets the instance passed as the argument, even before it has received a
192
- result.
193
-
194
- const usersGet = get(new Endpoint (&quot;users&quot;));
195
-
196
- @usersGet
197
- @state()
198
- payload?: ApiResult ;
199
-
200
- async refresh() {
201
- const payload = await usersGet.refetch(this);
202
- console.log(</pre>
203
- </section>
204
- <section id="docs-_decorators-handle" data-doc-id="docs/_decorators/handle">
205
- <h2><a href="../docs/_decorators/handle.html">@handle</a></h2>
206
- <p><strong>Doc ID:</strong> <code>docs/_decorators/handle</code> · <a href="../docs/_decorators/handle.html">full page</a></p>
207
- <p>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.).</p>
208
- <pre class="doc-excerpt">@handle
209
-
210
- Typed callback on one or more DataProviderKey paths: invokes the decorated method when a publisher assigns a value (calculations, side effects, updating other @state properties, etc.).
211
-
212
- Unlike @subscribe, nothing is bound to the decorated member — only your method runs. @handle is typed and accepts up to 3 keys plus an optional trailing HandleOptions object. It supersedes the string-based @onAssign.
213
-
214
- By default the method is called on every assignment, even when the value is null / undefined. Use the options below to restrict that.
215
-
216
- Import
217
-
218
- import { handle, Skip } from &quot;@supersoniks/concorde/decorators&quot;;
219
- import { DataProviderKey } from &quot;@supersoniks/concorde/dataProviderKey&quot;;
220
- import { get, set } from &quot;@supersoniks/concorde/utils&quot;;
221
-
222
- Basic example
223
-
224
- type DemoCounterData = { count: number };
225
- const demoDataKey = new DataProviderKey&amp;lt;DemoCounterData&amp;gt;(&quot;demoData&quot;);
226
-
227
- @customElement(&quot;demo-handle&quot;)
228
- export class DemoHandle extends LitElement {
229
- @state() doubled = 0;
230
- @state() lastUpdate = &quot;&quot;;
231
-
232
- @handle(demoDataKey.count)
233
- onCountChange(count: number) {
234
- this.doubled = count 2;
235
- this.lastUpdate = new Date().toLocaleTimeString();
236
- }
237
-
238
- incrementCount() {
239
- const data</pre>
240
- </section>
241
- <section id="docs-_decorators-on-assign" data-doc-id="docs/_decorators/on-assign">
242
- <h2><a href="../docs/_decorators/on-assign.html">@onAssign</a></h2>
243
- <p><strong>Doc ID:</strong> <code>docs/_decorators/on-assign</code> · <a href="../docs/_decorators/on-assign.html">full page</a></p>
244
- <p>&gt; New apps: use @handle with DataProviderKey (Data flow). @onAssign uses untyped string paths; it remains documented for existing codebases — see Migrating to @handle below.</p>
245
- <pre class="doc-excerpt">@onAssign
246
-
247
- &gt; New apps: use @handle with DataProviderKey (Data flow). @onAssign uses untyped string paths; it remains documented for existing codebases — see Migrating to @handle below.
248
-
249
- The @onAssign decorator allows you to execute a method when one or more publishers are updated. The method is called only when all specified publishers have been assigned values.
250
-
251
- For a typed equivalent (recommended), use @handle.
252
-
253
- Principle
254
-
255
- This decorator subscribes to one or more publishers by string path (legacy). When all specified publishers have been assigned values (via set), the decorated method is called with all the values as arguments. Prefer @handle + DataProviderKey and get / set from Data flow.
256
-
257
- This is particularly useful when you need to wait for multiple data sources to be ready before executing logic.
258
-
259
- Usage
260
-
261
- Import
262
-
263
- import { onAssign } from &quot;@supersoniks/concorde/decorators&quot;;
264
-
265
- Basic example
266
-
267
- //...
268
- @customElement(&quot;demo-on-assign&quot;)
269
- export class DemoOnAssign extends LitElement {
270
- static styles = [tailwind];
271
-
272
- @state() userWithSettings: any = null;
273
- @state() isReady: boolean = false;
274
- @state() lastUpdate: string = &quot;&quot;;
275
-
276
- @onAssign(&quot;demoUser&quot;, &quot;demoUserSettings&quot;)
277
- handleDataReady</pre>
278
- </section>
279
- <section id="docs-_decorators-patch" data-doc-id="docs/_decorators/patch">
280
- <h2><a href="../docs/_decorators/patch.html">@patch</a></h2>
281
- <p><strong>Doc ID:</strong> <code>docs/_decorators/patch</code> · <a href="../docs/_decorators/patch.html">full page</a></p>
282
- <p>@patch applies a partial update with the body from a publisher. It uses the</p>
283
- <pre class="doc-excerpt">@patch
284
-
285
- @patch applies a partial update with the body from a publisher. It uses the
286
- same model as @post:
287
- Endpoint , DataProviderKey , ApiResult , options, and the
288
- send(component) handle.
289
-
290
- Minimal usage
291
-
292
- const bodyKey = new DataProviderKey &gt;(&quot;users.patch&quot;);
293
- const patchUser = patch(new Endpoint (&quot;users/42&quot;), bodyKey);
294
-
295
- @patchUser
296
- @state()
297
- payload?: ApiResult ;
298
-
299
- The same decorator adapts to a method:
300
-
301
- @patch(new Endpoint (&quot;users/42&quot;), bodyKey)
302
- handlePatch(payload?: ApiResult ) {
303
- if (payload?.response?.ok) console.log(payload.result);
304
- }
305
-
306
- To run the operation again from the component:
307
-
308
- async savePatch() {
309
- await patchUser.send(this);
310
- }
311
-
312
- send(component) returns a Promise resolved after the PATCH completes. See
313
- @post for the method-decorator form and the
314
- when: &quot;before&quot; option.
315
-
316
- The PATCH is also sent automatically when the body mutates, unless
317
- autoPostOnBodyMutation: false is set. The available options are described in
318
- @post:
319
-
320
- - autoPostOnBodyMutation
321
- - skipIfBodyMissing
322
- - refetchEveryMs
323
- - skipEmptyPlaceholder
324
- - triggerKey
325
-
326
- Pass explicit API configuration as the third argument:
327
-
328
- @patch(endpoint, bodyKey, apiConfigurationKey)
329
-
330
- Import
331
-
332
- import { patch, type ApiResult } from &quot;@supersoniks/</pre>
333
- </section>
334
- <section id="docs-_decorators-post" data-doc-id="docs/_decorators/post">
335
- <h2><a href="../docs/_decorators/post.html">@post</a></h2>
336
- <p><strong>Doc ID:</strong> <code>docs/_decorators/post</code> · <a href="../docs/_decorators/post.html">full page</a></p>
337
- <p>@post sends the contents of a publisher and stores the response in an</p>
338
- <pre class="doc-excerpt">@post
339
-
340
- @post sends the contents of a publisher and stores the response in an
341
- optional ApiResult property. The property is undefined until a result
342
- is available.
343
-
344
- Minimal usage
345
-
346
- Pass an Endpoint and a DataProviderKey for the request body.
347
-
348
- const userBodyKey = new DataProviderKey (&quot;users.form&quot;);
349
- const createUser = post(new Endpoint (&quot;users&quot;), userBodyKey);
350
-
351
- @createUser
352
- @state()
353
- payload?: ApiResult ;
354
-
355
- The same decorator adapts to a method and receives the complete payload:
356
-
357
- @post(new Endpoint (&quot;users&quot;), userBodyKey)
358
- handleCreate(payload?: ApiResult ) {
359
- if (payload?.response?.ok) console.log(payload.result);
360
- }
361
-
362
- The current body is read from userBodyKey. By default, the POST is sent when
363
- the component connects and after each body mutation. Mutations in the same
364
- frame are coalesced into one request.
365
-
366
- API configuration is read from the HTML scope, as with
367
- @get.
368
-
369
- Sending the POST again
370
-
371
- From the component
372
-
373
- Keep the decorator to access send(component). The body is read again when the
374
- operation runs.
375
-
376
- async saveAgain() {
377
- const payload = await createUser.send(this);
378
- console.log(payload?.result);
379
- }
380
-
381
- send() returns a Promise | undefined&gt; that resolves after the
382
- operation completes. It</pre>
383
- </section>
384
- <section id="docs-_decorators-publish" data-doc-id="docs/_decorators/publish">
385
- <h2><a href="../docs/_decorators/publish.html">@publish</a></h2>
386
- <p><strong>Doc ID:</strong> <code>docs/_decorators/publish</code> · <a href="../docs/_decorators/publish.html">full page</a></p>
387
- <p>Write-only binding: assigning to the property publishes to the DataProviderKey path. No read subscription (inverse of @subscribe).</p>
388
- <pre class="doc-excerpt">@publish
389
-
390
- Write-only binding: assigning to the property publishes to the DataProviderKey path. No read subscription (inverse of @subscribe).
391
-
392
- Similar to the “reflect” half of @bind without listening to the publisher.
393
-
394
- Import
395
-
396
- import { publish } from &quot;@supersoniks/concorde/decorators&quot;;
397
- import { sub } from &quot;@supersoniks/concorde/directives&quot;;
398
- import { DataProviderKey } from &quot;@supersoniks/concorde/dataProviderKey&quot;;
399
-
400
- Example
401
-
402
- type PublishDemoData = { email: string; message: string };
403
- const publishDemoKey = new DataProviderKey (&quot;publishDemo&quot;);
404
- //
405
- @customElement(&quot;demo-publish&quot;)
406
- export class DemoPublish extends LitElement {
407
- @publish(publishDemoKey.email)
408
- @state()
409
- email = &quot;&quot;;
410
- //
411
- @publish(publishDemoKey.message)
412
- @state()
413
- message = &quot;&quot;;
414
- //
415
- render() {
416
- return html
417
- (this.email = (e.target as HTMLInputElement).value)}
418
- label=&quot;Email&quot;
419
- &gt;
420
- ${sub(publishDemoKey.email)}
421
- ;
422
- }
423
- }
424
-
425
- Dynamic paths use the same placeholder rules as @bind / @subscribe. Resolution and skipEmptyPlaceholder: Dynamic path placeholders.</pre>
426
- </section>
427
- <section id="docs-_decorators-put" data-doc-id="docs/_decorators/put">
428
- <h2><a href="../docs/_decorators/put.html">@put</a></h2>
429
- <p><strong>Doc ID:</strong> <code>docs/_decorators/put</code> · <a href="../docs/_decorators/put.html">full page</a></p>
430
- <p>@put replaces a resource with the body from a publisher. It uses exactly the</p>
431
- <pre class="doc-excerpt">@put
432
-
433
- @put replaces a resource with the body from a publisher. It uses exactly the
434
- same model as @post:
435
- Endpoint , DataProviderKey , ApiResult , options, and the
436
- send(component) handle.
437
-
438
- Minimal usage
439
-
440
- const bodyKey = new DataProviderKey (&quot;users.form&quot;);
441
- const updateUser = put(new Endpoint (&quot;users/42&quot;), bodyKey);
442
-
443
- @updateUser
444
- @state()
445
- payload?: ApiResult ;
446
-
447
- The same decorator adapts to a method:
448
-
449
- @put(new Endpoint (&quot;users/42&quot;), bodyKey)
450
- handleUpdate(payload?: ApiResult ) {
451
- if (payload?.response?.ok) console.log(payload.result);
452
- }
453
-
454
- To run the operation again from the component:
455
-
456
- async update() {
457
- await updateUser.send(this);
458
- }
459
-
460
- send(component) returns a Promise resolved after the PUT completes. See
461
- @post for the method-decorator form and the
462
- when: &quot;before&quot; option.
463
-
464
- The PUT is also sent automatically when the body mutates, unless
465
- autoPostOnBodyMutation: false is set. See
466
- @post for the option details:
467
-
468
- - autoPostOnBodyMutation
469
- - skipIfBodyMissing
470
- - refetchEveryMs
471
- - skipEmptyPlaceholder
472
- - triggerKey
473
-
474
- Pass explicit API configuration as the third argument:
475
-
476
- @put(endpoint, bodyKey, apiConfigurationKey)
477
-
478
- Import
479
-
480
- import { put, type ApiResult } from &quot;@supersoniks/concorde/decorators&quot;;
481
- impo</pre>
482
- </section>
483
- <section id="docs-_decorators-subscribe" data-doc-id="docs/_decorators/subscribe">
484
- <h2><a href="../docs/_decorators/subscribe.html">@subscribe</a></h2>
485
- <p><strong>Doc ID:</strong> <code>docs/_decorators/subscribe</code> · <a href="../docs/_decorators/subscribe.html">full page</a></p>
486
- <p>Keeps a Lit property in sync with a read-only slice of the DataProvider store. You pass a DataProviderKey; when that path changes, the property updates and the component re-renders.</p>
487
- <pre class="doc-excerpt">@subscribe
488
-
489
- Keeps a Lit property in sync with a read-only slice of the DataProvider store. You pass a DataProviderKey; when that path changes, the property updates and the component re-renders.
490
-
491
- Typical setup (same idea as My first component):
492
-
493
- | Piece | Role |
494
- |-------|------|
495
- | Type T | Shape of the object at that path (DocsUserData, { count: number }, …) |
496
- | Key | DataProviderKey — static path (&quot;cart&quot;) or dynamic (&quot;users.${userIndex}&quot;, &quot;${dataProvider}&quot;) |
497
- | Scope on the host | Properties listed in U (e.g. dataProvider, userIndex) — often filled via @ancestorAttribute |
498
- | @subscribe(key) | Mirrors the store into @state() (or another property); read-only from the component side |
499
-
500
- For writing back to the store from component state, use @publish. In templates, the same paths work with sub().
501
-
502
- Import
503
-
504
- import { subscribe } from &quot;@supersoniks/concorde/decorators&quot;;
505
- import { DataProviderKey } from &quot;@supersoniks/concorde/dataProviderKey&quot;;
506
-
507
- type Data = { count: number };
508
- const dataKey = new DataProviderKey&amp;lt;Data&amp;gt;(&quot;data&quot;);
509
-
510
- @subscribe(dataKey.count)
511
- @state()
512
- count = 0;
513
-
514
- Static path
515
-
516
- The key path is fixed. The property type must match T at that segment.
517
-
518
- const cartKey = new DataProvi</pre>
519
- </section>
520
- <section id="docs-_decorators-wait-for-ancestors" data-doc-id="docs/_decorators/wait-for-ancestors">
521
- <h2><a href="../docs/_decorators/wait-for-ancestors.html">@awaitConnectedAncestors and @dispatchConnectedEvent</a></h2>
522
- <p><strong>Doc ID:</strong> <code>docs/_decorators/wait-for-ancestors</code> · <a href="../docs/_decorators/wait-for-ancestors.html">full page</a></p>
523
- <p>The @awaitConnectedAncestors and @dispatchConnectedEvent decorators delay a web component's initialization until its matching ancestors have executed their connectedCallback. This is when contextual e</p>
524
- <pre class="doc-excerpt">@awaitConnectedAncestors and @dispatchConnectedEvent
525
-
526
- The @awaitConnectedAncestors and @dispatchConnectedEvent decorators delay a web component's initialization until its matching ancestors have executed their connectedCallback. This is when contextual elements (publisher, dataProvider, etc.) are configured.
527
-
528
- Principle
529
-
530
- When a child component attaches to the DOM, its ancestors may not yet be initialized (especially if custom element definitions are loaded asynchronously). The @awaitConnectedAncestors decorator delays the component's connectedCallback until all ancestors matching the provided CSS selectors have executed their connectedCallback.
531
-
532
- The @dispatchConnectedEvent decorator allows ancestors to signal they are ready by dispatching the sonic-connected event at the end of their connectedCallback. The event bubbles, so it can be listened to from anywhere (e.g. document.addEventListener(CONNECTED, handler)).
533
-
534
- Ancestors that are not web components (no hyphen in tag name) are considered connected by default and do not need to emit the event.
535
-
536
- Usage
537
-
538
- Import
539
-
540
- import { awaitConnectedAncestors, dispatchConnectedEvent, ancestorAttribute } from &quot;@supersoniks/concorde/decorators&quot;;
541
-
542
- Basic</pre>
543
- </section>
544
- </article>
545
- </main>
546
- </body>
547
- </html>