@supersoniks/concorde 5.1.1 → 5.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) 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/.tmp-cem/custom-elements.json +503 -503
  6. package/PLAN-DOCS-AGENTS.md +80 -0
  7. package/README.md +3 -3
  8. package/ai/skills/concorde/SKILL.md +1 -1
  9. package/ai/skills/concorde-get-set-dp/SKILL.md +3 -3
  10. package/ai/skills/concorde-theme/SKILL.md +1 -1
  11. package/build-infos.json +1 -1
  12. package/concorde-core.bundle.js +1 -1
  13. package/concorde-core.es.js +1 -1
  14. package/dist/concorde-core.bundle.js +1 -1
  15. package/dist/concorde-core.es.js +1 -1
  16. package/docs/.htaccess +75 -0
  17. package/docs/404.html +15 -0
  18. package/docs/404.md +5 -0
  19. package/docs/assets/{index-Bb-_LRyY.js → index-BgG6FFPt.js} +2582 -3097
  20. package/docs/assets/index-x89XINSG.css +1 -0
  21. package/docs/core/components/functional/date/date.html +211 -0
  22. package/docs/core/components/functional/date/date.md +150 -0
  23. package/docs/core/components/functional/fetch/fetch.html +180 -0
  24. package/docs/core/components/functional/fetch/fetch.md +108 -0
  25. package/docs/core/components/functional/if/if.html +65 -0
  26. package/docs/core/components/functional/if/if.md +34 -0
  27. package/docs/core/components/functional/jsonata/jsonata.html +110 -0
  28. package/docs/core/components/functional/jsonata/jsonata.md +61 -0
  29. package/docs/core/components/functional/list/list.html +198 -0
  30. package/docs/core/components/functional/list/list.md +121 -0
  31. package/docs/core/components/functional/mix/mix.html +78 -0
  32. package/docs/core/components/functional/mix/mix.md +46 -0
  33. package/docs/core/components/functional/queue/queue.html +155 -0
  34. package/docs/core/components/functional/queue/queue.md +51 -0
  35. package/docs/core/components/functional/router/router.html +154 -0
  36. package/docs/core/components/functional/router/router.md +93 -0
  37. package/docs/core/components/functional/sdui/sdui-extension-points.html +127 -0
  38. package/docs/core/components/functional/sdui/sdui-extension-points.md +94 -0
  39. package/docs/core/components/functional/sdui/sdui.html +397 -0
  40. package/docs/core/components/functional/sdui/sdui.md +307 -0
  41. package/docs/core/components/functional/states/states.html +141 -0
  42. package/docs/core/components/functional/states/states.md +112 -0
  43. package/docs/core/components/functional/submit/submit.html +178 -0
  44. package/docs/core/components/functional/submit/submit.md +106 -0
  45. package/docs/core/components/functional/subscriber/subscriber.html +68 -0
  46. package/docs/core/components/functional/subscriber/subscriber.md +91 -0
  47. package/docs/core/components/functional/translation/translation.html +60 -0
  48. package/docs/core/components/functional/translation/translation.md +38 -0
  49. package/docs/core/components/functional/value/value.html +81 -0
  50. package/docs/core/components/functional/value/value.md +47 -0
  51. package/docs/core/components/ui/alert/alert.html +201 -0
  52. package/docs/core/components/ui/alert/alert.md +186 -0
  53. package/docs/core/components/ui/alert-messages/alert-messages.html +132 -0
  54. package/docs/core/components/ui/alert-messages/alert-messages.md +85 -0
  55. package/docs/core/components/ui/badge/badge.html +197 -0
  56. package/docs/core/components/ui/badge/badge.md +181 -0
  57. package/docs/core/components/ui/button/button.html +309 -0
  58. package/docs/core/components/ui/button/button.md +216 -0
  59. package/docs/core/components/ui/captcha/captcha.html +80 -0
  60. package/docs/core/components/ui/captcha/captcha.md +56 -0
  61. package/docs/core/components/ui/card/card.html +254 -0
  62. package/docs/core/components/ui/card/card.md +215 -0
  63. package/docs/core/components/ui/divider/divider.html +144 -0
  64. package/docs/core/components/ui/divider/divider.md +126 -0
  65. package/docs/core/components/ui/form/checkbox/checkbox.html +200 -0
  66. package/docs/core/components/ui/form/checkbox/checkbox.md +125 -0
  67. package/docs/core/components/ui/form/fieldset/fieldset.html +238 -0
  68. package/docs/core/components/ui/form/fieldset/fieldset.md +161 -0
  69. package/docs/core/components/ui/form/form-actions/form-actions.html +122 -0
  70. package/docs/core/components/ui/form/form-actions/form-actions.md +98 -0
  71. package/docs/core/components/ui/form/form-layout/form-layout.html +115 -0
  72. package/docs/core/components/ui/form/form-layout/form-layout.md +109 -0
  73. package/docs/core/components/ui/form/input/input.html +235 -0
  74. package/docs/core/components/ui/form/input/input.md +142 -0
  75. package/docs/core/components/ui/form/radio/radio.html +144 -0
  76. package/docs/core/components/ui/form/radio/radio.md +78 -0
  77. package/docs/core/components/ui/form/select/select.html +178 -0
  78. package/docs/core/components/ui/form/select/select.md +86 -0
  79. package/docs/core/components/ui/form/switch/switch.html +146 -0
  80. package/docs/core/components/ui/form/switch/switch.md +80 -0
  81. package/docs/core/components/ui/form/textarea/textarea.html +162 -0
  82. package/docs/core/components/ui/form/textarea/textarea.md +82 -0
  83. package/docs/core/components/ui/group/group.html +113 -0
  84. package/docs/core/components/ui/group/group.md +77 -0
  85. package/docs/core/components/ui/icon/icon.html +223 -0
  86. package/docs/core/components/ui/icon/icon.md +214 -0
  87. package/docs/core/components/ui/image/image.html +194 -0
  88. package/docs/core/components/ui/image/image.md +167 -0
  89. package/docs/core/components/ui/link/link.html +101 -0
  90. package/docs/core/components/ui/link/link.md +81 -0
  91. package/docs/core/components/ui/loader/loader.html +114 -0
  92. package/docs/core/components/ui/loader/loader.md +87 -0
  93. package/docs/core/components/ui/menu/menu.html +395 -0
  94. package/docs/core/components/ui/menu/menu.md +370 -0
  95. package/docs/core/components/ui/modal/modal.html +324 -0
  96. package/docs/core/components/ui/modal/modal.md +211 -0
  97. package/docs/core/components/ui/pop/pop.html +250 -0
  98. package/docs/core/components/ui/pop/pop.md +216 -0
  99. package/docs/core/components/ui/progress/progress.html +132 -0
  100. package/docs/core/components/ui/progress/progress.md +109 -0
  101. package/docs/core/components/ui/table/table.html +333 -0
  102. package/docs/core/components/ui/table/table.md +267 -0
  103. package/docs/core/components/ui/theme/theme.html +116 -0
  104. package/docs/core/components/ui/theme/theme.md +97 -0
  105. package/docs/core/components/ui/toast/toast.html +185 -0
  106. package/docs/core/components/ui/toast/toast.md +147 -0
  107. package/docs/core/components/ui/tooltip/tooltip.html +112 -0
  108. package/docs/core/components/ui/tooltip/tooltip.md +89 -0
  109. package/docs/docs/decorators/ancestor-attribute.html +71 -0
  110. package/docs/docs/decorators/ancestor-attribute.md +59 -0
  111. package/docs/docs/decorators/auto-subscribe.html +61 -0
  112. package/docs/docs/decorators/auto-subscribe.md +40 -0
  113. package/docs/docs/decorators/bind.html +86 -0
  114. package/docs/docs/decorators/bind.md +77 -0
  115. package/docs/docs/decorators/get.html +166 -0
  116. package/docs/docs/decorators/get.md +160 -0
  117. package/docs/docs/decorators/handle.html +139 -0
  118. package/docs/docs/decorators/handle.md +119 -0
  119. package/docs/docs/decorators/on-assign.html +72 -0
  120. package/docs/docs/decorators/on-assign.md +63 -0
  121. package/docs/docs/decorators/patch.html +76 -0
  122. package/docs/docs/decorators/patch.md +44 -0
  123. package/docs/docs/decorators/post.html +150 -0
  124. package/docs/docs/decorators/post.md +134 -0
  125. package/docs/docs/decorators/publish.html +74 -0
  126. package/docs/docs/decorators/publish.md +56 -0
  127. package/docs/docs/decorators/put.html +83 -0
  128. package/docs/docs/decorators/put.md +51 -0
  129. package/docs/docs/decorators/subscribe.html +91 -0
  130. package/docs/docs/decorators/subscribe.md +87 -0
  131. package/docs/docs/decorators/wait-for-ancestors.html +82 -0
  132. package/docs/docs/decorators/wait-for-ancestors.md +76 -0
  133. package/docs/docs/directives/sub.html +79 -0
  134. package/docs/docs/directives/sub.md +75 -0
  135. package/docs/docs/directives/t.html +91 -0
  136. package/docs/docs/directives/t.md +73 -0
  137. package/docs/docs/getting-started/ai-agents.html +174 -0
  138. package/{src/docs/_getting-started → docs/docs/getting-started}/ai-agents.md +3 -3
  139. package/docs/docs/getting-started/components.html +27 -0
  140. package/docs/docs/getting-started/create-a-component.html +108 -0
  141. package/{src/docs/_getting-started → docs/docs/getting-started}/create-a-component.md +3 -6
  142. package/docs/docs/getting-started/dataFlow.html +174 -0
  143. package/{src/docs/_core-concept → docs/docs/getting-started}/dataFlow.md +17 -18
  144. package/docs/docs/getting-started/installation.html +69 -0
  145. package/docs/docs/getting-started/installation.md +36 -0
  146. package/docs/docs/getting-started/my-first-component.html +180 -0
  147. package/{src/docs/_getting-started → docs/docs/getting-started}/my-first-component.md +5 -14
  148. package/docs/docs/getting-started/start.html +47 -0
  149. package/{src/docs/_getting-started → docs/docs/getting-started}/start.md +1 -13
  150. package/docs/docs/getting-started/theming.html +334 -0
  151. package/docs/docs/index.html +99 -0
  152. package/docs/docs/misc/api-configuration.html +149 -0
  153. package/{src/docs/_misc → docs/docs/misc}/api-configuration.md +10 -12
  154. package/docs/docs/misc/dataProviderKey.html +136 -0
  155. package/{src/docs/_misc → docs/docs/misc}/dataProviderKey.md +4 -4
  156. package/docs/docs/misc/docs-mock-api.html +155 -0
  157. package/{src/docs/_misc → docs/docs/misc}/docs-mock-api.md +12 -13
  158. package/docs/docs/misc/dynamic-path.html +181 -0
  159. package/{src/docs/_misc → docs/docs/misc}/dynamic-path.md +8 -8
  160. package/docs/docs/misc/endpoint.html +51 -0
  161. package/{src/docs/_misc → docs/docs/misc}/endpoint.md +8 -8
  162. package/docs/docs/misc/html-integration.html +45 -0
  163. package/{src/docs/_misc → docs/docs/misc}/html-integration.md +4 -5
  164. package/docs/docs-mock-api-sw.js +58 -223
  165. package/docs/docs-mock-api-sw.js.map +4 -4
  166. package/docs/hubs/decorators.html +443 -0
  167. package/docs/hubs/form-components.html +404 -0
  168. package/docs/hubs/remote-data.html +371 -0
  169. package/docs/img/archive/concorde-001-2cv.webp +0 -0
  170. package/docs/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  171. package/docs/img/archive/concorde-red-arrows-2002.webm +0 -0
  172. package/docs/img/archive/credits.json +28 -0
  173. package/docs/img/concorde/plane_01.jpg +0 -0
  174. package/docs/img/concorde/plane_02.jpg +0 -0
  175. package/docs/img/concorde/plane_03.jpg +0 -0
  176. package/docs/img/concorde/plane_04.jpg +0 -0
  177. package/docs/img/concorde/plane_05.jpg +0 -0
  178. package/docs/img/concorde/plane_06.jpg +0 -0
  179. package/docs/img/concorde/plane_07.jpg +0 -0
  180. package/docs/img/concorde/plane_08.jpg +0 -0
  181. package/docs/img/concorde/plane_09.jpg +0 -0
  182. package/docs/img/concorde/plane_10.jpg +0 -0
  183. package/docs/img/concorde/plane_11.jpg +0 -0
  184. package/docs/img/concorde/plane_12.jpg +0 -0
  185. package/docs/img/concorde/plane_13.jpg +0 -0
  186. package/docs/index.html +95 -68
  187. package/docs/index.md +22 -0
  188. package/docs/llms-full.txt +5795 -0
  189. package/docs/llms.txt +106 -0
  190. package/docs/robots.txt +11 -10
  191. package/docs/sitemap.xml +237 -0
  192. package/docs/src/core/components/functional/date/date.md +150 -0
  193. package/docs/src/core/components/functional/fetch/fetch.md +108 -0
  194. package/docs/src/core/components/functional/if/if.md +34 -0
  195. package/docs/src/core/components/functional/jsonata/jsonata.md +61 -0
  196. package/docs/src/core/components/functional/list/list.md +121 -0
  197. package/docs/src/core/components/functional/mix/mix.md +46 -0
  198. package/docs/src/core/components/functional/queue/queue.md +51 -0
  199. package/docs/src/core/components/functional/router/router.md +93 -0
  200. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  201. package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
  202. package/docs/src/core/components/functional/sdui/default-library.json +108 -0
  203. package/docs/src/core/components/functional/sdui/example.json +32 -0
  204. package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  205. package/docs/src/core/components/functional/sdui/sdui.md +307 -0
  206. package/docs/src/core/components/functional/states/states.md +112 -0
  207. package/docs/src/core/components/functional/submit/submit.md +106 -0
  208. package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
  209. package/docs/src/core/components/functional/translation/translation.md +38 -0
  210. package/docs/src/core/components/functional/value/value.md +47 -0
  211. package/docs/src/core/components/ui/alert/alert.md +186 -0
  212. package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  213. package/docs/src/core/components/ui/badge/badge.md +181 -0
  214. package/docs/src/core/components/ui/button/button.md +216 -0
  215. package/docs/src/core/components/ui/captcha/captcha.md +56 -0
  216. package/docs/src/core/components/ui/card/card.md +215 -0
  217. package/docs/src/core/components/ui/divider/divider.md +126 -0
  218. package/docs/src/core/components/ui/form/checkbox/checkbox.md +125 -0
  219. package/docs/src/core/components/ui/form/fieldset/fieldset.md +161 -0
  220. package/docs/src/core/components/ui/form/form-actions/form-actions.md +98 -0
  221. package/docs/src/core/components/ui/form/form-layout/form-layout.md +109 -0
  222. package/docs/src/core/components/ui/form/input/input.md +142 -0
  223. package/docs/src/core/components/ui/form/radio/radio.md +78 -0
  224. package/docs/src/core/components/ui/form/select/select.md +86 -0
  225. package/docs/src/core/components/ui/form/switch/switch.md +80 -0
  226. package/docs/src/core/components/ui/form/textarea/textarea.md +82 -0
  227. package/docs/src/core/components/ui/group/group.md +77 -0
  228. package/docs/src/core/components/ui/icon/icon.md +214 -0
  229. package/docs/src/core/components/ui/icon/icons.json +1 -0
  230. package/docs/src/core/components/ui/image/image.md +167 -0
  231. package/docs/src/core/components/ui/link/link.md +81 -0
  232. package/docs/src/core/components/ui/loader/loader.md +87 -0
  233. package/docs/src/core/components/ui/menu/menu.md +370 -0
  234. package/docs/src/core/components/ui/modal/modal.md +211 -0
  235. package/docs/src/core/components/ui/pop/pop.md +216 -0
  236. package/docs/src/core/components/ui/progress/progress.md +109 -0
  237. package/docs/src/core/components/ui/table/table.md +267 -0
  238. package/docs/src/core/components/ui/theme/theme.md +97 -0
  239. package/docs/src/core/components/ui/toast/toast.md +147 -0
  240. package/docs/src/core/components/ui/tooltip/tooltip.md +89 -0
  241. package/docs/src/docs/decorators/ancestor-attribute.md +59 -0
  242. package/docs/src/docs/decorators/auto-subscribe.md +40 -0
  243. package/docs/src/docs/decorators/bind.md +77 -0
  244. package/docs/src/docs/decorators/get.md +160 -0
  245. package/docs/src/docs/decorators/handle.md +119 -0
  246. package/docs/src/docs/decorators/on-assign.md +63 -0
  247. package/docs/src/docs/decorators/patch.md +44 -0
  248. package/docs/src/docs/decorators/post.md +134 -0
  249. package/docs/src/docs/decorators/publish.md +56 -0
  250. package/docs/src/docs/decorators/put.md +51 -0
  251. package/docs/src/docs/decorators/subscribe.md +87 -0
  252. package/docs/src/docs/decorators/wait-for-ancestors.md +76 -0
  253. package/docs/src/docs/directives/sub.md +75 -0
  254. package/docs/src/docs/directives/t.md +73 -0
  255. package/docs/src/docs/getting-started/ai-agents.md +76 -0
  256. package/docs/src/docs/getting-started/components.md +5 -0
  257. package/docs/src/docs/getting-started/create-a-component.md +136 -0
  258. package/docs/src/docs/getting-started/dataFlow.md +87 -0
  259. package/docs/src/docs/getting-started/installation.md +36 -0
  260. package/docs/src/docs/getting-started/my-first-component.md +227 -0
  261. package/docs/src/docs/getting-started/start.md +35 -0
  262. package/docs/src/docs/getting-started/theming.md +253 -0
  263. package/docs/src/docs/misc/api-configuration.md +79 -0
  264. package/docs/src/docs/misc/dataProviderKey.md +168 -0
  265. package/docs/src/docs/misc/docs-mock-api.md +62 -0
  266. package/docs/src/docs/misc/dynamic-path.md +71 -0
  267. package/docs/src/docs/misc/endpoint.md +45 -0
  268. package/docs/src/docs/misc/html-integration.md +14 -0
  269. package/docs/src/docs/search/docs-search.json +10287 -0
  270. package/docs/src/tag-list.json +1 -0
  271. package/docs/src/tsconfig-model.json +23 -0
  272. package/docs/src/tsconfig.json +1353 -0
  273. package/index.html +68 -5
  274. package/package.json +1 -1
  275. package/public/docs-mock-api-sw.js +58 -223
  276. package/public/docs-mock-api-sw.js.map +4 -4
  277. package/public/img/concorde/plane_01.jpg +0 -0
  278. package/public/img/concorde/plane_02.jpg +0 -0
  279. package/public/img/concorde/plane_03.jpg +0 -0
  280. package/public/img/concorde/plane_04.jpg +0 -0
  281. package/public/img/concorde/plane_05.jpg +0 -0
  282. package/public/img/concorde/plane_06.jpg +0 -0
  283. package/public/img/concorde/plane_07.jpg +0 -0
  284. package/public/img/concorde/plane_08.jpg +0 -0
  285. package/public/img/concorde/plane_09.jpg +0 -0
  286. package/public/img/concorde/plane_10.jpg +0 -0
  287. package/public/img/concorde/plane_11.jpg +0 -0
  288. package/public/img/concorde/plane_12.jpg +0 -0
  289. package/public/img/concorde/plane_13.jpg +0 -0
  290. package/public/robots.txt +11 -10
  291. package/scripts/docs-markdown-vite-plugin.ts +37 -0
  292. package/scripts/docs-public-url.mjs +50 -0
  293. package/scripts/docs.htaccess +75 -0
  294. package/scripts/generate-crawl-docs.mjs +207 -116
  295. package/scripts/generate-crawl-docs.test.mjs +124 -0
  296. package/scripts/post-build-docs.js +34 -50
  297. package/src/core/components/functional/date/date.md +91 -231
  298. package/src/core/components/functional/fetch/fetch.md +66 -83
  299. package/src/core/components/functional/if/if.md +28 -3
  300. package/src/core/components/functional/jsonata/jsonata.md +42 -37
  301. package/src/core/components/functional/list/list.md +99 -43
  302. package/src/core/components/functional/mix/mix.md +31 -26
  303. package/src/core/components/functional/queue/queue.demo.ts +10 -7
  304. package/src/core/components/functional/queue/queue.md +40 -61
  305. package/src/core/components/functional/router/router.demo.ts +16 -16
  306. package/src/core/components/functional/router/router.md +64 -65
  307. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  308. package/src/core/components/functional/sdui/component-catalog.json +1 -1
  309. package/src/core/components/functional/sdui/example.json +19 -86
  310. package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
  311. package/src/core/components/functional/sdui/sdui.md +187 -358
  312. package/src/core/components/functional/states/states.demo.ts +21 -22
  313. package/src/core/components/functional/states/states.md +86 -61
  314. package/src/core/components/functional/states/states.ts +1 -1
  315. package/src/core/components/functional/submit/submit.md +64 -72
  316. package/src/core/components/functional/translation/translation.md +38 -0
  317. package/src/core/components/functional/value/value.md +34 -22
  318. package/src/core/components/ui/alert/alert.md +48 -58
  319. package/src/core/components/ui/badge/badge.md +27 -34
  320. package/src/core/components/ui/button/button.md +139 -106
  321. package/src/core/components/ui/captcha/captcha.md +17 -32
  322. package/src/core/components/ui/card/card.md +6 -6
  323. package/src/core/components/ui/divider/divider.md +8 -11
  324. package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
  325. package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
  326. package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
  327. package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
  328. package/src/core/components/ui/form/input/input.md +95 -95
  329. package/src/core/components/ui/form/radio/radio.md +55 -34
  330. package/src/core/components/ui/form/select/select.md +60 -45
  331. package/src/core/components/ui/form/switch/switch.md +57 -34
  332. package/src/core/components/ui/form/textarea/textarea.md +55 -38
  333. package/src/core/components/ui/group/group.md +35 -33
  334. package/src/core/components/ui/icon/icon.md +4 -4
  335. package/src/core/components/ui/image/image.md +41 -107
  336. package/src/core/components/ui/link/link.md +6 -6
  337. package/src/core/components/ui/loader/loader.md +30 -55
  338. package/src/core/components/ui/menu/menu.md +27 -27
  339. package/src/core/components/ui/modal/modal.md +72 -96
  340. package/src/core/components/ui/pop/pop.md +80 -158
  341. package/src/core/components/ui/progress/progress.md +2 -2
  342. package/src/core/components/ui/table/table.md +91 -255
  343. package/src/core/components/ui/theme/theme.md +11 -36
  344. package/src/core/components/ui/toast/toast.md +48 -117
  345. package/src/core/components/ui/tooltip/tooltip.md +27 -62
  346. package/src/core/utils/LocationHandler.spec.ts +80 -0
  347. package/src/core/utils/LocationHandler.ts +5 -9
  348. package/src/docs/components/docs-demo-sources.ts +55 -140
  349. package/src/docs/components/docs-lit-demo.ts +1 -3
  350. package/src/docs/components/docs-source-link.ts +0 -82
  351. package/src/docs/decorators/ancestor-attribute.md +59 -0
  352. package/src/docs/decorators/auto-subscribe.md +40 -0
  353. package/src/docs/decorators/bind.md +77 -0
  354. package/src/docs/decorators/get.md +160 -0
  355. package/src/docs/decorators/handle.md +119 -0
  356. package/src/docs/decorators/on-assign.md +63 -0
  357. package/src/docs/decorators/patch.md +44 -0
  358. package/src/docs/decorators/post.md +134 -0
  359. package/src/docs/decorators/publish.md +56 -0
  360. package/src/docs/decorators/put.md +51 -0
  361. package/src/docs/decorators/subscribe.md +87 -0
  362. package/src/docs/decorators/wait-for-ancestors.md +76 -0
  363. package/src/docs/directives/sub.md +75 -0
  364. package/src/docs/directives/t.md +73 -0
  365. package/src/docs/docs-location.spec.ts +46 -0
  366. package/src/docs/docs-location.ts +123 -32
  367. package/src/docs/docs.ts +1 -2
  368. package/src/docs/example/decorators-demo-bind-demos.ts +81 -116
  369. package/src/docs/example/decorators-demo-geo.ts +30 -19
  370. package/src/docs/example/decorators-demo-post.ts +88 -186
  371. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
  372. package/src/docs/example/decorators-demo.ts +85 -98
  373. package/src/docs/example/docs-api-config-demos.ts +19 -20
  374. package/src/docs/example/docs-flight-demos.ts +147 -0
  375. package/src/docs/example/docs-jsonata-demos.ts +52 -52
  376. package/src/docs/example/docs-list-demos.ts +43 -123
  377. package/src/docs/example/docs-provider-keys.ts +21 -28
  378. package/src/docs/example/docs-queue-demos.ts +37 -77
  379. package/src/docs/example/docs-router-demos.ts +20 -25
  380. package/src/docs/example/docs-submit-demos.ts +48 -48
  381. package/src/docs/example/docs-toggle-demos.ts +4 -3
  382. package/src/docs/getting-started/ai-agents.md +76 -0
  383. package/src/docs/getting-started/components.md +5 -0
  384. package/src/docs/getting-started/create-a-component.md +136 -0
  385. package/src/docs/getting-started/dataFlow.md +87 -0
  386. package/src/docs/getting-started/installation.md +36 -0
  387. package/src/docs/getting-started/my-first-component.md +227 -0
  388. package/src/docs/getting-started/start.md +35 -0
  389. package/src/docs/getting-started/theming.md +253 -0
  390. package/src/docs/header/header.ts +11 -6
  391. package/src/docs/home/catalog.ts +1 -1
  392. package/src/docs/home/home.ts +17 -10
  393. package/src/docs/layout.ts +12 -13
  394. package/src/docs/misc/api-configuration.md +79 -0
  395. package/src/docs/misc/dataProviderKey.md +168 -0
  396. package/src/docs/misc/docs-mock-api.md +62 -0
  397. package/src/docs/misc/dynamic-path.md +71 -0
  398. package/src/docs/misc/endpoint.md +45 -0
  399. package/src/docs/misc/html-integration.md +14 -0
  400. package/src/docs/mock-api/api-config-mock.ts +5 -0
  401. package/src/docs/mock-api/fixtures.ts +0 -278
  402. package/src/docs/mock-api/flights.ts +89 -0
  403. package/src/docs/mock-api/router.ts +3 -4
  404. package/src/docs/mock-api/urls.ts +1 -2
  405. package/src/docs/navigation/navigation.ts +82 -103
  406. package/src/docs/navigation/toc.ts +7 -4
  407. package/src/docs/search/docs-search.json +2845 -5110
  408. package/src/docs/search/markdown-renderer.ts +25 -7
  409. package/src/docs/search/page.ts +9 -6
  410. package/src/docs/search/search.ts +154 -122
  411. package/vite.config.mts +11 -2
  412. package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
  413. package/docs/assets/index-CD4WyL6o.css +0 -1
  414. package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
  415. package/src/docs/_core-concept/overview.md +0 -57
  416. package/src/docs/_core-concept/subscriber.md +0 -75
  417. package/src/docs/_decorators/ancestor-attribute.md +0 -128
  418. package/src/docs/_decorators/auto-subscribe.md +0 -202
  419. package/src/docs/_decorators/bind.md +0 -167
  420. package/src/docs/_decorators/get.md +0 -162
  421. package/src/docs/_decorators/handle.md +0 -175
  422. package/src/docs/_decorators/on-assign.md +0 -390
  423. package/src/docs/_decorators/patch.md +0 -70
  424. package/src/docs/_decorators/post.md +0 -146
  425. package/src/docs/_decorators/publish.md +0 -55
  426. package/src/docs/_decorators/put.md +0 -70
  427. package/src/docs/_decorators/subscribe.md +0 -100
  428. package/src/docs/_decorators/wait-for-ancestors.md +0 -163
  429. package/src/docs/_directives/sub.md +0 -91
  430. package/src/docs/_getting-started/concorde-manual-install.md +0 -133
  431. package/src/docs/_getting-started/concorde-outside.md +0 -33
  432. package/src/docs/_getting-started/my-first-subscriber.md +0 -120
  433. package/src/docs/_getting-started/pubsub.md +0 -37
  434. package/src/docs/_misc/formelement-subscriber-removal.md +0 -115
  435. package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
  436. package/src/docs/example/docs-joke-demos.ts +0 -297
  437. /package/{src/docs/_getting-started → docs/docs/getting-started}/components.md +0 -0
  438. /package/{src/docs/_getting-started → docs/docs/getting-started}/theming.md +0 -0
