@supersoniks/concorde 5.0.5 → 5.1.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 (282) hide show
  1. package/.claude/launch.json +15 -0
  2. package/.claude/vite.http.config.mjs +7 -0
  3. package/.taste-skill/after/desktop-fold.jpg +0 -0
  4. package/.taste-skill/after/desktop-page-01.jpg +0 -0
  5. package/.taste-skill/after/desktop-page-02.jpg +0 -0
  6. package/.taste-skill/after/desktop-page-03.jpg +0 -0
  7. package/.taste-skill/after/mobile-fold.jpg +0 -0
  8. package/.taste-skill/after/mobile-page-01.jpg +0 -0
  9. package/.taste-skill/after/report.json +4103 -0
  10. package/.taste-skill/after/tablet-fold.jpg +0 -0
  11. package/.taste-skill/after/tablet-page-01.jpg +0 -0
  12. package/.taste-skill/after/tablet-page-02.jpg +0 -0
  13. package/.taste-skill/before/desktop-fold.jpg +0 -0
  14. package/.taste-skill/before/desktop-page-01.jpg +0 -0
  15. package/.taste-skill/before/desktop-page-02.jpg +0 -0
  16. package/.taste-skill/before/mobile-fold.jpg +0 -0
  17. package/.taste-skill/before/mobile-page-01.jpg +0 -0
  18. package/.taste-skill/before/report.json +2556 -0
  19. package/.taste-skill/before/tablet-fold.jpg +0 -0
  20. package/.taste-skill/before/tablet-page-01.jpg +0 -0
  21. package/.taste-skill/direction.json +510 -0
  22. package/.taste-skill/notes.md +84 -0
  23. package/.taste-skill/prod/desktop-fold.jpg +0 -0
  24. package/.taste-skill/prod/desktop-page-01.jpg +0 -0
  25. package/.taste-skill/prod/desktop-page-02.jpg +0 -0
  26. package/.taste-skill/prod/desktop-page-03.jpg +0 -0
  27. package/.taste-skill/prod/mobile-fold.jpg +0 -0
  28. package/.taste-skill/prod/mobile-page-01.jpg +0 -0
  29. package/.taste-skill/prod/mobile-page-02.jpg +0 -0
  30. package/.taste-skill/prod/report.json +1973 -0
  31. package/.taste-skill/prod/tablet-fold.jpg +0 -0
  32. package/.taste-skill/prod/tablet-page-01.jpg +0 -0
  33. package/.taste-skill/prod/tablet-page-02.jpg +0 -0
  34. package/.tmp-cem/custom-elements.json +13705 -0
  35. package/AUDIT.md +228 -0
  36. package/PLAN-AMELIORATION.md +220 -0
  37. package/build-infos.json +1 -1
  38. package/concorde-core.bundle.js +196 -196
  39. package/concorde-core.es.js +3854 -3572
  40. package/custom-elements-manifest.config.mjs +14 -0
  41. package/dist/concorde-core.bundle.js +196 -196
  42. package/dist/concorde-core.es.js +3854 -3572
  43. package/dist/img/archive/concorde-001-2cv.webp +0 -0
  44. package/dist/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  45. package/dist/img/archive/concorde-red-arrows-2002.webm +0 -0
  46. package/dist/img/archive/credits.json +28 -0
  47. package/docs/assets/index-Bb-_LRyY.js +12280 -0
  48. package/docs/index.html +1 -1
  49. package/index.html +27 -63
  50. package/package.json +44 -3
  51. package/public/img/archive/concorde-001-2cv.webp +0 -0
  52. package/public/img/archive/concorde-red-arrows-2002-poster.jpg +0 -0
  53. package/public/img/archive/concorde-red-arrows-2002.webm +0 -0
  54. package/public/img/archive/credits.json +28 -0
  55. package/scripts/generate-sdui-catalog.mjs +250 -0
  56. package/scripts/generate-sdui-catalog.spec.ts +91 -0
  57. package/scripts/pre-build.mjs +15 -0
  58. package/src/core/components/functional/fetch/fetch.md +2 -2
  59. package/src/core/components/functional/sdui/SDUIDescriptorTransformer.ts +5 -5
  60. package/src/core/components/functional/sdui/__fixtures__/descriptors.ts +251 -0
  61. package/src/core/components/functional/sdui/__snapshots__/sdui-action.spec.ts.snap +73 -0
  62. package/src/core/components/functional/sdui/__snapshots__/sdui-incremental.spec.ts.snap +50 -0
  63. package/src/core/components/functional/sdui/__snapshots__/sdui-partial.spec.ts.snap +50 -0
  64. package/src/core/components/functional/sdui/__snapshots__/sdui.regression.spec.ts.snap +461 -0
  65. package/src/core/components/functional/sdui/component-catalog.gaps.json +511 -0
  66. package/src/core/components/functional/sdui/component-catalog.json +3103 -0
  67. package/src/core/components/functional/sdui/component-catalog.spec.ts +23 -0
  68. package/src/core/components/functional/sdui/sdui-action.spec.ts +99 -0
  69. package/src/core/components/functional/sdui/sdui-dom-snapshot.ts +61 -0
  70. package/src/core/components/functional/sdui/sdui-extension-points.md +94 -0
  71. package/src/core/components/functional/sdui/sdui-incremental.spec.ts +137 -0
  72. package/src/core/components/functional/sdui/sdui-partial.spec.ts +83 -0
  73. package/src/core/components/functional/sdui/sdui-partial.ts +19 -0
  74. package/src/core/components/functional/sdui/sdui-safe.spec.ts +188 -0
  75. package/src/core/components/functional/sdui/sdui-safe.ts +100 -0
  76. package/src/core/components/functional/sdui/sdui.md +122 -0
  77. package/src/core/components/functional/sdui/sdui.regression.spec.ts +64 -0
  78. package/src/core/components/functional/sdui/sdui.ts +442 -34
  79. package/src/core/components/functional/sdui/types.ts +49 -0
  80. package/src/core/components/ui/modal/modal.ts +14 -11
  81. package/src/docs/_getting-started/components.md +5 -0
  82. package/src/docs/_getting-started/theming.md +2 -2
  83. package/src/docs/code.ts +88 -75
  84. package/src/docs/components/docs-demo-sources.ts +16 -8
  85. package/src/docs/components/docs-lit-demo.ts +19 -37
  86. package/src/docs/docs.ts +5 -0
  87. package/src/docs/example/docs-boarding-pass-demo.ts +134 -0
  88. package/src/docs/example/docs-provider-keys.ts +12 -0
  89. package/src/docs/header/header.ts +233 -69
  90. package/src/docs/home/catalog.ts +44 -0
  91. package/src/docs/home/home.ts +513 -0
  92. package/src/docs/home/mach-stage.ts +389 -0
  93. package/src/docs/layout.ts +3 -1
  94. package/src/docs/navigation/components-index.ts +56 -0
  95. package/src/docs/navigation/navigation.ts +240 -232
  96. package/src/docs/navigation/pager.ts +67 -0
  97. package/src/docs/navigation/toc.ts +98 -0
  98. package/src/docs/search/docs-search.json +330 -20
  99. package/src/docs/search/markdown-renderer.ts +11 -3
  100. package/src/docs/shiki/index.ts +109 -0
  101. package/src/docs/tailwind/css/base/scrollbar.css +22 -0
  102. package/src/docs/tailwind/css/base/theme.css +96 -0
  103. package/src/docs/tailwind/css/base/typography.css +4 -0
  104. package/src/docs/tailwind/css/docs/boarding-pass.css +65 -0
  105. package/src/docs/tailwind/css/docs/content.css +32 -0
  106. package/src/docs/tailwind/css/docs/page.css +10 -0
  107. package/src/docs/tailwind/css/docs.css +9 -0
  108. package/src/docs/tailwind/css/home/hero.css +210 -0
  109. package/src/docs/tailwind/css/home/motion.css +84 -0
  110. package/src/docs/tailwind/css/home/sections.css +416 -0
  111. package/src/docs/tailwind/css/tailwind.css +7 -185
  112. package/src/tsconfig.json +113 -2
  113. package/src/tsconfig.tsbuildinfo +1 -1
  114. package/tailwind.config.js +8 -4
  115. package/docs/assets/index-wVZpLVYW.js +0 -12122
  116. package/docs/crawl/core/components/functional/date/date.html +0 -190
  117. package/docs/crawl/core/components/functional/fetch/fetch.html +0 -109
  118. package/docs/crawl/core/components/functional/if/if.html +0 -27
  119. package/docs/crawl/core/components/functional/jsonata/jsonata.html +0 -79
  120. package/docs/crawl/core/components/functional/list/list.html +0 -70
  121. package/docs/crawl/core/components/functional/mix/mix.html +0 -45
  122. package/docs/crawl/core/components/functional/queue/queue.html +0 -96
  123. package/docs/crawl/core/components/functional/router/router.html +0 -106
  124. package/docs/crawl/core/components/functional/sdui/sdui.html +0 -269
  125. package/docs/crawl/core/components/functional/states/states.html +0 -66
  126. package/docs/crawl/core/components/functional/submit/submit.html +0 -160
  127. package/docs/crawl/core/components/functional/subscriber/subscriber.html +0 -67
  128. package/docs/crawl/core/components/functional/value/value.html +0 -51
  129. package/docs/crawl/core/components/ui/alert/alert.html +0 -211
  130. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +0 -131
  131. package/docs/crawl/core/components/ui/badge/badge.html +0 -197
  132. package/docs/crawl/core/components/ui/button/button.html +0 -150
  133. package/docs/crawl/core/components/ui/captcha/captcha.html +0 -112
  134. package/docs/crawl/core/components/ui/card/card.html +0 -253
  135. package/docs/crawl/core/components/ui/divider/divider.html +0 -144
  136. package/docs/crawl/core/components/ui/form/checkbox/checkbox.html +0 -73
  137. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +0 -266
  138. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +0 -122
  139. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +0 -121
  140. package/docs/crawl/core/components/ui/form/input/input.html +0 -109
  141. package/docs/crawl/core/components/ui/form/input-autocomplete/input-autocomplete.html +0 -38
  142. package/docs/crawl/core/components/ui/form/radio/radio.html +0 -56
  143. package/docs/crawl/core/components/ui/form/select/select.html +0 -73
  144. package/docs/crawl/core/components/ui/form/switch/switch.html +0 -56
  145. package/docs/crawl/core/components/ui/form/textarea/textarea.html +0 -59
  146. package/docs/crawl/core/components/ui/group/group.html +0 -104
  147. package/docs/crawl/core/components/ui/icon/icon.html +0 -222
  148. package/docs/crawl/core/components/ui/image/image.html +0 -298
  149. package/docs/crawl/core/components/ui/link/link.html +0 -100
  150. package/docs/crawl/core/components/ui/loader/loader.html +0 -124
  151. package/docs/crawl/core/components/ui/menu/menu.html +0 -394
  152. package/docs/crawl/core/components/ui/modal/modal.html +0 -342
  153. package/docs/crawl/core/components/ui/pop/pop.html +0 -296
  154. package/docs/crawl/core/components/ui/progress/progress.html +0 -131
  155. package/docs/crawl/core/components/ui/table/table.html +0 -545
  156. package/docs/crawl/core/components/ui/theme/theme.html +0 -131
  157. package/docs/crawl/core/components/ui/toast/toast.html +0 -233
  158. package/docs/crawl/core/components/ui/tooltip/tooltip.html +0 -140
  159. package/docs/crawl/docs/_core-concept/dataFlow.html +0 -177
  160. package/docs/crawl/docs/_core-concept/overview.html +0 -66
  161. package/docs/crawl/docs/_core-concept/subscriber.html +0 -75
  162. package/docs/crawl/docs/_decorators/ancestor-attribute.html +0 -117
  163. package/docs/crawl/docs/_decorators/auto-subscribe.html +0 -202
  164. package/docs/crawl/docs/_decorators/bind.html +0 -141
  165. package/docs/crawl/docs/_decorators/get.html +0 -149
  166. package/docs/crawl/docs/_decorators/handle.html +0 -165
  167. package/docs/crawl/docs/_decorators/on-assign.html +0 -355
  168. package/docs/crawl/docs/_decorators/patch.html +0 -78
  169. package/docs/crawl/docs/_decorators/post.html +0 -139
  170. package/docs/crawl/docs/_decorators/publish.html +0 -61
  171. package/docs/crawl/docs/_decorators/put.html +0 -78
  172. package/docs/crawl/docs/_decorators/subscribe.html +0 -109
  173. package/docs/crawl/docs/_decorators/wait-for-ancestors.html +0 -137
  174. package/docs/crawl/docs/_directives/sub.html +0 -93
  175. package/docs/crawl/docs/_getting-started/ai-agents.html +0 -173
  176. package/docs/crawl/docs/_getting-started/concorde-manual-install.html +0 -100
  177. package/docs/crawl/docs/_getting-started/concorde-outside.html +0 -58
  178. package/docs/crawl/docs/_getting-started/create-a-component.html +0 -111
  179. package/docs/crawl/docs/_getting-started/my-first-component.html +0 -189
  180. package/docs/crawl/docs/_getting-started/my-first-subscriber.html +0 -110
  181. package/docs/crawl/docs/_getting-started/pubsub.html +0 -62
  182. package/docs/crawl/docs/_getting-started/start.html +0 -76
  183. package/docs/crawl/docs/_getting-started/theming.html +0 -333
  184. package/docs/crawl/docs/_misc/api-configuration.html +0 -149
  185. package/docs/crawl/docs/_misc/dataProviderKey.html +0 -135
  186. package/docs/crawl/docs/_misc/docs-mock-api.html +0 -158
  187. package/docs/crawl/docs/_misc/dynamic-path.html +0 -180
  188. package/docs/crawl/docs/_misc/endpoint.html +0 -50
  189. package/docs/crawl/docs/_misc/formelement-subscriber-removal.html +0 -138
  190. package/docs/crawl/docs/_misc/html-integration.html +0 -48
  191. package/docs/crawl/hubs/decorators.html +0 -547
  192. package/docs/crawl/hubs/form-components.html +0 -381
  193. package/docs/crawl/hubs/remote-data.html +0 -452
  194. package/docs/crawl/index.html +0 -102
  195. package/docs/llms-full.txt +0 -7008
  196. package/docs/llms.txt +0 -97
  197. package/docs/sitemap.xml +0 -240
  198. package/docs/src/core/components/functional/date/date.md +0 -290
  199. package/docs/src/core/components/functional/fetch/fetch.md +0 -125
  200. package/docs/src/core/components/functional/if/if.md +0 -9
  201. package/docs/src/core/components/functional/jsonata/jsonata.md +0 -56
  202. package/docs/src/core/components/functional/list/list.md +0 -65
  203. package/docs/src/core/components/functional/mix/mix.md +0 -41
  204. package/docs/src/core/components/functional/queue/queue.md +0 -72
  205. package/docs/src/core/components/functional/router/router.md +0 -94
  206. package/docs/src/core/components/functional/sdui/default-library.json +0 -108
  207. package/docs/src/core/components/functional/sdui/example.json +0 -99
  208. package/docs/src/core/components/functional/sdui/sdui.md +0 -356
  209. package/docs/src/core/components/functional/states/states.md +0 -87
  210. package/docs/src/core/components/functional/submit/submit.md +0 -114
  211. package/docs/src/core/components/functional/subscriber/subscriber.md +0 -91
  212. package/docs/src/core/components/functional/value/value.md +0 -35
  213. package/docs/src/core/components/ui/alert/alert.md +0 -196
  214. package/docs/src/core/components/ui/alert-messages/alert-messages.md +0 -85
  215. package/docs/src/core/components/ui/badge/badge.md +0 -188
  216. package/docs/src/core/components/ui/button/button.md +0 -183
  217. package/docs/src/core/components/ui/captcha/captcha.md +0 -71
  218. package/docs/src/core/components/ui/card/card.md +0 -215
  219. package/docs/src/core/components/ui/divider/divider.md +0 -129
  220. package/docs/src/core/components/ui/form/checkbox/checkbox.md +0 -77
  221. package/docs/src/core/components/ui/form/fieldset/fieldset.md +0 -205
  222. package/docs/src/core/components/ui/form/form-actions/form-actions.md +0 -100
  223. package/docs/src/core/components/ui/form/form-layout/form-layout.md +0 -119
  224. package/docs/src/core/components/ui/form/input/input.md +0 -142
  225. package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +0 -29
  226. package/docs/src/core/components/ui/form/radio/radio.md +0 -57
  227. package/docs/src/core/components/ui/form/select/select.md +0 -71
  228. package/docs/src/core/components/ui/form/switch/switch.md +0 -57
  229. package/docs/src/core/components/ui/form/textarea/textarea.md +0 -65
  230. package/docs/src/core/components/ui/group/group.md +0 -75
  231. package/docs/src/core/components/ui/icon/icon.md +0 -214
  232. package/docs/src/core/components/ui/icon/icons.json +0 -1
  233. package/docs/src/core/components/ui/image/image.md +0 -233
  234. package/docs/src/core/components/ui/link/link.md +0 -81
  235. package/docs/src/core/components/ui/loader/loader.md +0 -112
  236. package/docs/src/core/components/ui/menu/menu.md +0 -370
  237. package/docs/src/core/components/ui/modal/modal.md +0 -235
  238. package/docs/src/core/components/ui/pop/pop.md +0 -294
  239. package/docs/src/core/components/ui/progress/progress.md +0 -109
  240. package/docs/src/core/components/ui/table/table.md +0 -431
  241. package/docs/src/core/components/ui/theme/theme.md +0 -122
  242. package/docs/src/core/components/ui/toast/toast.md +0 -216
  243. package/docs/src/core/components/ui/tooltip/tooltip.md +0 -124
  244. package/docs/src/docs/_core-concept/dataFlow.md +0 -88
  245. package/docs/src/docs/_core-concept/overview.md +0 -57
  246. package/docs/src/docs/_core-concept/subscriber.md +0 -75
  247. package/docs/src/docs/_decorators/ancestor-attribute.md +0 -128
  248. package/docs/src/docs/_decorators/auto-subscribe.md +0 -202
  249. package/docs/src/docs/_decorators/bind.md +0 -167
  250. package/docs/src/docs/_decorators/get.md +0 -162
  251. package/docs/src/docs/_decorators/handle.md +0 -175
  252. package/docs/src/docs/_decorators/on-assign.md +0 -390
  253. package/docs/src/docs/_decorators/patch.md +0 -70
  254. package/docs/src/docs/_decorators/post.md +0 -146
  255. package/docs/src/docs/_decorators/publish.md +0 -55
  256. package/docs/src/docs/_decorators/put.md +0 -70
  257. package/docs/src/docs/_decorators/subscribe.md +0 -100
  258. package/docs/src/docs/_decorators/wait-for-ancestors.md +0 -163
  259. package/docs/src/docs/_directives/sub.md +0 -91
  260. package/docs/src/docs/_getting-started/ai-agents.md +0 -76
  261. package/docs/src/docs/_getting-started/concorde-manual-install.md +0 -133
  262. package/docs/src/docs/_getting-started/concorde-outside.md +0 -33
  263. package/docs/src/docs/_getting-started/create-a-component.md +0 -139
  264. package/docs/src/docs/_getting-started/my-first-component.md +0 -236
  265. package/docs/src/docs/_getting-started/my-first-subscriber.md +0 -120
  266. package/docs/src/docs/_getting-started/pubsub.md +0 -37
  267. package/docs/src/docs/_getting-started/start.md +0 -47
  268. package/docs/src/docs/_getting-started/theming.md +0 -253
  269. package/docs/src/docs/_misc/api-configuration.md +0 -81
  270. package/docs/src/docs/_misc/dataProviderKey.md +0 -168
  271. package/docs/src/docs/_misc/docs-mock-api.md +0 -63
  272. package/docs/src/docs/_misc/dynamic-path.md +0 -71
  273. package/docs/src/docs/_misc/endpoint.md +0 -45
  274. package/docs/src/docs/_misc/formelement-subscriber-removal.md +0 -115
  275. package/docs/src/docs/_misc/html-integration.md +0 -15
  276. package/docs/src/docs/search/docs-search.json +0 -12242
  277. package/docs/src/tag-list.json +0 -1
  278. package/docs/src/tsconfig-model.json +0 -23
  279. package/docs/src/tsconfig.json +0 -1242
  280. package/src/docs/prism/index.ts +0 -6
  281. package/src/docs/prism/prism.css +0 -158
  282. package/src/docs/prism/prism.js +0 -1022
