@supersoniks/concorde 4.6.0 → 4.7.0
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.
- package/.gitlab-ci.yml +23 -0
- package/README.md +106 -55
- package/ai/AGENTS.md +52 -0
- package/ai/README.md +30 -0
- package/ai/cursor/rules/concorde-menu.mdc +15 -0
- package/ai/cursor/rules/concorde-scope.mdc +14 -0
- package/ai/cursor/rules/concorde-theme.mdc +13 -0
- package/ai/cursor/rules/concorde.mdc +49 -0
- package/ai/jetbrains/rules/concorde.md +39 -0
- package/ai/skills/concorde/SKILL.md +220 -0
- package/ai/skills/concorde-get-set-dp/SKILL.md +194 -0
- package/ai/skills/concorde-imports/SKILL.md +78 -0
- package/ai/skills/concorde-menu/SKILL.md +74 -0
- package/ai/skills/concorde-scope/SKILL.md +70 -0
- package/ai/skills/concorde-theme/SKILL.md +46 -0
- package/build-infos.json +1 -1
- package/concorde-core.bundle.js +127 -127
- package/concorde-core.es.js +1435 -1364
- package/dist/altcha-widget.js +2662 -0
- package/dist/concorde-core.bundle.js +127 -127
- package/dist/concorde-core.es.js +1435 -1364
- package/dist/docs-mock-api-sw.js +589 -0
- package/dist/docs-mock-api-sw.js.map +7 -0
- package/docs/altcha-widget.js +2662 -0
- package/docs/assets/index-D9pxaQYK.js +7508 -0
- package/docs/assets/index-t0-i22oI.css +1 -0
- package/docs/docs-mock-api-sw.js +589 -0
- package/docs/docs-mock-api-sw.js.map +7 -0
- package/docs/index.html +2 -2
- package/docs/src/core/components/functional/fetch/fetch.md +13 -11
- package/docs/src/core/components/functional/if/if.md +4 -11
- package/docs/src/core/components/functional/list/list.md +60 -194
- package/docs/src/core/components/functional/queue/queue.md +70 -85
- package/docs/src/core/components/functional/router/router.md +62 -97
- package/docs/src/core/components/functional/states/states.md +2 -2
- package/docs/src/core/components/functional/submit/submit.md +86 -55
- package/docs/src/core/components/ui/captcha/captcha.md +2 -2
- package/docs/src/core/components/ui/card/card.md +1 -1
- package/docs/src/core/components/ui/form/checkbox/checkbox.md +5 -32
- package/docs/src/core/components/ui/form/input/input.md +5 -30
- package/docs/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +6 -4
- package/docs/src/core/components/ui/form/radio/radio.md +5 -32
- package/docs/src/core/components/ui/form/select/select.md +5 -31
- package/docs/src/core/components/ui/form/switch/switch.md +5 -32
- package/docs/src/core/components/ui/loader/loader.md +1 -13
- package/docs/src/core/components/ui/table/table.md +3 -3
- package/docs/src/docs/_core-concept/dataFlow.md +73 -0
- package/docs/src/docs/_core-concept/subscriber.md +9 -10
- package/docs/src/docs/_decorators/ancestor-attribute.md +4 -3
- package/docs/src/docs/_decorators/auto-subscribe.md +19 -16
- package/docs/src/docs/_decorators/bind.md +20 -17
- package/docs/src/docs/_decorators/get.md +7 -4
- package/docs/src/docs/_decorators/handle.md +171 -0
- package/docs/src/docs/_decorators/on-assign.md +99 -73
- package/docs/src/docs/_decorators/publish.md +2 -1
- package/docs/src/docs/_decorators/subscribe.md +70 -9
- package/docs/src/docs/_decorators/wait-for-ancestors.md +13 -10
- package/docs/src/docs/_directives/sub.md +91 -0
- package/docs/src/docs/_getting-started/ai-agents.md +56 -0
- package/docs/src/docs/_getting-started/concorde-manual-install.md +133 -0
- package/docs/src/docs/_getting-started/concorde-outside.md +13 -123
- package/docs/src/docs/_getting-started/create-a-component.md +2 -0
- package/docs/src/docs/_getting-started/my-first-component.md +236 -0
- package/docs/src/docs/_getting-started/my-first-subscriber.md +29 -83
- package/docs/src/docs/_getting-started/pubsub.md +21 -134
- package/docs/src/docs/_getting-started/start.md +26 -18
- package/docs/src/docs/_misc/api-configuration.md +79 -0
- package/docs/src/docs/_misc/dataProviderKey.md +38 -5
- package/docs/src/docs/_misc/docs-mock-api.md +60 -0
- package/docs/src/docs/_misc/endpoint.md +2 -1
- package/docs/src/docs/_misc/html-integration.md +13 -0
- package/docs/src/docs/search/docs-search.json +4163 -873
- package/docs/src/tsconfig.json +380 -317
- package/gitlab/job_tests.sh +55 -0
- package/package.json +34 -3
- package/public/altcha-widget.js +2662 -0
- package/public/docs-mock-api-sw.js +589 -0
- package/public/docs-mock-api-sw.js.map +7 -0
- package/scripts/ai-init.mjs +167 -0
- package/scripts/docs-mock-api-vite-plugin.ts +116 -0
- package/scripts/docs-open-in-editor-plugin.ts +130 -0
- package/scripts/pre-publish.mjs +2 -1
- package/src/core/components/functional/example/example.ts +1 -1
- package/src/core/components/functional/fetch/fetch.md +13 -11
- package/src/core/components/functional/if/if.md +4 -11
- package/src/core/components/functional/list/list.demo.ts +4 -4
- package/src/core/components/functional/list/list.md +60 -194
- package/src/core/components/functional/list/list.ts +8 -7
- package/src/core/components/functional/queue/queue.demo.ts +1 -1
- package/src/core/components/functional/queue/queue.md +70 -85
- package/src/core/components/functional/queue/queue.ts +4 -4
- package/src/core/components/functional/router/router.md +62 -97
- package/src/core/components/functional/router/router.ts +1 -1
- package/src/core/components/functional/states/states.md +2 -2
- package/src/core/components/functional/submit/submit.md +86 -55
- package/src/core/components/functional/submit/submit.ts +10 -3
- package/src/core/components/ui/captcha/captcha.md +2 -2
- package/src/core/components/ui/card/card.md +1 -1
- package/src/core/components/ui/form/checkbox/checkbox.md +5 -32
- package/src/core/components/ui/form/input/input.md +5 -30
- package/src/core/components/ui/form/input-autocomplete/input-autocomplete.md +6 -4
- package/src/core/components/ui/form/radio/radio.md +5 -32
- package/src/core/components/ui/form/select/select.md +5 -31
- package/src/core/components/ui/form/switch/switch.md +5 -32
- package/src/core/components/ui/loader/loader.md +1 -13
- package/src/core/components/ui/table/table.md +3 -3
- package/src/core/directives/DataProvider.sub.spec.ts +96 -0
- package/src/core/directives/DataProvider.ts +109 -40
- package/src/core/utils/PublisherProxy.ts +33 -18
- package/src/core/utils/dataProviderKey.ts +23 -0
- package/src/core/utils/publisherPathKey.spec.ts +58 -0
- package/src/docs/_core-concept/dataFlow.md +73 -0
- package/src/docs/_core-concept/subscriber.md +9 -10
- package/src/docs/_decorators/ancestor-attribute.md +4 -3
- package/src/docs/_decorators/auto-subscribe.md +19 -16
- package/src/docs/_decorators/bind.md +19 -16
- package/src/docs/_decorators/get.md +7 -4
- package/src/docs/_decorators/handle.md +15 -13
- package/src/docs/_decorators/on-assign.md +53 -53
- package/src/docs/_decorators/publish.md +2 -1
- package/src/docs/_decorators/subscribe.md +70 -9
- package/src/docs/_decorators/wait-for-ancestors.md +13 -10
- package/src/docs/_directives/sub.md +91 -0
- package/src/docs/_getting-started/ai-agents.md +56 -0
- package/src/docs/_getting-started/concorde-manual-install.md +133 -0
- package/src/docs/_getting-started/concorde-outside.md +13 -123
- package/src/docs/_getting-started/create-a-component.md +2 -0
- package/src/docs/_getting-started/my-first-component.md +236 -0
- package/src/docs/_getting-started/my-first-subscriber.md +29 -83
- package/src/docs/_getting-started/pubsub.md +21 -134
- package/src/docs/_getting-started/start.md +26 -18
- package/src/docs/_misc/api-configuration.md +79 -0
- package/src/docs/_misc/dataProviderKey.md +34 -1
- package/src/docs/_misc/docs-mock-api.md +60 -0
- package/src/docs/_misc/endpoint.md +2 -1
- package/src/docs/_misc/html-integration.md +13 -0
- package/src/docs/code.ts +58 -12
- package/src/docs/components/docs-demo-sources.ts +397 -0
- package/src/docs/components/docs-lit-demo-raw.ts +28 -0
- package/src/docs/components/docs-lit-demo.ts +166 -0
- package/src/docs/components/docs-source-link.ts +72 -0
- package/src/docs/docs-location.ts +54 -0
- package/src/docs/docs.ts +12 -0
- package/src/docs/example/decorators-demo-bind-demos.ts +41 -46
- package/src/docs/example/decorators-demo-geo.ts +16 -11
- package/src/docs/example/decorators-demo-init.ts +2 -228
- package/src/docs/example/decorators-demo-subscribe-publish-get-demos.ts +54 -14
- package/src/docs/example/decorators-demo.ts +71 -70
- package/src/docs/example/docs-api-config-demos.ts +234 -0
- package/src/docs/example/docs-joke-demos.ts +297 -0
- package/src/docs/example/docs-list-demos.ts +179 -0
- package/src/docs/example/docs-provider-keys.ts +315 -0
- package/src/docs/example/docs-queue-demos.ts +114 -0
- package/src/docs/example/docs-router-demos.ts +89 -0
- package/src/docs/example/docs-submit-demos.ts +455 -0
- package/src/docs/example/docs-toggle-demos.ts +73 -0
- package/src/docs/example/docs-user-two-scopes.ts +37 -0
- package/src/docs/example/docs-users-list.ts +71 -0
- package/src/docs/example/users.ts +41 -24
- package/src/docs/mock-api/api-config-mock.ts +152 -0
- package/src/docs/mock-api/fixtures.ts +377 -0
- package/src/docs/mock-api/register.ts +25 -0
- package/src/docs/mock-api/router.ts +234 -0
- package/src/docs/mock-api/service-worker.ts +23 -0
- package/src/docs/mock-api/urls.ts +11 -0
- package/src/docs/navigation/navigation.ts +39 -7
- package/src/docs/search/docs-search.json +4021 -936
- package/src/docs/search/markdown-renderer.ts +7 -3
- package/src/docs/search/page.ts +11 -14
- package/src/docs/search/sonic-code-markdown.spec.ts +29 -0
- package/src/docs/search/sonic-code-markdown.ts +28 -0
- package/src/docs.ts +4 -0
- package/src/tsconfig.json +87 -0
- package/src/tsconfig.tsbuildinfo +1 -1
- package/vite.config.mts +8 -0
- package/docs/assets/index-CaysOMFz.js +0 -5046
- package/docs/assets/index-D8mGoXzF.css +0 -1
- package/docs/src/docs/_misc/templates-demo.md +0 -19
- package/src/docs/_misc/templates-demo.md +0 -19
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concorde-get-set-dp
|
|
3
|
+
description: >-
|
|
4
|
+
Migration et usage de get/set/dp avec DataProviderKey statique.
|
|
5
|
+
Rejet des placeholders ${} par resolveStaticPublisherPath ; sub() et
|
|
6
|
+
décorateurs pour le dynamique.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Concorde — get / set / dp (chemins statiques)
|
|
10
|
+
|
|
11
|
+
Skill de **migration** vers Concorde ≥ 4.6 avec `resolveStaticPublisherPath`.
|
|
12
|
+
À activer quand un projet monte de version ou refactorise vers `DataProviderKey`.
|
|
13
|
+
|
|
14
|
+
Référence framework : skill **`concorde`**, doc `src/docs/_misc/dataProviderKey.md`.
|
|
15
|
+
|
|
16
|
+
## Quand utiliser cette skill
|
|
17
|
+
|
|
18
|
+
- Monter `@supersoniks/concorde` avec garde statique sur `get` / `set` / `dp`.
|
|
19
|
+
- Auditer un codebase TypeScript existant avant/après upgrade.
|
|
20
|
+
- Distinguer **chemin évalué en JS** vs **placeholder Concorde** `${prop}` / `{$prop}`.
|
|
21
|
+
- Choisir entre API programmatique (`get/set/dp`) et réactivité (`sub`, décorateurs).
|
|
22
|
+
|
|
23
|
+
## Règle de rejet (runtime)
|
|
24
|
+
|
|
25
|
+
`resolveStaticPublisherPath` lève une erreur si la string passée à `get`, `set` ou `dp` contient **`${`** ou **`{$`** :
|
|
26
|
+
|
|
27
|
+
| Appel | Résultat |
|
|
28
|
+
|-------|----------|
|
|
29
|
+
| `dp(new DataProviderKey("users.${userIndex}"))` | **throw** |
|
|
30
|
+
| `get("users.${userIndex}")` | **throw** |
|
|
31
|
+
| `dp(staticKey.path)` si `.path` contient `${` | **throw** |
|
|
32
|
+
|
|
33
|
+
**OK** — le chemin est résolu **avant** l'appel (pas de placeholder littéral) :
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
set(`app.pages.${index}.isComplete`, true); // → "app.pages.2.isComplete"
|
|
37
|
+
dp(`${this.formDataProvider}/fieldName`); // → "checkoutForm/email"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Faux positif fréquent** : grep `${` dans les sources TS ne suffit pas — vérifier la **valeur runtime** passée à `get/set/dp`.
|
|
41
|
+
|
|
42
|
+
## Rétrocompatibilité
|
|
43
|
+
|
|
44
|
+
| Avant | Après (recommandé) | Statut |
|
|
45
|
+
|-------|-------------------|--------|
|
|
46
|
+
| `dp(key.path)` | `dp(key)` | Équivalent si clé statique |
|
|
47
|
+
| `set(key.path, v)` | `set(key, v)` | Équivalent |
|
|
48
|
+
| `get("myCounter.count")` | `get(key.count)` | Typage amélioré |
|
|
49
|
+
| `key.path` dans attribut HTML | Inchangé | Toujours valide |
|
|
50
|
+
| `@onAssign(key.path)` | `@handle(key.leaf)` | Migration parallèle (skill `concorde`) |
|
|
51
|
+
|
|
52
|
+
Aucune rupture pour le code qui passait déjà des **strings résolues** ou des clés **statiques**.
|
|
53
|
+
|
|
54
|
+
## Trois niveaux d'accès DataProvider
|
|
55
|
+
|
|
56
|
+
| Mécanisme | Contexte | Dynamique |
|
|
57
|
+
|-----------|----------|-----------|
|
|
58
|
+
| **`get` / `set` / `dp`** | Code impératif, snapshot instant T | **Non** (placeholder `${` interdit) |
|
|
59
|
+
| **`sub(chemin \| clé)`** | Template Lit, réactivité | **Oui** — string, concat JS, ou `DataProviderKey` avec `${prop}` |
|
|
60
|
+
| **`@subscribe` / `@publish` / `@handle`** | Propriétés composant | **Oui** — `DataProviderKey<T, U>` avec `"base.${prop}"` |
|
|
61
|
+
| **`@bind`** | Legacy / bidirectionnel | Éviter sur composants métier — préférer `@subscribe` |
|
|
62
|
+
|
|
63
|
+
### `sub()` — dynamique OK (clés incluses), ne pas migrer vers `get()`
|
|
64
|
+
|
|
65
|
+
`sub()` accepte `string | DataProviderKey`, résout les placeholders `${prop}` depuis le **composant hôte** du template (comme `@subscribe`), et se ré-abonne quand les props observées changent.
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
const userKey = new DataProviderKey<User, { userIndex: number }>("users.${userIndex}");
|
|
69
|
+
|
|
70
|
+
html`<p>${sub(userKey.name)}</p>`
|
|
71
|
+
html`<p>${sub(counterKey.count)}</p>`
|
|
72
|
+
html`<p>${sub(this.formDataProvider + ".email")}</p>`
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Doc : `src/docs/_directives/sub.md`.
|
|
76
|
+
|
|
77
|
+
**Anti-pattern** : remplacer `sub(…)` par `get(…)` dans un template → perte de réactivité (snapshot unique).
|
|
78
|
+
|
|
79
|
+
### Clé dynamique Concorde → décorateur ou factory
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
export const resourceKey = new DataProviderKey<ResourceData, { resourceId: string }>(
|
|
83
|
+
"${resourceId}",
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
// ❌ dp(resourceKey) ou dp(resourceKey.path) → throw
|
|
87
|
+
export const resourceProvider = (id: string) => dp<ResourceData>(id);
|
|
88
|
+
|
|
89
|
+
@handle(resourceKey.conf.mode)
|
|
90
|
+
onMode(mode: Mode) { /* … */ }
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Patterns avant / après
|
|
94
|
+
|
|
95
|
+
### Statique typé (nouveau code)
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
const cartKey = new DataProviderKey<Cart>("cart");
|
|
99
|
+
set(cartKey, { items: [] });
|
|
100
|
+
dp(cartKey.items[0].qty).set(1);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### ID runtime (string pure, pas placeholder Concorde)
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
dp(resolvedId); // ex. "resource-abc123"
|
|
107
|
+
set(`forms/${formId}`, formData);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Index ou segment dynamique via JS (compatible)
|
|
111
|
+
|
|
112
|
+
**Avant** :
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
set(`app.pages.${index}.isComplete`, isComplete);
|
|
116
|
+
return get(`app.labels.${language}.${key}`);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Après** (option typée, même runtime) :
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
const pagesKey = new DataProviderKey<AppState["pages"]>("app.pages");
|
|
123
|
+
set(pagesKey[index].isComplete, isComplete);
|
|
124
|
+
|
|
125
|
+
const labelsKey = new DataProviderKey<AppState["labels"]>("app.labels");
|
|
126
|
+
return get(labelsKey[language][key]);
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Helper générique** — conserver si le suffixe ne contient jamais `${` :
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
export const appSet = <P extends string>(path: P, value: AppValue<P>) => {
|
|
133
|
+
set(`app.${path}`, value);
|
|
134
|
+
};
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Chemins entièrement statiques
|
|
138
|
+
|
|
139
|
+
**Avant** :
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
set("app.widget.computed", value);
|
|
143
|
+
const publisher = dp("app.widget.distance");
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Après** :
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
const widgetKey = new DataProviderKey<AppState["widget"]>("app.widget");
|
|
150
|
+
set(widgetKey.computed, value);
|
|
151
|
+
const publisher = dp(widgetKey.distance);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Profils de risque (générique)
|
|
155
|
+
|
|
156
|
+
| Profil codebase | Risque | Indice |
|
|
157
|
+
|-----------------|--------|--------|
|
|
158
|
+
| Strings JS uniquement, pas de `DataProviderKey` | Très faible | Chemins déjà résolus avant `get/set/dp` |
|
|
159
|
+
| Mix `DataProviderKey` statique + `.path` | Faible | Simplifier `dp(key)` progressivement |
|
|
160
|
+
| Clés avec `"${prop}"` passées à `dp()` | **Élevé** | Remplacer par factory `dp(idRésolu)` ou décorateur |
|
|
161
|
+
| Templates avec `sub()` | Aucun | Ne pas « migrer » vers `get()` |
|
|
162
|
+
|
|
163
|
+
Migrations **distinctes** (hors scope) : `PublisherManager`, `@onAssign` → `@handle`.
|
|
164
|
+
|
|
165
|
+
## Checklist migration (agent)
|
|
166
|
+
|
|
167
|
+
1. [ ] Confirmer version Concorde avec `resolveStaticPublisherPath` dans `dataProviderKey.ts`.
|
|
168
|
+
2. [ ] Chercher `DataProviderKey(` dont le constructeur contient `${` ou `{$`.
|
|
169
|
+
3. [ ] Pour chaque hit : si `get` / `set` / `dp` reçoit la clé → factory `dp(idRésolu)` ou décorateur.
|
|
170
|
+
4. [ ] Simplifier `dp(staticKey.path)` → `dp(staticKey)` sur clés statiques.
|
|
171
|
+
5. [ ] **Ne pas** toucher `sub(...)` ni décorateurs dynamiques sans raison.
|
|
172
|
+
6. [ ] Distinguer grep `${` (source) vs valeur runtime.
|
|
173
|
+
7. [ ] Tests manuels sur les flux métier qui utilisent clés dynamiques et formulaires `sub()`.
|
|
174
|
+
|
|
175
|
+
## Anti-patterns
|
|
176
|
+
|
|
177
|
+
| Anti-pattern | Pourquoi |
|
|
178
|
+
|--------------|----------|
|
|
179
|
+
| `dp(key)` sur clé `"${resourceId}"` | Throw immédiat |
|
|
180
|
+
| `sub()` → `get()` dans template | Perte réactivité |
|
|
181
|
+
| Refactor global `.path` → clé sur toutes les clés sans tri statique/dynamique | Régressions |
|
|
182
|
+
| Confondre migration get/set/dp et suppression `PublisherManager` | Périmètres différents |
|
|
183
|
+
|
|
184
|
+
## Fichiers de référence (package Concorde)
|
|
185
|
+
|
|
186
|
+
- `src/core/utils/dataProviderKey.ts` — `resolveStaticPublisherPath`
|
|
187
|
+
- `src/core/utils/PublisherProxy.ts` — overloads `get` / `set` / `dp`
|
|
188
|
+
- `src/core/utils/publisherPathKey.spec.ts` — tests
|
|
189
|
+
- `src/core/directives/DataProvider.ts` — `sub()`
|
|
190
|
+
- `src/docs/_misc/dataProviderKey.md`
|
|
191
|
+
|
|
192
|
+
## Maintenance
|
|
193
|
+
|
|
194
|
+
Mettre à jour quand l'API Concorde évolue ou que de nouveaux cas edge sont documentés dans les specs.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Imports Concorde — chemins courts
|
|
2
|
+
|
|
3
|
+
Toujours préférer le **chemin export le plus court** documenté dans `package.json` de `@supersoniks/concorde` — **dans les projets consommateurs** (apps qui installent le package).
|
|
4
|
+
|
|
5
|
+
Éviter les chemins `ui/…`, `functional/…`, `core/…` quand un alias racine existe **en dehors du monorepo Concorde**.
|
|
6
|
+
|
|
7
|
+
## Dans le dépôt Concorde (lib + doc)
|
|
8
|
+
|
|
9
|
+
Les exports courts (`@supersoniks/concorde/list`, `/menu`, `/queue`, …) **ne résolvent pas** ici : l’alias Vite `@supersoniks/concorde` pointe sur `src/`, pas sur les sous-chemins `package.json`.
|
|
10
|
+
|
|
11
|
+
| Besoin | ✅ Dans ce repo | ❌ Ne pas utiliser ici |
|
|
12
|
+
|--------|----------------|------------------------|
|
|
13
|
+
| `sonic-list` | `import "../../core/components/functional/list/list"` ou `@supersoniks/concorde/core/components/functional/list/list` | `@supersoniks/concorde/list` |
|
|
14
|
+
| `sonic-queue` | `…/core/components/functional/queue/queue` | `@supersoniks/concorde/queue` |
|
|
15
|
+
| UI (button, input, …) | `…/core/components/ui/…` ou relatif depuis `src/docs` | `@supersoniks/concorde/button`, etc. |
|
|
16
|
+
| `@subscribe`, `@ancestorAttribute` | `@supersoniks/concorde/core/decorators/Subscriber` | — |
|
|
17
|
+
| `DataProviderKey` | `@supersoniks/concorde/core/utils/dataProviderKey` | `@supersoniks/concorde/dataProviderKey` (alias doc seulement si configuré) |
|
|
18
|
+
|
|
19
|
+
`@supersoniks/concorde/decorators` peut fonctionner (fichier `src/decorators.ts`) ; préférer quand même les chemins `core/…` dans `src/docs/example/**` pour cohérence.
|
|
20
|
+
|
|
21
|
+
## Composants UI
|
|
22
|
+
|
|
23
|
+
| Composant | ✅ Préférer | ❌ Éviter |
|
|
24
|
+
|-----------|------------|----------|
|
|
25
|
+
| Menu | `@supersoniks/concorde/menu` | `…/ui/menu` |
|
|
26
|
+
| Menu item | `@supersoniks/concorde/menu-item` | `…/ui/menu-item` |
|
|
27
|
+
| Divider | `@supersoniks/concorde/divider` | `…/ui/divider` |
|
|
28
|
+
| Button | `@supersoniks/concorde/button` | `…/ui/button` |
|
|
29
|
+
| Theme | `@supersoniks/concorde/theme` | `…/ui/theme` |
|
|
30
|
+
| Scope | `@supersoniks/concorde/sonic-scope` | `…/functional/sonic-scope` |
|
|
31
|
+
| Input | `@supersoniks/concorde/input` | `…/ui/form/input` |
|
|
32
|
+
| Select | `@supersoniks/concorde/select` | `…/ui/form/select` |
|
|
33
|
+
| Checkbox | `@supersoniks/concorde/checkbox` | `…/ui/form/checkbox` |
|
|
34
|
+
|
|
35
|
+
## Composants fonctionnels
|
|
36
|
+
|
|
37
|
+
| Composant | ✅ Préférer | ❌ Éviter |
|
|
38
|
+
|-----------|------------|----------|
|
|
39
|
+
| List | `@supersoniks/concorde/list` | `…/functional/list` |
|
|
40
|
+
| Queue | `@supersoniks/concorde/queue` | `…/functional/queue` |
|
|
41
|
+
| Router | `@supersoniks/concorde/router` | `…/core/components/functional/router/router` |
|
|
42
|
+
| Fetch | `@supersoniks/concorde/fetch` | `…/functional/fetch` |
|
|
43
|
+
| Value | `@supersoniks/concorde/value` | `…/functional/value` |
|
|
44
|
+
|
|
45
|
+
## Utilitaires & types
|
|
46
|
+
|
|
47
|
+
| Besoin | ✅ Préférer | ❌ Éviter |
|
|
48
|
+
|--------|------------|----------|
|
|
49
|
+
| Décorateurs | `@supersoniks/concorde/decorators` | chemins `…/core/decorators/…` |
|
|
50
|
+
| Directives (`sub`) | `@supersoniks/concorde/directives` | — |
|
|
51
|
+
| `get` / `set` / `dp` | `@supersoniks/concorde/utils` | `PublisherManager` |
|
|
52
|
+
| `DataProviderKey` | `@supersoniks/concorde/dataProviderKey` | `…/core/utils/dataProviderKey` |
|
|
53
|
+
| `Endpoint` | `@supersoniks/concorde/utils/endpoint` | `…/core/utils/endpoint` |
|
|
54
|
+
| `APIConfiguration` | `@supersoniks/concorde/utils/api` | `…/core/utils/api` |
|
|
55
|
+
| Vite config | `@supersoniks/concorde/vite-config` | — |
|
|
56
|
+
|
|
57
|
+
## Exemples
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import "@supersoniks/concorde/menu";
|
|
61
|
+
import "@supersoniks/concorde/menu-item";
|
|
62
|
+
import "@supersoniks/concorde/divider";
|
|
63
|
+
import "@supersoniks/concorde/button";
|
|
64
|
+
import "@supersoniks/concorde/theme";
|
|
65
|
+
import "@supersoniks/concorde/input";
|
|
66
|
+
import "@supersoniks/concorde/list";
|
|
67
|
+
import "@supersoniks/concorde/queue";
|
|
68
|
+
import "@supersoniks/concorde/router";
|
|
69
|
+
|
|
70
|
+
import { subscribe, handle, get } from "@supersoniks/concorde/decorators";
|
|
71
|
+
import { sub } from "@supersoniks/concorde/directives";
|
|
72
|
+
import { get, set } from "@supersoniks/concorde/utils";
|
|
73
|
+
import { DataProviderKey } from "@supersoniks/concorde/dataProviderKey";
|
|
74
|
+
import { Endpoint } from "@supersoniks/concorde/utils/endpoint";
|
|
75
|
+
import type { APIConfiguration } from "@supersoniks/concorde/utils/api";
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Side-effect imports (enregistrement custom elements) : toujours le chemin **composant** court ci-dessus.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concorde-menu
|
|
3
|
+
description: >-
|
|
4
|
+
Menus et navigation Concorde : sonic-menu, sonic-menu-item, sonic-divider.
|
|
5
|
+
Sidebar, sections, routes pushstate.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Concorde — menus et navigation
|
|
9
|
+
|
|
10
|
+
Référence doc : `node_modules/@supersoniks/concorde/src/core/components/ui/menu/menu.md`
|
|
11
|
+
|
|
12
|
+
## Imports
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import "@supersoniks/concorde/menu";
|
|
16
|
+
import "@supersoniks/concorde/divider";
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Structure type (navigation latérale)
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<nav aria-label="Navigation latérale">
|
|
23
|
+
<sonic-menu direction="column" align="left" size="sm" class="w-full">
|
|
24
|
+
<sonic-menu-item pushstate href="/" autoActive="strict">Accueil</sonic-menu-item>
|
|
25
|
+
|
|
26
|
+
<sonic-divider label="Section A" align="left" size="sm"></sonic-divider>
|
|
27
|
+
<sonic-menu-item pushstate href="/a/page" autoActive="strict">Page A</sonic-menu-item>
|
|
28
|
+
|
|
29
|
+
<sonic-divider label="Section B" align="left" size="sm"></sonic-divider>
|
|
30
|
+
<sonic-menu-item pushstate href="/b/page" autoActive="strict">Page B</sonic-menu-item>
|
|
31
|
+
</sonic-menu>
|
|
32
|
+
</nav>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Règles
|
|
36
|
+
|
|
37
|
+
| Contexte | Composants |
|
|
38
|
+
|----------|------------|
|
|
39
|
+
| Liste de liens / nav | **`sonic-menu`** + **`sonic-menu-item`** |
|
|
40
|
+
| Séparation de sections | **`sonic-divider`** avec `label` |
|
|
41
|
+
| Liens internes (router Concorde) | `pushstate` + `href` sur **`sonic-menu-item`** |
|
|
42
|
+
| Item actif | `autoActive="strict"` sur chaque item de route |
|
|
43
|
+
|
|
44
|
+
## Interdits pour la navigation
|
|
45
|
+
|
|
46
|
+
- **Ne pas** empiler des **`sonic-button`** ghost pour simuler un menu latéral.
|
|
47
|
+
- **Ne pas** inventer des séparateurs custom quand **`sonic-divider`** suffit.
|
|
48
|
+
- **Ne pas** oublier `pushstate` sur les liens internes.
|
|
49
|
+
- **Ne pas** mettre `autoActive` sur le **`sonic-menu`** — c’est sur chaque **`sonic-menu-item`**.
|
|
50
|
+
|
|
51
|
+
## Attributs utiles
|
|
52
|
+
|
|
53
|
+
### sonic-menu
|
|
54
|
+
|
|
55
|
+
`direction="column"`, `align="left"`, `size="sm"` pour une sidebar.
|
|
56
|
+
|
|
57
|
+
### sonic-menu-item
|
|
58
|
+
|
|
59
|
+
Hérite de **`sonic-button`** : `pushstate`, `href`, `autoActive`, `variant`.
|
|
60
|
+
|
|
61
|
+
### sonic-divider
|
|
62
|
+
|
|
63
|
+
`label`, `align="left"`, `size="sm"`.
|
|
64
|
+
|
|
65
|
+
## Routes fichier
|
|
66
|
+
|
|
67
|
+
Pas de **tirets** dans les noms de dossiers sous `routes/` — le générateur Concorde produit des identifiants JS invalides (`dpkey-dynamic` → erreur).
|
|
68
|
+
|
|
69
|
+
## Checklist
|
|
70
|
+
|
|
71
|
+
- [ ] `sonic-menu` englobe tous les items
|
|
72
|
+
- [ ] Sections séparées par `sonic-divider` avec `label`
|
|
73
|
+
- [ ] Chaque route : `pushstate` + `href` + `autoActive="strict"`
|
|
74
|
+
- [ ] Imports `@supersoniks/concorde/menu`, `/menu-item`, `/divider` (pas `ui/…`)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concorde-scope
|
|
3
|
+
description: >-
|
|
4
|
+
Scope (sonic-scope) — inherited API, form, and icon defaults. Not UI.
|
|
5
|
+
APIConfiguration via attributes or DataProvider.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Scope — configuration héritée
|
|
9
|
+
|
|
10
|
+
**Scope** = defaults app-wide via `<sonic-scope>` (light DOM). Les descendants lisent les attributs ancêtres — pas de shadow root.
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import "@supersoniks/concorde/sonic-scope";
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Attributs courants
|
|
17
|
+
|
|
18
|
+
| Zone | Attributs | Consommé par |
|
|
19
|
+
|------|-----------|--------------|
|
|
20
|
+
| API | `serviceURL`, `token`, `credentials`, `userName`, `password` | `@get`, `sonic-list`, `sonic-queue`, `sonic-submit` |
|
|
21
|
+
| Forms | `formDataProvider`, `dataProvider`, `submitResultDataProvider` | champs form, `sonic-submit` |
|
|
22
|
+
| Icons | `customIconLibraryPath`, `customIconDefaultPrefix` | `sonic-icon` `library="custom"` |
|
|
23
|
+
|
|
24
|
+
## APIConfiguration
|
|
25
|
+
|
|
26
|
+
Type : `@supersoniks/concorde/utils/api`.
|
|
27
|
+
|
|
28
|
+
| Champ | Rôle |
|
|
29
|
+
|-------|------|
|
|
30
|
+
| `serviceURL` | URL de base API |
|
|
31
|
+
| `token` | Bearer |
|
|
32
|
+
| `userName` / `password` | Basic auth (si pas de token) |
|
|
33
|
+
| `credentials` | Mode `fetch` (`omit`, `same-origin`, `include`) |
|
|
34
|
+
| `authToken` | Refresh token (attribut scope : `eventsApiToken`) |
|
|
35
|
+
| `tokenProvider` | Chemin pour obtenir un nouveau bearer |
|
|
36
|
+
| `cache`, `blockUntilDone`, `keepAlive`, `addHTTPResponse` | Options avancées fetch |
|
|
37
|
+
|
|
38
|
+
## Deux façons de configurer l’API
|
|
39
|
+
|
|
40
|
+
**1. Scope** — attributs sur `<sonic-scope>` ou `<sonic-theme>` (API seulement sur scope recommandé) :
|
|
41
|
+
|
|
42
|
+
```html
|
|
43
|
+
<sonic-scope serviceURL="https://api.example.com" token="…">
|
|
44
|
+
…
|
|
45
|
+
</sonic-scope>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
@get(usersEndpoint) // pas de 2ᵉ arg — hérite serviceURL
|
|
50
|
+
@state() data: ApiGetResult<Users> | null = null;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**2. DataProvider** — objet typé :
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import type { APIConfiguration } from "@supersoniks/concorde/utils/api";
|
|
57
|
+
|
|
58
|
+
const apiKey = new DataProviderKey<APIConfiguration>("myApi");
|
|
59
|
+
set(apiKey, { serviceURL: "https://api.example.com", credentials: "same-origin" });
|
|
60
|
+
|
|
61
|
+
@get(usersEndpoint, apiKey)
|
|
62
|
+
@state() data: ApiGetResult<Users> | null = null;
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Les deux patterns peuvent coexister (scope pour l’URL par défaut, clé explicite quand nécessaire).
|
|
66
|
+
|
|
67
|
+
## Séparation theme / scope
|
|
68
|
+
|
|
69
|
+
- **Scope** → API, forms, icônes app-wide
|
|
70
|
+
- **Theme** → couleurs, typo (`concorde-theme`) — **pas** `serviceURL`
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concorde-theme
|
|
3
|
+
description: >-
|
|
4
|
+
sonic-theme — design tokens (colors, fonts, dark mode). Not API scope.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Theme — design system
|
|
8
|
+
|
|
9
|
+
`<sonic-theme>` définit la base visuelle Concorde. **Pas** pour l’API (`serviceURL` → scope, skill `concorde-scope`).
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import "@supersoniks/concorde/theme";
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<sonic-theme background color font>
|
|
17
|
+
…app…
|
|
18
|
+
</sonic-theme>
|
|
19
|
+
|
|
20
|
+
<!-- dark -->
|
|
21
|
+
<sonic-theme theme="dark" background color font>…</sonic-theme>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Attributs
|
|
25
|
+
|
|
26
|
+
| Attribut | Rôle |
|
|
27
|
+
|----------|------|
|
|
28
|
+
| `background` | Fond page / surface (`--sc-base`) |
|
|
29
|
+
| `color` | Couleur texte (`--sc-base-content`) |
|
|
30
|
+
| `font` | Famille / graisse (`--sc-font-family-base`) |
|
|
31
|
+
| `theme="light"` \| `"dark"` | Palette built-in |
|
|
32
|
+
|
|
33
|
+
## Variables CSS
|
|
34
|
+
|
|
35
|
+
Override dans `:root` ou fichier CSS projet :
|
|
36
|
+
|
|
37
|
+
- Surfaces : `--sc-base`, `--sc-base-content`, `--sc-base-50` … `--sc-base-900`
|
|
38
|
+
- Sémantique : `--sc-primary`, `--sc-success`, `--sc-warning`, `--sc-danger`, `--sc-info` (+ `-content`)
|
|
39
|
+
- Forme : `--sc-rounded`, `--sc-btn-rounded`, `--sc-border-width`
|
|
40
|
+
- Typo : `--sc-font-family-base`, `--sc-headings-font-family`
|
|
41
|
+
|
|
42
|
+
Doc composant : `node_modules/@supersoniks/concorde/src/core/components/ui/theme/`.
|
|
43
|
+
|
|
44
|
+
Popovers, modals, toasts se montent sous le `<sonic-theme>` le plus proche.
|
|
45
|
+
|
|
46
|
+
Palette generator : [concordecolors](https://delanfranchi.github.io/concordecolors/).
|
package/build-infos.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"date":
|
|
1
|
+
{"date":1780500767}
|