Skip to content

v1.23#192

Merged
jbdesbas merged 69 commits into
mainfrom
dev
Jul 15, 2026
Merged

v1.23#192
jbdesbas merged 69 commits into
mainfrom
dev

Conversation

@jbdesbas

@jbdesbas jbdesbas commented May 27, 2026

Copy link
Copy Markdown
Member

#189 ajout de la propriété sortBy dans le composant <Dataset> pour filter depuis le provider.
#190 amélioration du composant Map

#196 Nouveau système de theming

lucilecollignon and others added 30 commits April 29, 2026 15:52
- Add `build` script as alias for `tsc` for standard workflow conventions
- Upstream remote `geo2france/api-dashboard` configured for future PR

Made-with: Cursor
…k mode

- Crée src/theme/ avec tokens/base.ts (sans couleurs, règle antd v6 #53719)
- Palettes geo2france (#95c11f, #0f4496) et neutral (#1677ff)
- 4 ThemeConfig complets : geo2france.light/dark + neutral.light/dark
- ThemeProvider : sélection preset par string, résolution auto/light/dark,
  couche de rétrocompatibilité pour les ThemeConfig bruts (deprecation warning + deep merge)
- ThemeContext exposant themeName, mode, resolvedMode, setMode
- hooks usePreferredColorScheme (media query live) + useThemeMode (localStorage)
- ThemeToggle : cycle auto → light → dark avec icônes Ant Design
- DashboardApp : ConfigProvider remplacé par ThemeProvider, prop themeMode ajoutée,
  deep import antd/es/layout/layout corrigé, default_theme marqué @deprecated
- src/index.ts : tous les exports publics du système de thème ajoutés

Made-with: Cursor
- Sider: #ccc → colorBorderSecondary + fix fuite mémoire resize listener
- Footer: #fff/#ccc/gradient → colorBgContainer/colorBorder/transparent
- Control: #fff/#ccc → colorBgContainer/colorBorder
- Page: #fff sticky header → colorBgContainer
- Pie: #000/#333 echarts labels → colorTextBase/colorText
- ChartComparison: #d4d4d4 fallback → colorBorderSecondary
- Map: line-color #fff → colorBgContainer
- MapLegend: BUG rgba(256..) → colorBgElevated + tokens border/padding
- cardStyles: nouveau hook useCardStyles() dérivé des tokens (rétrocompat cardStyles conservé)
- usechartexports: background export #fff → token.colorBgContainer
- DataPreview: remplace deep import antd/es/table par import public

Made-with: Cursor
…vider (phase 3)

- preview.ts → preview.tsx : support JSX pour le decorator global
- globalTypes : toolbar "Thème" (geo2france / neutral) + toolbar "Mode" (light ☀️ / dark 🌙)
- withTheme decorator : enveloppe chaque story dans ConfigProvider avec le preset actif
- Fond adapté au mode via useEffect sur document.body + wrapper div
- manager.ts : branding Géo2France conservé intact

Made-with: Cursor
Crée src/utils/zIndex.ts avec les constantes Z_INDEX (SIDER, MAP_GESTURE,
CONTROL, FOOTER, FOOTER_BUTTON, MODAL). Remplace tous les z-index inline
dans Sider, Footer, Control et Page par ces constantes.

Corrige également le gradient rgba(0,0,0,0.1) du scroll indicator dans
Footer en utilisant token.colorFill pour une adaptation dark mode correcte.

Made-with: Cursor
…, a11y error mode

- Tests unitaires ThemeProvider : résolution theme par nom (geo2france/neutral),
  résolution mode (auto/light/dark via OS ou prop), couche de rétrocompatibilité
  (ThemeConfig direct → console.warn + merge), 31 tests passent en tout
- Snapshots : KeyFigure + FlipCard en geo2france-light et neutral-dark (5 snapshots)
- Fixture Jest : polyfill TextEncoder/TextDecoder pour react-router-dom v7 (jest.setup.js)
- Chromatic CI : .github/workflows/chromatic.yml — diff visuel sur toutes les PR
- a11y mode 'error' (bloquant CI) dans preview.tsx :
  - Règle color-contrast désactivée globalement (couleur primaire G2F #95c11f,
    FIXME documenté : fix/a11y-geo2france-contrast)
  - Stories ECharts exemptées en 'todo' (canvas non accessible, FIXME documenté :
    fix/a11y-echarts)
  - Statistics stories exemptées en 'todo' (indicateurs de tendance colorés)

Made-with: Cursor
- Introduction.mdx : section Personnalisation complétée (config theme/themeMode, liens vers Theming et Dark Mode)
- stories-docs/Theming.mdx : nouvelle page (presets, tokens, override partiel, branding, règle Ant Design v6)
- stories-docs/DarkMode.mdx : nouvelle page (activation, ThemeToggle, useThemeContext, bonnes pratiques)
- Fix: suppression de l'import React inutilisé dans ThemeProvider.test.tsx (TS6133)

Made-with: Cursor
Installs @fontsource/inter and imports weights 400/500/600 in both
manager.ts (Storybook UI shell) and preview.tsx (story canvas) so
that fontBase:'Inter' is actually applied.

Made-with: Cursor
Ajoute le bouton de bascule de thème (auto/light/dark) dans le footer
du DashboardSider, visible même en mode collapsed (icône seule).

Made-with: Cursor
Introduce createBrandTheme() factory and BrandTokens/BrandShorthand contracts
that let consumers define custom branding in their own repo without modifying
the lib. ThemeProvider now accepts a `brand` prop (3 forms: Bundle, Tokens,
Shorthand) with automatic dark mode derivation and logo integration via
useBrandLogo(). The legacy theme={ThemeConfig} path remains functional with
an enriched deprecation warning pointing to the new API.

Co-authored-by: Cursor <cursoragent@cursor.com>
Keep the theme unit test typings minimal after the Brand Theming API integration to reduce noise and avoid unused type imports.

Co-authored-by: Cursor <cursoragent@cursor.com>
Convert Markdown pipe tables to explicit HTML tables in theming and dark mode docs so token and mode reference tables display reliably in Storybook docs rendering.

Co-authored-by: Cursor <cursoragent@cursor.com>
Document how to self-host and use a custom font without Google Fonts,
including @font-face declaration and createBrandTheme typography config
with Inter fallback stack.
Clarifie l’API de personnalisation en remplaçant `brand` par `visualIdentity`, avec migration des exports, hooks, tests et documentation pour aligner le vocabulaire produit.
Ajoute une page dédiée à l’identité visuelle pour compléter la migration `brand` vers `visualIdentity` dans la documentation Storybook.
Harmonise l’orthographe et les accords dans la documentation Storybook afin d’améliorer la lisibilité et éviter les coquilles dans les exemples.

Co-authored-by: Cursor <cursoragent@cursor.com>
jbdesbas and others added 8 commits May 13, 2026 14:33
Quand l'intégrateur force themeMode="light"/"dark", ce mode devient
autoritaire (ignore localStorage) et le bouton ThemeToggle est masqué :
l'utilisateur final ne peut plus contredire l'intention de l'intégrateur.

- context.ts : ajout de `isModeLocked` à ThemeContextValue
- ThemeProvider.tsx : `isModeLocked = modeProp !== 'auto'`, mode forcé
  prioritaire sur localStorage
- DashboardApp.tsx : JSDoc de `themeMode` précise le masquage auto
- +6 tests (suite thème 59/59 OK)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Sider.tsx : support du thème sombre (theme dynamique selon resolvedMode),
  bouton replier/déplier redessiné avec tooltip et attributs ARIA
  (aria-expanded/aria-controls), focus-visible visible, lien logo accessible,
  mention « Développé par » repensée, repli auto sur mobile, respect de
  prefers-reduced-motion
- ThemeToggle.tsx : props `block` et `showLabel` pour l'intégration dans la
  colonne du footer de la sidebar
- base.ts : token Tooltip.paddingXS=12 pour des infobulles cohérentes

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Composant PartnerLogo : lien sécurisé (target _blank + rel noopener)
  seulement si une URL est fournie, sinon image seule ; hauteur uniforme
  (48px, objectFit contain), images lazy/non draggables
- Indicateur de scroll : dégradé + flou animés (apparition, bob au survol),
  respect de prefers-reduced-motion, couleurs basées sur les tokens
- Slider : défilement par page (slidesToScroll = slidesToShow), garde-fous
  Math.max(1, …), autoplay ralenti à 6s
- Aucun partenaire : zone logos masquée sans casser le footer
- Variante sans slider : logos en flex centrés et repliables

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- flèches de navigation externes (pilule [← | →]) pilotées via ref
- support de prefers-reduced-motion (coupe autoplay + glissement animé)
- hauteur de logo surchargeable par partenaire (Partner.height)
- seuils responsives centralisés (BREAKPOINTS) pour Slider et contrôles
- centrage vertical des logos + espace réservé aux dots

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ajoute un columnGap/rowGap basé sur les tokens du thème au Form inline
afin d'espacer automatiquement chaque contrôle (Année, Territoire, …).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jbdesbas jbdesbas added this to the 1.23 milestone Jun 11, 2026
lucilecollignon and others added 18 commits June 15, 2026 10:37
Introduit une couche de contraste (`contrast.ts`) et un hook
`useBrandForeground` qui utilise `colorPrimary` en avant-plan uniquement
là où elle atteint le seuil WCAG (3:1 UI / 4.5:1 texte), avec repli sur
`colorText` sinon — résolu au runtime contre la vraie surface, par mode.

Appliqué dans Footer (icône scroll), Sider (focus ring + item sélectionné),
LoadingContainer (icône empty) et via `AccessibleBrandButtons` dans le
ThemeProvider (hover des boutons `default`).

La surface de `VisualIdentityColors` est réduite à `colorPrimary` +
`colorLink` : AntD dérive les tokens restants automatiquement. Un
`console.warn` est émis à la création si la primaire échoue le contraste
WCAG sur la surface de référence du mode concerné.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Supprime la couche de rétrocompatibilité qui acceptait un ThemeConfig
Ant Design brut (avec console.warn de dépréciation) ainsi que le garde-fou
de mutuelle-exclusion theme/visualIdentity. L'API se réduit à
`theme: ThemeName` + `visualIdentity`. visualIdentity reste prioritaire.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Retire la constante exportée `default_theme` (plus consommée nulle part,
non ré-exportée depuis le barrel racine) et restreint la prop `theme` de
DashboardConfig à `ThemeName`. Nettoie l'import `ThemeConfig` devenu inutile.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Retire la constante `cardStyles` (styles figés, @deprecated) et son export.
Tous les composants consomment déjà `useCardStyles()`, dérivé des tokens du
thème actif (compatible light/dark).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ThemeProvider.test : supprime le describe de rétrocompatibilité
  (3 tests console.warn) ; conserve le test de robustesse null -> geo2france.
- ThemeProvider.visualIdentity.test : réécrit le test de mutuelle-exclusion
  en « visualIdentity prioritaire sur un preset theme » (sans console.error).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- CHANGELOG : remplace la section Deprecated par Removed (ThemeConfig brut,
  default_theme, cardStyles) et corrige l'exemple de migration.
- JOURNAL : objectif final recentré sur le fork (sans PR upstream ni npm),
  ajoute la Phase 7 « Nettoyage des béquilles » et met à jour le tableau d'état.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
 Prestation UI/UX L. Collignon (resolve confict)
@jbdesbas
jbdesbas marked this pull request as ready for review July 15, 2026 14:59
@jbdesbas jbdesbas self-assigned this Jul 15, 2026
@jbdesbas
jbdesbas merged commit d8484d8 into main Jul 15, 2026
4 of 6 checks passed
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.

2 participants