Skip to content

feat: styles vecteur personnalisables + fade-in synchronisé des couches - #43

Merged
cmer81 merged 18 commits into
mainfrom
feat/vector-styles
Jun 5, 2026
Merged

feat: styles vecteur personnalisables + fade-in synchronisé des couches#43
cmer81 merged 18 commits into
mainfrom
feat/vector-styles

Conversation

@cmer81

@cmer81 cmer81 commented Jun 5, 2026

Copy link
Copy Markdown
Owner

Résumé

Récupère les bonnes idées du PR upstream open-meteo/maps#280 (« predefined charts ») sans importer son architecture multi-source (dual-path de rendu + buildOmUrl qui aurait court-circuité le routing worker/bucket/anomalie du fork).

Trois apports, branchés sur l'existant :

  1. Extraction des styles vecteur — les expressions MapLibre des contours et flèches, jusqu'ici codées en dur dans layers.ts, vivent désormais dans un module pur data-driven src/lib/vector-styles.ts (types + defaults + builders). Refactor à rendu identique, couvert par des tests (vector-styles.test.ts, mini-évaluateur d'expressions).
  2. Fade-in synchroniséSlotManager gagne un commit différé opt-in (deferCommit/onReady/commitNow()/isReady()), et un coordinateur dans layers.ts (beginCommitGroup/addToCommitGroup/tryFlushGroup/dropFromGroup) regroupe les couches mises à jour dans le même tick (raster principal + raster secondaire + vecteur) pour qu'elles apparaissent ensemble au lieu de chacune dans son coin.
  3. Personnalisation des styles — couleurs et épaisseurs des contours et flèches éditables dans le drawer réglages (contour-settings.svelte, arrows-settings.svelte), persistées via svelte-persisted-store (contourStyle/arrowStyle). Application live par reloadVectorStyle(). Le ColorPicker gagne un mode portalToBody pour ne pas être tronqué dans le drawer. Comme l'app force le dark mode, l'UI n'expose qu'une seule pastille couleur (la couleur rendue) ; lightColor reste dans le modèle de données.

Au passage : corrige une désync de la couche superposée (le court-circuit en tête de changeOMfileURL empêchait l'overlay de se rafraîchir tant que le primaire ne changeait pas → la couche 2 ne suivait pas un changement de variable et « rattrapait » au scrub). Désormais seul le rechargement primaire est conditionné à son URL ; la couche 2 a sa propre déduplication.

Détails techniques

  • vector-styles.ts est pur (aucune dépendance store/runtime, seulement import type maplibre). Les builders reconstruisent exactement les anciennes expressions (table d'union fidèle pour les flèches, où les seuils couleur ≠ largeur).
  • Le coordinateur route les erreurs (dropFromGroup, clearOnError, échec d'enregistrement de source → onError) pour ne pas bloquer le groupe sur une couche en échec.
  • Doc moteur .claude/rules/architecture.md mise à jour (3 managers, coordinateur, styles data-driven).

Plan de test

  • npm run check (0 erreur), npx vitest run (246 verts), npm run lint, npm run build
  • Drawer → isocontours : éditer couleur/largeur d'un palier → maj immédiate ; persistance après reload ; « Réinitialiser »
  • Drawer → flèches de vent : idem
  • Changement de pas de temps avec couche 2 + vent actifs → apparition simultanée, sans clignotement
  • Changer la variable de la couche superposée → maj immédiate (sans avoir à scruber)
  • Légende (bas-gauche) : ColorPicker s'ouvre toujours à droite (non régressé)

Limitations connues / follow-ups (non bloquants)

  • Gel possible sur couche manquante/lente : le commit groupé attend que toutes les couches actives soient prêtes. Si une couche ne signale jamais « prête » ni « erreur » (tuile qui pend / donnée manquante d'une certaine période), le groupe peut rester en attente et figer le loading jusqu'à un refresh. À durcir avec un garde-fou (timeout de sécurité qui affiche ce qui est prêt et libère le spinner). Symptôme observé en test — à traiter avant usage intensif.
  • resetStates() ne réinitialise pas contourStyle/arrowStyle (à ajouter si la forme des niveaux change un jour).
  • reloadVectorStyle() lit l'URL du slot actif : edge transitoire documenté (mismatch d'une frame si on édite un style pile pendant un changement de temps).
  • Changer le niveau du vent overlay (flèches) quand il est déjà actif souffre du même type de court-circuit côté vecteur (pré-existant sur main).
  • Couleur du texte des labels de contours encore en dur.
  • Action portal dupliquée (color-picker + advanced-panel) → extraire \$lib/actions/portal.ts.

Spec & plan : docs/superpowers/.

🤖 Generated with Claude Code

cmer81 added 18 commits June 5, 2026 23:03
…l'ordre onReady

Réinitialise `deferredCommit` dans `destroy()` pour que `isReady()` retourne
`false` après destruction. Ajoute un commentaire inline dans `commit()` pour
documenter que l'assignation doit précéder l'appel `onReady()`.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 5, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
maps c5e6714 Commit Preview URL

Branch Preview URL
Jun 05 2026, 10:52 PM

@cmer81
cmer81 merged commit 4103818 into main Jun 5, 2026
8 checks passed
@cmer81
cmer81 deleted the feat/vector-styles branch June 5, 2026 22:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant