@supersoniks/concorde 5.1.1 → 5.1.3-immutable.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/.agents/skills/concorde-docs/SKILL.md +153 -0
  2. package/.agents/skills/{concorde-component-docs/template.md → concorde-docs/templates/component.md} +6 -2
  3. package/.agents/skills/concorde-docs/templates/decorator.md +43 -0
  4. package/.agents/skills/concorde-docs/templates/guide.md +25 -0
  5. package/.claude/skills +1 -0
  6. package/.github/workflows/ci.yml +21 -0
  7. package/.github-export-ignore +30 -0
  8. package/CONTRIBUTING.md +59 -0
  9. package/DEV.md +54 -0
  10. package/LICENSE +21 -0
  11. package/OPEN_SOURCE_CHECKPOINT.md +133 -0
  12. package/README.md +4 -4
  13. package/ai/README.md +29 -41
  14. package/ai/skills/concorde/SKILL.md +54 -324
  15. package/ai/skills/concorde/rules/composition.md +32 -0
  16. package/ai/skills/concorde/rules/data.md +47 -0
  17. package/ai/skills/concorde/rules/http.md +25 -0
  18. package/ai/skills/concorde/rules/lists-forms.md +35 -0
  19. package/ai/skills/concorde/rules/styling.md +46 -0
  20. package/ai/skills/concorde/rules/troubleshooting.md +45 -0
  21. package/build-infos.json +1 -1
  22. package/concorde-core.bundle.js +177 -177
  23. package/concorde-core.es.js +4993 -4833
  24. package/custom-elements-manifest.public.config.mjs +8 -0
  25. package/{.tmp-cem/custom-elements.json → custom-elements.json} +11758 -8904
  26. package/dist/concorde-core.bundle.js +177 -177
  27. package/dist/concorde-core.es.js +4993 -4833
  28. package/dist/docs-mock-api-sw.js +58 -223
  29. package/dist/docs-mock-api-sw.js.map +4 -4
  30. package/dist/img/concorde/plane_01.jpg +0 -0
  31. package/dist/img/concorde/plane_02.jpg +0 -0
  32. package/dist/img/concorde/plane_03.jpg +0 -0
  33. package/dist/img/concorde/plane_04.jpg +0 -0
  34. package/dist/img/concorde/plane_05.jpg +0 -0
  35. package/dist/img/concorde/plane_06.jpg +0 -0
  36. package/dist/img/concorde/plane_07.jpg +0 -0
  37. package/dist/img/concorde/plane_08.jpg +0 -0
  38. package/dist/img/concorde/plane_09.jpg +0 -0
  39. package/dist/img/concorde/plane_10.jpg +0 -0
  40. package/dist/img/concorde/plane_11.jpg +0 -0
  41. package/dist/img/concorde/plane_12.jpg +0 -0
  42. package/dist/img/concorde/plane_13.jpg +0 -0
  43. package/dist/img/og-concorde.jpg +0 -0
  44. package/dist/robots.txt +11 -10
  45. package/docs/assets/index-D_alEsng.js +12122 -0
  46. package/docs/crawl/core/components/functional/date/date.html +190 -0
  47. package/docs/crawl/core/components/functional/fetch/fetch.html +109 -0
  48. package/docs/crawl/core/components/functional/if/if.html +27 -0
  49. package/docs/crawl/core/components/functional/jsonata/jsonata.html +79 -0
  50. package/docs/crawl/core/components/functional/list/list.html +70 -0
  51. package/docs/crawl/core/components/functional/mix/mix.html +45 -0
  52. package/docs/crawl/core/components/functional/queue/queue.html +96 -0
  53. package/docs/crawl/core/components/functional/router/router.html +106 -0
  54. package/docs/crawl/core/components/functional/sdui/sdui-extension-points.html +126 -0
  55. package/docs/crawl/core/components/functional/sdui/sdui.html +368 -0
  56. package/docs/crawl/core/components/functional/states/states.html +66 -0
  57. package/docs/crawl/core/components/functional/submit/submit.html +160 -0
  58. package/docs/crawl/core/components/functional/subscriber/subscriber.html +67 -0
  59. package/docs/crawl/core/components/functional/value/value.html +51 -0
  60. package/docs/crawl/core/components/ui/alert/alert.html +211 -0
  61. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +131 -0
  62. package/docs/crawl/core/components/ui/badge/badge.html +197 -0
  63. package/docs/crawl/core/components/ui/button/button.html +150 -0
  64. package/docs/crawl/core/components/ui/captcha/captcha.html +112 -0
  65. package/docs/crawl/core/components/ui/card/card.html +253 -0
  66. package/docs/crawl/core/components/ui/divider/divider.html +144 -0
  67. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +73 -0
  68. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +266 -0
  69. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +122 -0
  70. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +121 -0
  71. package/docs/crawl/core/components/ui/form/input/input.html +109 -0
  72. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +38 -0
  73. package/docs/crawl/core/components/ui/form/radio/radio.html +56 -0
  74. package/docs/crawl/core/components/ui/form/select/select.html +73 -0
  75. package/docs/crawl/core/components/ui/form/switch/switch.html +56 -0
  76. package/docs/crawl/core/components/ui/form/textarea/textarea.html +59 -0
  77. package/docs/crawl/core/components/ui/group/group.html +104 -0
  78. package/docs/crawl/core/components/ui/icon/icon.html +222 -0
  79. package/docs/crawl/core/components/ui/image/image.html +298 -0
  80. package/docs/crawl/core/components/ui/link/link.html +100 -0
  81. package/docs/crawl/core/components/ui/loader/loader.html +124 -0
  82. package/docs/crawl/core/components/ui/menu/menu.html +394 -0
  83. package/docs/crawl/core/components/ui/modal/modal.html +342 -0
  84. package/docs/crawl/core/components/ui/pop/pop.html +296 -0
  85. package/docs/crawl/core/components/ui/progress/progress.html +131 -0
  86. package/docs/crawl/core/components/ui/table/table.html +545 -0
  87. package/docs/crawl/core/components/ui/theme/theme.html +131 -0
  88. package/docs/crawl/core/components/ui/toast/toast.html +233 -0
  89. package/docs/crawl/core/components/ui/tooltip/tooltip.html +140 -0
  90. package/docs/crawl/docs/_core-concept/dataFlow.html +177 -0
  91. package/docs/crawl/docs/_core-concept/overview.html +66 -0
  92. package/docs/crawl/docs/_core-concept/subscriber.html +75 -0
  93. package/docs/crawl/docs/_decorators/ancestor-attribute.html +117 -0
  94. package/docs/crawl/docs/_decorators/auto-subscribe.html +202 -0
  95. package/docs/crawl/docs/_decorators/bind.html +141 -0
  96. package/docs/crawl/docs/_decorators/get.html +149 -0
  97. package/docs/crawl/docs/_decorators/handle.html +165 -0
  98. package/docs/crawl/docs/_decorators/on-assign.html +355 -0
  99. package/docs/crawl/docs/_decorators/patch.html +78 -0
  100. package/docs/crawl/docs/_decorators/post.html +139 -0
  101. package/docs/crawl/docs/_decorators/publish.html +61 -0
  102. package/docs/crawl/docs/_decorators/put.html +78 -0
  103. package/docs/crawl/docs/_decorators/subscribe.html +109 -0
  104. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +137 -0
  105. package/docs/crawl/docs/_directives/sub.html +93 -0
  106. package/docs/crawl/docs/_getting-started/ai-agents.html +173 -0
  107. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +100 -0
  108. package/docs/crawl/docs/_getting-started/concorde-outside.html +58 -0
  109. package/docs/crawl/docs/_getting-started/create-a-component.html +111 -0
  110. package/docs/crawl/docs/_getting-started/my-first-component.html +189 -0
  111. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +110 -0
  112. package/docs/crawl/docs/_getting-started/pubsub.html +62 -0
  113. package/docs/crawl/docs/_getting-started/start.html +76 -0
  114. package/docs/crawl/docs/_getting-started/theming.html +333 -0
  115. package/docs/crawl/docs/_misc/api-configuration.html +149 -0
  116. package/docs/crawl/docs/_misc/dataProviderKey.html +135 -0
  117. package/docs/crawl/docs/_misc/docs-mock-api.html +158 -0
  118. package/docs/crawl/docs/_misc/dynamic-path.html +180 -0
  119. package/docs/crawl/docs/_misc/endpoint.html +50 -0
  120. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +138 -0
  121. package/docs/crawl/docs/_misc/html-integration.html +48 -0
  122. package/docs/crawl/hubs/decorators.html +547 -0
  123. package/docs/crawl/hubs/form-components.html +381 -0
  124. package/docs/crawl/hubs/remote-data.html +452 -0
  125. package/docs/crawl/index.html +103 -0
  126. package/docs/index.html +1 -1
  127. package/docs/llms-full.txt +7174 -0
  128. package/docs/llms.txt +98 -0
  129. package/docs/sitemap.xml +243 -0
  130. package/docs/src/core/components/functional/date/date.md +290 -0
  131. package/docs/src/core/components/functional/fetch/fetch.md +125 -0
  132. package/docs/src/core/components/functional/if/if.md +9 -0
  133. package/docs/src/core/components/functional/jsonata/jsonata.md +56 -0
  134. package/docs/src/core/components/functional/list/list.md +65 -0
  135. package/docs/src/core/components/functional/mix/mix.md +41 -0
  136. package/docs/src/core/components/functional/queue/queue.md +72 -0
  137. package/docs/src/core/components/functional/router/router.md +94 -0
  138. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  139. package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
  140. package/docs/src/core/components/functional/sdui/default-library.json +108 -0
  141. package/docs/src/core/components/functional/sdui/example.json +99 -0
  142. package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  143. package/docs/src/core/components/functional/sdui/sdui.md +478 -0
  144. package/docs/src/core/components/functional/states/states.md +87 -0
  145. package/docs/src/core/components/functional/submit/submit.md +114 -0
  146. package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
  147. package/docs/src/core/components/functional/value/value.md +35 -0
  148. package/docs/src/core/components/ui/alert/alert.md +196 -0
  149. package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  150. package/docs/src/core/components/ui/badge/badge.md +188 -0
  151. package/docs/src/core/components/ui/button/button.md +183 -0
  152. package/docs/src/core/components/ui/captcha/captcha.md +71 -0
  153. package/docs/src/core/components/ui/card/card.md +215 -0
  154. package/docs/src/core/components/ui/divider/divider.md +129 -0
  155. package/docs/src/core/components/ui/form/checkbox/checkbox.md +77 -0
  156. package/docs/src/core/components/ui/form/fieldset/fieldset.md +205 -0
  157. package/docs/src/core/components/ui/form/form-actions/form-actions.md +100 -0
  158. package/docs/src/core/components/ui/form/form-layout/form-layout.md +119 -0
  159. package/docs/src/core/components/ui/form/input/input.md +142 -0
  160. package/docs/src/core/components/ui/form/radio/radio.md +57 -0
  161. package/docs/src/core/components/ui/form/select/select.md +71 -0
  162. package/docs/src/core/components/ui/form/switch/switch.md +57 -0
  163. package/docs/src/core/components/ui/form/textarea/textarea.md +65 -0
  164. package/docs/src/core/components/ui/group/group.md +75 -0
  165. package/docs/src/core/components/ui/icon/icon.md +214 -0
  166. package/docs/src/core/components/ui/icon/icons.json +1 -0
  167. package/docs/src/core/components/ui/image/image.md +233 -0
  168. package/docs/src/core/components/ui/link/link.md +81 -0
  169. package/docs/src/core/components/ui/loader/loader.md +112 -0
  170. package/docs/src/core/components/ui/menu/menu.md +370 -0
  171. package/docs/src/core/components/ui/modal/modal.md +235 -0
  172. package/docs/src/core/components/ui/pop/pop.md +294 -0
  173. package/docs/src/core/components/ui/progress/progress.md +109 -0
  174. package/docs/src/core/components/ui/table/table.md +431 -0
  175. package/docs/src/core/components/ui/theme/theme.md +122 -0
  176. package/docs/src/core/components/ui/toast/toast.md +216 -0
  177. package/docs/src/core/components/ui/tooltip/tooltip.md +124 -0
  178. package/{src → docs/src}/docs/_core-concept/subscriber.md +0 -0
  179. package/{src → docs/src}/docs/_getting-started/my-first-subscriber.md +0 -0
  180. package/{src → docs/src}/docs/_getting-started/pubsub.md +0 -0
  181. package/docs/src/docs/_getting-started/theming.md +253 -0
  182. package/docs/src/docs/search/docs-search.json +12242 -0
  183. package/docs/src/tag-list.json +1 -0
  184. package/docs/src/tsconfig-model.json +23 -0
  185. package/docs/src/tsconfig.declarations.json +22 -0
  186. package/docs/src/tsconfig.emit.json +23 -0
  187. package/docs/src/tsconfig.json +1332 -0
  188. package/gitlab/job_github_mirror.sh +39 -0
  189. package/index.html +157 -5
  190. package/package.json +22 -4
  191. package/public/docs-mock-api-sw.js +58 -223
  192. package/public/docs-mock-api-sw.js.map +4 -4
  193. package/public/img/concorde/plane_01.jpg +0 -0
  194. package/public/img/concorde/plane_02.jpg +0 -0
  195. package/public/img/concorde/plane_03.jpg +0 -0
  196. package/public/img/concorde/plane_04.jpg +0 -0
  197. package/public/img/concorde/plane_05.jpg +0 -0
  198. package/public/img/concorde/plane_06.jpg +0 -0
  199. package/public/img/concorde/plane_07.jpg +0 -0
  200. package/public/img/concorde/plane_08.jpg +0 -0
  201. package/public/img/concorde/plane_09.jpg +0 -0
  202. package/public/img/concorde/plane_10.jpg +0 -0
  203. package/public/img/concorde/plane_11.jpg +0 -0
  204. package/public/img/concorde/plane_12.jpg +0 -0
  205. package/public/img/concorde/plane_13.jpg +0 -0
  206. package/public/img/og-concorde.jpg +0 -0
  207. package/public/robots.txt +11 -10
  208. package/scripts/ai-init.mjs +104 -379
  209. package/scripts/ai-init.test.mjs +81 -239
  210. package/scripts/docs-markdown-vite-plugin.ts +43 -0
  211. package/scripts/docs-public-url.mjs +56 -0
  212. package/scripts/docs.htaccess +82 -0
  213. package/scripts/generate-cem.mjs +244 -0
  214. package/scripts/generate-cem.test.mjs +122 -0
  215. package/scripts/generate-crawl-docs.mjs +233 -118
  216. package/scripts/generate-crawl-docs.test.mjs +124 -0
  217. package/scripts/generate-sdui-catalog.mjs +11 -10
  218. package/scripts/github-export.mjs +150 -0
  219. package/scripts/post-build-docs.js +37 -50
  220. package/scripts/post-build.mjs +0 -0
  221. package/scripts/pre-publish.mjs +2 -1
  222. package/scripts/site-pages.mjs +212 -0
  223. package/scripts/site-pages.test.mjs +116 -0
  224. package/site-pages/about.md +22 -0
  225. package/site-pages/privacy.md +32 -0
  226. package/src/core/components/functional/date/date.md +91 -231
  227. package/src/core/components/functional/example/example.ts +3 -1
  228. package/src/core/components/functional/fetch/fetch.md +66 -83
  229. package/src/core/components/functional/if/if.md +28 -3
  230. package/src/core/components/functional/if/if.ts +0 -0
  231. package/src/core/components/functional/jsonata/jsonata.md +42 -37
  232. package/src/core/components/functional/list/list.demo.ts +0 -0
  233. package/src/core/components/functional/list/list.md +103 -43
  234. package/src/core/components/functional/list/list.ts +17 -4
  235. package/src/core/components/functional/mix/mix.md +31 -26
  236. package/src/core/components/functional/queue/queue.demo.ts +10 -7
  237. package/src/core/components/functional/queue/queue.md +40 -61
  238. package/src/core/components/functional/router/router.demo.ts +16 -16
  239. package/src/core/components/functional/router/router.md +64 -65
  240. package/src/core/components/functional/router/router.ts +0 -0
  241. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
  242. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  243. package/src/core/components/functional/sdui/component-catalog.json +2 -2
  244. package/src/core/components/functional/sdui/example.json +19 -86
  245. package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
  246. package/src/core/components/functional/sdui/sdui-immutable.spec.ts +74 -0
  247. package/src/core/components/functional/sdui/sdui.md +187 -358
  248. package/src/core/components/functional/sdui/sdui.ts +33 -8
  249. package/src/core/components/functional/sdui/types.ts +0 -0
  250. package/src/core/components/functional/states/states.demo.ts +21 -22
  251. package/src/core/components/functional/states/states.md +86 -61
  252. package/src/core/components/functional/states/states.ts +1 -1
  253. package/src/core/components/functional/submit/submit.md +64 -72
  254. package/src/core/components/functional/submit/submit.spec.ts +60 -0
  255. package/src/core/components/functional/submit/submit.ts +6 -3
  256. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  257. package/src/core/components/functional/translation/translation.md +38 -0
  258. package/src/core/components/functional/value/value.md +34 -22
  259. package/src/core/components/functional/value/value.ts +0 -0
  260. package/src/core/components/ui/_css/size.ts +0 -0
  261. package/src/core/components/ui/alert/alert.md +48 -58
  262. package/src/core/components/ui/badge/badge.md +27 -34
  263. package/src/core/components/ui/button/button.md +139 -106
  264. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  265. package/src/core/components/ui/captcha/captcha.md +17 -32
  266. package/src/core/components/ui/card/card.md +6 -6
  267. package/src/core/components/ui/divider/divider.md +8 -11
  268. package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
  269. package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
  270. package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
  271. package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
  272. package/src/core/components/ui/form/input/input.md +108 -90
  273. package/src/core/components/ui/form/input/input.ts +8 -2
  274. package/src/core/components/ui/form/radio/radio.md +65 -30
  275. package/src/core/components/ui/form/select/select.md +60 -45
  276. package/src/core/components/ui/form/switch/switch.md +57 -34
  277. package/src/core/components/ui/form/textarea/textarea.md +55 -38
  278. package/src/core/components/ui/group/group.md +35 -33
  279. package/src/core/components/ui/icon/icon.md +4 -4
  280. package/src/core/components/ui/image/image.md +41 -107
  281. package/src/core/components/ui/link/link.md +6 -6
  282. package/src/core/components/ui/loader/loader.md +30 -55
  283. package/src/core/components/ui/menu/menu.md +27 -27
  284. package/src/core/components/ui/modal/modal.md +72 -96
  285. package/src/core/components/ui/pop/pop.md +80 -158
  286. package/src/core/components/ui/progress/progress.md +2 -2
  287. package/src/core/components/ui/table/table.md +91 -255
  288. package/src/core/components/ui/theme/theme.md +11 -36
  289. package/src/core/components/ui/toast/toast.md +48 -117
  290. package/src/core/components/ui/tooltip/tooltip.md +27 -62
  291. package/src/core/decorators/subscriber/bind.ts +9 -14
  292. package/src/core/decorators/subscriber/subscribe.ts +15 -9
  293. package/src/core/decorators/subscriber/subscribe.type-test.ts +14 -5
  294. package/src/core/mixins/Subscriber.ts +0 -0
  295. package/src/core/utils/DataBindObserver.ts +0 -0
  296. package/src/core/utils/LocationHandler.spec.ts +80 -0
  297. package/src/core/utils/LocationHandler.ts +5 -9
  298. package/src/core/utils/Objects.ts +0 -0
  299. package/src/core/utils/PublisherProxy.ts +166 -125
  300. package/src/core/utils/deepReadonly.spec.ts +66 -0
  301. package/src/core/utils/deepReadonly.ts +71 -0
  302. package/src/core/utils/immutableValue.spec.ts +54 -0
  303. package/src/core/utils/immutableValue.ts +102 -0
  304. package/src/core/utils/nestedDotForm.spec.ts +88 -0
  305. package/src/core/utils/publisherImmutable.spec.ts +76 -0
  306. package/src/core/utils/route.ts +0 -0
  307. package/src/core/utils/strictGet.spec.ts +61 -0
  308. package/src/core/utils/strictGet.ts +102 -0
  309. package/src/css.d.ts +19 -0
  310. package/src/docs/components/docs-demo-sources.ts +55 -140
  311. package/src/docs/components/docs-lit-demo.ts +1 -3
  312. package/src/docs/components/docs-source-link.ts +0 -82
  313. package/src/docs/decorators/ancestor-attribute.md +59 -0
  314. package/src/docs/decorators/auto-subscribe.md +40 -0
  315. package/src/docs/decorators/bind.md +76 -0
  316. package/src/docs/decorators/get.md +160 -0
  317. package/src/docs/decorators/handle.md +119 -0
  318. package/src/docs/decorators/on-assign.md +63 -0
  319. package/src/docs/decorators/patch.md +44 -0
  320. package/src/docs/decorators/post.md +134 -0
  321. package/src/docs/decorators/publish.md +56 -0
  322. package/src/docs/decorators/put.md +51 -0
  323. package/src/docs/decorators/subscribe.md +87 -0
  324. package/src/docs/decorators/wait-for-ancestors.md +76 -0
  325. package/src/docs/directives/sub.md +75 -0
  326. package/src/docs/directives/t.md +73 -0
  327. package/src/docs/docs-location.spec.ts +56 -0
  328. package/src/docs/docs-location.ts +133 -32
  329. package/src/docs/docs.ts +1 -2
  330. package/src/docs/example/decorators-demo-bind-demos.ts +83 -135
  331. package/src/docs/example/decorators-demo-geo.ts +30 -19
  332. package/src/docs/example/decorators-demo-post.ts +88 -186
  333. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
  334. package/src/docs/example/decorators-demo.ts +85 -98
  335. package/src/docs/example/docs-api-config-demos.ts +19 -20
  336. package/src/docs/example/docs-flight-demos.ts +147 -0
  337. package/src/docs/example/docs-jsonata-demos.ts +52 -52
  338. package/src/docs/example/docs-list-demos.ts +43 -123
  339. package/src/docs/example/docs-provider-keys.ts +21 -28
  340. package/src/docs/example/docs-queue-demos.ts +37 -77
  341. package/src/docs/example/docs-router-demos.ts +20 -25
  342. package/src/docs/example/docs-submit-demos.ts +48 -48
  343. package/src/docs/example/docs-toggle-demos.ts +4 -3
  344. package/src/docs/example/users.ts +0 -0
  345. package/src/docs/getting-started/ai-agents.md +50 -0
  346. package/src/docs/getting-started/create-a-component.md +136 -0
  347. package/src/docs/getting-started/dataFlow.md +87 -0
  348. package/src/docs/getting-started/installation.md +36 -0
  349. package/src/docs/getting-started/my-first-component.md +227 -0
  350. package/src/docs/getting-started/start.md +35 -0
  351. package/src/docs/header/header.ts +11 -6
  352. package/src/docs/home/catalog.ts +1 -1
  353. package/src/docs/home/home.ts +20 -11
  354. package/src/docs/layout.ts +12 -13
  355. package/src/docs/misc/api-configuration.md +79 -0
  356. package/src/docs/misc/dataProviderKey.md +168 -0
  357. package/src/docs/misc/docs-mock-api.md +62 -0
  358. package/src/docs/misc/dynamic-path.md +71 -0
  359. package/src/docs/misc/endpoint.md +45 -0
  360. package/src/docs/misc/html-integration.md +14 -0
  361. package/src/docs/misc/publisher-get-immutability-docs-crawl.json +902 -0
  362. package/src/docs/misc/publisher-get-immutability-docs-recheck.json +13 -0
  363. package/src/docs/misc/publisher-get-immutability-study.md +229 -0
  364. package/src/docs/mock-api/api-config-mock.ts +5 -0
  365. package/src/docs/mock-api/fixtures.ts +0 -278
  366. package/src/docs/mock-api/flights.ts +89 -0
  367. package/src/docs/mock-api/router.ts +3 -4
  368. package/src/docs/mock-api/urls.ts +1 -2
  369. package/src/docs/navigation/navigation.ts +84 -101
  370. package/src/docs/navigation/toc.ts +7 -4
  371. package/src/docs/search/docs-search.json +3188 -5153
  372. package/src/docs/search/markdown-renderer.ts +31 -8
  373. package/src/docs/search/page.ts +9 -6
  374. package/src/docs/search/search.ts +154 -122
  375. package/src/docs/tailwind/css/docs/content.css +4 -5
  376. package/src/tsconfig.declarations.json +22 -0
  377. package/src/tsconfig.emit.json +23 -0
  378. package/src/tsconfig.json +53 -5
  379. package/src/tsconfig.tsbuildinfo +1 -1
  380. package/vite.config.mts +11 -2
  381. package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
  382. package/.taste-skill/after/desktop-fold.jpg +0 -0
  383. package/.taste-skill/after/desktop-page-01.jpg +0 -0
  384. package/.taste-skill/after/desktop-page-02.jpg +0 -0
  385. package/.taste-skill/after/desktop-page-03.jpg +0 -0
  386. package/.taste-skill/after/mobile-fold.jpg +0 -0
  387. package/.taste-skill/after/mobile-page-01.jpg +0 -0
  388. package/.taste-skill/after/report.json +0 -4103
  389. package/.taste-skill/after/tablet-fold.jpg +0 -0
  390. package/.taste-skill/after/tablet-page-01.jpg +0 -0
  391. package/.taste-skill/after/tablet-page-02.jpg +0 -0
  392. package/.taste-skill/before/desktop-fold.jpg +0 -0
  393. package/.taste-skill/before/desktop-page-01.jpg +0 -0
  394. package/.taste-skill/before/desktop-page-02.jpg +0 -0
  395. package/.taste-skill/before/mobile-fold.jpg +0 -0
  396. package/.taste-skill/before/mobile-page-01.jpg +0 -0
  397. package/.taste-skill/before/report.json +0 -2556
  398. package/.taste-skill/before/tablet-fold.jpg +0 -0
  399. package/.taste-skill/before/tablet-page-01.jpg +0 -0
  400. package/.taste-skill/direction.json +0 -510
  401. package/.taste-skill/notes.md +0 -84
  402. package/.taste-skill/prod/desktop-fold.jpg +0 -0
  403. package/.taste-skill/prod/desktop-page-01.jpg +0 -0
  404. package/.taste-skill/prod/desktop-page-02.jpg +0 -0
  405. package/.taste-skill/prod/desktop-page-03.jpg +0 -0
  406. package/.taste-skill/prod/mobile-fold.jpg +0 -0
  407. package/.taste-skill/prod/mobile-page-01.jpg +0 -0
  408. package/.taste-skill/prod/mobile-page-02.jpg +0 -0
  409. package/.taste-skill/prod/report.json +0 -1973
  410. package/.taste-skill/prod/tablet-fold.jpg +0 -0
  411. package/.taste-skill/prod/tablet-page-01.jpg +0 -0
  412. package/.taste-skill/prod/tablet-page-02.jpg +0 -0
  413. package/AUDIT.md +0 -228
  414. package/PLAN-AMELIORATION.md +0 -220
  415. package/ai/AGENTS.md +0 -56
  416. package/ai/cursor/rules/concorde-menu.mdc +0 -15
  417. package/ai/cursor/rules/concorde-scope.mdc +0 -14
  418. package/ai/cursor/rules/concorde-theme.mdc +0 -13
  419. package/ai/cursor/rules/concorde.mdc +0 -66
  420. package/ai/jetbrains/rules/concorde.md +0 -53
  421. package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
  422. package/ai/skills/concorde-imports/SKILL.md +0 -78
  423. package/ai/skills/concorde-menu/SKILL.md +0 -74
  424. package/ai/skills/concorde-scope/SKILL.md +0 -70
  425. package/ai/skills/concorde-theme/SKILL.md +0 -57
  426. package/docs/assets/index-Bb-_LRyY.js +0 -12280
  427. package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
  428. package/src/docs/example/docs-joke-demos.ts +0 -297
  429. /package/{src → docs/src}/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -0
  430. /package/{src → docs/src}/docs/_core-concept/dataFlow.md +0 -0
  431. /package/{src → docs/src}/docs/_core-concept/overview.md +0 -0
  432. /package/{src → docs/src}/docs/_decorators/ancestor-attribute.md +0 -0
  433. /package/{src → docs/src}/docs/_decorators/auto-subscribe.md +0 -0
  434. /package/{src → docs/src}/docs/_decorators/bind.md +0 -0
  435. /package/{src → docs/src}/docs/_decorators/get.md +0 -0
  436. /package/{src → docs/src}/docs/_decorators/handle.md +0 -0
  437. /package/{src → docs/src}/docs/_decorators/on-assign.md +0 -0
  438. /package/{src → docs/src}/docs/_decorators/patch.md +0 -0
  439. /package/{src → docs/src}/docs/_decorators/post.md +0 -0
  440. /package/{src → docs/src}/docs/_decorators/publish.md +0 -0
  441. /package/{src → docs/src}/docs/_decorators/put.md +0 -0
  442. /package/{src → docs/src}/docs/_decorators/subscribe.md +0 -0
  443. /package/{src → docs/src}/docs/_decorators/wait-for-ancestors.md +0 -0
  444. /package/{src → docs/src}/docs/_directives/sub.md +0 -0
  445. /package/{src → docs/src}/docs/_getting-started/ai-agents.md +0 -0
  446. /package/{src → docs/src}/docs/_getting-started/concorde-manual-install.md +0 -0
  447. /package/{src → docs/src}/docs/_getting-started/concorde-outside.md +0 -0
  448. /package/{src → docs/src}/docs/_getting-started/create-a-component.md +0 -0
  449. /package/{src → docs/src}/docs/_getting-started/my-first-component.md +0 -0
  450. /package/{src → docs/src}/docs/_getting-started/start.md +0 -0
  451. /package/{src → docs/src}/docs/_misc/api-configuration.md +0 -0
  452. /package/{src → docs/src}/docs/_misc/dataProviderKey.md +0 -0
  453. /package/{src → docs/src}/docs/_misc/docs-mock-api.md +0 -0
  454. /package/{src → docs/src}/docs/_misc/dynamic-path.md +0 -0
  455. /package/{src → docs/src}/docs/_misc/endpoint.md +0 -0
  456. /package/{src → docs/src}/docs/_misc/formelement-subscriber-removal.md +0 -0
  457. /package/{src → docs/src}/docs/_misc/html-integration.md +0 -0
  458. /package/src/docs/{_getting-started → getting-started}/components.md +0 -0
  459. /package/src/docs/{_getting-started → getting-started}/theming.md +0 -0
