@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
@@ -1,13 +1,23 @@
1
+ /**
2
+ * Post-build agent/SEO artifacts for the docs site.
3
+ *
4
+ * Canonical page URLs are the SPA pathnames (`/docs/…`, `/core/…`):
5
+ * - Browsers → index.html (pushState SPA)
6
+ * - Accept: text/markdown → sibling `*.md` (same pathname + `.md`)
7
+ * - Known crawler UAs → sibling `*.html` static pages (same path + `.html`)
8
+ *
9
+ * No redirects for old URL shapes (`/crawl/`, `/docs/…`, `…/name/name`).
10
+ */
1
11
  import fs from "fs";
2
12
  import path from "path";
3
13
  import { fileURLToPath } from "url";
4
14
  import { marked } from "marked";
5
15
  import { gfmHeadingId } from "marked-gfm-heading-id";
16
+ import { toPublicPath } from "./docs-public-url.mjs";
6
17
 
7
18
  const SITE_ORIGIN = "https://concorde.supersoniks.org";
8
19
  const SRC_DIR = path.resolve("src");
9
20
  const DOCS_OUT = path.resolve("docs");
10
- const CRAWL_DIR = path.join(DOCS_OUT, "crawl");
11
21
 
12
22
  const SONIC_CODE_BLOCK_RE = /<sonic-code\b[\s\S]*?<\/sonic-code>/gi;
13
23
  const DOC_HASH_LINK_RE = /#([^)\s"']+)\.md\/([^)\s"'#]+)/g;
@@ -48,28 +58,44 @@ function mdRelativePath(absPath) {
48
58
  return path.relative(SRC_DIR, absPath).replace(/\\/g, "/");
49
59
  }
50
60
 
51
- function crawlHtmlPath(mdRel) {
52
- return path.join("crawl", mdRel.replace(/\.mdx?$/, ".html")).replace(/\\/g, "/");
53
- }
54
-
55
61
  function docId(mdRel) {
56
62
  return mdRel.replace(/\.mdx?$/, "");
57
63
  }
58
64
 
