Skip to content

epic(core): intégration DSFR Chart 2.1.x — API cartes unifiée + décommission dsfr-data-world-map (Option A) #402

Description

@bmatge

Suite au rapport d'analyse (2026-07-16) : docs/RAPPORT-dsfr-chart-2.1-cartes.md sur branche claude/dsfr-charts-updates-wlju9n.
Runtime déjà en 2.1.1 (cdn-versions.ts), mais code encore aligné sur 2.0.4 → bug DataBox actif en prod.

🎯 Objectifs

  1. Corriger le bug DataBox title/name en prod (P0).
  2. Adopter la nouvelle API cartes unifiée <map-chart level="…"> : corrige la limitation map-reg connue, ajoute map-aca / map-monde.
  3. Aligner toute la doc statique CDN sur 2.1.1 (SRI regen).
  4. Décommissioner dsfr-data-world-map (Option A validée) : utiliser <map-chart level=\"monde\"> upstream, retirer d3-geo / topojson / world-atlas (~31 Ko bundle + 140 Ko asset). Perte assumée : zoom continent interactif + support iso-a3 / iso-num.

🔴 P0 — DataBox `title` → `name` (bug actif prod)

Renommé en DSFR Chart 2.1.0 (conflit avec l'attribut HTML `title`). Titres invisibles depuis le bump 2.1.1.

  • `packages/core/src/components/dsfr-data-chart.ts:1121` — poser `name` (option robuste : `name` et `title` pour hôtes 2.0.x)
  • `apps/builder/src/ui/code-generator.ts:119` — générer `name="…"`
  • `apps/builder-ia/src/ui/{code-generator,chart-renderer}.ts` — vérifier la génération DataBox
  • Aucun changement d'API publique (`databox-title` reste notre attribut)
  • Changeset : patch

🟠 P1 — `map-reg` → `<map-chart level="reg">`

Résout la limitation documentée dans `specs/charts/map-chart.html:48`.

  • `dsfr-data-chart.ts` — dans `_getTypeSpecificAttributes()`, router `map`/`map-reg` vers `` avec `level="dep"`/`"reg"` (au lieu de `` sans `region`)
  • Répercuter dans `apps/builder-ia/src/ui/{code-generator,chart-renderer}.ts`
  • Retirer la mention "limitation connue" dans specs/guide
  • Changeset : patch (correction de comportement)

🟢 P2 — Nouveaux types `map-aca` et `map-monde`

Étendre `DSFRChartType` + `CHART_TAG_MAP` (tous → `` avec le bon `level`).

  • `packages/core/src/components/dsfr-data-chart.ts` — types, `CHART_TAG_MAP`, `_processMapData()`, `_getAriaLabel()` ("carte académies", "carte monde")
  • `map-aca` : clés = nom d'académie majuscule ("PARIS", "LYON", "STRASBOURG")
  • `map-monde` : clés = ISO 3166-1 alpha-2. Convertir depuis a3/num via `continent-lookup.ts` (à préserver après P4)
  • `apps/builder-ia/src/skills.ts` — ajouter les types (test `skills.test.ts` garde-fou)
  • `apps/builder-ia/src/ui/{chart-renderer,code-generator}.ts`
  • `apps/grist-widgets/src/chart.ts` — dropdown types
  • `specs/charts/map-chart.html` — documenter les 4 `level`
  • Changeset : minor

🔵 P3 — Bump doc statique CDN 2.0.4 → 2.1.1 (96 occurrences)

  • `README.md`, `guide/.html` (15), `guide/examples/` (6), `specs/charts/` (8), `specs/components/` (5), `specs/*.html` (2), `apps/{playground,favorites,dashboard,builder,builder-ia,grist-widgets}` (index.html/src), `e2e/industrie-du-futur.html`
  • Retirer les SRI figés sur 2.0.4 ou recalculer (`npm run generate-sri`)
  • `tests/apps/dashboard/dashboards.test.ts:21-23` — URLs 2.0.4 → 2.1.1
  • Idéal : faire pointer les pages/tests sur `CDN_URLS` (`cdn-versions.ts`) pour supprimer la version en dur (cf [J3] Shared app-side : code mort, contrats non typés, versions CDN désynchronisées #322)
  • Pas de changeset (hors `packages/core/src`)

🎯 P4 — Décommission `dsfr-data-world-map` (Option A)

Utiliser `<map-chart level="monde">` upstream + retirer d3-geo + topojson + world-atlas.

Perte assumée : zoom continent interactif + support iso-a3 / iso-num (les lookups `continent-lookup.ts` restent pour convertir a3/num→a2 dans `_processMapData()`).

Cycle de dépréciation :

  • Release N (avec P2) : `type="map-monde"` disponible sur `dsfr-data-chart`. `dsfr-data-world-map` `console.warn("deprecated, use dsfr-data-chart type=\"map-monde\"")`.
  • Release N+1 (major) : retirer.

Fichiers (v N+1) :

  • Lib : `packages/core/package.json` export `./world-map`, devDeps `d3-geo`/`topojson-client`/`world-atlas`/`@types/*`
  • `packages/core/src/index.ts:24`, `index-world-map.ts`, `scripts/build-lib.ts:88-100` (bundle world-map)
  • Composant `dsfr-data-world-map.ts` + `data/country-names.ts` + `world-countries-110m.json`
  • ⚠️ Conserver `data/continent-lookup.ts` (converter a3/num→a2 pour `map-monde`)
  • ⚠️ Conserver `CHOROPLETH_SCALES` (partagé avec `dsfr-data-map-layer`)
  • Apps : `skills.ts` (skill world-map), `playground/{index.html,examples}`, `pipeline-helper/html-parser.ts`, `app-ui/app-layout-demo.ts`
  • Doc : `guide/guide-exemples-world-map.html`, `guide/guide-demo-complete.html`, `guide/guide-menu.js`, `specs/components/dsfr-data-world-map.html`, `specs/index.html`, `index.html`
  • e2e : `guide-examples.spec.ts`, `playground-examples.spec.ts`, `specs-live.spec.ts`
  • tests : `dsfr-data-world-map.test.ts`, `world-map-a11y.test.ts`, `display-states-harmonized.test.ts`, `palettes-unified.test.ts`
  • `docs/THIRD-PARTY-LICENSES.md`, `docs/ARCHITECTURE.md:428` (table bundles), `packages/core/src/README.md`
  • Nettoyer aussi `packages/core/package 2.json` (doublon parasite)
  • Changeset : major (retrait export public `./world-map`)

✅ Validation (obligatoire, ARCHITECTURE.md:714)

  • `npm run build` puis preview réelle des 4 cartes (`dep`/`reg`/`aca`/`monde`) + une DataBox → titre visible + cartes correctes
  • `npm run test:run` — dont `skills.test.ts`, `cdn-versions-alignment.test.ts`
  • E2E Playwright — smoke playground

📎 Références

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestepicpkg:coreTouche la lib packages/core (composants dsfr-data-*)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions