@supersoniks/concorde 5.1.2 → 5.1.3

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 (130) hide show
  1. package/.agents/skills/concorde-docs/SKILL.md +1 -1
  2. package/README.md +1 -1
  3. package/ai/README.md +29 -41
  4. package/ai/skills/concorde/SKILL.md +54 -324
  5. package/ai/skills/concorde/rules/composition.md +32 -0
  6. package/ai/skills/concorde/rules/data.md +47 -0
  7. package/ai/skills/concorde/rules/http.md +25 -0
  8. package/ai/skills/concorde/rules/lists-forms.md +35 -0
  9. package/ai/skills/concorde/rules/styling.md +46 -0
  10. package/ai/skills/concorde/rules/troubleshooting.md +45 -0
  11. package/build-infos.json +1 -1
  12. package/concorde-core.bundle.js +21 -21
  13. package/concorde-core.es.js +977 -980
  14. package/custom-elements-manifest.public.config.mjs +8 -0
  15. package/{.tmp-cem/custom-elements.json → custom-elements.json} +11722 -8868
  16. package/dist/concorde-core.bundle.js +21 -21
  17. package/dist/concorde-core.es.js +977 -980
  18. package/dist/docs-mock-api-sw.js +58 -223
  19. package/dist/docs-mock-api-sw.js.map +4 -4
  20. package/dist/img/concorde/plane_01.jpg +0 -0
  21. package/dist/img/concorde/plane_02.jpg +0 -0
  22. package/dist/img/concorde/plane_03.jpg +0 -0
  23. package/dist/img/concorde/plane_04.jpg +0 -0
  24. package/dist/img/concorde/plane_05.jpg +0 -0
  25. package/dist/img/concorde/plane_06.jpg +0 -0
  26. package/dist/img/concorde/plane_07.jpg +0 -0
  27. package/dist/img/concorde/plane_08.jpg +0 -0
  28. package/dist/img/concorde/plane_09.jpg +0 -0
  29. package/dist/img/concorde/plane_10.jpg +0 -0
  30. package/dist/img/concorde/plane_11.jpg +0 -0
  31. package/dist/img/concorde/plane_12.jpg +0 -0
  32. package/dist/img/concorde/plane_13.jpg +0 -0
  33. package/dist/img/og-concorde.jpg +0 -0
  34. package/dist/robots.txt +11 -10
  35. package/docs/.htaccess +7 -0
  36. package/docs/about.html +111 -0
  37. package/docs/about.md +22 -0
  38. package/docs/assets/{index-BgG6FFPt.js → index-6sS76xWj.js} +482 -500
  39. package/docs/assets/{index-x89XINSG.css → index-DkdPbH0F.css} +1 -1
  40. package/docs/core/components/functional/date/date.md +1 -1
  41. package/docs/core/components/functional/list/list.html +7 -5
  42. package/docs/core/components/functional/list/list.md +6 -2
  43. package/docs/core/components/ui/card/card.html +1 -1
  44. package/docs/core/components/ui/card/card.md +1 -1
  45. package/docs/core/components/ui/image/image.html +17 -17
  46. package/docs/core/components/ui/image/image.md +17 -17
  47. package/docs/core/components/ui/modal/modal.html +2 -2
  48. package/docs/core/components/ui/modal/modal.md +2 -2
  49. package/docs/custom-elements.json +16559 -0
  50. package/docs/docs/decorators/bind.html +22 -21
  51. package/docs/docs/decorators/bind.md +23 -24
  52. package/docs/docs/getting-started/ai-agents.html +50 -94
  53. package/docs/docs/getting-started/ai-agents.md +29 -55
  54. package/docs/docs/getting-started/dataFlow.html +1 -1
  55. package/docs/docs/getting-started/dataFlow.md +1 -1
  56. package/docs/docs/index.html +1 -1
  57. package/docs/hubs/decorators.html +11 -16
  58. package/docs/hubs/remote-data.html +5 -9
  59. package/docs/img/og-concorde.jpg +0 -0
  60. package/docs/index.html +91 -2
  61. package/docs/index.md +2 -2
  62. package/docs/llms-full.txt +58 -74
  63. package/docs/llms.txt +6 -4
  64. package/docs/privacy.html +122 -0
  65. package/docs/privacy.md +32 -0
  66. package/docs/sitemap.xml +6 -0
  67. package/docs/src/core/components/functional/date/date.md +1 -1
  68. package/docs/src/core/components/functional/list/list.md +6 -2
  69. package/docs/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  70. package/docs/src/core/components/functional/sdui/component-catalog.json +1 -1
  71. package/docs/src/core/components/ui/card/card.md +1 -1
  72. package/docs/src/core/components/ui/image/image.md +17 -17
  73. package/docs/src/core/components/ui/modal/modal.md +2 -2
  74. package/docs/src/docs/decorators/bind.md +23 -24
  75. package/docs/src/docs/getting-started/ai-agents.md +29 -55
  76. package/docs/src/docs/getting-started/dataFlow.md +1 -1
  77. package/docs/src/docs/search/docs-search.json +100 -55
  78. package/docs/src/tsconfig.json +11 -5
  79. package/index.html +89 -0
  80. package/package.json +8 -4
  81. package/public/img/og-concorde.jpg +0 -0
  82. package/scripts/ai-init.mjs +104 -379
  83. package/scripts/ai-init.test.mjs +81 -239
  84. package/scripts/docs-markdown-vite-plugin.ts +11 -5
  85. package/scripts/docs-public-url.mjs +6 -0
  86. package/scripts/docs.htaccess +7 -0
  87. package/scripts/generate-cem.mjs +244 -0
  88. package/scripts/generate-cem.test.mjs +122 -0
  89. package/scripts/generate-crawl-docs.mjs +29 -5
  90. package/scripts/generate-sdui-catalog.mjs +11 -10
  91. package/scripts/post-build-docs.js +3 -0
  92. package/scripts/pre-publish.mjs +2 -1
  93. package/scripts/site-pages.mjs +212 -0
  94. package/scripts/site-pages.test.mjs +116 -0
  95. package/site-pages/about.md +22 -0
  96. package/site-pages/privacy.md +32 -0
  97. package/src/core/components/functional/date/date.md +1 -1
  98. package/src/core/components/functional/list/list.md +6 -2
  99. package/src/core/components/functional/sdui/component-catalog.gaps.json +1 -1
  100. package/src/core/components/functional/sdui/component-catalog.json +1 -1
  101. package/src/core/components/ui/card/card.md +1 -1
  102. package/src/core/components/ui/image/image.md +17 -17
  103. package/src/core/components/ui/modal/modal.md +2 -2
  104. package/src/core/decorators/subscriber/bind.ts +9 -14
  105. package/src/docs/components/docs-demo-sources.ts +3 -3
  106. package/src/docs/decorators/bind.md +23 -24
  107. package/src/docs/docs-location.spec.ts +10 -0
  108. package/src/docs/docs-location.ts +10 -0
  109. package/src/docs/example/decorators-demo-bind-demos.ts +11 -28
  110. package/src/docs/example/docs-toggle-demos.ts +1 -1
  111. package/src/docs/getting-started/ai-agents.md +29 -55
  112. package/src/docs/getting-started/dataFlow.md +1 -1
  113. package/src/docs/home/home.ts +3 -1
  114. package/src/docs/navigation/navigation.ts +1 -1
  115. package/src/docs/search/docs-search.json +100 -55
  116. package/src/docs/search/markdown-renderer.ts +6 -1
  117. package/src/docs/tailwind/css/docs/content.css +4 -5
  118. package/src/tsconfig.json +11 -5
  119. package/src/tsconfig.tsbuildinfo +1 -1
  120. package/ai/AGENTS.md +0 -56
  121. package/ai/cursor/rules/concorde-menu.mdc +0 -15
  122. package/ai/cursor/rules/concorde-scope.mdc +0 -14
  123. package/ai/cursor/rules/concorde-theme.mdc +0 -13
  124. package/ai/cursor/rules/concorde.mdc +0 -66
  125. package/ai/jetbrains/rules/concorde.md +0 -53
  126. package/ai/skills/concorde-get-set-dp/SKILL.md +0 -194
  127. package/ai/skills/concorde-imports/SKILL.md +0 -78
  128. package/ai/skills/concorde-menu/SKILL.md +0 -74
  129. package/ai/skills/concorde-scope/SKILL.md +0 -70
  130. package/ai/skills/concorde-theme/SKILL.md +0 -57
