@supersoniks/concorde 4.7.0 → 4.7.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.
- package/ai/skills/concorde/SKILL.md +55 -2
- package/build-infos.json +1 -1
- package/concorde-core.bundle.js +129 -129
- package/concorde-core.es.js +1043 -950
- package/dist/concorde-core.bundle.js +129 -129
- package/dist/concorde-core.es.js +1043 -950
- package/package.json +1 -1
- package/src/core/decorators/api.spec.ts +8 -1
- package/src/core/decorators/api.ts +126 -15
- package/src/core/utils/HTML.ts +42 -10
|
@@ -3,6 +3,7 @@ name: concorde
|
|
|
3
3
|
description: >-
|
|
4
4
|
Composants Web Concorde (Lit) : DataProvider, scope, theme, Endpoint,
|
|
5
5
|
formDataProvider, sonic-list/sonic-queue, @subscribe/@handle/@get.
|
|
6
|
+
@subscribe feuille par feuille (pas d’objet parent + getters).
|
|
6
7
|
Imports courts (@supersoniks/concorde/menu, /list, /utils…).
|
|
7
8
|
---
|
|
8
9
|
|
|
@@ -143,6 +144,57 @@ count = 0;
|
|
|
143
144
|
subscribedCount = 0;
|
|
144
145
|
```
|
|
145
146
|
|
|
147
|
+
### Règle impérative — une souscription par valeur affichée
|
|
148
|
+
|
|
149
|
+
Sur un composant **`LitElement`** métier, chaque donnée lue dans `render()` doit avoir **son propre** `@subscribe` + `@state()` (ou `@property` si besoin explicite) sur le **publisher feuille** — jamais un abonnement à l’objet parent + getters.
|
|
150
|
+
|
|
151
|
+
| Anti-pattern | Pourquoi |
|
|
152
|
+
|--------------|----------|
|
|
153
|
+
| `@subscribe(dpKeys.currentSession)` + `get edito()` | Si seul `edito` change (même référence `Session`), Lit peut **ne pas** re-rendre |
|
|
154
|
+
| `@subscribe` sur un parent + `sub()` enfant pour le détail | Mélange deux modèles ; préférer des feuilles cohérentes |
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// ❌ — re-render non garanti sur sous-clés
|
|
158
|
+
@subscribe(dpKeys.currentSession)
|
|
159
|
+
@state() session?: Session;
|
|
160
|
+
get edito() { return this.session?.edito; }
|
|
161
|
+
|
|
162
|
+
// ✅ — une propriété réactive par champ du template
|
|
163
|
+
@subscribe(dpKeys.currentSession.slug)
|
|
164
|
+
@state() slug = "";
|
|
165
|
+
|
|
166
|
+
@subscribe(dpKeys.currentSession.edito)
|
|
167
|
+
@state() edito: Edito | null = null;
|
|
168
|
+
|
|
169
|
+
@subscribe(dpKeys.currentSession.settings)
|
|
170
|
+
@state() settings: SettingsSessionAPI | null = null;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Navigation typée** : chaîner `DataProviderKey` — `dpKeys.currentSession.edito` → `"app.currentSession.edito"`.
|
|
174
|
+
|
|
175
|
+
**Granularité** : descendre jusqu’à la **feuille** réellement affichée si les mutations ne remplacent pas l’objet intermédiaire (ex. `@subscribe(dpKeys.currentSession.edito.title)` si seul `title` change sans nouvel objet `edito`).
|
|
176
|
+
|
|
177
|
+
**Templates** : même règle avec `sub(dpKeys.currentSession.edito.title)` plutôt que `sub(dpKeys.currentSession)` + accès JS.
|
|
178
|
+
|
|
179
|
+
### Cas hybride — hôte `Subscriber` + enfants sonic
|
|
180
|
+
|
|
181
|
+
Des composants catalogue (`sonic-event-location-hall`, `sonic-date`, `sonic-product-title`, …) remontent l’arbre pour `dataProvider` et utilisent le **template filling** du mixin `Subscriber` — pas un `@subscribe` local.
|
|
182
|
+
|
|
183
|
+
| Situation | Approche |
|
|
184
|
+
|-----------|----------|
|
|
185
|
+
| Composant métier **sans** enfants `Subscriber` | `LitElement` + `@subscribe` **feuille par feuille** |
|
|
186
|
+
| Composant **hôte** d’enfants sonic `Subscriber` | `extends Subscriber(LitElement)` + `@property` remplies par template filling ; **exposer** `dataProvider` aux descendants |
|
|
187
|
+
|
|
188
|
+
**`dataProvider` imbriqué** (éviter la clé plate `"app.currentSession"`) :
|
|
189
|
+
|
|
190
|
+
```html
|
|
191
|
+
<mon-composant-hote dataProvider="app" subDataProvider="currentSession"></mon-composant-hote>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Après `initPublisher`, refléter le chemin résolu sur l’attribut (ex. `app/currentSession`) pour que les **enfants** héritent le bon publisher — ils ne lisent pas `subDataProvider` sur l’ancêtre.
|
|
195
|
+
|
|
196
|
+
**Liste / queue** : chaque ligne a son publisher — l’hôte **hérite** de l’ancêtre ; ne pas forcer `app.currentSession` sur un item de liste.
|
|
197
|
+
|
|
146
198
|
## formDataProvider
|
|
147
199
|
|
|
148
200
|
```html
|
|
@@ -189,7 +241,7 @@ Propriétés Lit (recommandé) :
|
|
|
189
241
|
|
|
190
242
|
| Besoin | API |
|
|
191
243
|
|--------|-----|
|
|
192
|
-
| Lire | `@subscribe(dpKey.
|
|
244
|
+
| Lire (affichage Lit) | `@subscribe(dpKey.leaf)` + `@state()` — **une fois par champ** du `render()` |
|
|
193
245
|
| Effet typé | `@handle(dpKey.a, …)` |
|
|
194
246
|
| API HTTP | `@get(Endpoint)` ou `@get(Endpoint, apiConfigKey)` |
|
|
195
247
|
| Écriture classe (hors form) | `@publish` |
|
|
@@ -203,7 +255,8 @@ Propriétés Lit (recommandé) :
|
|
|
203
255
|
| « publisher » | DataProvider |
|
|
204
256
|
| `sonic-input` + `@input` | `formDataProvider` + `name` |
|
|
205
257
|
| `sonic-fetch` | `sonic-queue` + filtre, ou `@get` |
|
|
206
|
-
| `extends Subscriber(LitElement)` | `LitElement` + `@subscribe` / `sub()` |
|
|
258
|
+
| `extends Subscriber(LitElement)` (métier seul) | `LitElement` + `@subscribe` feuille par feuille / `sub()` |
|
|
259
|
+
| `extends Subscriber` (hôte d’enfants sonic) | Conserver `Subscriber` + `dataProvider` / `subDataProvider` corrects |
|
|
207
260
|
| `data-bind` HTML | `@subscribe` / `sub()` |
|
|
208
261
|
| `@bind` décorateur | `@subscribe` + `DataProviderKey` (lecture) ou `@publish` (écriture) |
|
|
209
262
|
| `@onAssign` | `@handle` + `DataProviderKey` |
|
package/build-infos.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"date":
|
|
1
|
+
{"date":1780507582}
|