@@ -1,76 +0,0 @@
1
- # AI agents (skills & AGENTS.md)
2
-
3
- Concorde ships **skills**, **rules**, and a root **`AGENTS.md`** so Cursor, JetBrains AI Assistant, and other coding agents follow framework patterns (DataProvider, decorators, short imports, scope, theme, migrations).
4
-
5
- On a [starter](#docs/_getting-started/concorde-outside.md/concorde-outside) project, run `yarn ai:sync` after install. On a [manual / brownfield](#docs/_getting-started/concorde-manual-install.md/concorde-manual-install) project, install Concorde first, then use `ai-init` below.
6
-
7
- ## Dedicated commands
8
-
9
- | Context | Command |
10
- |---------|---------|
11
- | [create-concorde-ts-starter](https://www.npmjs.com/package/@supersoniks/create-concorde-ts-starter) project | `yarn ai:sync` |
12
- | Any consumer app (after `yarn add @supersoniks/concorde`) | `node node_modules/@supersoniks/concorde/scripts/ai-init.mjs` |
13
- | Concorde repo (contributors) | `yarn ai-init` |
14
-
15
- <sonic-code language="shell">
16
- <template>
17
- # Starter (from project root)
18
- yarn ai:sync
19
-
20
- # Manual / existing project
21
- node node_modules/@supersoniks/concorde/scripts/ai-init.mjs
22
- </template>
23
- </sonic-code>
24
-
25
- ## Useful flags
26
-
27
- | Flag | Effect |
28
- |------|--------|
29
- | `--skip-agents` | Never write `AGENTS.md` (skills / rules only) |
30
- | `--merge-agents` | Opt-in: keep the project preamble and append / refresh the Concorde block |
31
- | `--force-agents` | Opt-in: **replace** the whole `AGENTS.md` (destructive) |
32
- | `--overlay <dir>` | Extra rules/skills + optional `AGENTS.concorde.md` for project-only Concorde agent notes |
33
- | `--cursor-only` | Install only `.cursor/skills` and `.cursor/rules` |
34
- | `--jetbrains-only` | Install only `.aiassistant/rules/` |
35
-
36
- ## `AGENTS.md` policy (non-invasive)
37
-
38
- | Situation | Default |
39
- |-----------|---------|
40
- | No `AGENTS.md` | Create the Concorde guide |
41
- | File with `<!-- concorde-ai -->` | Refresh the managed zone only |
42
- | File **without** marker (project notes) | **Left untouched** — skills / rules are enough |
43
- | `--merge-agents` / `--force-agents` / `--skip-agents` | See flags above |
44
-
45
- ```text
46
- [optional project preamble — short, project-only]
47
- <!-- concorde-ai -->
48
- <package ai/AGENTS.md>
49
- [--- + overlay AGENTS.concorde.md]
50
- ```
51
-
52
- Everything **after** `<!-- concorde-ai -->` is replaced on each `ai-init` run (idempotent). Do not paste a full copy of the Concorde guide above the marker — put project-specific notes in `AGENTS.concorde.md` (overlay). If the preamble duplicates package `AGENTS.md`, `ai-init` slims or drops it and prints a warning. Legacy filenames `AGENTS.overlay.md` / `AGENTS.starter.md` are still accepted with a deprecation warning.
53
-
54
- ## What gets installed
55
-
56
- | Path | Role |
57
- |------|------|
58
- | `AGENTS.md` | Created only if missing; existing project-owned files are left alone unless `--merge-agents` / `--force-agents` |
59
- | `.cursor/skills/concorde/` | Core Lit + DataProvider patterns |
60
- | `.cursor/skills/concorde-imports/` | Short `@supersoniks/concorde/…` import paths |
61
- | `.cursor/skills/concorde-scope/` | `serviceURL`, `formDataProvider`, API configuration |
62
- | `.cursor/skills/concorde-theme/` | `sonic-theme` and `--sc-*` tokens |
63
- | `.cursor/skills/concorde-menu/` | `sonic-menu` navigation |
64
- | `.cursor/skills/concorde-get-set-dp/` | `get` / `set` / `dp` and `DataProviderKey` migration |
65
- | `.cursor/rules/concorde.mdc` | Cursor rules (always-on patterns) |
66
- | `.aiassistant/rules/concorde.md` | JetBrains AI Assistant rules |
67
-
68
- ## Workflow
69
-
70
- 1. **Starter project:** [Installation](#docs/_getting-started/concorde-outside.md/concorde-outside) — `yarn ai:sync` is wired in the kit.
71
- 2. **Existing / manual Vite project:** [Manual installation](#docs/_getting-started/concorde-manual-install.md/concorde-manual-install), then **`ai-init`** after `yarn add @supersoniks/concorde`.
72
- 3. Commit `.cursor/` and `.aiassistant/` (and `AGENTS.md` only if you opted in / it was created) if your team shares agent settings.
73
- 4. Re-run the same command when you bump `@supersoniks/concorde` to refresh skills from `node_modules/@supersoniks/concorde/ai/`.
74
- 5. In Cursor, skills under `.cursor/skills/` are picked up automatically; mention a skill in chat for focused tasks (e.g. migration → `concorde-get-set-dp`).
75
-
76
- Source files in the npm package: `node_modules/@supersoniks/concorde/ai/` (see also `ai/README.md` in the [Concorde repository](https://github.com/supersoniks/concorde)).
@@ -1,133 +0,0 @@
1
- # Manual installation (Vite)
2
-
3
- > **Legacy** — for brownfield apps or custom stacks. New projects should use the [starter](#docs/_getting-started/concorde-outside.md/concorde-outside).
4
-
5
- ## Brand New Vite Project
6
-
7
- Tailwind configuration is not covered here yet.
8
-
9
- ### Creating the Project
10
-
11
- <sonic-code language="shell">
12
- <template>
13
- # Pure JavaScript project
14
- yarn create vite --template vanilla-js
15
- # TypeScript project
16
- # (it is recommended to use this approach, which installs Lit separately if needed, via "yarn add lit")
17
- yarn create vite --template vanilla-ts
18
- # TypeScript + Lit project
19
- # (creating new web components, for example, to extend the fetch or subscriber mixins)
20
- yarn create vite --template lit-ts
21
- </template>
22
- </sonic-code>
23
-
24
- Using Lit with TypeScript requires the following configuration in the "compilerOptions" section of the `tsconfig.json` file:
25
-
26
- <sonic-code language="json">
27
- <template>
28
- "experimentalDecorators": true,
29
- "useDefineForClassFields": false
30
- </template>
31
- </sonic-code>
32
-
33
- ### Installing Concorde
34
-
35
- Navigate to the project folder created and perform the installation:
36
-
37
- <sonic-code language="shell">
38
- <template>
39
- yarn add @supersoniks/concorde
40
- </template>
41
- </sonic-code>
42
-
43
- Agent skills (`AGENTS.md`, Cursor / JetBrains): see [AI agents](#docs/_getting-started/ai-agents.md/ai-agents) — run `node node_modules/@supersoniks/concorde/scripts/ai-init.mjs` after install.
44
-
45
- ### Development / Build
46
-
47
- <sonic-code language="shell">
48
- <template>
49
- # Development (you can add `--host` after the command chain in package.json's dev script instead of typing it each time as shown below)
50
- yarn dev --host
51
- # Build
52
- yarn build
53
- </template>
54
- </sonic-code>
55
-
56
- ## Shortcut Imports
57
-
58
- Shortcut imports work by default in JavaScript, but in TypeScript, they are activated by choice as they inject data into *tsconfig.json*. Here is the command:
59
-
60
- <sonic-code language="shell">
61
- <template>
62
- npx concorde enable-short-paths
63
- </template>
64
- </sonic-code>
65
-
66
- Shortcut imports replace the actual paths with aliases as follows:
67
-
68
- * `@supersoniks/concorde/core/components/functional_or_ui/component/component` becomes `@supersoniks/concorde/functional_or_ui/component`
69
- * `@supersoniks/concorde/core/mixins_or_utils/class_name` becomes `@supersoniks/concorde/mixins_or_utils/class_name`
70
-
71
- The original paths remain accessible. Shortcut imports are used for the examples later in this documentation.
72
-
73
- ## Usage
74
-
75
- ### Simple Integration in HTML
76
-
77
- Import needed component in `main.ts` or wherever you want to use it:
78
-
79
- <sonic-code language="typescript">
80
- <template>
81
- import "@supersoniks/concorde/ui/button";
82
- </template>
83
- </sonic-code>
84
-
85
- Then in the render function ofyour component or in the HTML of the web page that includes the compiled JS, use the component as follows:
86
-
87
- <sonic-code>
88
- <template>
89
- <sonic-button variant="outline">My button</sonic-button>
90
- </template>
91
- </sonic-code>
92
-
93
- ### Using a Mixin to Create a New Lit Component
94
-
95
- For example, create a file `my-element.ts` at the root:
96
-
97
- <sonic-code language="typescript">
98
- <template>
99
- import { html, LitElement } from "lit";
100
- import { customElement, property } from "lit/decorators.js";
101
- import Fetcher from "@supersoniks/concorde/mixins/Fetcher";
102
- import Subscriber from "@supersoniks/concorde/mixins/Subscriber";
103
-
104
- @customElement("my-element")
105
- export class SonicComponent extends Fetcher(Subscriber(LitElement)) {
106
- @property() email = "";
107
- @property() first_name = "";
108
- @property() last_name = "";
109
-
110
- render() {
111
- return html`<div>
112
- ${this.first_name} ${this.last_name} : ${this.email}
113
- </div>`;
114
- }
115
- }
116
- </template>
117
- </sonic-code>
118
-
119
- Import component `main.ts` or `main.js` or any other component that uses it to be compiled
120
-
121
- <sonic-code language="typescript">
122
- <template>
123
- import "./my-element";
124
- </template>
125
- </sonic-code>
126
-
127
- In the HTML of a JS or TS component or in the HTML of the web page containing the compiled JS:
128
-
129
- <sonic-code language="html">
130
- <template>
131
- <my-element serviceURL="/docs-mock-api" dataProvider="api/users/2" key="data"></my-element>
132
- </template>
133
- </sonic-code>
@@ -1,33 +0,0 @@
1
- # Installation
2
-
3
- <sonic-alert status="info" label="Recommended — use the starter" background>
4
- <p>For almost all new projects, use <a href="https://www.npmjs.com/package/@supersoniks/create-concorde-ts-starter">create-concorde-ts-starter</a></p>
5
- <p>You get Vite + TypeScript + Lit + Tailwind, an example component, <code>npx concorde enable-short-paths</code> ready to run, and <code>yarn ai:sync</code> for <a href="#docs/_getting-started/ai-agents.md/ai-agents">AI agent skills</a> (<code>AGENTS.md</code>, Cursor / JetBrains rules) without extra setup.</p>
6
- </sonic-alert>
7
-
8
- ## Starter
9
-
10
- The following command creates a new Vite project in TypeScript mode with Tailwind and an example component to get started.
11
-
12
- <sonic-code language="shell">
13
- <template>
14
- npx @supersoniks/create-concorde-ts-starter "project_name"
15
- </template>
16
- </sonic-code>
17
-
18
- Then, from the project folder:
19
-
20
- <sonic-code language="shell">
21
- <template>
22
- yarn install
23
- yarn dev --host
24
- </template>
25
- </sonic-code>
26
-
27
- ## Next steps
28
-
29
- | Step | Page |
30
- |------|------|
31
- | Learn patterns | [My first component](#docs/_getting-started/my-first-component.md/my-first-component) |
32
- | Agent skills | [AI agents (skills)](#docs/_getting-started/ai-agents.md/ai-agents) — `yarn ai:sync` on the starter |
33
- | Brownfield / manual Vite | [Legacy: Manual installation](#docs/_getting-started/concorde-manual-install.md/concorde-manual-install) |
@@ -1,139 +0,0 @@
1
- # Creating components
2
-
3
- > **New app components:** start with [My first component](#docs/_getting-started/my-first-component.md/my-first-component) and [Data flow](#docs/_core-concept/dataFlow.md/dataFlow). The `Subscriber` mixin below is [legacy](#docs/_core-concept/subscriber.md/subscriber).
4
-
5
- ## Where to put it?
6
-
7
- In this document, we consider the src directory of the project as the root.<br>
8
- We describe how we organize our components as an example, however it depends on your project.
9
-
10
- In concorde each component is currently organized in the following directory structure (at least we try):
11
-
12
- - **/core/components/functional/component-name/component-name.ts**
13
- Generic/functional/generally unstyled component.
14
- The component usually doesn't use any other concrete components.
15
- - **/core/components/ui/component-name/component-name.ts**
16
- Generic but UI-oriented component.
17
- The component usually only uses generic components and other UI components.
18
- - **la-billetterie/components/atoms/component-name/component-name.ts**
19
- The component is intended to have a concrete usage within our ticketing system **"la-billetterie"**.
20
- It usually only uses generic components from `core` and possibly other atoms.
21
- - **la-billetterie/components/concrete-destination/component-name/component-name.ts**
22
- The component has a specific destination: (event / cart / gift card): `/components/destination/`
23
- The component uses various components, usually from the `/components/atoms` directory.
24
- It does not use components at the same level in the file hierarchy.
25
-
26
- ## Starting from a Simple Model
27
-
28
- You can copy `example.ts` from the source to the desired destination to start with.
29
- This file contains a web component in the form of a class that extends the `Subscriber` mixin, with a reactive property and a render function.
30
-
31
- <sonic-code language="javascript">
32
- <template>
33
- import { html, LitElement } from "lit";
34
- import { customElement, property } from "lit/decorators.js";
35
- import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
36
-
37
- @customElement("sonic-example")
38
- export class SonicComponent extends Subscriber(LitElement) {
39
- @property() text = "Example";
40
- render() {
41
- return html`${this.text}`;
42
- }
43
- }
44
- </template>
45
- </sonic-code>
46
-
47
- **You can remove the dependency on `Subscriber`** if automatic population of the component with external data is not required.
48
- For example, for a UI component:
49
-
50
-
51
- <sonic-code language="javascript">
52
- <template>
53
- import { html, LitElement } from "lit";
54
- import { customElement, property } from "lit/decorators.js";
55
-
56
- @customElement("sonic-example")
57
- export class SonicComponent extends LitElement {
58
- @property() text = "Example";
59
- render() {
60
- return html`${this.text}`;
61
- }
62
- }
63
- </template>
64
- </sonic-code>
65
-
66
- Regarding `Subscriber`, see:
67
-
68
- - [🔔 Subscriber](#docs/_core-concept/subscriber.md/subscriber)
69
- - [🥨 Sharing Data](#docs/_getting-started/pubsub.md/pubsub)
70
-
71
- ### Naming the Component
72
-
73
- The class name is not necessarily important. However, it is important to **give it a component name prefixed with "sonic"** (or a prefix of your own) using the dedicated metadata already present in the copied document. For example, a button component would be named as follows:
74
-
75
-
76
- <sonic-code language="typescript">
77
- <template>
78
- @customElement("sonic-button")
79
- </template>
80
- </sonic-code>
81
-
82
- For less generic components with a specific destination, we advise to include the destination in the name.
83
- For example, for a "title" component in the "event" destination, the name would be simply:
84
-
85
-
86
- <sonic-code language="typescript">
87
- <template>
88
- @customElement("sonic-event-title")
89
- </template>
90
- </sonic-code>
91
-
92
-
93
- ## Modifying It
94
-
95
- #### Creating Reactive Properties and Modifying the Render Function
96
-
97
- To do this, study the functioning of https://lit.dev and also refer to [Subscriber](#docs/_core-concept/subscriber.md/subscriber).
98
-
99
- #### HTML Structure of a Component
100
-
101
- The HTML structure of a component should remain as simple as possible.
102
-
103
- Ideally, there should be only one additional level of elements in addition to slots.
104
-
105
- - **The main component is already a wrapper**.
106
- It receives classes to manage its layout, but it should not style internal elements.
107
- - **Slots handle the visual organization** of elements.
108
- - **The specificity of the component is expressed in this additional level** by adding a list, a functional native element (e.g., button), or another component.
109
-
110
- This leads to the creation of more components and thus raises questions about the hierarchical organization of files. However, this tends to atomize their roles.
111
-
112
- ## Referencing It
113
-
114
- To compile the component, it needs to be referenced somewhere through an import statement. In particular, it is important to reference it in any component that uses it.
115
-
116
- In the case where it can be directly used in a page, it should also be globally referenced, especially considering the creation of **specific bundles** in the future.
117
-
118
- Here's where we add imports based on the component's location inside concorde as an example
119
-
120
- - **/core/components/functional/component-name/component-name.ts**
121
- In `/core/components/functional/functional.ts`, which is referenced in core.ts and imported in `index.ts`.
122
- - **/core/components/ui/component-name/component-name.ts**
123
- In `/core/components/ui/ui.ts`, which is referenced in core.ts and imported in `index.ts`.
124
- - **la-billetterie/components/atoms/component-name/component-name.ts**
125
- Nowhere else but where it will be used, except for possible **temporary** tests, for example, in `index.ts`.
126
- - **la-billetterie/components/concrete-destination/component-name/component-name.ts**
127
- In `la-billetterie/components/concrete-destination/destination-concrete.ts`.
128
- If it's a new destination, you'll need to create the corresponding import .ts file and import it in `la-billetterie.ts`.
129
-
130
- ## Using It
131
-
132
- As a reminder, the component is simply integrated into the context by adding a tag with the component's name, for example:
133
-
134
-
135
- <sonic-code language="html">
136
- <template>
137
- <sonic-event-title></sonic-event-title>
138
- </template>
139
- </sonic-code>
@@ -1,236 +0,0 @@
1
- # My first component
2
-
3
- Build a **Lit** user card with Tailwind and Concorde UI, then connect it to the **DataProvider** store: declare the **data configuration** (type, key, scope), and let **`@subscribe`** keep the card in sync.
4
-
5
- > Legacy approach with the **Subscriber mixin**: [Legacy: My first subscriber](#docs/_getting-started/my-first-subscriber.md/my-first-subscriber).
6
-
7
- ## 1. Lit component + Tailwind
8
-
9
- Export Tailwind once (e.g. `src/docs/tailwind.ts` in this repo):
10
-
11
- <sonic-code language="typescript">
12
- <template>
13
- import { css, unsafeCSS } from "lit";
14
- import tailwindImport from "./css/tailwind.css?inline";
15
-
16
- export const tailwind = css`${unsafeCSS(tailwindImport)}`;
17
- </template>
18
- </sonic-code>
19
-
20
- User card — plain Lit properties and UI components (no store yet):
21
-
22
- <sonic-code language="typescript">
23
- <template>
24
- import { html, LitElement } from "lit";
25
- import { customElement, property } from "lit/decorators.js";
26
- import { tailwind } from "../tailwind";
27
-
28
- @customElement("docs-user")
29
- export class DocsUser extends LitElement {
30
- static styles = [tailwind];
31
-
32
- @property({ type: String }) first_name = "";
33
- @property({ type: String }) last_name = "";
34
- @property({ type: String }) email = "";
35
- @property({ type: String }) avatar = "";
36
-
37
- render() {
38
- return html`&lt;div class="flex items-center gap-3 rounded-md p-2"&gt;
39
- &lt;sonic-image src=${this.avatar} rounded="md" ratio="1/1" class="w-16"&gt;&lt;/sonic-image&gt;
40
- &lt;div&gt;
41
- &lt;div&gt;${this.first_name} &lt;span class="font-bold"&gt;${this.last_name}&lt;/span&gt;&lt;/div&gt;
42
- &lt;div class="text-sm text-neutral-400"&gt;${this.email}&lt;/div&gt;
43
- &lt;/div&gt;
44
- &lt;/div&gt;`;
45
- }
46
- }
47
- </template>
48
- </sonic-code>
49
-
50
- ## 2. Data configuration
51
-
52
- The card does not hard-code user fields anymore. You declare **what** is stored, **where** it lives, and **which ancestor scope** applies — then `@subscribe` mirrors that object on the component.
53
-
54
- ### Type — shape of the data
55
-
56
- `DocsUserData` documents the fields you expect at this scope (first name, email, avatar, …). TypeScript checks that `user` matches that shape.
57
-
58
- <sonic-code language="typescript">
59
- <template>
60
- export type DocsUserData = {
61
- first_name: string;
62
- last_name: string;
63
- email: string;
64
- avatar: string;
65
- };
66
- </template>
67
- </sonic-code>
68
-
69
- ### Key — path in the DataProvider
70
-
71
- `docsUserRowKey` points at the store segment to read. The path `"${dataProvider}"` is resolved at runtime from a property on the component (see scope below).
72
-
73
- <sonic-code language="typescript">
74
- <template>
75
- import { DataProviderKey } from "@supersoniks/concorde/core/utils/dataProviderKey";
76
-
77
- export const docsUserRowKey = new DataProviderKey&lt;
78
- DocsUserData,
79
- { dataProvider: string | null }
80
- &gt;("${dataProvider}");
81
- </template>
82
- </sonic-code>
83
-
84
- The second generic (`{ dataProvider: string | null }`) lists what the host must expose so `"${dataProvider}"` can be resolved. See [DataProviderKey](#docs/_misc/dataProviderKey.md/dataProviderKey) and [Dynamic path placeholders](#docs/_misc/dynamic-path.md/dynamic-path).
85
-
86
- ### Scope — which store segment applies
87
-
88
- A parent sets `dataProvider=${docsUserScopeAKey.path}` (or a list row sets `…/list-item/0`). [`@ancestorAttribute`](#docs/_decorators/ancestor-attribute.md/ancestor-attribute) copies that attribute onto `this.dataProvider`, so the key resolves to the correct branch.
89
-
90
- <sonic-code language="typescript">
91
- <template>
92
- @ancestorAttribute("dataProvider")
93
- dataProvider: string | null = null;
94
- </template>
95
- </sonic-code>
96
-
97
- ### Subscribe — keep the card in sync
98
-
99
- [`@subscribe`](#docs/_decorators/subscribe.md/subscribe) watches `docsUserRowKey` and updates `user` when the store changes. Use `@state()` so Lit re-renders. The template reads `this.user` like any other property.
100
-
101
- <sonic-code language="typescript">
102
- <template>
103
- import { html, LitElement, nothing } from "lit";
104
- import { customElement, state } from "lit/decorators.js";
105
- import {
106
- ancestorAttribute,
107
- subscribe,
108
- } from "@supersoniks/concorde/core/decorators/Subscriber";
109
- import { docsUserRowKey, type DocsUserData } from "./users";
110
- import { tailwind } from "../tailwind";
111
-
112
- @customElement("docs-user")
113
- export class DocsUser extends LitElement {
114
- static styles = [tailwind];
115
-
116
- @ancestorAttribute("dataProvider")
117
- dataProvider: string | null = null;
118
-
119
- @subscribe(docsUserRowKey)
120
- @state()
121
- user: DocsUserData | null = null;
122
-
123
- render() {
124
- const u = this.user;
125
- if (!u) return nothing;
126
- return html`&lt;div class="flex items-center gap-3 rounded-md p-2"&gt;
127
- &lt;sonic-image src=${u.avatar} rounded="md" ratio="1/1" class="w-16"&gt;&lt;/sonic-image&gt;
128
- &lt;div&gt;
129
- &lt;div&gt;${u.first_name} &lt;span class="font-bold"&gt;${u.last_name}&lt;/span&gt;&lt;/div&gt;
130
- &lt;div class="text-sm text-neutral-400"&gt;${u.email}&lt;/div&gt;
131
- &lt;/div&gt;
132
- &lt;/div&gt;`;
133
- }
134
- }
135
- </template>
136
- </sonic-code>
137
-
138
- Live code: `src/docs/example/users.ts`. In this repo, imports use **`core/…` paths** (short `@supersoniks/concorde/…` exports apply in **consumer apps** only).
139
-
140
- ### Two scopes, one component
141
-
142
- The same `docs-user` is mounted twice. Each copy inherits a **different** nearest `dataProvider` — that is the row/list **scope**:
143
-
144
- <sonic-code>
145
- <template>
146
- <docs-demo-sources for="docs-user-two-scopes"></docs-demo-sources>
147
- <docs-user-two-scopes></docs-user-two-scopes>
148
- </template>
149
- </sonic-code>
150
-
151
- Markup (two isolated stores; keys from `docs-provider-keys.ts`):
152
-
153
- <sonic-code language="markup">
154
- <template>
155
- &lt;div class="grid md:grid-cols-2 gap-6"&gt;
156
- &lt;div dataProvider="${docsUserScopeAKey.path}"&gt;
157
- &lt;docs-user&gt;&lt;/docs-user&gt;
158
- &lt;/div&gt;
159
- &lt;div dataProvider="${docsUserScopeBKey.path}"&gt;
160
- &lt;docs-user&gt;&lt;/docs-user&gt;
161
- &lt;/div&gt;
162
- &lt;/div&gt;
163
- </template>
164
- </sonic-code>
165
-
166
- Seeded in `docs-provider-keys.ts` (`set(docsUserScopeAKey, …)`): **Paul** / **Marie**. Without `@ancestorAttribute`, both cards would not know which store to read.
167
-
168
- ## 3. Fetch users — `sonic-list` with `.items`
169
-
170
- Use a Lit parent and the **`items`** renderer (not HTML `<template>` children). The callback receives each row object from fetch — render fields directly (`${item.first_name}`, …), like porting a template that used `data-bind` / `<sonic-value>`.
171
-
172
- <sonic-code>
173
- <template>
174
- <docs-lit-demo for="docs-users-list"></docs-lit-demo>
175
- </template>
176
- </sonic-code>
177
-
178
- Wrapper (`docs-users-list.ts`):
179
-
180
- <sonic-code language="typescript">
181
- <template>
182
- import { html, LitElement } from "lit";
183
- import { customElement } from "lit/decorators.js";
184
- import "../../core/components/functional/list/list";
185
- import "./users";
186
-
187
- @customElement("docs-users-list")
188
- export class DocsUsersList extends LitElement {
189
- private items = ({ first_name, last_name, email, avatar }) => html`
190
- &lt;div class="flex gap-3"&gt;
191
- &lt;sonic-image src=${avatar} ...&gt;&lt;/sonic-image&gt;
192
- &lt;div&gt;${first_name} &lt;b&gt;${last_name}&lt;/b&gt;&lt;/div&gt;
193
- &lt;div class="text-sm text-neutral-400"&gt;${email}&lt;/div&gt;
194
- &lt;/div&gt;
195
- `;
196
-
197
- render() {
198
- return html`
199
- &lt;sonic-list fetch dataProvider=${usersListEndpoint.path} key="data" .items=${this.items}&gt;&lt;/sonic-list&gt;
200
- `;
201
- }
202
- }
203
- </template>
204
- </sonic-code>
205
-
206
- See [Local API demos](#docs/_misc/docs-mock-api.md/docs-mock-api) for `serviceURL="/docs-mock-api"`.
207
-
208
- ## 4. Form preview with `formDataProvider`
209
-
210
- Edit fields in a form; the card follows the same `docsUserRowKey` when the preview host sets `dataProvider="userPreview"`.
211
-
212
- <sonic-code>
213
- <template>
214
- <div class="grid grid-cols-1 gap-4 max-w-xl">
215
- <form formDataProvider="${docsUserPreviewKey.path}" class="grid grid-cols-2 gap-3">
216
- <sonic-input label="First name" name="first_name" value="Paul" size="sm"></sonic-input>
217
- <sonic-input label="Last name" name="last_name" value="Metrand" size="sm"></sonic-input>
218
- <sonic-input class="col-span-2" label="Email" name="email" value="paul@example.com" size="sm"></sonic-input>
219
- <sonic-input class="col-span-2" label="Avatar URL" name="avatar" value="https://i.pravatar.cc/150?u=paul" size="sm"></sonic-input>
220
- </form>
221
- <sonic-divider align="left">Preview</sonic-divider>
222
- <div dataProvider="${docsUserPreviewKey.path}">
223
- <docs-user></docs-user>
224
- </div>
225
- </div>
226
- </template>
227
- </sonic-code>
228
-
229
- Use `formDataProvider` + `name` on inputs — no manual `@input` handlers ([Data flow](#docs/_core-concept/dataFlow.md/dataFlow)).
230
-
231
- ## Next steps
232
-
233
- - [Data flow](#docs/_core-concept/dataFlow.md/dataFlow) — full map
234
- - [DataProviderKey](#docs/_misc/dataProviderKey.md/dataProviderKey) — typed paths and host constraints
235
- - [@subscribe](#docs/_decorators/subscribe.md/subscribe) / [sub()](#docs/_directives/sub.md/sub) — read-only in templates
236
- - [List](#core/components/functional/list/list.md/list) — `.items`, `.noItems`, `.skeleton`