@supersoniks/concorde 5.1.1 → 5.1.3-immutable.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/.agents/skills/concorde-docs/SKILL.md +153 -0
  2. package/.agents/skills/{concorde-component-docs/template.md → concorde-docs/templates/component.md} +6 -2
  3. package/.agents/skills/concorde-docs/templates/decorator.md +43 -0
  4. package/.agents/skills/concorde-docs/templates/guide.md +25 -0
  5. package/.claude/skills +1 -0
  6. package/.github/workflows/ci.yml +21 -0
  7. package/.github-export-ignore +30 -0
  8. package/CONTRIBUTING.md +59 -0
  9. package/DEV.md +54 -0
  10. package/LICENSE +21 -0
  11. package/OPEN_SOURCE_CHECKPOINT.md +133 -0
  12. package/README.md +4 -4
  13. package/ai/README.md +29 -41
  14. package/ai/skills/concorde/SKILL.md +54 -324
  15. package/ai/skills/concorde/rules/composition.md +32 -0
  16. package/ai/skills/concorde/rules/data.md +47 -0
  17. package/ai/skills/concorde/rules/http.md +25 -0
  18. package/ai/skills/concorde/rules/lists-forms.md +35 -0
  19. package/ai/skills/concorde/rules/styling.md +46 -0
  20. package/ai/skills/concorde/rules/troubleshooting.md +45 -0
  21. package/build-infos.json +1 -1
  22. package/concorde-core.bundle.js +177 -177
  23. package/concorde-core.es.js +4993 -4833
  24. package/custom-elements-manifest.public.config.mjs +8 -0
  25. package/{.tmp-cem/custom-elements.json → custom-elements.json} +11758 -8904
  26. package/dist/concorde-core.bundle.js +177 -177
  27. package/dist/concorde-core.es.js +4993 -4833
  28. package/dist/docs-mock-api-sw.js +58 -223
  29. package/dist/docs-mock-api-sw.js.map +4 -4
  30. package/dist/img/concorde/plane_01.jpg +0 -0
  31. package/dist/img/concorde/plane_02.jpg +0 -0
  32. package/dist/img/concorde/plane_03.jpg +0 -0
  33. package/dist/img/concorde/plane_04.jpg +0 -0
  34. package/dist/img/concorde/plane_05.jpg +0 -0
  35. package/dist/img/concorde/plane_06.jpg +0 -0
  36. package/dist/img/concorde/plane_07.jpg +0 -0
  37. package/dist/img/concorde/plane_08.jpg +0 -0
  38. package/dist/img/concorde/plane_09.jpg +0 -0
  39. package/dist/img/concorde/plane_10.jpg +0 -0
  40. package/dist/img/concorde/plane_11.jpg +0 -0
  41. package/dist/img/concorde/plane_12.jpg +0 -0
  42. package/dist/img/concorde/plane_13.jpg +0 -0
  43. package/dist/img/og-concorde.jpg +0 -0
  44. package/dist/robots.txt +11 -10
  45. package/docs/assets/index-D_alEsng.js +12122 -0
  46. package/docs/crawl/core/components/functional/date/date.html +190 -0
  47. package/docs/crawl/core/components/functional/fetch/fetch.html +109 -0
  48. package/docs/crawl/core/components/functional/if/if.html +27 -0
  49. package/docs/crawl/core/components/functional/jsonata/jsonata.html +79 -0
  50. package/docs/crawl/core/components/functional/list/list.html +70 -0
  51. package/docs/crawl/core/components/functional/mix/mix.html +45 -0
  52. package/docs/crawl/core/components/functional/queue/queue.html +96 -0
  53. package/docs/crawl/core/components/functional/router/router.html +106 -0
  54. package/docs/crawl/core/components/functional/sdui/sdui-extension-points.html +126 -0
  55. package/docs/crawl/core/components/functional/sdui/sdui.html +368 -0
  56. package/docs/crawl/core/components/functional/states/states.html +66 -0
  57. package/docs/crawl/core/components/functional/submit/submit.html +160 -0
  58. package/docs/crawl/core/components/functional/subscriber/subscriber.html +67 -0
  59. package/docs/crawl/core/components/functional/value/value.html +51 -0
  60. package/docs/crawl/core/components/ui/alert/alert.html +211 -0
  61. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +131 -0
  62. package/docs/crawl/core/components/ui/badge/badge.html +197 -0
  63. package/docs/crawl/core/components/ui/button/button.html +150 -0
  64. package/docs/crawl/core/components/ui/captcha/captcha.html +112 -0
  65. package/docs/crawl/core/components/ui/card/card.html +253 -0
  66. package/docs/crawl/core/components/ui/divider/divider.html +144 -0
  67. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +73 -0
  68. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +266 -0
  69. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +122 -0
  70. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +121 -0
  71. package/docs/crawl/core/components/ui/form/input/input.html +109 -0
  72. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +38 -0
  73. package/docs/crawl/core/components/ui/form/radio/radio.html +56 -0
  74. package/docs/crawl/core/components/ui/form/select/select.html +73 -0
  75. package/docs/crawl/core/components/ui/form/switch/switch.html +56 -0
  76. package/docs/crawl/core/components/ui/form/textarea/textarea.html +59 -0
  77. package/docs/crawl/core/components/ui/group/group.html +104 -0
  78. package/docs/crawl/core/components/ui/icon/icon.html +222 -0
  79. package/docs/crawl/core/components/ui/image/image.html +298 -0
  80. package/docs/crawl/core/components/ui/link/link.html +100 -0
  81. package/docs/crawl/core/components/ui/loader/loader.html +124 -0
  82. package/docs/crawl/core/components/ui/menu/menu.html +394 -0
  83. package/docs/crawl/core/components/ui/modal/modal.html +342 -0
  84. package/docs/crawl/core/components/ui/pop/pop.html +296 -0
  85. package/docs/crawl/core/components/ui/progress/progress.html +131 -0
  86. package/docs/crawl/core/components/ui/table/table.html +545 -0
  87. package/docs/crawl/core/components/ui/theme/theme.html +131 -0
  88. package/docs/crawl/core/components/ui/toast/toast.html +233 -0
  89. package/docs/crawl/core/components/ui/tooltip/tooltip.html +140 -0
  90. package/docs/crawl/docs/_core-concept/dataFlow.html +177 -0
  91. package/docs/crawl/docs/_core-concept/overview.html +66 -0
  92. package/docs/crawl/docs/_core-concept/subscriber.html +75 -0
  93. package/docs/crawl/docs/_decorators/ancestor-attribute.html +117 -0
  94. package/docs/crawl/docs/_decorators/auto-subscribe.html +202 -0
  95. package/docs/crawl/docs/_decorators/bind.html +141 -0
  96. package/docs/crawl/docs/_decorators/get.html +149 -0
  97. package/docs/crawl/docs/_decorators/handle.html +165 -0
  98. package/docs/crawl/docs/_decorators/on-assign.html +355 -0
  99. package/docs/crawl/docs/_decorators/patch.html +78 -0
  100. package/docs/crawl/docs/_decorators/post.html +139 -0
  101. package/docs/crawl/docs/_decorators/publish.html +61 -0
  102. package/docs/crawl/docs/_decorators/put.html +78 -0
  103. package/docs/crawl/docs/_decorators/subscribe.html +109 -0
  104. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +137 -0
  105. package/docs/crawl/docs/_directives/sub.html +93 -0
  106. package/docs/crawl/docs/_getting-started/ai-agents.html +173 -0
  107. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +100 -0
  108. package/docs/crawl/docs/_getting-started/concorde-outside.html +58 -0
  109. package/docs/crawl/docs/_getting-started/create-a-component.html +111 -0
  110. package/docs/crawl/docs/_getting-started/my-first-component.html +189 -0
  111. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +110 -0
  112. package/docs/crawl/docs/_getting-started/pubsub.html +62 -0
  113. package/docs/crawl/docs/_getting-started/start.html +76 -0
  114. package/docs/crawl/docs/_getting-started/theming.html +333 -0
  115. package/docs/crawl/docs/_misc/api-configuration.html +149 -0
  116. package/docs/crawl/docs/_misc/dataProviderKey.html +135 -0
  117. package/docs/crawl/docs/_misc/docs-mock-api.html +158 -0
  118. package/docs/crawl/docs/_misc/dynamic-path.html +180 -0
  119. package/docs/crawl/docs/_misc/endpoint.html +50 -0
  120. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +138 -0
  121. package/docs/crawl/docs/_misc/html-integration.html +48 -0
  122. package/docs/crawl/hubs/decorators.html +547 -0
  123. package/docs/crawl/hubs/form-components.html +381 -0
  124. package/docs/crawl/hubs/remote-data.html +452 -0
  125. package/docs/crawl/index.html +103 -0
  126. package/docs/index.html +1 -1
  127. package/docs/llms-full.txt +7174 -0
  128. package/docs/llms.txt +98 -0
  129. package/docs/sitemap.xml +243 -0
  130. package/docs/src/core/components/functional/date/date.md +290 -0
  131. package/docs/src/core/components/functional/fetch/fetch.md +125 -0
  132. package/docs/src/core/components/functional/if/if.md +9 -0
  133. package/docs/src/core/components/functional/jsonata/jsonata.md +56 -0
  134. package/docs/src/core/components/functional/list/list.md +65 -0
  135. package/docs/src/core/components/functional/mix/mix.md +41 -0
  136. package/docs/src/core/components/functional/queue/queue.md +72 -0
  137. package/docs/src/core/components/functional/router/router.md +94 -0
  138. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  139. package/docs/src/core/components/functional/sdui/component-catalog.json +3103 -0
  140. package/docs/src/core/components/functional/sdui/default-library.json +108 -0
  141. package/docs/src/core/components/functional/sdui/example.json +99 -0
  142. package/docs/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  143. package/docs/src/core/components/functional/sdui/sdui.md +478 -0
  144. package/docs/src/core/components/functional/states/states.md +87 -0
  145. package/docs/src/core/components/functional/submit/submit.md +114 -0
  146. package/docs/src/core/components/functional/subscriber/subscriber.md +91 -0
  147. package/docs/src/core/components/functional/value/value.md +35 -0
  148. package/docs/src/core/components/ui/alert/alert.md +196 -0
  149. package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  150. package/docs/src/core/components/ui/badge/badge.md +188 -0
  151. package/docs/src/core/components/ui/button/button.md +183 -0
  152. package/docs/src/core/components/ui/captcha/captcha.md +71 -0
  153. package/docs/src/core/components/ui/card/card.md +215 -0
  154. package/docs/src/core/components/ui/divider/divider.md +129 -0
  155. package/docs/src/core/components/ui/form/checkbox/checkbox.md +77 -0
  156. package/docs/src/core/components/ui/form/fieldset/fieldset.md +205 -0
  157. package/docs/src/core/components/ui/form/form-actions/form-actions.md +100 -0
  158. package/docs/src/core/components/ui/form/form-layout/form-layout.md +119 -0
  159. package/docs/src/core/components/ui/form/input/input.md +142 -0
  160. package/docs/src/core/components/ui/form/radio/radio.md +57 -0
  161. package/docs/src/core/components/ui/form/select/select.md +71 -0
  162. package/docs/src/core/components/ui/form/switch/switch.md +57 -0
  163. package/docs/src/core/components/ui/form/textarea/textarea.md +65 -0
  164. package/docs/src/core/components/ui/group/group.md +75 -0
  165. package/docs/src/core/components/ui/icon/icon.md +214 -0
  166. package/docs/src/core/components/ui/icon/icons.json +1 -0
  167. package/docs/src/core/components/ui/image/image.md +233 -0
  168. package/docs/src/core/components/ui/link/link.md +81 -0
  169. package/docs/src/core/components/ui/loader/loader.md +112 -0
  170. package/docs/src/core/components/ui/menu/menu.md +370 -0
  171. package/docs/src/core/components/ui/modal/modal.md +235 -0
  172. package/docs/src/core/components/ui/pop/pop.md +294 -0
  173. package/docs/src/core/components/ui/progress/progress.md +109 -0
  174. package/docs/src/core/components/ui/table/table.md +431 -0
  175. package/docs/src/core/components/ui/theme/theme.md +122 -0
  176. package/docs/src/core/components/ui/toast/toast.md +216 -0
  177. package/docs/src/core/components/ui/tooltip/tooltip.md +124 -0
  178. package/{src → docs/src}/docs/_core-concept/subscriber.md +0 -0
  179. package/{src → docs/src}/docs/_getting-started/my-first-subscriber.md +0 -0
  180. package/{src → docs/src}/docs/_getting-started/pubsub.md +0 -0
  181. package/docs/src/docs/_getting-started/theming.md +253 -0
  182. package/docs/src/docs/search/docs-search.json +12242 -0
  183. package/docs/src/tag-list.json +1 -0
  184. package/docs/src/tsconfig-model.json +23 -0
  185. package/docs/src/tsconfig.declarations.json +22 -0
  186. package/docs/src/tsconfig.emit.json +23 -0
  187. package/docs/src/tsconfig.json +1332 -0
  188. package/gitlab/job_github_mirror.sh +39 -0
  189. package/index.html +157 -5
  190. package/package.json +22 -4
  191. package/public/docs-mock-api-sw.js +58 -223
  192. package/public/docs-mock-api-sw.js.map +4 -4
  193. package/public/img/concorde/plane_01.jpg +0 -0
  194. package/public/img/concorde/plane_02.jpg +0 -0
  195. package/public/img/concorde/plane_03.jpg +0 -0
  196. package/public/img/concorde/plane_04.jpg +0 -0
  197. package/public/img/concorde/plane_05.jpg +0 -0
  198. package/public/img/concorde/plane_06.jpg +0 -0
  199. package/public/img/concorde/plane_07.jpg +0 -0
  200. package/public/img/concorde/plane_08.jpg +0 -0
  201. package/public/img/concorde/plane_09.jpg +0 -0
  202. package/public/img/concorde/plane_10.jpg +0 -0
  203. package/public/img/concorde/plane_11.jpg +0 -0
  204. package/public/img/concorde/plane_12.jpg +0 -0
  205. package/public/img/concorde/plane_13.jpg +0 -0
  206. package/public/img/og-concorde.jpg +0 -0
  207. package/public/robots.txt +11 -10
  208. package/scripts/ai-init.mjs +104 -379
  209. package/scripts/ai-init.test.mjs +81 -239
  210. package/scripts/docs-markdown-vite-plugin.ts +43 -0
  211. package/scripts/docs-public-url.mjs +56 -0
  212. package/scripts/docs.htaccess +82 -0
  213. package/scripts/generate-cem.mjs +244 -0
  214. package/scripts/generate-cem.test.mjs +122 -0
  215. package/scripts/generate-crawl-docs.mjs +233 -118
  216. package/scripts/generate-crawl-docs.test.mjs +124 -0
  217. package/scripts/generate-sdui-catalog.mjs +11 -10
  218. package/scripts/github-export.mjs +150 -0
  219. package/scripts/post-build-docs.js +37 -50
  220. package/scripts/post-build.mjs +0 -0
  221. package/scripts/pre-publish.mjs +2 -1
  222. package/scripts/site-pages.mjs +212 -0
  223. package/scripts/site-pages.test.mjs +116 -0
  224. package/site-pages/about.md +22 -0
  225. package/site-pages/privacy.md +32 -0
  226. package/src/core/components/functional/date/date.md +91 -231
  227. package/src/core/components/functional/example/example.ts +3 -1
  228. package/src/core/components/functional/fetch/fetch.md +66 -83
  229. package/src/core/components/functional/if/if.md +28 -3
  230. package/src/core/components/functional/if/if.ts +0 -0
  231. package/src/core/components/functional/jsonata/jsonata.md +42 -37
  232. package/src/core/components/functional/list/list.demo.ts +0 -0
  233. package/src/core/components/functional/list/list.md +103 -43
  234. package/src/core/components/functional/list/list.ts +17 -4
  235. package/src/core/components/functional/mix/mix.md +31 -26
  236. package/src/core/components/functional/queue/queue.demo.ts +10 -7
  237. package/src/core/components/functional/queue/queue.md +40 -61
  238. package/src/core/components/functional/router/router.demo.ts +16 -16
  239. package/src/core/components/functional/router/router.md +64 -65
  240. package/src/core/components/functional/router/router.ts +0 -0
  241. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +0 -0
  242. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  243. package/src/core/components/functional/sdui/component-catalog.json +2 -2
  244. package/src/core/components/functional/sdui/example.json +19 -86
  245. package/src/core/components/functional/sdui/sdui-extension-points.md +1 -1
  246. package/src/core/components/functional/sdui/sdui-immutable.spec.ts +74 -0
  247. package/src/core/components/functional/sdui/sdui.md +187 -358
  248. package/src/core/components/functional/sdui/sdui.ts +33 -8
  249. package/src/core/components/functional/sdui/types.ts +0 -0
  250. package/src/core/components/functional/states/states.demo.ts +21 -22
  251. package/src/core/components/functional/states/states.md +86 -61
  252. package/src/core/components/functional/states/states.ts +1 -1
  253. package/src/core/components/functional/submit/submit.md +64 -72
  254. package/src/core/components/functional/submit/submit.spec.ts +60 -0
  255. package/src/core/components/functional/submit/submit.ts +6 -3
  256. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  257. package/src/core/components/functional/translation/translation.md +38 -0
  258. package/src/core/components/functional/value/value.md +34 -22
  259. package/src/core/components/functional/value/value.ts +0 -0
  260. package/src/core/components/ui/_css/size.ts +0 -0
  261. package/src/core/components/ui/alert/alert.md +48 -58
  262. package/src/core/components/ui/badge/badge.md +27 -34
  263. package/src/core/components/ui/button/button.md +139 -106
  264. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  265. package/src/core/components/ui/captcha/captcha.md +17 -32
  266. package/src/core/components/ui/card/card.md +6 -6
  267. package/src/core/components/ui/divider/divider.md +8 -11
  268. package/src/core/components/ui/form/checkbox/checkbox.md +90 -42
  269. package/src/core/components/ui/form/fieldset/fieldset.md +31 -75
  270. package/src/core/components/ui/form/form-actions/form-actions.md +14 -16
  271. package/src/core/components/ui/form/form-layout/form-layout.md +19 -29
  272. package/src/core/components/ui/form/input/input.md +108 -90
  273. package/src/core/components/ui/form/input/input.ts +8 -2
  274. package/src/core/components/ui/form/radio/radio.md +65 -30
  275. package/src/core/components/ui/form/select/select.md +60 -45
  276. package/src/core/components/ui/form/switch/switch.md +57 -34
  277. package/src/core/components/ui/form/textarea/textarea.md +55 -38
  278. package/src/core/components/ui/group/group.md +35 -33
  279. package/src/core/components/ui/icon/icon.md +4 -4
  280. package/src/core/components/ui/image/image.md +41 -107
  281. package/src/core/components/ui/link/link.md +6 -6
  282. package/src/core/components/ui/loader/loader.md +30 -55
  283. package/src/core/components/ui/menu/menu.md +27 -27
  284. package/src/core/components/ui/modal/modal.md +72 -96
  285. package/src/core/components/ui/pop/pop.md +80 -158
  286. package/src/core/components/ui/progress/progress.md +2 -2
  287. package/src/core/components/ui/table/table.md +91 -255
  288. package/src/core/components/ui/theme/theme.md +11 -36
  289. package/src/core/components/ui/toast/toast.md +48 -117
  290. package/src/core/components/ui/tooltip/tooltip.md +27 -62
  291. package/src/core/decorators/subscriber/bind.ts +9 -14
  292. package/src/core/decorators/subscriber/subscribe.ts +15 -9
  293. package/src/core/decorators/subscriber/subscribe.type-test.ts +14 -5
  294. package/src/core/mixins/Subscriber.ts +0 -0
  295. package/src/core/utils/DataBindObserver.ts +0 -0
  296. package/src/core/utils/LocationHandler.spec.ts +80 -0
  297. package/src/core/utils/LocationHandler.ts +5 -9
  298. package/src/core/utils/Objects.ts +0 -0
  299. package/src/core/utils/PublisherProxy.ts +166 -125
  300. package/src/core/utils/deepReadonly.spec.ts +66 -0
  301. package/src/core/utils/deepReadonly.ts +71 -0
  302. package/src/core/utils/immutableValue.spec.ts +54 -0
  303. package/src/core/utils/immutableValue.ts +102 -0
  304. package/src/core/utils/nestedDotForm.spec.ts +88 -0
  305. package/src/core/utils/publisherImmutable.spec.ts +76 -0
  306. package/src/core/utils/route.ts +0 -0
  307. package/src/core/utils/strictGet.spec.ts +61 -0
  308. package/src/core/utils/strictGet.ts +102 -0
  309. package/src/css.d.ts +19 -0
  310. package/src/docs/components/docs-demo-sources.ts +55 -140
  311. package/src/docs/components/docs-lit-demo.ts +1 -3
  312. package/src/docs/components/docs-source-link.ts +0 -82
  313. package/src/docs/decorators/ancestor-attribute.md +59 -0
  314. package/src/docs/decorators/auto-subscribe.md +40 -0
  315. package/src/docs/decorators/bind.md +76 -0
  316. package/src/docs/decorators/get.md +160 -0
  317. package/src/docs/decorators/handle.md +119 -0
  318. package/src/docs/decorators/on-assign.md +63 -0
  319. package/src/docs/decorators/patch.md +44 -0
  320. package/src/docs/decorators/post.md +134 -0
  321. package/src/docs/decorators/publish.md +56 -0
  322. package/src/docs/decorators/put.md +51 -0
  323. package/src/docs/decorators/subscribe.md +87 -0
  324. package/src/docs/decorators/wait-for-ancestors.md +76 -0
  325. package/src/docs/directives/sub.md +75 -0
  326. package/src/docs/directives/t.md +73 -0
  327. package/src/docs/docs-location.spec.ts +56 -0
  328. package/src/docs/docs-location.ts +133 -32
  329. package/src/docs/docs.ts +1 -2
  330. package/src/docs/example/decorators-demo-bind-demos.ts +83 -135
  331. package/src/docs/example/decorators-demo-geo.ts +30 -19
  332. package/src/docs/example/decorators-demo-post.ts +88 -186
  333. package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +165 -268
  334. package/src/docs/example/decorators-demo.ts +85 -98
  335. package/src/docs/example/docs-api-config-demos.ts +19 -20
  336. package/src/docs/example/docs-flight-demos.ts +147 -0
  337. package/src/docs/example/docs-jsonata-demos.ts +52 -52
  338. package/src/docs/example/docs-list-demos.ts +43 -123
  339. package/src/docs/example/docs-provider-keys.ts +21 -28
  340. package/src/docs/example/docs-queue-demos.ts +37 -77
  341. package/src/docs/example/docs-router-demos.ts +20 -25
  342. package/src/docs/example/docs-submit-demos.ts +48 -48
  343. package/src/docs/example/docs-toggle-demos.ts +4 -3
  344. package/src/docs/example/users.ts +0 -0
  345. package/src/docs/getting-started/ai-agents.md +50 -0
  346. package/src/docs/getting-started/create-a-component.md +136 -0
  347. package/src/docs/getting-started/dataFlow.md +87 -0
  348. package/src/docs/getting-started/installation.md +36 -0
  349. package/src/docs/getting-started/my-first-component.md +227 -0
  350. package/src/docs/getting-started/start.md +35 -0
  351. package/src/docs/header/header.ts +11 -6
  352. package/src/docs/home/catalog.ts +1 -1
  353. package/src/docs/home/home.ts +20 -11
  354. package/src/docs/layout.ts +12 -13
  355. package/src/docs/misc/api-configuration.md +79 -0
  356. package/src/docs/misc/dataProviderKey.md +168 -0
  357. package/src/docs/misc/docs-mock-api.md +62 -0
  358. package/src/docs/misc/dynamic-path.md +71 -0
  359. package/src/docs/misc/endpoint.md +45 -0
  360. package/src/docs/misc/html-integration.md +14 -0
  361. package/src/docs/misc/publisher-get-immutability-docs-crawl.json +902 -0
  362. package/src/docs/misc/publisher-get-immutability-docs-recheck.json +13 -0
  363. package/src/docs/misc/publisher-get-immutability-study.md +229 -0
  364. package/src/docs/mock-api/api-config-mock.ts +5 -0
  365. package/src/docs/mock-api/fixtures.ts +0 -278
  366. package/src/docs/mock-api/flights.ts +89 -0
  367. package/src/docs/mock-api/router.ts +3 -4
  368. package/src/docs/mock-api/urls.ts +1 -2
  369. package/src/docs/navigation/navigation.ts +84 -101
  370. package/src/docs/navigation/toc.ts +7 -4
  371. package/src/docs/search/docs-search.json +3188 -5153
  372. package/src/docs/search/markdown-renderer.ts +31 -8
  373. package/src/docs/search/page.ts +9 -6
  374. package/src/docs/search/search.ts +154 -122
  375. package/src/docs/tailwind/css/docs/content.css +4 -5
  376. package/src/tsconfig.declarations.json +22 -0
  377. package/src/tsconfig.emit.json +23 -0
  378. package/src/tsconfig.json +53 -5
  379. package/src/tsconfig.tsbuildinfo +1 -1
  380. package/vite.config.mts +11 -2
  381. package/.agents/skills/concorde-component-docs/SKILL.md +0 -194
  382. package/.taste-skill/after/desktop-fold.jpg +0 -0
  383. package/.taste-skill/after/desktop-page-01.jpg +0 -0
  384. package/.taste-skill/after/desktop-page-02.jpg +0 -0
  385. package/.taste-skill/after/desktop-page-03.jpg +0 -0
  386. package/.taste-skill/after/mobile-fold.jpg +0 -0
  387. package/.taste-skill/after/mobile-page-01.jpg +0 -0
  388. package/.taste-skill/after/report.json +0 -4103
  389. package/.taste-skill/after/tablet-fold.jpg +0 -0
  390. package/.taste-skill/after/tablet-page-01.jpg +0 -0
  391. package/.taste-skill/after/tablet-page-02.jpg +0 -0
  392. package/.taste-skill/before/desktop-fold.jpg +0 -0
  393. package/.taste-skill/before/desktop-page-01.jpg +0 -0
  394. package/.taste-skill/before/desktop-page-02.jpg +0 -0
  395. package/.taste-skill/before/mobile-fold.jpg +0 -0
  396. package/.taste-skill/before/mobile-page-01.jpg +0 -0
  397. package/.taste-skill/before/report.json +0 -2556
  398. package/.taste-skill/before/tablet-fold.jpg +0 -0
  399. package/.taste-skill/before/tablet-page-01.jpg +0 -0
  400. package/.taste-skill/direction.json +0 -510
  401. package/.taste-skill/notes.md +0 -84
  402. package/.taste-skill/prod/desktop-fold.jpg +0 -0
  403. package/.taste-skill/prod/desktop-page-01.jpg +0 -0
  404. package/.taste-skill/prod/desktop-page-02.jpg +0 -0
  405. package/.taste-skill/prod/desktop-page-03.jpg +0 -0
  406. package/.taste-skill/prod/mobile-fold.jpg +0 -0
  407. package/.taste-skill/prod/mobile-page-01.jpg +0 -0
  408. package/.taste-skill/prod/mobile-page-02.jpg +0 -0
  409. package/.taste-skill/prod/report.json +0 -1973
  410. package/.taste-skill/prod/tablet-fold.jpg +0 -0
  411. package/.taste-skill/prod/tablet-page-01.jpg +0 -0
  412. package/.taste-skill/prod/tablet-page-02.jpg +0 -0
  413. package/AUDIT.md +0 -228
  414. package/PLAN-AMELIORATION.md +0 -220
  415. package/ai/AGENTS.md +0 -56
  416. package/ai/cursor/rules/concorde-menu.mdc +0 -15
  417. package/ai/cursor/rules/concorde-scope.mdc +0 -14
  418. package/ai/cursor/rules/concorde-theme.mdc +0 -13
  419. package/ai/cursor/rules/concorde.mdc +0 -66
  420. package/ai/jetbrains/rules/concorde.md +0 -53
  421. package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
  422. package/ai/skills/concorde-imports/SKILL.md +0 -78
  423. package/ai/skills/concorde-menu/SKILL.md +0 -74
  424. package/ai/skills/concorde-scope/SKILL.md +0 -70
  425. package/ai/skills/concorde-theme/SKILL.md +0 -57
  426. package/docs/assets/index-Bb-_LRyY.js +0 -12280
  427. package/src/docs/example/docs-input-autocomplete-demos.ts +0 -110
  428. package/src/docs/example/docs-joke-demos.ts +0 -297
  429. /package/{src → docs/src}/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -0
  430. /package/{src → docs/src}/docs/_core-concept/dataFlow.md +0 -0
  431. /package/{src → docs/src}/docs/_core-concept/overview.md +0 -0
  432. /package/{src → docs/src}/docs/_decorators/ancestor-attribute.md +0 -0
  433. /package/{src → docs/src}/docs/_decorators/auto-subscribe.md +0 -0
  434. /package/{src → docs/src}/docs/_decorators/bind.md +0 -0
  435. /package/{src → docs/src}/docs/_decorators/get.md +0 -0
  436. /package/{src → docs/src}/docs/_decorators/handle.md +0 -0
  437. /package/{src → docs/src}/docs/_decorators/on-assign.md +0 -0
  438. /package/{src → docs/src}/docs/_decorators/patch.md +0 -0
  439. /package/{src → docs/src}/docs/_decorators/post.md +0 -0
  440. /package/{src → docs/src}/docs/_decorators/publish.md +0 -0
  441. /package/{src → docs/src}/docs/_decorators/put.md +0 -0
  442. /package/{src → docs/src}/docs/_decorators/subscribe.md +0 -0
  443. /package/{src → docs/src}/docs/_decorators/wait-for-ancestors.md +0 -0
  444. /package/{src → docs/src}/docs/_directives/sub.md +0 -0
  445. /package/{src → docs/src}/docs/_getting-started/ai-agents.md +0 -0
  446. /package/{src → docs/src}/docs/_getting-started/concorde-manual-install.md +0 -0
  447. /package/{src → docs/src}/docs/_getting-started/concorde-outside.md +0 -0
  448. /package/{src → docs/src}/docs/_getting-started/create-a-component.md +0 -0
  449. /package/{src → docs/src}/docs/_getting-started/my-first-component.md +0 -0
  450. /package/{src → docs/src}/docs/_getting-started/start.md +0 -0
  451. /package/{src → docs/src}/docs/_misc/api-configuration.md +0 -0
  452. /package/{src → docs/src}/docs/_misc/dataProviderKey.md +0 -0
  453. /package/{src → docs/src}/docs/_misc/docs-mock-api.md +0 -0
  454. /package/{src → docs/src}/docs/_misc/dynamic-path.md +0 -0
  455. /package/{src → docs/src}/docs/_misc/endpoint.md +0 -0
  456. /package/{src → docs/src}/docs/_misc/formelement-subscriber-removal.md +0 -0
  457. /package/{src → docs/src}/docs/_misc/html-integration.md +0 -0
  458. /package/src/docs/{_getting-started → getting-started}/components.md +0 -0
  459. /package/src/docs/{_getting-started → getting-started}/theming.md +0 -0
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Homepage JSON-LD and the root site pages (/about, /privacy).
3
+ *
4
+ * Page content lives in site-pages/*.md: the SPA renders it at /about, and
5
+ * the build publishes `slug.md` + `slug.html` (SPA shell with the page
6
+ * inlined for crawlers and link previews).
7
+ */
8
+ import fs from "fs";
9
+ import { fileURLToPath } from "url";
10
+
11
+ export const SITE_ORIGIN = "https://concorde.supersoniks.org";
12
+ export const NPM_URL = "https://www.npmjs.com/package/@supersoniks/concorde";
13
+
14
+ /** Publisher details, from https://supersoniks.com/mentions-legales */
15
+ export const ORGANIZATION = {
16
+ name: "Supersoniks",
17
+ legalName: "SUPERSONIKS",
18
+ url: "https://supersoniks.com/",
19
+ contactUrl: "https://supersoniks.com/un-projet",
20
+ telephone: "+33 2 47 68 93 25",
21
+ streetAddress: "22 rue du Docteur Bretonneau",
22
+ postalCode: "37000",
23
+ addressLocality: "Tours",
24
+ addressCountry: "FR",
25
+ sameAs: [
26
+ "https://www.linkedin.com/company/supersoniks/",
27
+ "https://www.facebook.com/supersoniks",
28
+ "https://www.instagram.com/agencesupersoniks/",
29
+ ],
30
+ };
31
+
32
+ function escapeHtml(text) {
33
+ return String(text)
34
+ .replace(/&/g, "&")
35
+ .replace(/</g, "&lt;")
36
+ .replace(/>/g, "&gt;")
37
+ .replace(/"/g, "&quot;");
38
+ }
39
+
40
+ /* -------------------------------------------------------------------------- */
41
+ /* JSON-LD */
42
+ /* -------------------------------------------------------------------------- */
43
+
44
+ export function organizationJsonLd() {
45
+ return {
46
+ "@type": "Organization",
47
+ "@id": `${ORGANIZATION.url}#organization`,
48
+ name: ORGANIZATION.name,
49
+ legalName: ORGANIZATION.legalName,
50
+ url: ORGANIZATION.url,
51
+ telephone: ORGANIZATION.telephone,
52
+ address: {
53
+ "@type": "PostalAddress",
54
+ streetAddress: ORGANIZATION.streetAddress,
55
+ postalCode: ORGANIZATION.postalCode,
56
+ addressLocality: ORGANIZATION.addressLocality,
57
+ addressCountry: ORGANIZATION.addressCountry,
58
+ },
59
+ contactPoint: {
60
+ "@type": "ContactPoint",
61
+ contactType: "customer service",
62
+ telephone: ORGANIZATION.telephone,
63
+ url: ORGANIZATION.contactUrl,
64
+ availableLanguage: ["fr", "en"],
65
+ },
66
+ sameAs: ORGANIZATION.sameAs,
67
+ };
68
+ }
69
+
70
+ /** Homepage graph: WebSite + SoftwareApplication + Organization. */
71
+ export function homepageJsonLd() {
72
+ const org = { "@id": `${ORGANIZATION.url}#organization` };
73
+ return {
74
+ "@context": "https://schema.org",
75
+ "@graph": [
76
+ {
77
+ "@type": "WebSite",
78
+ "@id": `${SITE_ORIGIN}/#website`,
79
+ name: "Concorde",
80
+ alternateName: "Concorde by Supersoniks",
81
+ url: `${SITE_ORIGIN}/`,
82
+ inLanguage: "en",
83
+ publisher: org,
84
+ },
85
+ {
86
+ "@type": "SoftwareApplication",
87
+ "@id": `${SITE_ORIGIN}/#software`,
88
+ name: "Concorde",
89
+ alternateName: "@supersoniks/concorde",
90
+ description:
91
+ "Concorde is an open-source web components framework built on Lit: UI components, data binding, forms, routing helpers and theming that work in React, Vue, PHP or plain HTML.",
92
+ url: `${SITE_ORIGIN}/`,
93
+ applicationCategory: "DeveloperApplication",
94
+ applicationSubCategory: "Web components framework",
95
+ operatingSystem: "Any (web browser)",
96
+ programmingLanguage: "TypeScript",
97
+ license: "https://opensource.org/licenses/MIT",
98
+ downloadUrl: NPM_URL,
99
+ softwareHelp: `${SITE_ORIGIN}/docs/getting-started/start`,
100
+ image: `${SITE_ORIGIN}/img/og-concorde.jpg`,
101
+ offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
102
+ author: org,
103
+ publisher: org,
104
+ sameAs: [NPM_URL],
105
+ },
106
+ organizationJsonLd(),
107
+ ],
108
+ };
109
+ }
110
+
111
+ /* -------------------------------------------------------------------------- */
112
+ /* Site pages: /about, /privacy */
113
+ /* -------------------------------------------------------------------------- */
114
+
115
+ const SITE_PAGES_DIR = fileURLToPath(new URL("../site-pages/", import.meta.url));
116
+
117
+ export const STATIC_PAGES = [
118
+ {
119
+ slug: "about",
120
+ title: "About Concorde — web components framework by Supersoniks",
121
+ description:
122
+ "Concorde is an open-source Lit web components framework designed and maintained by Supersoniks, Tours, France.",
123
+ },
124
+ {
125
+ slug: "privacy",
126
+ title: "Privacy notice — Concorde by Supersoniks",
127
+ description:
128
+ "Privacy notice of the Concorde documentation site: no cookies, no analytics, third-party hosts and your GDPR rights.",
129
+ },
130
+ ].map((page) => ({
131
+ ...page,
132
+ markdown: fs.readFileSync(`${SITE_PAGES_DIR}${page.slug}.md`, "utf8"),
133
+ }));
134
+
135
+ function pageJsonLd(page) {
136
+ return {
137
+ "@context": "https://schema.org",
138
+ "@type": page.slug === "about" ? "AboutPage" : "WebPage",
139
+ name: page.title,
140
+ description: page.description,
141
+ url: `${SITE_ORIGIN}/${page.slug}`,
142
+ isPartOf: { "@type": "WebSite", name: "Concorde", url: `${SITE_ORIGIN}/` },
143
+ publisher: organizationJsonLd(),
144
+ };
145
+ }
146
+
147
+ function replaceOnce(html, re, replacement, what) {
148
+ if (!re.test(html)) throw new Error(`site page shell: ${what} not found`);
149
+ return html.replace(re, () => replacement);
150
+ }
151
+
152
+ /**
153
+ * `slug.html`: the SPA shell (built docs/index.html) with the page's
154
+ * metadata and its rendered content in the no-JS section. Browsers boot the
155
+ * SPA, which renders the same Markdown; crawlers read the inline copy.
156
+ */
157
+ export function renderSitePage(page, bodyHtml, shellHtml) {
158
+ const url = `${SITE_ORIGIN}/${page.slug}`;
159
+ const title = escapeHtml(page.title);
160
+ const description = escapeHtml(page.description);
161
+ let html = shellHtml;
162
+ html = replaceOnce(html, /<title>[\s\S]*?<\/title>/, `<title>${title}</title>`, "title");
163
+ html = replaceOnce(
164
+ html,
165
+ /<meta\s+name="description"\s+content="[^"]*"\s*\/?>/,
166
+ `<meta name="description" content="${description}" />`,
167
+ "description",
168
+ );
169
+ html = replaceOnce(
170
+ html,
171
+ /<link rel="canonical" href="[^"]*"\s*\/?>/,
172
+ `<link rel="canonical" href="${url}" />`,
173
+ "canonical",
174
+ );
175
+ html = replaceOnce(
176
+ html,
177
+ /<link rel="alternate" type="text\/markdown" href="[^"]*"/,
178
+ `<link rel="alternate" type="text/markdown" href="/${page.slug}.md"`,
179
+ "markdown alternate",
180
+ );
181
+ html = replaceOnce(
182
+ html,
183
+ /<meta property="og:title" content="[^"]*"/,
184
+ `<meta property="og:title" content="${title}"`,
185
+ "og:title",
186
+ );
187
+ html = replaceOnce(
188
+ html,
189
+ /<meta property="og:description" content="[^"]*"/,
190
+ `<meta property="og:description" content="${description}"`,
191
+ "og:description",
192
+ );
193
+ html = replaceOnce(
194
+ html,
195
+ /<meta property="og:url" content="[^"]*"/,
196
+ `<meta property="og:url" content="${url}"`,
197
+ "og:url",
198
+ );
199
+ html = replaceOnce(
200
+ html,
201
+ /<script type="application\/ld\+json">[\s\S]*?<\/script>/,
202
+ `<script type="application/ld+json">${JSON.stringify(pageJsonLd(page))}</script>`,
203
+ "JSON-LD",
204
+ );
205
+ html = replaceOnce(
206
+ html,
207
+ /<section id="docs-agent-content"([^>]*)>[\s\S]*?<\/section>/,
208
+ `<section id="docs-agent-content" aria-hidden="true">\n${bodyHtml}\n </section>`,
209
+ "page section",
210
+ );
211
+ return html;
212
+ }
@@ -0,0 +1,116 @@
1
+ import assert from "node:assert/strict";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "path";
5
+ import test from "node:test";
6
+ import { STATIC_PAGES, homepageJsonLd } from "./site-pages.mjs";
7
+ import {
8
+ generateHomepageMarkdown,
9
+ generateHtaccess,
10
+ generateSitemap,
11
+ writeAgentSiteArtifacts,
12
+ } from "./generate-crawl-docs.mjs";
13
+
14
+ function stripTags(html) {
15
+ return html
16
+ .replace(/<[^>]+>/g, " ")
17
+ .replace(/\s+/g, " ")
18
+ .trim();
19
+ }
20
+
21
+ test("homepage JSON-LD has SoftwareApplication and complete Organization", () => {
22
+ const ld = homepageJsonLd();
23
+ assert.equal(ld["@context"], "https://schema.org");
24
+ const byType = Object.fromEntries(ld["@graph"].map((n) => [n["@type"], n]));
25
+ const app = byType.SoftwareApplication;
26
+ assert.ok(app.name && app.description && app.url && app.offers);
27
+ assert.equal(app.publisher["@id"], byType.Organization["@id"]);
28
+ const org = byType.Organization;
29
+ assert.equal(org.url, "https://supersoniks.com/");
30
+ assert.equal(org.address["@type"], "PostalAddress");
31
+ assert.equal(org.address.addressLocality, "Tours");
32
+ assert.equal(org.contactPoint["@type"], "ContactPoint");
33
+ assert.ok(org.contactPoint.contactType && org.contactPoint.telephone);
34
+ assert.ok(org.sameAs.every((u) => u.startsWith("https://")));
35
+ });
36
+
37
+ test("source index.html embeds the generated JSON-LD and Open Graph tags", () => {
38
+ const html = fs.readFileSync(path.resolve("index.html"), "utf8");
39
+ const block = html.match(
40
+ /<script type="application\/ld\+json">([\s\S]*?)<\/script>/,
41
+ );
42
+ assert.ok(block, "JSON-LD script missing");
43
+ assert.deepEqual(JSON.parse(block[1]), homepageJsonLd());
44
+ for (const prop of ["og:type", "og:title", "og:description", "og:url", "og:image"]) {
45
+ assert.match(html, new RegExp(`<meta property="${prop}" content="[^"]+"`), prop);
46
+ }
47
+ assert.match(
48
+ html,
49
+ /<meta property="og:image" content="https:\/\/concorde\.supersoniks\.org\/img\/og-concorde\.jpg"/,
50
+ );
51
+ assert.ok(fs.existsSync(path.resolve("public/img/og-concorde.jpg")));
52
+ assert.match(html, /<meta name="twitter:card" content="summary_large_image"/);
53
+ assert.match(html, /href="\/about"/);
54
+ assert.match(html, /href="\/privacy"/);
55
+ });
56
+
57
+ test("site page Markdown is read from site-pages/", () => {
58
+ assert.deepEqual(
59
+ STATIC_PAGES.map((p) => p.slug),
60
+ ["about", "privacy"],
61
+ );
62
+ for (const { slug, markdown } of STATIC_PAGES) {
63
+ assert.equal(
64
+ markdown,
65
+ fs.readFileSync(path.resolve(`site-pages/${slug}.md`), "utf8"),
66
+ );
67
+ assert.match(markdown, /^# /);
68
+ }
69
+ });
70
+
71
+ test("site pages are SPA shells with their own metadata and inline content", () => {
72
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "concorde-pages-"));
73
+ try {
74
+ writeAgentSiteArtifacts(dir);
75
+ for (const { slug } of STATIC_PAGES) {
76
+ const md = fs.readFileSync(path.join(dir, `${slug}.md`), "utf8");
77
+ const html = fs.readFileSync(path.join(dir, `${slug}.html`), "utf8");
78
+ assert.ok(md.length >= 500, `${slug}.md too short (${md.length})`);
79
+ const section = html.match(
80
+ /<section id="docs-agent-content"[^>]*>([\s\S]*?)<\/section>/,
81
+ );
82
+ assert.ok(section, `${slug}.html page section missing`);
83
+ assert.ok(stripTags(section[1]).length >= 500, `${slug}.html too short`);
84
+ assert.match(section[1], /<h1/);
85
+ assert.doesNotMatch(section[1], /<h1>Concorde by Supersoniks<\/h1>/);
86
+ assert.match(html, /<sonic-router>/, "SPA shell expected");
87
+ const url = `https://concorde\\.supersoniks\\.org/${slug}`;
88
+ assert.match(html, new RegExp(`<link rel="canonical" href="${url}" />`));
89
+ assert.match(html, new RegExp(`<meta property="og:url" content="${url}"`));
90
+ assert.match(html, new RegExp(`href="/${slug}\\.md"`));
91
+ assert.equal((html.match(/<title>/g) || []).length, 1);
92
+ const ld = JSON.parse(
93
+ html.match(/<script type="application\/ld\+json">([\s\S]*?)<\/script>/)[1],
94
+ );
95
+ assert.equal(ld.url, `https://concorde.supersoniks.org/${slug}`);
96
+ assert.equal(ld.publisher.address.addressLocality, "Tours");
97
+ }
98
+ } finally {
99
+ fs.rmSync(dir, { recursive: true, force: true });
100
+ }
101
+ });
102
+
103
+ test("sitemap and homepage Markdown link the site pages", () => {
104
+ const xml = generateSitemap([], []);
105
+ const md = generateHomepageMarkdown();
106
+ for (const slug of ["about", "privacy"]) {
107
+ assert.match(xml, new RegExp(`<loc>https://concorde\\.supersoniks\\.org/${slug}</loc>`));
108
+ assert.match(md, new RegExp(`https://concorde\\.supersoniks\\.org/${slug}\\)`));
109
+ }
110
+ });
111
+
112
+ test("htaccess serves site pages as HTML or Markdown", () => {
113
+ const conf = generateHtaccess();
114
+ assert.match(conf, /\^\(about\|privacy\)\$ \/\$1\.md \[END\]/);
115
+ assert.match(conf, /\^\(about\|privacy\)\$ \/\$1\.html \[END\]/);
116
+ });
@@ -0,0 +1,22 @@
1
+ # About Concorde
2
+
3
+ Concorde is an open-source web components framework built on [Lit](https://lit.dev). It is designed, written and maintained by [Supersoniks](https://supersoniks.com/), a company based in Tours, France, which uses it in production.
4
+
5
+ ## Why it exists
6
+
7
+ Supersoniks works on many stacks: PHP back offices, static pages, React and Vue front ends. Rewriting the same buttons, forms and data lists for each stack was slow and led to inconsistent interfaces. Concorde solves this with standard custom elements (`sonic-*`) that work the same way in any host page, plus a small data layer (DataProvider, decorators) that connects components to each other and to REST APIs without a framework.
8
+
9
+ ## What it includes
10
+
11
+ - UI components: buttons, inputs, selects, checkboxes, modals, toasts, cards, menus, tooltips and more.
12
+ - Data components: lists, queues, fetch, submit, router, states and server-driven UI from JSON.
13
+ - Lit decorators such as `@get`, `@post`, `@subscribe` and `@bind`.
14
+ - Theming through CSS custom properties, with light and dark modes.
15
+
16
+ ## Licence and distribution
17
+
18
+ Concorde is published on npm as [`@supersoniks/concorde`](https://www.npmjs.com/package/@supersoniks/concorde) under the MIT licence. This site (https://concorde.supersoniks.org) is its official documentation.
19
+
20
+ ## Publisher
21
+
22
+ Supersoniks, 22 rue du Docteur Bretonneau, 37000 Tours, France · +33 2 47 68 93 25 · [contact Supersoniks](https://supersoniks.com/un-projet). See also the [privacy notice](/privacy).
@@ -0,0 +1,32 @@
1
+ # Privacy notice
2
+
3
+ This notice covers the Concorde documentation site, https://concorde.supersoniks.org, published by [Supersoniks](https://supersoniks.com/), 22 rue du Docteur Bretonneau, 37000 Tours, France.
4
+
5
+ ## What this site does not do
6
+
7
+ - It has no user accounts, sign-up or login.
8
+ - It sets no cookies and runs no analytics, advertising or tracking scripts.
9
+ - It has no forms that send personal data to Supersoniks.
10
+
11
+ ## What is stored in your browser
12
+
13
+ - `sonicTheme` in localStorage remembers your light or dark theme choice. It never leaves your browser.
14
+ - A service worker serves the mock API used by live examples (`/docs-mock-api/…`). It runs locally in your browser.
15
+ - Some examples demonstrate features that store values in localStorage (for example dismissed alerts or cached labels). They only run when you open those pages.
16
+
17
+ ## Third-party services
18
+
19
+ To display pages, your browser loads files from these providers, which receive your IP address and browser details as part of any web request:
20
+
21
+ - Google Fonts (fonts.googleapis.com, fonts.gstatic.com) for the Schibsted Grotesk font.
22
+ - jsDelivr (cdn.jsdelivr.net) for the search and Markdown libraries.
23
+ - cdn.supersoniks.com for icons.
24
+ - A few live examples call public demo APIs (geo.api.gouv.fr, reqres.in, i.pravatar.cc) when you open them.
25
+
26
+ ## Server logs
27
+
28
+ Like any web server, the host records technical request data (IP address, URL, date, user agent) to operate and secure the site.
29
+
30
+ ## Your rights
31
+
32
+ Under the GDPR you can ask for access to, correction or deletion of data about you. Contact Supersoniks through [supersoniks.com/un-projet](https://supersoniks.com/un-projet), by phone at +33 2 47 68 93 25, or by mail at 22 rue du Docteur Bretonneau, 37000 Tours, France. See also the [Supersoniks privacy policy](https://supersoniks.com/politique-de-confidentialite) and [legal notice](https://supersoniks.com/mentions-legales).