@@ -35,24 +35,21 @@ export class DemoAncestorAttribute extends LitElement {
35
35
  @ancestorAttribute("dataProvider")
36
36
  dataProvider: string | null = null;
37
37
 
38
- @ancestorAttribute("testAttribute")
39
- testAttribute: string | null = null;
38
+ @ancestorAttribute("gate")
39
+ gate: string | null = null;
40
40
 
41
41
  render() {
42
42
  return html`
43
43
  <div
44
44
  class="space-y-2 rounded border border-neutral-200 dark:border-neutral-700 p-3"
45
45
  >
46
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
47
- <code>@ancestorAttribute</code> — lecture unique au connect (défaut)
48
- </p>
49
46
  <p>
50
47
  dataProvider:
51
48
  <strong>${this.dataProvider ?? "null"}</strong>
52
49
  </p>
53
50
  <p>
54
- testAttribute:
55
- <strong>${this.testAttribute ?? "null"}</strong>
51
+ gate:
52
+ <strong>${this.gate ?? "null"}</strong>
56
53
  </p>
57
54
  </div>
58
55
  `;
@@ -86,43 +83,37 @@ export class DemoAncestorAttributeDynamicSection extends LitElement {
86
83
  static styles = [tailwind];
87
84
 
88
85
  /** Direct parent of the child — closest ancestor when set. */
89
- @state() parentValue: string | null = "from-parent";
86
+ @state() parentValue: string | null = "departures";
90
87
  /** Grandparent — used when the parent has no attribute. */
91
- @state() outerValue: string | null = "from-outer";
88
+ @state() outerValue: string | null = "fleet";
92
89
  /** Optional wrapper inserted between parent and child (wins over parent). */
93
90
  @state() closerActive = false;
94
91
 
95
92
  render() {
96
93
  return html`
97
94
  <div class="space-y-4">
98
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
99
- The child always displays the <strong>nearest</strong> ancestor
100
- <code>dataProvider</code>. Change a value, add a closer wrapper, or
101
- remove an attribute — the property follows automatically.
102
- </p>
103
-
104
95
  <div class="flex flex-wrap gap-2">
105
96
  <span class="text-xs text-neutral-500 self-center w-full"
106
97
  >Parent</span
107
98
  >
108
99
  <sonic-button
109
100
  size="sm"
110
- @click=${() => (this.parentValue = "from-parent")}
101
+ @click=${() => (this.parentValue = "departures")}
111
102
  >
112
- parent-a
103
+ departures
113
104
  </sonic-button>
114
105
  <sonic-button
115
106
  size="sm"
116
- @click=${() => (this.parentValue = "from-parent-b")}
107
+ @click=${() => (this.parentValue = "arrivals")}
117
108
  >
118
- parent-b
109
+ arrivals
119
110
  </sonic-button>
120
111
  <sonic-button
121
112
  size="sm"
122
113
  variant="outline"
123
114
  @click=${() => (this.parentValue = null)}
124
115
  >
125
- Remove parent attr
116
+ Remove attribute
126
117
  </sonic-button>
127
118
  </div>
128
119
 
@@ -135,7 +126,7 @@ export class DemoAncestorAttributeDynamicSection extends LitElement {
135
126
  ?disabled=${this.closerActive}
136
127
  @click=${() => (this.closerActive = true)}
137
128
  >
138
- Add closer → from-closer
129
+ Add closer (flights.CN001)
139
130
  </sonic-button>
140
131
  <sonic-button
141
132
  size="sm"
@@ -151,22 +142,22 @@ export class DemoAncestorAttributeDynamicSection extends LitElement {
151
142
  <span class="text-xs text-neutral-500 self-center w-full">Outer</span>
152
143
  <sonic-button
153
144
  size="sm"
154
- @click=${() => (this.outerValue = "from-outer")}
145
+ @click=${() => (this.outerValue = "fleet")}
155
146
  >
156
- outer-a
147
+ fleet
157
148
  </sonic-button>
158
149
  <sonic-button
159
150
  size="sm"
160
- @click=${() => (this.outerValue = "from-outer-b")}
151
+ @click=${() => (this.outerValue = "crew")}
161
152
  >
162
- outer-b
153
+ crew
163
154
  </sonic-button>
164
155
  <sonic-button
165
156
  size="sm"
166
157
  variant="outline"
167
158
  @click=${() => (this.outerValue = null)}
168
159
  >
169
- Remove outer attr
160
+ Remove attribute
170
161
  </sonic-button>
171
162
  </div>
172
163
 
@@ -175,23 +166,23 @@ export class DemoAncestorAttributeDynamicSection extends LitElement {
175
166
  dataProvider=${this.outerValue ?? nothing}
176
167
  >
177
168
  <p class="text-xs text-neutral-400">
178
- outer ${this.outerValue ?? "— no dataProvider —"}
169
+ outer: ${this.outerValue ?? "no dataProvider"}
179
170
  </p>
180
171
  <div
181
172
  class="rounded border border-dashed border-neutral-300 dark:border-neutral-600 p-3 space-y-2"
182
173
  dataProvider=${this.parentValue ?? nothing}
183
174
  >
184
175
  <p class="text-xs text-neutral-400">
185
- parent ${this.parentValue ?? "— no dataProvider —"}
176
+ parent: ${this.parentValue ?? "no dataProvider"}
186
177
  </p>
187
178
  ${this.closerActive
188
179
  ? html`
189
180
  <div
190
181
  class="rounded border border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-950/30 p-2 space-y-2"
191
- dataProvider="from-closer"
182
+ dataProvider="flights.CN001"
192
183
  >
193
184
  <p class="text-xs text-amber-800 dark:text-amber-200">
194
- closer from-closer
185
+ closer: flights.CN001
195
186
  </p>
196
187
  <demo-ancestor-attribute-dynamic></demo-ancestor-attribute-dynamic>
197
188
  </div>
@@ -204,50 +195,57 @@ export class DemoAncestorAttributeDynamicSection extends LitElement {
204
195
  }
205
196
  }
206
197
 
198
+ const PASSENGERS = [
199
+ "Ada Lindqvist",
200
+ "Captain Leo Marchand",
201
+ "Mira Okafor",
202
+ "Jonas Berg",
203
+ ];
204
+
207
205
  @customElement("demo-on-assign")
208
206
  export class DemoOnAssign extends LitElement {
209
207
  static styles = [tailwind];
210
208
 
211
- @state() userWithSettings: any = null;
212
- @state() isReady: boolean = false;
213
- @state() lastUpdate: string = "";
209
+ @state() passenger: { name: string; email: string } | null = null;
210
+ @state() settings: { theme: string; language: string } | null = null;
211
+ @state() lastUpdate = "";
214
212
 
213
+ /** Called once both paths hold a value, then on every later assignment. */
215
214
  @onAssign("demoUser", "demoUserSettings")
216
- handleDataReady(user: any, settings: any) {
217
- this.isReady =
218
- Object.keys(user).length > 0 && Object.keys(settings).length > 0;
219
- this.userWithSettings = { ...user, ...settings };
215
+ handleDataReady(
216
+ user: { name: string; email: string },
217
+ settings: { theme: string; language: string },
218
+ ) {
219
+ this.passenger = user;
220
+ this.settings = settings;
220
221
  this.lastUpdate = new Date().toLocaleTimeString();
221
- this.requestUpdate();
222
222
  }
223
223
 
224
224
  render() {
225
- const { name, email, theme, language } = this.userWithSettings;
226
225
  return html`
227
- <div class="mt-2">
228
- <sonic-button @click=${this.updateData}>Update Data</sonic-button>
229
- </div>
230
- <div class="p-3">
231
- ${this.isReady === false
232
- ? html`<p>No settings yet...</p>`
233
- : html`<p>${name || "N/A"}</p>
234
- <p>${email || "N/A"}</p>
235
- <p>${theme || "N/A"}</p>
236
- <p>${language || "N/A"}</p>
237
- <p><small>Last updated: ${this.lastUpdate}</small></p> `}
226
+ <div class="flex flex-col gap-3">
227
+ <div>
228
+ <sonic-button @click=${this.nextPassenger}>Next passenger</sonic-button>
229
+ </div>
230
+ ${this.passenger && this.settings
231
+ ? html`<div class="rounded border border-neutral-200 dark:border-neutral-700 p-3">
232
+ <p><strong>${this.passenger.name}</strong></p>
233
+ <p>${this.passenger.email}</p>
234
+ <p>Theme: ${this.settings.theme} · Language: ${this.settings.language}</p>
235
+ <p><small>Last update: ${this.lastUpdate}</small></p>
236
+ </div>`
237
+ : html`<p>Waiting for passenger and settings…</p>`}
238
238
  </div>
239
239
  `;
240
240
  }
241
241
 
242
- updateData() {
243
- const userNumber = Math.floor(Math.random() * 100);
244
- set(demoUserKey, {
245
- name: `User n°${userNumber}`,
246
- email: `user-${userNumber}@example.com`,
247
- });
242
+ nextPassenger() {
243
+ const name = PASSENGERS[Math.floor(Math.random() * PASSENGERS.length)];
244
+ const slug = name.toLowerCase().replace("captain ", "").replace(" ", ".");
245
+ set(demoUserKey, { name, email: `${slug}@example.com` });
248
246
  set(demoUserSettingsKey, {
249
247
  theme: ["light", "dark", "auto"][Math.floor(Math.random() * 3)],
250
- language: ["en", "fr", "es"][Math.floor(Math.random() * 3)],
248
+ language: ["en", "fr", "sv"][Math.floor(Math.random() * 3)],
251
249
  });
252
250
  }
253
251
  }
@@ -300,11 +298,10 @@ export class DemoOnAssignDynamic extends LitElement {
300
298
  if (!users[idx] || !settings[idx]) return;
301
299
 
302
300
  const randomNames = [
303
- { firstName: "Alice", lastName: "Wonder" },
304
- { firstName: "Bob", lastName: "Builder" },
305
- { firstName: "Charlie", lastName: "Chaplin" },
306
- { firstName: "Diana", lastName: "Prince" },
307
- { firstName: "Eve", lastName: "Adams" },
301
+ { firstName: "Ada", lastName: "Lindqvist" },
302
+ { firstName: "Leo", lastName: "Marchand" },
303
+ { firstName: "Mira", lastName: "Okafor" },
304
+ { firstName: "Jonas", lastName: "Berg" },
308
305
  ];
309
306
  const randomThemes = ["light", "dark", "auto"];
310
307
  const randomLanguages = ["en", "fr", "es", "de", "it"];
@@ -330,9 +327,9 @@ export class DemoOnAssignDynamic extends LitElement {
330
327
  render() {
331
328
  return html`
332
329
  <div class="flex flex-col gap-2">
333
- <sonic-select label="Users set" @change=${this.updateDataProvider}>
334
- <option value=${demoUsersKey.path}>First set of users</option>
335
- <option value=${demoUsersAltKey.path}>Second set of users</option>
330
+ <sonic-select label="Passenger list" @change=${this.updateDataProvider}>
331
+ <option value=${demoUsersKey.path}>First list</option>
332
+ <option value=${demoUsersAltKey.path}>Second list</option>
336
333
  </sonic-select>
337
334
  <sonic-input
338
335
  type="number"
@@ -345,7 +342,7 @@ export class DemoOnAssignDynamic extends LitElement {
345
342
  >
346
343
  </sonic-input>
347
344
  <sonic-button @click=${this.updateCurrentUserData}
348
- >Update current user data</sonic-button
345
+ >Update current passenger</sonic-button
349
346
  >
350
347
  <div class="flex flex-col gap-2 border p-2">
351
348
  <div>
@@ -370,35 +367,32 @@ export class DemoOnAssignDynamic extends LitElement {
370
367
  export class DemoAutoSubscribe extends LitElement {
371
368
  static styles = [tailwind];
372
369
 
373
- @state() displayText: string = "";
374
- @state() computedValue: number = 0;
370
+ @state() displayText = "";
375
371
 
372
+ /** Re-runs whenever `autoValue1` or `autoValue2` is assigned. */
376
373
  @autoSubscribe()
377
374
  updateDisplay() {
378
- const value1 = get(autoValue1Key) || 0;
379
- const value2 = get(autoValue2Key) || 0;
380
-
381
- this.computedValue = value1 + value2;
382
- this.displayText = `${value1} + ${value2} = ${this.computedValue}`;
375
+ const passengers = get(autoValue1Key) || 0;
376
+ const crew = get(autoValue2Key) || 0;
377
+ this.displayText = `${passengers} passengers + ${crew} crew = ${passengers + crew} on board`;
383
378
  }
384
379
 
385
380
  render() {
386
381
  return html`
387
- <p><strong>${this.displayText}</strong></p>
388
- <div>
389
- <sonic-button @click=${() => this.randomizeValue("autoValue1")}
390
- >Randomize Value 1</sonic-button
382
+ <p class="mb-2"><strong>${this.displayText}</strong></p>
383
+ <div class="flex flex-wrap gap-2">
384
+ <sonic-button @click=${() => this.randomize(autoValue1Key, 100)}
385
+ >Board passengers</sonic-button
386
+ >
387
+ <sonic-button @click=${() => this.randomize(autoValue2Key, 12)}
388
+ >Change crew</sonic-button
391
389
  >
392
- <sonic-button @click=${() => this.randomizeValue("autoValue2")}
393
- Randomize Value 2
394
- </sonic-button>
395
390
  </div>
396
391
  `;
397
392
  }
398
393
 
399
- randomizeValue(which: "autoValue1" | "autoValue2") {
400
- const key = which === "autoValue1" ? autoValue1Key : autoValue2Key;
401
- set(key, Math.floor(Math.random() * 100));
394
+ randomize(key: typeof autoValue1Key, max: number) {
395
+ set(key, Math.floor(Math.random() * max) + 1);
402
396
  }
403
397
  }
404
398
 
@@ -425,10 +419,10 @@ export class DemoWaitAncestorValue extends LitElement {
425
419
  render() {
426
420
  return html`
427
421
  <p>
428
- DataProvider from ancestor:
429
- <strong>${this.dataProvider || "—"}</strong>
422
+ dataProvider from ancestor:
423
+ <strong>${this.dataProvider || "none yet"}</strong>
430
424
  </p>
431
- <p>Initialized at: ${this.initializedAt || "(waiting for parent…)"}</p>
425
+ <p>Initialized at: ${this.initializedAt || "waiting for the parent…"}</p>
432
426
  `;
433
427
  }
434
428
  }
@@ -500,11 +494,11 @@ export class DemoWaitAncestorValueMulti extends LitElement {
500
494
  render() {
501
495
  return html`
502
496
  <p>
503
- DataProvider from ancestor:
504
- <strong>${this.dataProvider || "—"}</strong>
497
+ dataProvider from ancestor:
498
+ <strong>${this.dataProvider || "none yet"}</strong>
505
499
  </p>
506
500
  <p>
507
- Initialized at: ${this.initializedAt || "(waiting for both ancestors…)"}
501
+ Initialized at: ${this.initializedAt || "waiting for both ancestors…"}
508
502
  </p>
509
503
  `;
510
504
  }
@@ -581,7 +575,7 @@ export class DemoWaitAncestorValueReady extends LitElement {
581
575
 
582
576
  render() {
583
577
  return html`
584
- <p>DataProvider: <strong>${this.dataProvider || "—"}</strong></p>
578
+ <p>dataProvider: <strong>${this.dataProvider || "none"}</strong></p>
585
579
  <p>Initialized at: ${this.initializedAt}</p>
586
580
  `;
587
581
  }
@@ -600,12 +594,8 @@ export class DemoWaitAncestorsReadySection extends LitElement {
600
594
  render() {
601
595
  return html`
602
596
  <div class="space-y-4">
603
- <p class="text-sm text-neutral-600 dark:text-neutral-400">
604
- Parent défini au chargement. Ajout dynamique de l’enfant —
605
- initialisation immédiate si l’ancêtre est prêt.
606
- </p>
607
597
  <sonic-button ?disabled=${this.childInDom} @click=${this.addChild}>
608
- ${this.childInDom ? "Child added" : "Add child dynamically"}
598
+ ${this.childInDom ? "Child added" : "Add child"}
609
599
  </sonic-button>
610
600
  <demo-wait-ancestor-ready dataProvider=${waitAncestorDemoKey.path}>
611
601
  ${this.childInDom
@@ -623,9 +613,6 @@ export class DemoWaitAncestorsStaticSection extends LitElement {
623
613
 
624
614
  render() {
625
615
  return html`
626
- <p class="text-sm text-neutral-600 dark:text-neutral-400 mb-4">
627
- Parent et enfant présents dès le chargement — pas de délai.
628
- </p>
629
616
  <demo-wait-ancestor-ready dataProvider=${waitAncestorDemoKey.path}>
630
617
  <demo-wait-ancestor-value-ready></demo-wait-ancestor-value-ready>
631
618
  </demo-wait-ancestor-ready>
@@ -4,7 +4,7 @@ import { get } from "@supersoniks/concorde/core/decorators/api";
4
4
  import type { ApiResult } from "@supersoniks/concorde/core/utils/api";
5
5
  import { Endpoint } from "@supersoniks/concorde/core/utils/endpoint";
6
6
  import { set } from "@supersoniks/concorde/core/utils/PublisherProxy";
7
- import { wording } from "@supersoniks/concorde/core/directives/Wording";
7
+ import { t } from "@supersoniks/concorde/core/directives/Wording";
8
8
  import { DOCS_MOCK_API_BASE } from "../mock-api/urls";
9
9
  import {
10
10
  DOCS_MOCK_EVENTS_API_TOKEN,
@@ -128,32 +128,31 @@ export class DocsApiConfigStaleTokenDemo extends LitElement {
128
128
  }
129
129
  }
130
130
 
131
- /** Ancestor attributes: <code>wordingProvider</code> + directive <code>wording()</code>. */
131
+ /** <code>t()</code> reads <code>serviceURL</code> / <code>wordingProvider</code> from the host and its ancestors. */
132
132
  @customElement("docs-api-config-wording-demo")
133
133
  export class DocsApiConfigWordingDemo extends LitElement {
134
134
  static styles = [tailwind];
135
135
 
136
+ connectedCallback() {
137
+ this.setAttribute("serviceURL", DOCS_MOCK_API_BASE);
138
+ this.setAttribute("wordingProvider", "wording/labels?lang=fr");
139
+ this.setAttribute("wordingVersionProvider", docsApiConfWordingVersionKey.path);
140
+ super.connectedCallback();
141
+ }
142
+
136
143
  render() {
137
144
  return html`
138
- <div
139
- serviceURL=${DOCS_MOCK_API_BASE}
140
- wordingProvider="wording/labels?lang=fr"
141
- wordingVersionProvider=${docsApiConfWordingVersionKey.path}
145
+ <p class="text-sm space-y-2">
146
+ <span class="block">${t("api-config.greeting")}</span>
147
+ <span class="block">${t("api-config.farewell")}</span>
148
+ <span class="block text-neutral-500">${t("api-config.hint")}</span>
149
+ </p>
150
+ <sonic-button
151
+ size="sm"
152
+ class="mt-3"
153
+ @click=${() => set(docsApiConfWordingVersionKey, Date.now())}
154
+ >Bump wording version (reload)</sonic-button
142
155
  >
143
- <p class="text-sm space-y-2">
144
- <span class="block">${wording("api-config.greeting")}</span>
145
- <span class="block">${wording("api-config.farewell")}</span>
146
- <span class="block text-neutral-500"
147
- >${wording("api-config.hint")}</span
148
- >
149
- </p>
150
- <sonic-button
151
- size="sm"
152
- class="mt-3"
153
- @click=${() => set(docsApiConfWordingVersionKey, Date.now())}
154
- >Bump wording version (reload)</sonic-button
155
- >
156
- </div>
157
156
  `;
158
157
  }
159
158
  }
@@ -0,0 +1,147 @@
1
+ import { html, LitElement } from "lit";
2
+ import { customElement, property } from "lit/decorators.js";
3
+ import { DOCS_MOCK_API_BASE } from "../mock-api/urls";
4
+ import type { DocsFlight, DocsFlightStatus } from "../mock-api/flights";
5
+ import {
6
+ docsFlightDelayedSwitchKey,
7
+ docsFlightDirectionFilterKey,
8
+ docsFlightSearchFilterKey,
9
+ docsFlightStatusRadioKey,
10
+ } from "./docs-provider-keys";
11
+ import { tailwind } from "../tailwind";
12
+
13
+ import "../../core/components/functional/queue/queue";
14
+ import "../../core/components/ui/badge/badge";
15
+ import "../../core/components/ui/form/input/input";
16
+ import "../../core/components/ui/form/select/select";
17
+ import "../../core/components/ui/form/radio/radio";
18
+ import "../../core/components/ui/form/switch/switch";
19
+
20
+ const STATUS: Record<DocsFlightStatus, { label: string; type: string }> = {
21
+ "on-time": { label: "On time", type: "success" },
22
+ boarding: { label: "Boarding", type: "info" },
23
+ delayed: { label: "Delayed", type: "warning" },
24
+ landed: { label: "Landed", type: "neutral" },
25
+ cancelled: { label: "Cancelled", type: "danger" },
26
+ };
27
+
28
+ const flightRow = (f: DocsFlight) => html`
29
+ <div
30
+ class="grid grid-cols-[3.5rem_4.5rem_1fr_auto] items-center gap-3 border-0 border-b border-dotted border-neutral-300 py-2 text-sm"
31
+ >
32
+ <span class="font-mono">${f.time}</span>
33
+ <span class="font-mono">${f.code}</span>
34
+ <span>${f.city} <span class="text-neutral-500">(${f.airport})</span></span>
35
+ <sonic-badge size="xs" type=${STATUS[f.status].type}
36
+ >${STATUS[f.status].label}</sonic-badge
37
+ >
38
+ </div>
39
+ `;
40
+
41
+ /** Flight board: a sonic-queue on `/flights`, filtered by `filterProvider`. */
42
+ @customElement("docs-flight-board")
43
+ export class DocsFlightBoard extends LitElement {
44
+ static styles = [tailwind];
45
+
46
+ @property() filterProvider = "";
47
+ @property() direction = "";
48
+
49
+ render() {
50
+ const direction = this.direction ? `&direction=${this.direction}` : "";
51
+ return html`
52
+ <sonic-queue
53
+ serviceURL=${DOCS_MOCK_API_BASE}
54
+ dataProviderExpression="flights?offset=$offset&limit=$limit${direction}"
55
+ dataFilterProvider=${this.filterProvider}
56
+ key="flights"
57
+ limit="8"
58
+ class="mt-4 block max-h-80 overflow-y-auto"
59
+ .items=${flightRow}
60
+ ></sonic-queue>
61
+ `;
62
+ }
63
+ }
64
+
65
+ @customElement("docs-flight-search-demo")
66
+ export class DocsFlightSearchDemo extends LitElement {
67
+ static styles = [tailwind];
68
+
69
+ render() {
70
+ return html`
71
+ <sonic-input
72
+ formDataProvider=${docsFlightSearchFilterKey.path}
73
+ name="q"
74
+ label="Search flights"
75
+ placeholder="City, airport or flight number"
76
+ ></sonic-input>
77
+ <docs-flight-board
78
+ filterProvider=${docsFlightSearchFilterKey.path}
79
+ direction="departures"
80
+ ></docs-flight-board>
81
+ `;
82
+ }
83
+ }
84
+
85
+ @customElement("docs-flight-direction-demo")
86
+ export class DocsFlightDirectionDemo extends LitElement {
87
+ static styles = [tailwind];
88
+
89
+ render() {
90
+ return html`
91
+ <sonic-select
92
+ formDataProvider=${docsFlightDirectionFilterKey.path}
93
+ name="direction"
94
+ label="Board"
95
+ >
96
+ <option value="departures">Departures</option>
97
+ <option value="arrivals">Arrivals</option>
98
+ </sonic-select>
99
+ <docs-flight-board
100
+ filterProvider=${docsFlightDirectionFilterKey.path}
101
+ ></docs-flight-board>
102
+ `;
103
+ }
104
+ }
105
+
106
+ @customElement("docs-flight-status-radio-demo")
107
+ export class DocsFlightStatusRadioDemo extends LitElement {
108
+ static styles = [tailwind];
109
+
110
+ render() {
111
+ return html`
112
+ <div
113
+ formDataProvider=${docsFlightStatusRadioKey.path}
114
+ class="flex flex-wrap gap-4"
115
+ >
116
+ <sonic-radio name="status" value="all" checked>All</sonic-radio>
117
+ <sonic-radio name="status" value="on-time">On time</sonic-radio>
118
+ <sonic-radio name="status" value="delayed">Delayed</sonic-radio>
119
+ <sonic-radio name="status" value="cancelled">Cancelled</sonic-radio>
120
+ </div>
121
+ <docs-flight-board
122
+ filterProvider=${docsFlightStatusRadioKey.path}
123
+ direction="arrivals"
124
+ ></docs-flight-board>
125
+ `;
126
+ }
127
+ }
128
+
129
+ @customElement("docs-flight-delayed-switch-demo")
130
+ export class DocsFlightDelayedSwitchDemo extends LitElement {
131
+ static styles = [tailwind];
132
+
133
+ render() {
134
+ return html`
135
+ <sonic-switch
136
+ formDataProvider=${docsFlightDelayedSwitchKey.path}
137
+ name="status"
138
+ value="delayed"
139
+ >Delayed flights only</sonic-switch
140
+ >
141
+ <docs-flight-board
142
+ filterProvider=${docsFlightDelayedSwitchKey.path}
143
+ direction="departures"
144
+ ></docs-flight-board>
145
+ `;
146
+ }
147
+ }