@@ -53,10 +53,10 @@ When the response type starts w</pre>
53
53
  <section id="core-components-functional-list-list" data-doc-id="core/components/functional/list/list">
54
54
  <h2><a href="/core/components/functional/list">List</a></h2>
55
55
  <p><strong>Doc ID:</strong> <code>core/components/functional/list/list</code> · <a href="/core/components/functional/list">full page</a></p>
56
- <p>sonic-list renders one row per entry of its props array, either set directly or loaded with fetch. From Lit, pass a row renderer on the items property; in plain HTML, declare &lt;template&gt; children. Each</p>
56
+ <p>sonic-list renders one row per entry of its props array, either set directly or loaded with fetch. In TypeScript, prefer the .items row renderer (with .separator · .noItems · .skeleton); &lt;template&gt; ch</p>
57
57
  <pre class="doc-excerpt">List
58
58
 
59
- sonic-list renders one row per entry of its props array, either set directly or loaded with fetch. From Lit, pass a row renderer on the items property; in plain HTML, declare children. Each row gets its own data provider at /list-item/ .
59
+ sonic-list renders one row per entry of its props array, either set directly or loaded with fetch. In TypeScript, prefer the .items row renderer (with .separator · .noItems · .skeleton); children are for plain HTML hosts without Lit. Each row gets its own data provider at /list-item/ .
60
60
 
61
61
  Basic example
62
62
 