59
- function relativeCrawlLink(fromMdRel, toMdPath, anchor) {
60
- const fromHtml = crawlHtmlPath(fromMdRel);
61
- const toHtml = crawlHtmlPath(`${toMdPath}.md`);
62
- const rel = path
63
- .relative(path.dirname(fromHtml), toHtml)
64
- .replace(/\\/g, "/");
65
- const href = rel.startsWith(".") ? rel : `./${rel}`;
66
- return `${href}#${anchor}`;
65
+ /** Public pathname (SPA + agents): /docs/getting-started/start */
66
+ export function pagePath(mdRel) {
67
+ return toPublicPath(mdRel);
68
+ }
69
+
70
+ /** On-disk static HTML next to the SPA build: docs/getting-started/start.html */
71
+ function staticHtmlRel(mdRel) {
72
+ return `${docId(mdRel)}.html`;
67
73
  }
68
74
 
69
- function rewriteDocLinks(text, fromMdRel) {
70
- return text.replace(DOC_HASH_LINK_RE, (match, mdPath, anchor) => {
71
- return relativeCrawlLink(fromMdRel, mdPath, anchor);
75
+ function pageUrl(mdRel) {
76
+ return `${SITE_ORIGIN}${pagePath(mdRel)}`;
77
+ }
78
+
79
+ function docLink(toMdPath, anchor) {
80
+ const base = pagePath(`${toMdPath}.md`);
81
+ const slug = toMdPath.split("/").pop() || "page";
82
+ if (!anchor || anchor === slug) return base;
83
+ return `${base}#${anchor}`;
84
+ }
85
+
86
+ function rewriteDocLinks(text) {
87
+ let out = text.replace(DOC_HASH_LINK_RE, (match, mdPath, anchor) => {
88
+ return docLink(mdPath, anchor);
72
89
  });
90
+ out = out.replace(
91
+ /\]\((\/(?:docs|core)\/[^)\s"'#]+)(#[^)\s"']*)?\)/g,
92
+ (match, pathname, fragment) => {
93
+ const mdPath = pathname.replace(/^\//, "");
94
+ const anchor = fragment ? fragment.slice(1) : mdPath.split("/").pop() || "page";
95
+ return `](${docLink(mdPath, anchor)})`;
96
+ },
97
+ );
98
+ return out;
73
99
  }
74
100
 
75
101
  function extractTitle(markdown) {
@@ -133,11 +159,10 @@ function extractDescription(markdown, title) {
133
159
  }
134
160
 
135
161
  function docKind(mdRel) {
136
- if (mdRel.includes("/_decorators/")) return "decorator";
137
- if (mdRel.includes("/_directives/")) return "directive";
138
- if (mdRel.includes("/_getting-started/")) return "guide";
139
- if (mdRel.includes("/_core-concept/")) return "concept";
140
- if (mdRel.includes("/_misc/")) return "reference";
162
+ if (mdRel.includes("/decorators/")) return "decorator";
163
+ if (mdRel.includes("/directives/")) return "directive";
164
+ if (mdRel.includes("/getting-started/")) return "guide";
165
+ if (mdRel.includes("/misc/")) return "reference";
141
166
  if (mdRel.includes("/components/functional/")) return "functional component";
142
167
  if (mdRel.includes("/components/ui/")) return "UI component";
143
168
  return "documentation";
@@ -167,10 +192,10 @@ function extractKeywords(mdRel, title, raw) {
167
192
  keywords.add(`sonic-${baseName}`);
168
193
  keywords.add("web component", "Lit");
169
194
  }
170
- if (mdRel.includes("/_decorators/")) {
195
+ if (mdRel.includes("/decorators/")) {
171
196
  keywords.add("decorator", "DataProvider", "ApiResult", "Endpoint");
172
197
  }
173
- if (mdRel.includes("/_core-concept/")) {
198
+ if (mdRel.endsWith("/dataFlow.md")) {
174
199
  keywords.add("DataProvider", "data flow");
175
200
  }
176
201
 
@@ -184,16 +209,6 @@ function extractKeywords(mdRel, title, raw) {
184
209
  return [...keywords].join(", ");
185
210
  }
186
211
 
187
- function pageHash(mdRel) {
188
- const base = mdRel.replace(/\.mdx?$/, "");
189
- const anchor = base.split("/").pop() || "page";
190
- return `#${base}.md/${anchor}`;
191
- }
192
-
193
- function crawlPageUrl(crawlRel) {
194
- return `${SITE_ORIGIN}/${crawlRel}`;
195
- }
196
-
197
212
  function buildLeadParagraph({ title, mdRel, description, canonical, keywords }) {
198
213
  const id = docId(mdRel);
199
214
  const kind = docKind(mdRel);
@@ -201,11 +216,7 @@ function buildLeadParagraph({ title, mdRel, description, canonical, keywords })
201
216
  }
202
217
 
203
218
  function renderPage({ mdRel, title, description, keywords, bodyHtml }) {
204
- const crawlRel = crawlHtmlPath(mdRel);
205
- const canonical = crawlPageUrl(crawlRel);
206
- const interactiveDoc = `${SITE_ORIGIN}/${pageHash(mdRel)}`;
207
- const depth = path.dirname(crawlRel).split("/").length - 1;
208
- const indexHref = `${"../".repeat(depth)}index.html`;
219
+ const canonical = pageUrl(mdRel);
209
220
  const id = docId(mdRel);
210
221
  const leadHtml = buildLeadParagraph({
211
222
  title,
@@ -216,19 +227,20 @@ function renderPage({ mdRel, title, description, keywords, bodyHtml }) {
216
227
  });
217
228
 
218
229
  return `<!DOCTYPE html>
219
- <html lang="fr" data-crawl-url="${escapeHtml(canonical)}" data-doc-id="${escapeHtml(id)}">
230
+ <html lang="en" data-doc-url="${escapeHtml(canonical)}" data-doc-id="${escapeHtml(id)}">
220
231
  <head>
221
232
  <meta charset="UTF-8">
222
233
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
223
- <title>${escapeHtml(title)} — Concorde</title>
234
+ <title>${escapeHtml(title)} — Concorde by Supersoniks</title>
224
235
  <meta name="description" content="${escapeHtml(description)}">
225
236
  <meta name="keywords" content="${escapeHtml(keywords)}">
226
237
  <meta name="concorde-doc-id" content="${escapeHtml(id)}">
227
238
  <link rel="canonical" href="${escapeHtml(canonical)}">
239
+ <link rel="alternate" type="text/markdown" href="${SITE_ORIGIN}${pagePath(mdRel)}.md">
228
240
  </head>
229
241
  <body>
230
242
  <header>
231
- <p><a href="${indexHref}">Concorde documentation (crawl)</a> · <a href="${escapeHtml(interactiveDoc)}" rel="nofollow">interactive version</a></p>
243
+ <p><a href="/docs/index.html">Concorde documentation</a> · <a href="${escapeHtml(canonical)}">same URL (interactive)</a> · <a href="/llms.txt">llms.txt</a></p>
232
244
  </header>
233
245
  <main>
234
246
  <article>
@@ -245,29 +257,29 @@ function renderIndex(pages) {
245
257
  const items = pages
246
258
  .map(
247
259
  (p) =>
248
- ` <li><a href="${escapeHtml(p.crawlHref)}">${escapeHtml(p.title)}</a> <small>(${escapeHtml(p.docId)})</small></li>`,
260
+ ` <li><a href="${escapeHtml(p.pagePath)}">${escapeHtml(p.title)}</a> <small>(${escapeHtml(p.docId)})</small></li>`,
249
261
  )
250
262
  .join("\n");
251
263
 
252
264
  return `<!DOCTYPE html>
253
- <html lang="fr" data-doc-id="crawl-index">
265
+ <html lang="en" data-doc-id="docs-index">
254
266
  <head>
255
267
  <meta charset="UTF-8">
256
268
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
257
- <title>Concorde documentation index</title>
258
- <meta name="description" content="Static crawl index for Concorde framework documentation. All pages use .html under /crawl/.">
259
- <meta name="keywords" content="Concorde, documentation index, web components, Lit, DataProvider">
260
- <link rel="canonical" href="${SITE_ORIGIN}/crawl/index.html">
269
+ <title>Concorde documentation index — Supersoniks</title>
270
+ <meta name="description" content="Documentation index for Concorde by Supersoniks. Same pathnames as the interactive docs; static HTML for crawlers, Markdown via Accept: text/markdown.">
271
+ <meta name="keywords" content="Concorde, Supersoniks, documentation index, web components, Lit, DataProvider">
272
+ <link rel="canonical" href="${SITE_ORIGIN}/docs/index.html">
261
273
  </head>
262
274
  <body>
263
275
  <header>
264
276
  <h1>Concorde documentation</h1>
265
- <p>Static pages for crawlers and AI indexing. Interactive docs: <a href="${SITE_ORIGIN}/">${SITE_ORIGIN}/</a></p>
266
- <p>Full text mirror: <a href="${SITE_ORIGIN}/llms-full.txt">llms-full.txt</a></p>
277
+ <p>Canonical URLs match the interactive docs (<code>/docs/…</code>, <code>/core/…</code>). Crawlers receive static HTML; agents can request <code>Accept: text/markdown</code>.</p>
278
+ <p>Interactive site: <a href="${SITE_ORIGIN}/">${SITE_ORIGIN}/</a> · Full text: <a href="${SITE_ORIGIN}/llms-full.txt">llms-full.txt</a></p>
267
279
  <ul>
268
- <li><a href="hubs/decorators.html">Decorators hub (@get, @post, …)</a></li>
269
- <li><a href="hubs/remote-data.html">Remote data hub (@get, List, Queue)</a></li>
270
- <li><a href="hubs/form-components.html">Form components hub</a></li>
280
+ <li><a href="/hubs/decorators.html">Decorators hub (@get, @post, …)</a></li>
281
+ <li><a href="/hubs/remote-data.html">Remote data hub (@get, List, Queue)</a></li>
282
+ <li><a href="/hubs/form-components.html">Form components hub</a></li>
271
283
  </ul>
272
284
  </header>
273
285
  <main>
@@ -287,15 +299,27 @@ function writeFileEnsuringDir(filePath, content) {
287
299
 
288
300
  function generateLlmsTxt(pages, hubs = []) {
289
301
  const lines = [
290
- "# Concorde",
302
+ "# Concorde by Supersoniks",
291
303
  "",
292
- "> Web components framework (Lit, DataProvider, decorators).",
304
+ "> Concorde is the Supersoniks Lit web-components library (UI, DataProvider, decorators, forms, SDUI).",
305
+ "> npm: `@supersoniks/concorde` — https://www.npmjs.com/package/@supersoniks/concorde",
306
+ `> Site: ${SITE_ORIGIN}/`,
293
307
  "",
294
- "Documentation for AI indexers lives under `/crawl/` as **HTML** (`.html`), not Markdown.",
295
- "Example: https://concorde.supersoniks.org/crawl/docs/_decorators/post.html",
296
- "Do not fetch `/crawl/**/*.md` (does not exist) nor `/src/docs/**/*.md` (SPA source only).",
308
+ "## Developer resources",
297
309
  "",
298
- `Full text: ${SITE_ORIGIN}/llms-full.txt`,
310
+ `- [Homepage (HTML)](${SITE_ORIGIN}/) — interactive docs SPA`,
311
+ `- [Homepage (Markdown)](${SITE_ORIGIN}/index.md) — also via \`Accept: text/markdown\` on ${SITE_ORIGIN}/`,
312
+ `- [llms-full.txt](${SITE_ORIGIN}/llms-full.txt) — full plain-text mirror`,
313
+ `- [Docs index](${SITE_ORIGIN}/docs/index.html)`,
314
+ `- [Sitemap](${SITE_ORIGIN}/sitemap.xml)`,
315
+ `- [npm package @supersoniks/concorde](https://www.npmjs.com/package/@supersoniks/concorde)`,
316
+ `- [Getting started](${SITE_ORIGIN}/docs/getting-started/start)`,
317
+ `- [AI agents (skills)](${SITE_ORIGIN}/docs/getting-started/ai-agents)`,
318
+ `- [Components index](${SITE_ORIGIN}/docs/getting-started/components)`,
319
+ "",
320
+ "Doc pages use the same pathnames as the interactive site (`/docs/…`, `/core/…`).",
321
+ "Markdown: same URL with `.md` (e.g. `/docs/getting-started/start.md`), or `Accept: text/markdown` on the pathname.",
322
+ "HTML crawlers receive a static HTML variant of the same URL.",
299
323
  "",
300
324
  "## Topic hubs (start here for RAG)",
301
325
  "",
@@ -303,7 +327,7 @@ function generateLlmsTxt(pages, hubs = []) {
303
327
 
304
328
  for (const h of hubs) {
305
329
  lines.push(
306
- `- [${h.title}](${SITE_ORIGIN}/${h.crawlPath}) (${h.docId}, ${h.sectionCount} pages)`,
330
+ `- [${h.title}](${SITE_ORIGIN}/${h.hubPath}) (${h.docId}, ${h.sectionCount} pages)`,
307
331
  );
308
332
  }
309
333
 
@@ -311,27 +335,29 @@ function generateLlmsTxt(pages, hubs = []) {
311
335
 
312
336
  for (const p of pages) {
313
337
  lines.push(
314
- `- [${p.title}](${SITE_ORIGIN}/${p.crawlPath}) (${p.docId}): ${p.description}`,
338
+ `- [${p.title}](${SITE_ORIGIN}${p.pagePath}) (${p.docId}): ${p.description}`,
315
339
  );
316
340
  }
317
341
 
318
- lines.push("", "## Optional", "", `- [Full index](${SITE_ORIGIN}/crawl/index.html)`);
342
+ lines.push("", "## Optional", "", `- [Full index](${SITE_ORIGIN}/docs/index.html)`);
319
343
  return lines.join("\n");
320
344
  }
321
345
 
322
346
  function generateLlmsFullTxt(pages, hubs = []) {
323
347
  const lines = [
324
- "# Concorde — full documentation (plain text)",
348
+ "# Concorde by Supersoniks — full documentation (plain text)",
325
349
  "",
326
350
  "> Mirror for AI indexers. Each page is a section below.",
327
- "> HTML URLs use /crawl/**/*.html — never .md under /crawl/.",
351
+ "> Canonical URLs: /docs/** and /core/** (Markdown via Accept: text/markdown).",
352
+ `> Homepage Markdown: ${SITE_ORIGIN}/index.md`,
353
+ `> npm: https://www.npmjs.com/package/@supersoniks/concorde`,
328
354
  "",
329
355
  "## Topic hubs",
330
356
  "",
331
357
  ];
332
358
 
333
359
  for (const h of hubs) {
334
- lines.push(`- ${h.title}: ${SITE_ORIGIN}/${h.crawlPath} (${h.docId})`);
360
+ lines.push(`- ${h.title}: ${SITE_ORIGIN}/${h.hubPath} (${h.docId})`);
335
361
  }
336
362
 
337
363
  lines.push("");
@@ -342,7 +368,7 @@ function generateLlmsFullTxt(pages, hubs = []) {
342
368
  "",
343
369
  `## ${p.title}`,
344
370
  "",
345
- `- URL: ${SITE_ORIGIN}/${p.crawlPath}`,
371
+ `- URL: ${SITE_ORIGIN}${p.pagePath}`,
346
372
  `- Doc ID: ${p.docId}`,
347
373
  `- Keywords: ${p.keywords}`,
348
374
  "",
@@ -363,7 +389,7 @@ const TOPIC_HUBS = [
363
389
  "Hub for all Concorde Lit decorators: @get @post @put @patch @subscribe @publish @bind @handle and related. Use this page when asking about any decorator.",
364
390
  keywords:
365
391
  "decorator, @get, @post, @put, @patch, @subscribe, @publish, @bind, @handle, ApiResult, Endpoint, DataProviderKey",
366
- filter: (p) => p.docId.startsWith("docs/_decorators/"),
392
+ filter: (p) => p.docId.startsWith("docs/decorators/"),
367
393
  },
368
394
  {
369
395
  slug: "remote-data",
@@ -375,14 +401,14 @@ const TOPIC_HUBS = [
375
401
  "@get, fetch, remote data, API, Endpoint, ApiResult, serviceURL, sonic-list, sonic-queue, HTTP GET",
376
402
  filter: (p) =>
377
403
  [
378
- "docs/_decorators/get",
379
- "docs/_decorators/post",
380
- "docs/_decorators/put",
381
- "docs/_decorators/patch",
382
- "docs/_misc/endpoint",
383
- "docs/_misc/api-configuration",
384
- "docs/_misc/dynamic-path",
385
- "docs/_core-concept/dataFlow",
404
+ "docs/decorators/get",
405
+ "docs/decorators/post",
406
+ "docs/decorators/put",
407
+ "docs/decorators/patch",
408
+ "docs/misc/endpoint",
409
+ "docs/misc/api-configuration",
410
+ "docs/misc/dynamic-path",
411
+ "docs/getting-started/dataFlow",
386
412
  "core/components/functional/fetch/fetch",
387
413
  "core/components/functional/list/list",
388
414
  "core/components/functional/queue/queue",
@@ -400,26 +426,19 @@ const TOPIC_HUBS = [
400
426
  },
401
427
  ];
402
428
 
403
- function hubCrawlPath(slug) {
404
- return `crawl/hubs/${slug}.html`;
405
- }
406
-
407
- function relativeHubLink(fromHubSlug, targetCrawlPath) {
408
- const from = hubCrawlPath(fromHubSlug);
409
- const rel = path.relative(path.dirname(from), targetCrawlPath).replace(/\\/g, "/");
410
- return rel.startsWith(".") ? rel : `./${rel}`;
429
+ function hubPath(slug) {
430
+ return `hubs/${slug}.html`;
411
431
  }
412
432
 
413
433
  function renderHubPage(hub, sections) {
414
- const crawlRel = hubCrawlPath(hub.slug);
415
- const canonical = crawlPageUrl(crawlRel);
434
+ const hubRel = hubPath(hub.slug);
435
+ const canonical = `${SITE_ORIGIN}/${hubRel}`;
416
436
  const sectionHtml = sections
417
437
  .map((p) => {
418
438
  const excerpt = p.plainText.slice(0, 1200);
419
- const href = relativeHubLink(hub.slug, p.crawlPath);
420
439
  return `<section id="${escapeHtml(p.docId.replace(/\//g, "-"))}" data-doc-id="${escapeHtml(p.docId)}">
421
- <h2><a href="${escapeHtml(href)}">${escapeHtml(p.title)}</a></h2>
422
- <p><strong>Doc ID:</strong> <code>${escapeHtml(p.docId)}</code> · <a href="${escapeHtml(href)}">full page</a></p>
440
+ <h2><a href="${escapeHtml(p.pagePath)}">${escapeHtml(p.title)}</a></h2>
441
+ <p><strong>Doc ID:</strong> <code>${escapeHtml(p.docId)}</code> · <a href="${escapeHtml(p.pagePath)}">full page</a></p>
423
442
  <p>${escapeHtml(p.description)}</p>
424
443
  <pre class="doc-excerpt">${escapeHtml(excerpt)}</pre>
425
444
  </section>`;
@@ -435,11 +454,11 @@ function renderHubPage(hub, sections) {
435
454
  });
436
455
 
437
456
  return `<!DOCTYPE html>
438
- <html lang="fr" data-crawl-url="${escapeHtml(canonical)}" data-doc-id="${escapeHtml(hub.docId)}">
457
+ <html lang="en" data-doc-url="${escapeHtml(canonical)}" data-doc-id="${escapeHtml(hub.docId)}">
439
458
  <head>
440
459
  <meta charset="UTF-8">
441
460
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
442
- <title>${escapeHtml(hub.title)} — Concorde</title>
461
+ <title>${escapeHtml(hub.title)} — Concorde by Supersoniks</title>
443
462
  <meta name="description" content="${escapeHtml(hub.intro)}">
444
463
  <meta name="keywords" content="${escapeHtml(hub.keywords)}">
445
464
  <meta name="concorde-doc-id" content="${escapeHtml(hub.docId)}">
@@ -447,7 +466,7 @@ function renderHubPage(hub, sections) {
447
466
  </head>
448
467
  <body>
449
468
  <header>
450
- <p><a href="../index.html">Concorde documentation (crawl)</a></p>
469
+ <p><a href="/docs/index.html">Concorde documentation</a></p>
451
470
  </header>
452
471
  <main>
453
472
  <article>
@@ -465,14 +484,11 @@ function generateTopicHubs(pages) {
465
484
  for (const hub of TOPIC_HUBS) {
466
485
  const sections = pages.filter(hub.filter);
467
486
  if (sections.length === 0) continue;
468
- const crawlRel = hubCrawlPath(hub.slug);
469
- writeFileEnsuringDir(
470
- path.join(DOCS_OUT, crawlRel),
471
- renderHubPage(hub, sections),
472
- );
487
+ const rel = hubPath(hub.slug);
488
+ writeFileEnsuringDir(path.join(DOCS_OUT, rel), renderHubPage(hub, sections));
473
489
  hubs.push({
474
490
  ...hub,
475
- crawlPath: crawlRel,
491
+ hubPath: rel,
476
492
  sectionCount: sections.length,
477
493
  });
478
494
  }
@@ -480,16 +496,20 @@ function generateTopicHubs(pages) {
480
496
  }
481
497
 
482
498
  function generateSitemap(pages, hubs = []) {
483
- const indexUrl = ` <url>\n <loc>${SITE_ORIGIN}/crawl/index.html</loc>\n </url>`;
499
+ const homeUrl = ` <url>\n <loc>${SITE_ORIGIN}/</loc>\n </url>`;
500
+ const homeMdUrl = ` <url>\n <loc>${SITE_ORIGIN}/index.md</loc>\n </url>`;
501
+ const indexUrl = ` <url>\n <loc>${SITE_ORIGIN}/docs/index.html</loc>\n </url>`;
484
502
  const hubUrls = hubs
485
- .map((h) => ` <url>\n <loc>${SITE_ORIGIN}/${h.crawlPath}</loc>\n </url>`)
503
+ .map((h) => ` <url>\n <loc>${SITE_ORIGIN}/${h.hubPath}</loc>\n </url>`)
486
504
  .join("\n");
487
505
  const urls = pages
488
- .map((p) => ` <url>\n <loc>${SITE_ORIGIN}/${p.crawlPath}</loc>\n </url>`)
506
+ .map((p) => ` <url>\n <loc>${SITE_ORIGIN}${p.pagePath}</loc>\n </url>`)
489
507
  .join("\n");
490
508
 
491
509
  return `<?xml version="1.0" encoding="UTF-8"?>
492
510
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
511
+ ${homeUrl}
512
+ ${homeMdUrl}
493
513
  ${indexUrl}
494
514
  ${hubUrls}
495
515
  ${urls}
@@ -497,15 +517,91 @@ ${urls}
497
517
  `;
498
518
  }
499
519
 
520
+ /** Homepage Markdown for Accept: text/markdown negotiation (acceptmarkdown.com). */
521
+ export function generateHomepageMarkdown() {
522
+ return `# Concorde by Supersoniks
523
+
524
+ Concorde is an open-source Lit web-components library from Supersoniks. It provides UI primitives, data binding, forms, routing helpers and theming that run the same way in React, Vue, PHP templates or a static HTML page.
525
+
526
+ Install the npm package [\`@supersoniks/concorde\`](https://www.npmjs.com/package/@supersoniks/concorde).
527
+
528
+ ## Developer resources
529
+
530
+ - Interactive docs: ${SITE_ORIGIN}/
531
+ - Agent index: ${SITE_ORIGIN}/llms.txt
532
+ - Full text mirror: ${SITE_ORIGIN}/llms-full.txt
533
+ - Docs index: ${SITE_ORIGIN}/docs/index.html
534
+ - Sitemap: ${SITE_ORIGIN}/sitemap.xml
535
+ - Getting started: ${SITE_ORIGIN}/docs/getting-started/start
536
+ - AI agents (skills): ${SITE_ORIGIN}/docs/getting-started/ai-agents
537
+ - Components: ${SITE_ORIGIN}/docs/getting-started/components
538
+
539
+ Doc pages share pathnames with the interactive site (\`/docs/…\`, \`/core/…\`). Markdown is at the same path with a \`.md\` suffix (e.g. \`/docs/getting-started/start.md\`), or via \`Accept: text/markdown\` on the pathname (\`Content-Type: text/markdown\`, \`Vary: Accept\`).
540
+
541
+ ## What Concorde includes
542
+
543
+ Custom elements (\`sonic-*\`) for buttons, forms, lists, queues, SDUI trees and more. Decorators such as \`@get\`, \`@post\`, \`@subscribe\` and \`@bind\` wire components to a shared DataProvider without framework lock-in. Concorde is MIT-licensed and maintained by Supersoniks.
544
+ `;
545
+ }
546
+
547
+ /** Markdown 404 body for agents (HTTP 404 + text/markdown). */
548
+ export function generateNotFoundMarkdown() {
549
+ return `# Page not found
550
+
551
+ The requested URL does not exist on the Concorde documentation site (Concorde by Supersoniks).
552
+
553
+ Try the [homepage](${SITE_ORIGIN}/), the [documentation index](${SITE_ORIGIN}/docs/index.html), [llms.txt](${SITE_ORIGIN}/llms.txt), or the [sitemap](${SITE_ORIGIN}/sitemap.xml).
554
+ `;
555
+ }
556
+
557
+ export function generateNotFoundHtml() {
558
+ return `<!DOCTYPE html>
559
+ <html lang="en">
560
+ <head>
561
+ <meta charset="UTF-8">
562
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
563
+ <title>Page not found — Concorde by Supersoniks</title>
564
+ <meta name="robots" content="noindex">
565
+ <link rel="canonical" href="${SITE_ORIGIN}/">
566
+ </head>
567
+ <body>
568
+ <h1>Page not found</h1>
569
+ <p>The requested URL does not exist on the Concorde documentation site (Concorde by Supersoniks).</p>
570
+ <p>Try the <a href="${SITE_ORIGIN}/">homepage</a>, the <a href="${SITE_ORIGIN}/docs/index.html">documentation index</a>, <a href="${SITE_ORIGIN}/llms.txt">llms.txt</a>, or the <a href="${SITE_ORIGIN}/sitemap.xml">sitemap</a>.</p>
571
+ </body>
572
+ </html>
573
+ `;
574
+ }
575
+
576
+ /**
577
+ * Apache rules live in scripts/docs.htaccess (pretty URLs + negotiation).
578
+ */
579
+ export function generateHtaccess() {
580
+ const htaccessPath = fileURLToPath(new URL("./docs.htaccess", import.meta.url));
581
+ return fs.readFileSync(htaccessPath, "utf8");
582
+ }
583
+
584
+ export function writeAgentSiteArtifacts(docsOut = DOCS_OUT) {
585
+ fs.writeFileSync(path.join(docsOut, "index.md"), generateHomepageMarkdown());
586
+ fs.writeFileSync(path.join(docsOut, "404.md"), generateNotFoundMarkdown());
587
+ fs.writeFileSync(path.join(docsOut, "404.html"), generateNotFoundHtml());
588
+ fs.writeFileSync(path.join(docsOut, ".htaccess"), generateHtaccess());
589
+ }
590
+
591
+ function removeLegacyCrawlDir() {
592
+ const crawlDir = path.join(DOCS_OUT, "crawl");
593
+ if (fs.existsSync(crawlDir)) {
594
+ fs.rmSync(crawlDir, { recursive: true, force: true });
595
+ }
596
+ }
597
+
500
598
  export function generateCrawlDocs() {
501
599
  if (!fs.existsSync(DOCS_OUT)) {
502
600
  console.warn("generate-crawl-docs: docs/ not found, skipping");
503
601
  return;
504
602
  }
505
603
 
506
- if (fs.existsSync(CRAWL_DIR)) {
507
- fs.rmSync(CRAWL_DIR, { recursive: true, force: true });
508
- }
604
+ removeLegacyCrawlDir();
509
605
 
510
606
  const mdFiles = listMdFiles(SRC_DIR).sort();
511
607
  const pages = [];
@@ -517,14 +613,13 @@ export function generateCrawlDocs() {
517
613
  const description = extractDescription(raw, title);
518
614
  const keywords = extractKeywords(mdRel, title, raw);
519
615
  const plainText = markdownToPlainText(raw);
520
- const markdown = rewriteDocLinks(preprocessSonicCode(raw), mdRel);
616
+ const markdown = rewriteDocLinks(preprocessSonicCode(raw));
521
617
  const bodyHtml = marked.parse(markdown);
522
- const crawlRel = crawlHtmlPath(mdRel);
523
- const outPath = path.join(DOCS_OUT, crawlRel);
618
+ const htmlRel = staticHtmlRel(mdRel);
524
619
  const id = docId(mdRel);
525
620
 
526
621
  writeFileEnsuringDir(
527
- outPath,
622
+ path.join(DOCS_OUT, htmlRel),
528
623
  renderPage({ mdRel, title, description, keywords, bodyHtml }),
529
624
  );
530
625
 
@@ -535,19 +630,14 @@ export function generateCrawlDocs() {
535
630
  description,
536
631
  keywords,
537
632
  plainText,
538
- crawlPath: crawlRel,
539
- crawlHref: crawlRel.replace(/^crawl\//, ""),
633
+ pagePath: pagePath(mdRel),
634
+ htmlRel,
540
635
  });
541
636
  }
542
637
 
543
638
  writeFileEnsuringDir(
544
- path.join(CRAWL_DIR, "index.html"),
545
- renderIndex(
546
- pages.map((p) => ({
547
- ...p,
548
- crawlHref: p.mdRel.replace(/\.mdx?$/, ".html"),
549
- })),
550
- ),
639
+ path.join(DOCS_OUT, "docs/index.html"),
640
+ renderIndex(pages),
551
641
  );
552
642
 
553
643
  const hubs = generateTopicHubs(pages);
@@ -558,9 +648,10 @@ export function generateCrawlDocs() {
558
648
  path.join(DOCS_OUT, "llms-full.txt"),
559
649
  generateLlmsFullTxt(pages, hubs),
560
650
  );
651
+ writeAgentSiteArtifacts(DOCS_OUT);
561
652
 
562
653
  console.info(
563
- `generate-crawl-docs: ${pages.length} pages, ${hubs.length} hubs → docs/crawl/, sitemap.xml, llms.txt, llms-full.txt`,
654
+ `generate-crawl-docs: ${pages.length} pages, ${hubs.length} hubs → pathnames /docs|/core + hubs/, sitemap, llms*, index.md (no /crawl/)`,
564
655
  );
565
656
  }
566
657