@@ -1,183 +1,178 @@
1
1
  import { html, LitElement } from "lit";
2
2
  import { customElement, property, state } from "lit/decorators.js";
3
- import { get, handle, publish, subscribe } from "@supersoniks/concorde/decorators";
4
- import type { ApiResult } from "@supersoniks/concorde/core/utils/api";
5
- import { DataProviderKey } from "@supersoniks/concorde/core/utils/dataProviderKey";
6
- import { sub } from "@supersoniks/concorde/directives";
7
3
  import {
8
- dp,
9
- get as storeGet,
10
- set,
11
- } from "@supersoniks/concorde/core/utils/PublisherProxy";
12
- import { publishDemoKey } from "./docs-provider-keys";
4
+ DataProviderKey,
5
+ get,
6
+ handle,
7
+ publish,
8
+ subscribe,
9
+ type ApiResult,
10
+ } from "@supersoniks/concorde/decorators";
11
+ import { sub } from "@supersoniks/concorde/directives";
12
+ import { dp, get as storeGet, set } from "@supersoniks/concorde/utils";
13
13
  import { tailwind } from "../tailwind";
14
14
  import "./decorators-demo-init";
15
15
  import {
16
- docsDemoGeoApiConfigurationKey,
17
- geoCommunesApiGetEndpoint,
18
- geoCommunesApiGetEndpointDynamic,
19
- geoCommunesApiGetPublishKey,
20
- type GeoCommuneRow,
16
+ departuresEndpoint,
17
+ departuresPayloadKey,
18
+ flightsApiConfigurationKey,
19
+ flightsByDirectionEndpoint,
20
+ type Flight,
21
+ type FlightBoard,
22
+ type FlightDirection,
21
23
  } from "./decorators-demo-geo";