@@ -64,7 +64,7 @@ Add fetch to load props from serviceURL + endPoint (or dataProvider when endPoin
64
64
 
65
65
  $time $code from $city ($airport)&quot;&gt;
66
66
 
67
- Fetch attributes (lazyload · refetchEveryMs · headers · authentication) are shared with Fetch.
67
+ This example uses HTML templates; from Lit, use the row renderer instead. Fetch attributes (lazyload · refetchEveryMs · headers · authentication) are shared with Fetch.
68
68
 
69
69
  Row renderer
70
70
 
@@ -72,11 +72,7 @@ From a Lit component, set .items to a function (item, metadata) =&gt; TemplateRe
72
72
 
73
73
  Row variants
74
74
 
75
- In HTML, templateKey (default template) names the row field that selects a . Rows without a match cycle through the children that have no data-value. From Lit, branch inside the items callback instead.
76
-
77
- Separator and empty list
78
-
79
- .separator renders between rows (not after the last one). .noItems</pre>
75
+ In HTML, templateKey (default template) names the row field that selects a . Rows without a match cycle through the children that have no data-value. From Lit, branch insid</pre>
80
76
  </section>
81
77
  <section id="core-components-functional-queue-queue" data-doc-id="core/components/functional/queue/queue">
82
78
  <h2><a href="/core/components/functional/queue">Queue</a></h2>
@@ -274,7 +270,7 @@ Quick map
274
270
  | Derived / aggregate (JSONata) | derive() or sonic-jsonata — Jsonata |
275
271
  | Offline doc demos | serviceURL=&quot;/docs-mock-api&quot; — Local API demos |
276
272
 
277
- Skill: concorde-get-set-dp in the package ai/ folder.
273
+ Agent skill: concorde (rules/data.md), see AI agents.
278
274
 
279
275
  DataProviderKey
280
276
 
Binary file
package/docs/index.html CHANGED
@@ -16,6 +16,94 @@
16
16
  <link rel="canonical" href="https://concorde.supersoniks.org/" />
17
17
  <link rel="alternate" type="text/markdown" href="/index.md" title="Markdown" />
18
18
  <link rel="alternate" type="text/plain" href="/llms.txt" title="llms.txt" />
19
+ <meta property="og:type" content="website" />
20
+ <meta property="og:site_name" content="Concorde by Supersoniks" />
21
+ <meta property="og:title" content="Concorde by Supersoniks — Web components for every stack" />
22
+ <meta property="og:description" content="Open-source Lit web components framework: UI, data binding, forms and themes for React, Vue, PHP or plain HTML." />
23
+ <meta property="og:url" content="https://concorde.supersoniks.org/" />
24
+ <meta property="og:image" content="https://concorde.supersoniks.org/img/og-concorde.jpg" />
25
+ <meta property="og:image:width" content="1200" />
26
+ <meta property="og:image:height" content="630" />
27
+ <meta property="og:image:alt" content="Five Concorde aircraft parked nose to nose, black and white photo" />
28
+ <meta name="twitter:card" content="summary_large_image" />
29
+ <script type="application/ld+json">
30
+ {
31
+ "@context": "https://schema.org",
32
+ "@graph": [
33
+ {
34
+ "@type": "WebSite",
35
+ "@id": "https://concorde.supersoniks.org/#website",
36
+ "name": "Concorde",
37
+ "alternateName": "Concorde by Supersoniks",
38
+ "url": "https://concorde.supersoniks.org/",
39
+ "inLanguage": "en",
40
+ "publisher": {
41
+ "@id": "https://supersoniks.com/#organization"
42
+ }
43
+ },
44
+ {
45
+ "@type": "SoftwareApplication",
46
+ "@id": "https://concorde.supersoniks.org/#software",
47
+ "name": "Concorde",
48
+ "alternateName": "@supersoniks/concorde",
49
+ "description": "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.",
50
+ "url": "https://concorde.supersoniks.org/",
51
+ "applicationCategory": "DeveloperApplication",
52
+ "applicationSubCategory": "Web components framework",
53
+ "operatingSystem": "Any (web browser)",
54
+ "programmingLanguage": "TypeScript",
55
+ "license": "https://opensource.org/licenses/MIT",
56
+ "downloadUrl": "https://www.npmjs.com/package/@supersoniks/concorde",
57
+ "softwareHelp": "https://concorde.supersoniks.org/docs/getting-started/start",
58
+ "image": "https://concorde.supersoniks.org/img/og-concorde.jpg",
59
+ "offers": {
60
+ "@type": "Offer",
61
+ "price": "0",
62
+ "priceCurrency": "EUR"
63
+ },
64
+ "author": {
65
+ "@id": "https://supersoniks.com/#organization"
66
+ },
67
+ "publisher": {
68
+ "@id": "https://supersoniks.com/#organization"
69
+ },
70
+ "sameAs": [
71
+ "https://www.npmjs.com/package/@supersoniks/concorde"
72
+ ]
73
+ },
74
+ {
75
+ "@type": "Organization",
76
+ "@id": "https://supersoniks.com/#organization",
77
+ "name": "Supersoniks",
78
+ "legalName": "SUPERSONIKS",
79
+ "url": "https://supersoniks.com/",
80
+ "telephone": "+33 2 47 68 93 25",
81
+ "address": {
82
+ "@type": "PostalAddress",
83
+ "streetAddress": "22 rue du Docteur Bretonneau",
84
+ "postalCode": "37000",
85
+ "addressLocality": "Tours",
86
+ "addressCountry": "FR"
87
+ },
88
+ "contactPoint": {
89
+ "@type": "ContactPoint",
90
+ "contactType": "customer service",
91
+ "telephone": "+33 2 47 68 93 25",
92
+ "url": "https://supersoniks.com/un-projet",
93
+ "availableLanguage": [
94
+ "fr",
95
+ "en"
96
+ ]
97
+ },
98
+ "sameAs": [
99
+ "https://www.linkedin.com/company/supersoniks/",
100
+ "https://www.facebook.com/supersoniks",
101
+ "https://www.instagram.com/agencesupersoniks/"
102
+ ]
103
+ }
104
+ ]
105
+ }
106
+ </script>
19
107
  <link rel="preconnect" href="https://fonts.googleapis.com" />
20
108
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
21
109
  <link
@@ -35,8 +123,8 @@
35
123
  display: none !important;
36
124
  }
37
125
  </style>
38
- <script type="module" crossorigin src="/assets/index-BgG6FFPt.js"></script>
39
- <link rel="stylesheet" crossorigin href="/assets/index-x89XINSG.css">
126
+ <script type="module" crossorigin src="/assets/index-6sS76xWj.js"></script>
127
+ <link rel="stylesheet" crossorigin href="/assets/index-DkdPbH0F.css">
40
128
  </head>
41
129
  <body class="px-4 sm:px-6 lg:px-10 2xl:px-20">
42
130
  <!--
@@ -78,6 +166,7 @@
78
166
  wire components to a shared DataProvider without framework lock-in.
79
167
  Concorde is MIT-licensed and maintained by Supersoniks for production
80
168
  stacks that need one component set across many hosts.
169
+ <a href="/about">About</a> · <a href="/privacy">Privacy</a>
81
170
  </p>
82
171
  </section>
83
172
 