22
24
 
23
- type PublishDemoData = {
24
- email: string;
25
- message: string;
26
- };
25
+ /* ---------------------------------------------------------------- data */
27
26
 
28
- const geoCommunesGet = get(
29
- geoCommunesApiGetEndpoint,
30
- docsDemoGeoApiConfigurationKey,
31
- );
32
- const geoCommunesMethodTriggerKey = new DataProviderKey<number>(
33
- "docsDemoGeoCommunesMethodTrigger",
27
+ type OnBoard = { name: string; role: string; seat: string };
28
+
29
+ /** People on board flight CN 001 (CDG → JFK). */
30
+ const onBoardKey = new DataProviderKey<OnBoard[]>("demoOnBoard");
31
+ set(onBoardKey, [
32
+ { name: "Captain Leo Marchand", role: "Captain", seat: "Cockpit" },
33
+ { name: "Ada Lindqvist", role: "Passenger", seat: "1A" },
34
+ { name: "Grace Okafor", role: "Flight engineer", seat: "Cockpit" },
35
+ { name: "Noah Keller", role: "Cabin crew", seat: "Galley" },
36
+ { name: "Mateo Ortega", role: "Passenger", seat: "4C" },
37
+ ]);
38
+
39
+ /** One person, picked by `${seatIndex}` on the host component. */
40
+ const personKey = new DataProviderKey<OnBoard, { seatIndex: number }>(
41
+ "demoOnBoard.${seatIndex}",
34
42
  );
35
43
 
44
+ type CheckIn = { passenger: string; seat: string };
45
+ const checkInKey = new DataProviderKey<CheckIn>("demoCheckIn");
46
+
47
+ type Cockpit = { altitude: number };
48
+ const cockpitKey = new DataProviderKey<Cockpit>("demoCockpit");
49
+ set(cockpitKey, { altitude: 50000 });
50
+
51
+ const seatIndexInput = (host: { seatIndex: number }) => html`
52
+ <sonic-input
53
+ type="number"
54
+ .value=${String(host.seatIndex)}
55
+ @input=${(e: Event) =>
56
+ (host.seatIndex = parseInt((e.target as HTMLInputElement).value))}
57
+ min="0"
58
+ max="4"
59
+ label="Seat index"
60
+ ></sonic-input>
61
+ `;
62
+
63
+ const flightList = (flights: Flight[] | undefined) =>
64
+ !flights
65
+ ? html`<p class="text-sm text-neutral-500">Loading…</p>`
66
+ : flights.length === 0
67
+ ? html`<p class="text-sm text-neutral-500">No flight</p>`
68
+ : html`
69
+ <ul class="grid gap-1 sm:grid-cols-2">
70
+ ${flights.map(
71
+ (f) => html`<li class="text-sm">
72
+ <strong>${f.code}</strong> ${f.city}
73
+ <span class="text-neutral-500">· ${f.time} · ${f.status}</span>
74
+ </li>`,
75
+ )}
76
+ </ul>
77
+ `;
78
+
79
+ /* ------------------------------------------------------------- @publish */
80
+
36
81
  @customElement("demo-publish")
37
82
  export class DemoPublish extends LitElement {
38
83
  static styles = [tailwind];
39
84
 
40
- @publish(publishDemoKey.email)
85
+ @publish(checkInKey.passenger)
41
86
  @state()
42
- email = "";
87
+ passenger = "Ada Lindqvist";
43
88
 
44
- @publish(publishDemoKey.message)
89
+ @publish(checkInKey.seat)
45
90
  @state()
46
- message = "";
47
-
48
- connectedCallback() {
49
- super.connectedCallback();
50
- set(publishDemoKey, { email: "", message: "" });
51
- }
91
+ seat = "1A";
52
92
 
53
93
  render() {
54
94
  return html`
55
95
  <div class="space-y-4">
56
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
57
- Les champs publient vers le publisher ; les valeurs ci-dessous passent
58
- par <code>sub()</code>.
59
- </p>
60
96
  <sonic-input
61
- .value=${this.email}
97
+ .value=${this.passenger}
62
98
  @input=${(e: Event) =>
63
- (this.email = (e.target as HTMLInputElement).value)}
64
- label="Email"
65
- placeholder="your@email.com"
99
+ (this.passenger = (e.target as HTMLInputElement).value)}
100
+ label="Passenger"
66
101
  ></sonic-input>
67
102
  <sonic-input
68
- .value=${this.message}
103
+ .value=${this.seat}
69
104
  @input=${(e: Event) =>
70
- (this.message = (e.target as HTMLInputElement).value)}
71
- label="Message"
72
- placeholder="Type a message..."
105
+ (this.seat = (e.target as HTMLInputElement).value)}
106
+ label="Seat"
73
107
  ></sonic-input>
74
- <div
75
- class="rounded border border-neutral-200 dark:border-neutral-700 p-3"
76
- >
77
- <p
78
- class="text-xs font-medium text-neutral-500 dark:text-neutral-400 mb-1"
79
- >
80
- Published values (from sub):
81
- </p>
82
- <p>Email: ${sub(publishDemoKey.email) || "—"}</p>
83
- <p>Message: ${sub(publishDemoKey.message) || "—"}</p>
84
- </div>
108
+ <p class="rounded border border-neutral-200 dark:border-neutral-700 p-3">
109
+ Boarding pass: ${sub(checkInKey.passenger)} · seat
110
+ ${sub(checkInKey.seat)}
111
+ </p>
85
112
  </div>
86
113
  `;
87
114
  }
88
115
  }
89
116
 
117
+ /* ----------------------------------------------------------------- @get */
118
+
119
+ const departuresGet = get(departuresEndpoint, flightsApiConfigurationKey);
120
+
90
121
  @customElement("demo-api-get")
91
122
  export class DemoApiGet extends LitElement {
92
123
  static styles = [tailwind];
93
124
 
94
- @geoCommunesGet
125
+ @departuresGet
95
126
  @state()
96
- geoApiPayload?: ApiResult<GeoCommuneRow[]>;
127
+ departures?: ApiResult<FlightBoard>;
97
128
 
98
129
  private async refresh() {
99
- await geoCommunesGet.refetch(this);
130
+ await departuresGet.refetch(this);
100
131
  }
101
132
 
102
133
  render() {
103
- const rows = this.geoApiPayload?.result;
104
134
  return html`
105
135
  <div class="space-y-3">
106
- <div class="flex flex-wrap items-center gap-3">
107
- <span class="text-sm font-medium">🗺️ GET simple</span>
108
- <sonic-button size="sm" @click=${this.refresh}>Rafraîchir</sonic-button>
109
- </div>
110
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
111
- Une liste de communes chargée avec <code>@get</code>.
112
- </p>
113
- ${this.geoApiPayload == null
114
- ? html`<p class="text-sm text-neutral-500">Chargement…</p>`
115
- : !rows || rows.length === 0
116
- ? html`<p class="text-sm text-neutral-500">Aucune commune</p>`
117
- : html`
118
- <ul class="grid gap-1 sm:grid-cols-2">
119
- ${rows.map(
120
- (c) => html`<li class="text-sm">
121
- ${c.nom} <span class="text-neutral-500">(${c.code})</span>
122
- </li>`,
123
- )}
124
- </ul>
125
- `}
136
+ <sonic-button size="sm" @click=${this.refresh}>Refresh</sonic-button>
137
+ ${flightList(this.departures?.result?.flights)}
126
138
  </div>
127
139
  `;
128
140
  }
129
141
  }
130
142
 
143
+ const departuresRefreshKey = new DataProviderKey<number>(
144
+ "docsDemoDeparturesRefresh",
145
+ );
146
+ set(departuresRefreshKey, 0);
147
+
131
148
  @customElement("demo-api-get-method")
132
149
  export class DemoApiGetMethod extends LitElement {
133
150
  static styles = [tailwind];
134
151
 
135
152
  @state()
136
- private payload?: ApiResult<GeoCommuneRow[]>;
137
-
138
- connectedCallback() {
139
- super.connectedCallback();
140
- set(geoCommunesMethodTriggerKey, 0);
141
- }
153
+ private payload?: ApiResult<FlightBoard>;
142
154
 
143
- @get(geoCommunesApiGetEndpoint, docsDemoGeoApiConfigurationKey, {
144
- triggerKey: geoCommunesMethodTriggerKey,
155
+ @get(departuresEndpoint, flightsApiConfigurationKey, {
156
+ triggerKey: departuresRefreshKey,
145
157
  })
146
- handlePayload(payload?: ApiResult<GeoCommuneRow[]>) {
158
+ onDepartures(payload?: ApiResult<FlightBoard>) {
147
159
  this.payload = payload;
148
160
  }
149
161
 
150
162
  private refresh() {
151
- dp(geoCommunesMethodTriggerKey).invalidate();
163
+ dp(departuresRefreshKey).invalidate();
152
164
  }
153
165
 
154
166
  render() {
155
- const rows = this.payload?.result ?? [];
156
167
  return html`
157
168
  <div class="space-y-3">
158
- <div class="flex flex-wrap items-center gap-3">
159
- <span class="text-sm font-medium">🗺️ GET function mode</span>
160
- <sonic-button size="sm" @click=${this.refresh}>
161
- Invalidate trigger
162
- </sonic-button>
163
- </div>
164
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
165
- The <code>@get</code> decorator calls <code>handlePayload</code> with
166
- the complete API payload.
167
- </p>
169
+ <sonic-button size="sm" @click=${this.refresh}>
170
+ Invalidate trigger
171
+ </sonic-button>
168
172
  <p class="text-xs text-neutral-500">
169
- HTTP status:
170
- <strong>${this.payload?.response?.status ?? "loading…"}</strong>
173
+ HTTP status: ${this.payload?.response?.status ?? "…"}
171
174
  </p>
172
- <ul class="grid gap-1 sm:grid-cols-2">
173
- ${rows.slice(0, 6).map(
174
- (commune) =>
175
- html`<li class="text-sm">
176
- ${commune.nom}
177
- <span class="text-neutral-500">(${commune.code})</span>
178
- </li>`,
179
- )}
180
- </ul>
175
+ ${flightList(this.payload?.result?.flights)}
181
176
  </div>
182
177
  `;
183
178
  }
@@ -187,48 +182,33 @@ export class DemoApiGetMethod extends LitElement {
187
182
  export class DemoApiGetConfigurationKey extends LitElement {
188
183
  static styles = [tailwind];
189
184
 
190
- @property({ type: Number })
191
- communeLimit = 3;
185
+ @property()
186
+ direction: FlightDirection = "departures";
192
187
 
193
- @get(geoCommunesApiGetEndpointDynamic, docsDemoGeoApiConfigurationKey)
188
+ @get(flightsByDirectionEndpoint, flightsApiConfigurationKey)
194
189
  @state()
195
- geoApiPayloadDyn?: ApiResult<GeoCommuneRow[]>;
190
+ board?: ApiResult<FlightBoard>;
196
191
 
197
192
  render() {
198
- const rows = this.geoApiPayloadDyn?.result;
199
193
  return html`
200
194
  <div class="space-y-3">
201
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
202
- <code>@get</code> avec un endpoint et une configuration dynamiques.
203
- </p>
204
- <div class="flex flex-wrap items-center gap-2">
205
- <span class="text-sm">Nombre de communes :</span>
206
- ${[3, 5, 10].map(
207
- (limit) => html`
195
+ <div class="flex flex-wrap gap-2">
196
+ ${(["departures", "arrivals"] as const).map(
197
+ (direction) => html`
208
198
  <sonic-button
209
199
  size="sm"
210
- type=${this.communeLimit === limit ? "primary" : "neutral"}
211
- @click=${() => {
212
- this.communeLimit = limit;
213
- }}
200
+ type=${this.direction === direction ? "primary" : "neutral"}
201
+ @click=${() => (this.direction = direction)}
214
202
  >
215
- ${limit}
203
+ ${direction === "departures" ? "Departures" : "Arrivals"}
216
204
  </sonic-button>
217
205
  `,
218
206
  )}
219
207
  </div>
220
208
  <p class="font-mono text-xs text-neutral-500">
221
- communes?limit=${this.communeLimit}
209
+ flights?direction=${this.direction}&amp;limit=4
222
210
  </p>
223
- ${this.geoApiPayloadDyn == null
224
- ? html`<p class="text-sm text-neutral-500">Chargement…</p>`
225
- : html`
226
- <ul class="grid gap-1 sm:grid-cols-2">
227
- ${(rows ?? []).map(
228
- (c) => html`<li class="text-sm">${c.nom}</li>`,
229
- )}
230
- </ul>
231
- `}
211
+ ${flightList(this.board?.result?.flights)}
232
212
  </div>
233
213
  `;
234
214
  }
@@ -238,87 +218,42 @@ export class DemoApiGetConfigurationKey extends LitElement {
238
218
  export class DemoApiGetPublishSubscribe extends LitElement {
239
219
  static styles = [tailwind];
240
220
 
241
- @get(geoCommunesApiGetEndpoint)
242
- @publish(geoCommunesApiGetPublishKey)
221
+ @get(departuresEndpoint, flightsApiConfigurationKey)
222
+ @publish(departuresPayloadKey)
243
223
  @state()
244
- geoApiPayloadPublished: ApiResult<GeoCommuneRow[]> | null = null;
224
+ departures?: ApiResult<FlightBoard>;
245
225
 
226
+ @subscribe(departuresPayloadKey.result.flights)
246
227
  @state()
247
- @subscribe(geoCommunesApiGetPublishKey.result)
248
- geoCommunesFromSubscribe: GeoCommuneRow[] | null = null;
228
+ flights: Flight[] | null = null;
249
229
 
250
230
  render() {
251
- const rows =
252
- this.geoCommunesFromSubscribe ?? this.geoApiPayloadPublished?.result;
253
- const status = this.geoApiPayloadPublished?.response?.status;
254
- const fetchedAt = formatFetchedAt(
255
- this.geoApiPayloadPublished?.response ?? null,
256
- );
257
231
  return html`
258
232
  <div class="space-y-2">
259
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
260
- <code>@get</code> (scoped) + <code>@publish</code> sur la clé du
261
- payload + <code>@subscribe</code> sur <code>.result</code> — même
262
- rendu que <code>&lt;demo-api-get&gt;</code> (doc @get).
233
+ <p class="text-xs text-neutral-500">
234
+ HTTP ${this.departures?.response?.status ?? "…"}
263
235
  </p>
264
- ${status != null
265
- ? html`<p class="text-xs text-neutral-500">
266
- HTTP ${status} · fetch ${fetchedAt}
267
- </p>`
268
- : ""}
269
- ${this.geoApiPayloadPublished === null
270
- ? html`<p class="text-neutral-500">Chargement…</p>`
271
- : !rows || rows.length === 0
272
- ? html`<p class="text-neutral-500">Aucune commune</p>`
273
- : html`
274
- <ul class="list-disc pl-5 space-y-1">
275
- ${rows.map(
276
- (c) =>
277
- html`<li>
278
- <span class="font-medium">${c.nom}</span>
279
- <span class="text-neutral-500 text-sm">
280
- — ${c.code}</span
281
- >
282
- </li>`,
283
- )}
284
- </ul>
285
- `}
236
+ ${flightList(this.flights ?? undefined)}
286
237
  </div>
287
238
  `;
288
239
  }
289
240
  }
290
241
 
291
- type User = { firstName: string; lastName: string; email: string };
292
-
293
- const demoUsersSubKey = new DataProviderKey<User, { userIndex: number }>(
294
- "demoUsers.${userIndex}",
295
- );
242
+ /* ----------------------------------------------------- sub / @subscribe */
296
243
 
297
244
  @customElement("demo-sub-template")
298
245
  export class DemoSubTemplate extends LitElement {
299
246
  static styles = [tailwind];
300
247
 
301
248
  @property({ type: Number })
302
- userIndex = 0;
249
+ seatIndex = 0;
303
250
 
304
251
  render() {
305
252
  return html`
306
253
  <div class="space-y-4">
307
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
308
- <code>sub(demoUsersSubKey.email)</code> — same dynamic path as
309
- <code>@subscribe</code>, reactive in the template.
310
- </p>
311
- <sonic-input
312
- type="number"
313
- .value=${String(this.userIndex)}
314
- @input=${(e: Event) =>
315
- (this.userIndex = parseInt((e.target as HTMLInputElement).value))}
316
- min="0"
317
- max="9"
318
- label="User index"
319
- ></sonic-input>
254
+ ${seatIndexInput(this)}
320
255
  <p class="rounded border border-neutral-200 dark:border-neutral-700 p-3">
321
- Email: <strong>${sub(demoUsersSubKey.email) || "—"}</strong>
256
+ <strong>${sub(personKey.name)}</strong> · ${sub(personKey.role)}
322
257
  </p>
323
258
  </div>
324
259
  `;
@@ -330,78 +265,63 @@ export class DemoSubscribeDynamic extends LitElement {
330
265
  static styles = [tailwind];
331
266
 
332
267
  @property({ type: Number })
333
- userIndex = 0;
268
+ seatIndex = 0;
334
269
 
335
- @subscribe(new DataProviderKey<User>("demoUsers.${userIndex}"))
270
+ @subscribe(personKey)
336
271
  @state()
337
- user: User | null = null;
272
+ person: OnBoard | null = null;
338
273
 
339
274
  render() {
340
275
  return html`
341
276
  <div class="space-y-4">
342
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
343
- <code>@subscribe</code> avec chemin dynamique
344
- <code>demoUsers.\${userIndex}</code>
345
- </p>
346
- <sonic-input
347
- type="number"
348
- .value=${String(this.userIndex)}
349
- @input=${(e: Event) =>
350
- (this.userIndex = parseInt((e.target as HTMLInputElement).value))}
351
- min="0"
352
- max="9"
353
- label="User index"
354
- ></sonic-input>
355
- ${this.user
277
+ ${seatIndexInput(this)}
278
+ ${this.person
356
279
  ? html`
357
280
  <div
358
281
  class="rounded border border-neutral-200 dark:border-neutral-700 p-3"
359
282
  >
360
- <p>${this.user.firstName} ${this.user.lastName}</p>
361
- <p class="text-sm text-neutral-500">${this.user.email}</p>
283
+ <p>${this.person.name}</p>
284
+ <p class="text-sm text-neutral-500">
285
+ ${this.person.role} · ${this.person.seat}
286
+ </p>
362
287
  </div>
363
288
  `
364
289
  : html`<p class="text-neutral-500">
365
- No user at index ${this.userIndex}
290
+ Nobody at index ${this.seatIndex}
366
291
  </p>`}
367
292
  </div>
368
293
  `;
369
294
  }
370
295
  }
371
296
 
372
- type DemoCounterData = { count: number; title: string; user: { name: string } };
373
- const demoDataKey = new DataProviderKey<DemoCounterData>("demoData");
297
+ /* -------------------------------------------------------------- @handle */
374
298
 
375
299
  @customElement("demo-handle")
376
300
  export class DemoHandle extends LitElement {
377
301
  static styles = [tailwind];
378
302
 
379
- @state() doubled = 0;
380
- @state() lastUpdate = "";
303
+ @state() meters = 0;
304
+ @state() flightLevel = "";
381
305
 
382
- @handle(demoDataKey.count)
383
- onCountChange(count: number) {
384
- this.doubled = count * 2;
385
- this.lastUpdate = new Date().toLocaleTimeString();
306
+ @handle(cockpitKey.altitude)
307
+ onAltitude(feet: number) {
308
+ this.meters = Math.round(feet * 0.3048);
309
+ this.flightLevel = `FL${Math.round(feet / 100)}`;
386
310
  }
387
311
 
388
- incrementCount() {
389
- const data = storeGet(demoDataKey);
390
- set(demoDataKey, { ...data, count: data.count + 1 });
312
+ climb() {
313
+ const cockpit = storeGet(cockpitKey);
314
+ set(cockpitKey, { ...cockpit, altitude: cockpit.altitude + 1000 });
391
315
  }
392
316
 
393
317
  render() {
394
318
  return html`
395
319
  <div class="space-y-4">
396
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
397
- <code>@handle</code> sur <code>demoData.count</code> — calcul
398
- <code>doubled = count * 2</code>
399
- </p>
400
- <p>Doubled count: <strong>${this.doubled}</strong></p>
401
- <p class="text-sm text-neutral-500">
402
- Last update: ${this.lastUpdate || "—"}
320
+ <p>
321
+ Altitude: <strong>${this.flightLevel}</strong> ·
322
+ ${this.meters.toLocaleString("en")} m
403
323
  </p>
404
- <sonic-button @click=${this.incrementCount}>Increment count</sonic-button>
324
+ <sonic-button @click=${this.climb}>Climb 1,000 ft</sonic-button>
405
325
  </div>
406
326
  `;
407
327
  }
@@ -412,47 +332,24 @@ export class DemoHandleDynamic extends LitElement {
412
332
  static styles = [tailwind];
413
333
 
414
334
  @property({ type: Number })
415
- userIndex = 0;
335
+ seatIndex = 0;
416
336
 
417
- @state() displayName = "";
418
- @state() lastUpdate = "";
337
+ @state() announcement = "";
419
338
 
420
- @handle(new DataProviderKey<User, { userIndex: number }>("demoUsers.${userIndex}"))
421
- onUserAssigned(user: User) {
422
- this.displayName = `${user.firstName} ${user.lastName}`;
423
- this.lastUpdate = new Date().toLocaleTimeString();
339
+ @handle(personKey)
340
+ onPerson(person: OnBoard | null) {
341
+ this.announcement = person
342
+ ? `${person.name}, please proceed to gate B12.`
343
+ : "";
424
344
  }
425
345
 
426
346
  render() {
427
347
  return html`
428
348
  <div class="space-y-4">
429
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
430
- <code>@handle</code> avec chemin dynamique
431
- <code>demoUsers.\${userIndex}</code>
349
+ ${seatIndexInput(this)}
350
+ <p class="rounded border border-neutral-200 dark:border-neutral-700 p-3">
351
+ ${this.announcement || `Nobody at index ${this.seatIndex}`}
432
352
  </p>
433
- <sonic-input
434
- type="number"
435
- .value=${String(this.userIndex)}
436
- @input=${(e: Event) =>
437
- (this.userIndex = parseInt((e.target as HTMLInputElement).value))}
438
- min="0"
439
- max="9"
440
- label="User index"
441
- ></sonic-input>
442
- ${this.displayName
443
- ? html`
444
- <div
445
- class="rounded border border-neutral-200 dark:border-neutral-700 p-3"
446
- >
447
- <p>${this.displayName}</p>
448
- <p class="text-sm text-neutral-500">
449
- Assigned at ${this.lastUpdate}
450
- </p>
451
- </div>
452
- `
453
- : html`<p class="text-neutral-500">
454
- No user at index ${this.userIndex}
455
- </p>`}
456
353
  </div>
457
354
  `;
458
355
  }