package/docs/index.md CHANGED
@@ -12,11 +12,11 @@ Install the npm package [`@supersoniks/concorde`](https://www.npmjs.com/package/
12
12
  - Docs index: https://concorde.supersoniks.org/docs/index.html
13
13
  - Sitemap: https://concorde.supersoniks.org/sitemap.xml
14
14
  - Getting started: https://concorde.supersoniks.org/docs/getting-started/start
15
- - AI agents (skills): https://concorde.supersoniks.org/docs/getting-started/ai-agents
15
+ - AI agents (skill): https://concorde.supersoniks.org/docs/getting-started/ai-agents
16
16
  - Components: https://concorde.supersoniks.org/docs/getting-started/components
17
17
 
18
18
  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`).
19
19
 
20
20
  ## What Concorde includes
21
21
 
22
- 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.
22
+ 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 ([about](https://concorde.supersoniks.org/about), [privacy](https://concorde.supersoniks.org/privacy)).
@@ -273,11 +273,11 @@ No slots.
273
273
 
274
274
  - URL: https://concorde.supersoniks.org/core/components/functional/list
275
275
  - Doc ID: core/components/functional/list/list
276
- - Keywords: Concorde, supersoniks, core/components/functional/list/list, list, List, functional component, sonic-list, web component, props, fetch, items, , /list-item/, serviceURL, endPoint
276
+ - Keywords: Concorde, supersoniks, core/components/functional/list/list, list, List, functional component, sonic-list, web component, props, fetch, .items, .separator, .noItems, .skeleton, , /list-item/
277
277
 
278
278
  List
279
279
 
280
- sonic-list renders one row per entry of its props array, either set directly or loaded with fetch. From Lit, pass a row renderer on the items property; in plain HTML, declare children. Each row gets its own data provider at /list-item/ .
280
+ sonic-list renders one row per entry of its props array, either set directly or loaded with fetch. In TypeScript, prefer the .items row renderer (with .separator · .noItems · .skeleton); children are for plain HTML hosts without Lit. Each row gets its own data provider at /list-item/ .
281
281
 
282
282
  Basic example
283
283
 
@@ -285,7 +285,7 @@ Add fetch to load props from serviceURL + endPoint (or dataProvider when endPoin
285
285
 
286
286
  $time $code from $city ($airport)">
287
287
 
288
- Fetch attributes (lazyload · refetchEveryMs · headers · authentication) are shared with Fetch.
288
+ This example uses HTML templates; from Lit, use the row renderer instead. Fetch attributes (lazyload · refetchEveryMs · headers · authentication) are shared with Fetch.
289
289
 
290
290
  Row renderer
291
291
 
@@ -327,6 +327,8 @@ API reference
327
327
  | loader | fixed (when empty) · inline | Loader shown while fetching. None by default |
328
328
  | debug | boolean | Shows each row's data on hover |
329
329
 
330
+ Properties (TypeScript / Lit, preferred):
331
+
330
332
  | Property | Type | Description |
331
333
  |----------|------|-------------|
332
334
  | props | array · object | Rows to render |
@@ -336,6 +338,8 @@ API reference
336
338
  | skeleton | () => TemplateResult | Rendered while fetching |
337
339
  | itemPropertyMap | object | propertyMap passed to each row subscriber |
338
340
 
341
+ Templates (plain HTML hosts):
342
+
339
343
  | Template | Description |
340
344
  |----------|-------------|
341
345
  | | Row markup; several are used in turn |
@@ -3743,28 +3747,15 @@ API reference
3743
3747
 
3744
3748
  - URL: https://concorde.supersoniks.org/docs/decorators/bind
3745
3749
  - Doc ID: docs/decorators/bind
3746
- - Keywords: Concorde, supersoniks, docs/decorators/bind, bind, @bind, decorator, { reflect: true }, passengers.0, @state(), DataProviderKey, reflect: false, reflect: true, set(), ${index}, null
3750
+ - Keywords: Concorde, supersoniks, docs/decorators/bind, bind, @bind, decorator, @bind(key), { reflect: true }, @state(), reflect: true, set(), reflect, @subscribe, ${index}
3747
3751
 
3748
3752
  @bind
3749
3753
 
3750
- Keeps a class property in sync with a path of the DataProvider store, in both directions when needed. Pass a dot-notation string or a DataProviderKey; add { reflect: true } to push local writes back to the store. For read-only sync prefer @subscribe, and see Data flow for the overall model.
3754
+ @bind(key) keeps a class property and one path of the DataProvider store in sync. With { reflect: true } the sync goes both ways: the property follows the store, and each assignment is written back to it. For one direction only, use the complementary decorators: @subscribe to read, @publish to write. See Data flow for the overall model.
3751
3755
 
3752
3756
  Import
3753
3757
 
3754
3758
  import { bind } from "@supersoniks/concorde/decorators";
3755
-
3756
- @bind("flight.gate")
3757
- @state()
3758
- gate = "";
3759
-
3760
- Basic usage
3761
-
3762
- The first path segment is the data provider id, the rest is dot notation (array items use a numeric index: passengers.0). The property updates each time the store value changes. Add @state() so Lit re-renders.
3763
-
3764
- Typed key
3765
-
3766
- With a DataProviderKey , TypeScript checks that the property type matches T at that path.
3767
-
3768
3759
  import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
3769
3760
 
3770
3761
  type Flight = { flight: string; gate: string; boarded: number };
@@ -3774,13 +3765,25 @@ const flightKey = new DataProviderKey&lt;Flight&gt;("flight");
3774
3765
  @state()
3775
3766
  boarded = 0;
3776
3767
 
3768
+ Basic usage
3769
+
3770
+ The key is a DataProviderKey: TypeScript checks that the property type matches T at that path. The property updates each time the store value changes. Add @state() so Lit re-renders.
3771
+
3777
3772
  Reflect
3778
3773
 
3779
- By default (reflect: false) the binding is one-way: assigning the property does not touch the store. With reflect: true, each assignment calls set() on the publisher, so every other subscriber sees the new value. An internal guard prevents update loops.
3774
+ With reflect: true, each assignment to the property calls set() at the key path, so every other subscriber sees the new value. An internal guard prevents update loops. Without reflect (the default), assigning the property does not touch the store, and @bind behaves like @subscribe.
3780
3775
 
3781
3776
  Dynamic path
3782
3777
 
3783
- Placeholders such as ${index} are resolved from properties of the same component, and @bind re-subscribes when they change. Write them in a plain string, not a backtick template literal. While a placeholder is null or undefined the binding is inactive; { skipEmptyPlaceholder: true } also waits on "". Full rules: Dynamic paths.
3778
+ Placeholders such as ${index} are resolved from properties of the same component, and @bind re-subscribes when they change. Declare them in the key's second generic and write them in a plain string, not a backtick template literal. While a placeholder is null or undefined the binding is inactive; { skipEmptyPlaceholder: true } also waits on "". Full rules: Dynamic paths.
3779
+
3780
+ const personKey = new DataProviderKey&lt;Person, { dataProvider: string; index: number }&gt;(
3781
+ "${dataProvider}.${index}",
3782
+ );
3783
+
3784
+ @bind(personKey)
3785
+ @state()
3786
+ person: Person | null = null;
3784
3787
 
3785
3788
  Lifecycle
3786
3789
 
@@ -3790,7 +3793,7 @@ API reference
3790
3793
 
3791
3794
  | Argument | Type | Description |
3792
3795
  |----------|------|-------------|
3793
- | path | string or DataProviderKey | Store path to bind. Supports ${prop} placeholders |
3796
+ | key | DataProviderKey | Store path to bind. Supports ${prop} placeholders |
3794
3797
  | options.reflect | boolean (default false) | Write local assignments back to the store |
3795
3798
  | options.skipEmptyPlaceholder | boolean (default false) | Treat a placeholder resolved to "" as not ready |
3796
3799
 
@@ -4566,20 +4569,20 @@ Other ancestor attributes (serviceURL, token, …) apply as for any request: see
4566
4569
 
4567
4570
  ---
4568
4571
 
4569
- ## AI agents (skills & AGENTS.md)
4572
+ ## AI agents (skill)
4570
4573
 
4571
4574
  - URL: https://concorde.supersoniks.org/docs/getting-started/ai-agents
4572
4575
  - Doc ID: docs/getting-started/ai-agents
4573
- - Keywords: Concorde, supersoniks, docs/getting-started/ai-agents, ai-agents, AI agents (skills & AGENTS.md), guide, AGENTS.md, yarn ai:sync, ai-init, yarn add @supersoniks/concorde, |
4574
- | Concorde repo (contributors) | , --skip-agents, --merge-agents, --force-agents
4576
+ - Keywords: Concorde, supersoniks, docs/getting-started/ai-agents, ai-agents, AI agents (skill), guide, concorde, AGENTS.md, yarn ai:sync, ai-init, yarn add @supersoniks/concorde, |
4577
+ | Concorde repo (contributors) | , SKILL.md, custom-elements.json, rules/
4575
4578
 
4576
- AI agents (skills & AGENTS.md)
4579
+ AI agents (skill)
4577
4580
 
4578
- 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).
4581
+ Concorde ships one Agent Skill, concorde, so coding agents follow the framework patterns. Cursor, Claude Code, JetBrains Junie and other agents load it on their own when they work on Concorde code; there is nothing to add to your AGENTS.md.
4579
4582
 
4580
- On a starter project, run yarn ai:sync after install. On an existing project, install Concorde first, then use ai-init below.
4583
+ On a starter project, run yarn ai:sync after install. On an existing project, install Concorde first, then run ai-init.
4581
4584
 
4582
- Dedicated commands
4585
+ Commands
4583
4586
 
4584
4587
  | Context | Command |
4585
4588
  |---------|---------|
@@ -4587,61 +4590,42 @@ Dedicated commands
4587
4590
  | Any consumer app (after yarn add @supersoniks/concorde) | node nodemodules/@supersoniks/concorde/scripts/ai-init.mjs |
4588
4591
  | Concorde repo (contributors) | yarn ai-init |
4589
4592
 
4590
- Starter (from project root)
4591
- yarn ai:sync
4593
+ Re-run the same command after each Concorde upgrade to refresh the skill.
4592
4594
 
4593
- Manual / existing project
4594
- node nodemodules/@supersoniks/concorde/scripts/ai-init.mjs
4595
+ The skill
4595
4596
 
4596
- Useful flags
4597
+ SKILL.md is the entry point: where to find the truth (the project, these docs, custom-elements.json), the critical rules and the imports. Details live in rules/ files that the agent reads only for the topic at hand.
4597
4598
 
4598
- | Flag | Effect |
4599
- |------|--------|
4600
- | --skip-agents | Never write AGENTS.md (skills / rules only) |
4601
- | --merge-agents | Opt-in: keep the project preamble and append / refresh the Concorde block |
4602
- | --force-agents | Opt-in: replace the whole AGENTS.md (destructive) |
4603
- | --overlay | Extra rules/skills + optional AGENTS.concorde.md for project-only Concorde agent notes |
4604
- | --cursor-only | Install only .cursor/skills and .cursor/rules |
4605
- | --jetbrains-only | Install only .aiassistant/rules/ |
4599
+ | File | Topic |
4600
+ |------|-------|
4601
+ | SKILL.md | Sources, critical rules, component shape, imports |
4602
+ | rules/data.md | Store, DataProviderKey, @subscribe / @publish / @bind / @handle, sub(), get / set / dp |
4603
+ | rules/http.md | Endpoint, @get / @post, API configuration |
4604
+ | rules/lists-forms.md | sonic-list / sonic-queue, form fields |
4605
+ | rules/styling.md | Theme, tokens, classes, styling rules |
4606
+ | rules/composition.md | Parts of compound components, built-in states |
4607
+ | rules/troubleshooting.md | Symptom → cause → fix: values not updating, requests not sent, empty lists |
4606
4608
 
4607
- AGENTS.md policy (non-invasive)
4609
+ What gets installed
4608
4610
 
4609
- | Situation | Default |
4610
- |-----------|---------|
4611
- | No AGENTS.md | Create the Concorde guide |
4612
- | File with | Refresh the managed zone only |
4613
- | File without marker (project notes) | Left untouched — skills / rules are enough |
4614
- | --merge-agents / --force-agents / --skip-agents | See flags above |
4611
+ | Path | Role |
4612
+ |------|------|
4613
+ | .agents/skills/concorde/ | The skill (read directly by Cursor) |
4614
+ | .claude/skills/concorde | Symlink for Claude Code |
4615
+ | .junie/skills/concorde | Symlink for JetBrains Junie |
4615
4616
 
4616
- [optional project preamble — short, project-only]
4617
+ Where symlinks are not allowed (some Windows setups), the skill is copied instead. Your own skills in these folders are never touched. Commit .agents/ and the links if your team shares agent settings.
4617
4618
 
4618
- [--- + overlay AGENTS.concorde.md]
4619
+ AGENTS.md stays yours: ai-init never reads or writes it.
4619
4620
 
4620
- Everything after 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.
4621
+ Flags
4621
4622
 
4622
- What gets installed
4623
+ | Flag | Effect |
4624
+ |------|--------|
4625
+ | --no-links | Install .agents/skills only, without the .claude / .junie links |
4626
+ | --overlay | Also install the skills found in /skills/ (project kit) |
4623
4627
 
4624
- | Path | Role |
4625
- |------|------|
4626
- | AGENTS.md | Created only if missing; existing project-owned files are left alone unless --merge-agents / --force-agents |
4627
- | .cursor/skills/concorde/ | Core Lit + DataProvider patterns |
4628
- | .cursor/skills/concorde-imports/ | Short @supersoniks/concorde/… import paths |
4629
- | .cursor/skills/concorde-scope/ | serviceURL, formDataProvider, API configuration |
4630
- | .cursor/skills/concorde-theme/ | sonic-theme and --sc- tokens |
4631
- | .cursor/skills/concorde-menu/ | sonic-menu navigation |
4632
- | .cursor/skills/concorde-get-set-dp/ | get / set / dp and DataProviderKey migration |
4633
- | .cursor/rules/concorde.mdc | Cursor rules (always-on patterns) |
4634
- | .aiassistant/rules/concorde.md | JetBrains AI Assistant rules |
4635
-
4636
- Workflow
4637
-
4638
- 1. Starter project: Installation — yarn ai:sync is wired in the kit.
4639
- 2. Existing project: run ai-init after yarn add @supersoniks/concorde.
4640
- 3. Commit .cursor/ and .aiassistant/ (and AGENTS.md only if you opted in / it was created) if your team shares agent settings.
4641
- 4. Re-run the same command when you bump @supersoniks/concorde to refresh skills from nodemodules/@supersoniks/concorde/ai/.
4642
- 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).
4643
-
4644
- Source files in the npm package: nodemodules/@supersoniks/concorde/ai/ (see also ai/README.md in the Concorde repository).
4628
+ Source files in the npm package: nodemodules/@supersoniks/concorde/ai/skills/concorde/.
4645
4629
 
4646
4630
  ---
4647
4631
 
@@ -4802,7 +4786,7 @@ Quick map
4802
4786
  | Derived / aggregate (JSONata) | derive() or sonic-jsonata — Jsonata |
4803
4787
  | Offline doc demos | serviceURL="/docs-mock-api" — Local API demos |
4804
4788
 
4805
- Skill: concorde-get-set-dp in the package ai/ folder.
4789
+ Agent skill: concorde (rules/data.md), see AI agents.
4806
4790
 
4807
4791
  DataProviderKey
4808
4792
 
package/docs/llms.txt CHANGED
@@ -13,8 +13,10 @@
13
13
  - [Sitemap](https://concorde.supersoniks.org/sitemap.xml)
14
14
  - [npm package @supersoniks/concorde](https://www.npmjs.com/package/@supersoniks/concorde)
15
15
  - [Getting started](https://concorde.supersoniks.org/docs/getting-started/start)
16
- - [AI agents (skills)](https://concorde.supersoniks.org/docs/getting-started/ai-agents)
16
+ - [AI agents (skill)](https://concorde.supersoniks.org/docs/getting-started/ai-agents)
17
17
  - [Components index](https://concorde.supersoniks.org/docs/getting-started/components)
18
+ - [custom-elements.json](https://concorde.supersoniks.org/custom-elements.json) — Custom Elements Manifest: attributes, properties, events and slots of every `sonic-*` element
19
+ - [About](https://concorde.supersoniks.org/about) · [Privacy](https://concorde.supersoniks.org/privacy)
18
20
 
19
21
  Doc pages use the same pathnames as the interactive site (`/docs/…`, `/core/…`).
20
22
  Markdown: same URL with `.md` (e.g. `/docs/getting-started/start.md`), or `Accept: text/markdown` on the pathname.
@@ -32,7 +34,7 @@ HTML crawlers receive a static HTML variant of the same URL.
32
34
  - [Fetch](https://concorde.supersoniks.org/core/components/functional/fetch) (core/components/functional/fetch/fetch): sonic-fetch sends a GET request to serviceURL + endPoint and publishes the response under dataProvider, so its children and any subscriber of that provider can render it. In a Lit component, prefer th
33
35
  - [If](https://concorde.supersoniks.org/core/components/functional/if) (core/components/functional/if/if): sonic-if renders its default slot only while condition is true. Use it to show or hide a block from reactive state; with no condition, the content is not rendered. The host uses display: contents, so
34
36
  - [Jsonata](https://concorde.supersoniks.org/core/components/functional/jsonata) (core/components/functional/jsonata/jsonata): sonic-jsonata reads one data provider, evaluates a JSONata expression on it and writes the result to another data provider. Use it for read-only aggregates such as groups, rankings and totals; use Mix
35
- - [List](https://concorde.supersoniks.org/core/components/functional/list) (core/components/functional/list/list): sonic-list renders one row per entry of its props array, either set directly or loaded with fetch. From Lit, pass a row renderer on the items property; in plain HTML, declare <template> children. Each
37
+ - [List](https://concorde.supersoniks.org/core/components/functional/list) (core/components/functional/list/list): sonic-list renders one row per entry of its props array, either set directly or loaded with fetch. In TypeScript, prefer the .items row renderer (with .separator · .noItems · .skeleton); <template> ch
36
38
  - [Mix](https://concorde.supersoniks.org/core/components/functional/mix) (core/components/functional/mix/mix): sonic-mix builds a new data provider from parts of other ones. Each key of composition maps to a source data provider id, with an optional dot path to a sub-value. The mixed provider is named by the d
37
39
  - [Queue](https://concorde.supersoniks.org/core/components/functional/queue) (core/components/functional/queue/queue): sonic-queue loads a paginated API in batches and renders each batch as an internal List. Choose it over sonic-list for long or endless lists; the key attributes are dataProviderExpression · limit · da
38
40
  - [Router](https://concorde.supersoniks.org/core/components/functional/router) (core/components/functional/router/router): sonic-router watches the location (pathname + hash) and renders the views whose route matches. From Lit, pass a .routes map of path patterns to render functions; use sonic-redirect to navigate when a
@@ -74,7 +76,7 @@ HTML crawlers receive a static HTML variant of the same URL.
74
76
  - [Tooltip](https://concorde.supersoniks.org/core/components/ui/tooltip) (core/components/ui/tooltip/tooltip): sonic-tooltip shows a short label in a bubble when the trigger in the default slot is hovered or receives focus. With no placement, the bubble sits on top, centered. An empty label hides the bubble, l
75
77
  - [@ancestorAttribute](https://concorde.supersoniks.org/docs/decorators/ancestor-attribute) (docs/decorators/ancestor-attribute): Copies the value of an attribute from the nearest element that carries it (the host itself, then its ancestors, across shadow roots) into a class property. Use it to pick up a scope such as dataProvid
76
78
  - [@autoSubscribe](https://concorde.supersoniks.org/docs/decorators/auto-subscribe) (docs/decorators/auto-subscribe): Legacy decorator that re-runs a method whenever one of the store values it reads is assigned. For new code, prefer @subscribe with a DataProviderKey: dependencies are explicit and typed.
77
- - [@bind](https://concorde.supersoniks.org/docs/decorators/bind) (docs/decorators/bind): Keeps a class property in sync with a path of the DataProvider store, in both directions when needed. Pass a dot-notation string or a DataProviderKey; add { reflect: true } to push local writes back t
79
+ - [@bind](https://concorde.supersoniks.org/docs/decorators/bind) (docs/decorators/bind): @bind(key) keeps a class property and one path of the DataProvider store in sync. With { reflect: true } the sync goes both ways: the property follows the store, and each assignment is written back to
78
80
  - [@get](https://concorde.supersoniks.org/docs/decorators/get) (docs/decorators/get): @get(endpoint) runs an HTTP GET on an Endpoint and stores the full ApiResult<T> in a property, or passes it to a method. It runs again when the endpoint's placeholders or the API configuration change,
79
81
  - [@handle](https://concorde.supersoniks.org/docs/decorators/handle) (docs/decorators/handle): @handle(...keys) calls the decorated method each time a publisher assigns one of up to three store paths, with one typed argument per key. Nothing is stored on the component: use it for derived values
80
82
  - [@onAssign](https://concorde.supersoniks.org/docs/decorators/on-assign) (docs/decorators/on-assign): Legacy decorator that calls a method with the values at one or more string paths of the store, once all of them are defined. For new code, use @handle with { waitForAllDefined: true }: same behaviour,
@@ -86,7 +88,7 @@ HTML crawlers receive a static HTML variant of the same URL.
86
88
  - [@awaitConnectedAncestors](https://concorde.supersoniks.org/docs/decorators/wait-for-ancestors) (docs/decorators/wait-for-ancestors): Delays a component's connectedCallback until its matching ancestors are defined and connected, so context they set up (a dataProvider, a publisher, a fetched payload) is ready when the child starts. P
87
89
  - [sub()](https://concorde.supersoniks.org/docs/directives/sub) (docs/directives/sub): sub(path) is a Lit directive that renders the current value of a store path and updates in place on every assignment. Use it inside html templates for read-only display; in a decorator, the same path
88
90
  - [t()](https://concorde.supersoniks.org/docs/directives/t) (docs/directives/t): Lit directive that renders a translated label by key. Keys are batched into one GET to the endpoint set by the nearest wordingProvider ancestor attribute, and results are cached in localStorage.
89
- - [AI agents (skills & AGENTS.md)](https://concorde.supersoniks.org/docs/getting-started/ai-agents) (docs/getting-started/ai-agents): 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, migratio
91
+ - [AI agents (skill)](https://concorde.supersoniks.org/docs/getting-started/ai-agents) (docs/getting-started/ai-agents): Concorde ships one Agent Skill, concorde, so coding agents follow the framework patterns. Cursor, Claude Code, JetBrains Junie and other agents load it on their own when they work on Concorde code; th
90
92
  - [Components](https://concorde.supersoniks.org/docs/getting-started/components) (docs/getting-started/components): Every Concorde web component, grouped like the sidebar. Pick one to see its live demos, attributes and import path.
91
93
  - [Creating components](https://concorde.supersoniks.org/docs/getting-started/create-a-component) (docs/getting-started/create-a-component): > New app components: start with My first component and Data flow. The Subscriber mixin below is legacy.
92
94
  - [Data flow](https://concorde.supersoniks.org/docs/getting-started/dataFlow) (docs/getting-started/dataFlow): Recommended patterns for new Concorde apps (Lit + TypeScript). Under the hood, data lives in a DataProvider store.
@@ -0,0 +1,122 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="./svg/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Privacy notice — Concorde by Supersoniks</title>
8
+ <meta name="description" content="Privacy notice of the Concorde documentation site: no cookies, no analytics, third-party hosts and your GDPR rights." />
9
+ <meta
10
+ name="keywords"
11
+ content="Concorde, Supersoniks, web components, Lit, design system, @supersoniks/concorde, DataProvider, sonic-button"
12
+ />
13
+ <link rel="canonical" href="https://concorde.supersoniks.org/privacy" />
14
+ <link rel="alternate" type="text/markdown" href="/privacy.md" title="Markdown" />
15
+ <link rel="alternate" type="text/plain" href="/llms.txt" title="llms.txt" />
16
+ <meta property="og:type" content="website" />
17
+ <meta property="og:site_name" content="Concorde by Supersoniks" />
18
+ <meta property="og:title" content="Privacy notice — Concorde by Supersoniks" />
19
+ <meta property="og:description" content="Privacy notice of the Concorde documentation site: no cookies, no analytics, third-party hosts and your GDPR rights." />
20
+ <meta property="og:url" content="https://concorde.supersoniks.org/privacy" />
21
+ <meta property="og:image" content="https://concorde.supersoniks.org/img/og-concorde.jpg" />
22
+ <meta property="og:image:width" content="1200" />
23
+ <meta property="og:image:height" content="630" />
24
+ <meta property="og:image:alt" content="Five Concorde aircraft parked nose to nose, black and white photo" />
25
+ <meta name="twitter:card" content="summary_large_image" />
26
+ <script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Privacy notice — Concorde by Supersoniks","description":"Privacy notice of the Concorde documentation site: no cookies, no analytics, third-party hosts and your GDPR rights.","url":"https://concorde.supersoniks.org/privacy","isPartOf":{"@type":"WebSite","name":"Concorde","url":"https://concorde.supersoniks.org/"},"publisher":{"@type":"Organization","@id":"https://supersoniks.com/#organization","name":"Supersoniks","legalName":"SUPERSONIKS","url":"https://supersoniks.com/","telephone":"+33 2 47 68 93 25","address":{"@type":"PostalAddress","streetAddress":"22 rue du Docteur Bretonneau","postalCode":"37000","addressLocality":"Tours","addressCountry":"FR"},"contactPoint":{"@type":"ContactPoint","contactType":"customer service","telephone":"+33 2 47 68 93 25","url":"https://supersoniks.com/un-projet","availableLanguage":["fr","en"]},"sameAs":["https://www.linkedin.com/company/supersoniks/","https://www.facebook.com/supersoniks","https://www.instagram.com/agencesupersoniks/"]}}</script>
27
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
28
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
29
+ <link
30
+ href="https://fonts.googleapis.com/css2?family=Schibsted+Grotesk:wght@400;600;800&display=swap"
31
+ rel="stylesheet"
32
+ />
33
+ <script src="https://cdn.jsdelivr.net/npm/fuzzysort@2.0.1/fuzzysort.min.js"></script>
34
+ <!-- <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
35
+ -->
36
+ <script src="https://cdn.jsdelivr.net/npm/marked@13.0.3"></script>
37
+ <style>
38
+ /*
39
+ Crawler/agent fallback stays in the HTML source (Is Agentic raw-text check)
40
+ but must not take clicks or layout away from the interactive homepage.
41
+ */
42
+ #docs-agent-content {
43
+ display: none !important;
44
+ }
45
+ </style>
46
+ <script type="module" crossorigin src="/assets/index-6sS76xWj.js"></script>
47
+ <link rel="stylesheet" crossorigin href="/assets/index-DkdPbH0F.css">
48
+ </head>
49
+ <body class="px-4 sm:px-6 lg:px-10 2xl:px-20">
50
+ <!--
51
+ Static homepage copy for agents and no-JS crawlers (Is Agentic / Ora).
52
+ Hidden after JS boot; must stay in raw HTML with a clear H1 and 500+ chars.
53
+ -->
54
+ <section id="docs-agent-content" aria-hidden="true">
55
+ <h1 id="privacy-notice">Privacy notice</h1>
56
+ <p>This notice covers the Concorde documentation site, <a href="https://concorde.supersoniks.org">https://concorde.supersoniks.org</a>, published by <a href="https://supersoniks.com/">Supersoniks</a>, 22 rue du Docteur Bretonneau, 37000 Tours, France.</p>
57
+ <h2 id="what-this-site-does-not-do">What this site does not do</h2>
58
+ <ul>
59
+ <li>It has no user accounts, sign-up or login.</li>
60
+ <li>It sets no cookies and runs no analytics, advertising or tracking scripts.</li>
61
+ <li>It has no forms that send personal data to Supersoniks.</li>
62
+ </ul>
63
+ <h2 id="what-is-stored-in-your-browser">What is stored in your browser</h2>
64
+ <ul>
65
+ <li><code>sonicTheme</code> in localStorage remembers your light or dark theme choice. It never leaves your browser.</li>
66
+ <li>A service worker serves the mock API used by live examples (<code>/docs-mock-api/…</code>). It runs locally in your browser.</li>
67
+ <li>Some examples demonstrate features that store values in localStorage (for example dismissed alerts or cached labels). They only run when you open those pages.</li>
68
+ </ul>
69
+ <h2 id="third-party-services">Third-party services</h2>
70
+ <p>To display pages, your browser loads files from these providers, which receive your IP address and browser details as part of any web request:</p>
71
+ <ul>
72
+ <li>Google Fonts (fonts.googleapis.com, fonts.gstatic.com) for the Schibsted Grotesk font.</li>
73
+ <li>jsDelivr (cdn.jsdelivr.net) for the search and Markdown libraries.</li>
74
+ <li>cdn.supersoniks.com for icons.</li>
75
+ <li>A few live examples call public demo APIs (geo.api.gouv.fr, reqres.in, i.pravatar.cc) when you open them.</li>
76
+ </ul>
77
+ <h2 id="server-logs">Server logs</h2>
78
+ <p>Like any web server, the host records technical request data (IP address, URL, date, user agent) to operate and secure the site.</p>
79
+ <h2 id="your-rights">Your rights</h2>
80
+ <p>Under the GDPR you can ask for access to, correction or deletion of data about you. Contact Supersoniks through <a href="https://supersoniks.com/un-projet">supersoniks.com/un-projet</a>, by phone at +33 2 47 68 93 25, or by mail at 22 rue du Docteur Bretonneau, 37000 Tours, France. See also the <a href="https://supersoniks.com/politique-de-confidentialite">Supersoniks privacy policy</a> and <a href="https://supersoniks.com/mentions-legales">legal notice</a>.</p>
81
+
82
+ </section>
83
+
84
+ <sonic-theme
85
+ customIconLibraryPath="https://cdn.supersoniks.com/concorde/icons/fontawesome/v6/$prefix/$name.svg"
86
+ customIconDefaultPrefix="regular"
87
+ markdownsURL=""
88
+ >
89
+ <sonic-docs-header></sonic-docs-header>
90
+ <sonic-router>
91
+ <!-- Home only at `/` (doc pages use pathname `/docs/...` or `/core/...`). -->
92
+ <template data-route="^/?$">
93
+ <docs-home></docs-home>
94
+ </template>
95
+ </sonic-router>
96
+
97
+ <div
98
+ class="[[data-home]_&]:hidden grid grid-cols-1 lg:grid-cols-[14rem_minmax(0,1fr)] xl:grid-cols-[15rem_minmax(0,1fr)_13rem] gap-8 xl:gap-12"
99
+ >
100
+ <aside class="hidden lg:block">
101
+ <docs-navigation
102
+ class="sticky top-[4.2rem] max-h-[calc(100svh_-_4.2rem)] block overflow-auto py-4 custom-scroll"
103
+ ></docs-navigation>
104
+ </aside>
105
+ <main class="min-w-0 min-h-[100svh] pt-3">
106
+ <div class="max-w-prose mx-auto xl:mx-0">
107
+ <docs-page
108
+ noShadowDom
109
+ class="prose max-w-none block py-8 prose-li:my-[.2em] leading-[1.5] lg:leading-[1.5] prose-h1:text-[2.4em] sm:prose-h1:text-[3.25em] prose-code:before:content-none prose-code:after:content-none prose-pre:font-mono"
110
+ ></docs-page>
111
+ <docs-pager class="block mt-8 pb-16"></docs-pager>
112
+ </div>
113
+ </main>
114
+ <aside class="hidden xl:block">
115
+ <docs-toc
116
+ class="sticky top-[4.2rem] max-h-[calc(100svh_-_4.2rem)] block overflow-auto py-4 custom-scroll"
117
+ ></docs-toc>
118
+ </aside>
119
+ </div>
120
+ </sonic-theme>
121
+ </body>
122
+ </html>
@@ -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).