@synertech/ui 0.40.0 → 0.41.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.
@@ -156,6 +156,10 @@ import { cn } from "@synertech/ui";
156
156
  - `ScatterChart` - Corrélation entre deux variables numériques (3 séries max)
157
157
  - `StatCard` / `StatCardGroup` - Valeur unique avec variation et sparkline
158
158
  - `Sparkline` - Courbe sans axe, pour une cellule ou une carte
159
+ - `Heatmap` - Une grandeur sur une grille (jour × heure, cohortes, matrice)
160
+ - `BulletChart` - Réalisé, objectif et plages qualitatives sur une seule ligne
161
+ - `ChartFacets` - Petits multiples : un même graphique répété, à échelle partagée
162
+ - `ChartScaleLegend` - La légende d'une rampe de couleur
159
163
 
160
164
  ### Feedback & Overlays
161
165
 
@@ -586,6 +590,26 @@ const data = [
586
590
  showValues
587
591
  />
588
592
 
593
+ // Barres divergentes : l'écart à une référence
594
+ <BarChart
595
+ data={gaps}
596
+ x={{ key: "region" }}
597
+ series={[{ key: "gap" }]}
598
+ orientation="horizontal"
599
+ diverging // true | un nombre (le centre) | une clé de série
600
+ y={{ label: "Écart à la cible (%)" }}
601
+ />
602
+
603
+ // Échelle d'accord : la série nommée est à cheval sur le centre
604
+ <BarChart
605
+ data={survey}
606
+ x={{ key: "question" }}
607
+ series={[{ key: "awful" }, { key: "bad" }, { key: "ok" }, { key: "good" }, { key: "great" }]}
608
+ orientation="horizontal"
609
+ stack="stacked"
610
+ diverging="ok"
611
+ />
612
+
589
613
  // Camembert ou anneau
590
614
  <PieChart
591
615
  data={sources}
@@ -606,6 +630,46 @@ const data = [
606
630
  />
607
631
  ```
608
632
 
633
+ ```tsx
634
+ // Carte de chaleur — une ligne de données par case
635
+ <Heatmap
636
+ data={load} // [{ day, hour, sessions }, ...]
637
+ x={{ key: "hour", label: "Heure" }}
638
+ y={{ key: "day", label: "Jour" }}
639
+ value="sessions"
640
+ scale="sequential" // "sequential" | "diverging" (+ center)
641
+ steps={undefined} // la rampe reste continue tant qu'on ne la découpe pas
642
+ legendLabel="Sessions" // la légende d'échelle est affichée par défaut
643
+ showValues
644
+ tableView="toggle" // la grille pivotée : une ligne par catégorie de rangée
645
+ />
646
+
647
+ // Graphique à puce — réalisé, objectif, plages
648
+ <BulletChart
649
+ data={[{ measure: "Revenu", value: 38400, target: 42000, bands: [20000, 34000, 50000] }]}
650
+ x={{ key: "measure" }}
651
+ value="value"
652
+ target="target"
653
+ ranges="bands" // bornes croissantes, peintes en gris derrière la barre
654
+ normalize="row" // "row" (par défaut) | "shared" → ramène l'axe des valeurs
655
+ />
656
+
657
+ // Petits multiples — le domaine est calculé sur l'ensemble et imposé à chaque panneau
658
+ <ChartFacets data={rows} by="region" values={["revenue"]} columns={3}>
659
+ {({ data, domain, label }) => (
660
+ <LineChart
661
+ data={data}
662
+ series={[{ key: "revenue" }]}
663
+ x={{ key: "month" }}
664
+ y={{ domain }} // ← toujours le passer, c'est tout l'intérêt
665
+ plotLabel={label}
666
+ height={130}
667
+ legend={false}
668
+ />
669
+ )}
670
+ </ChartFacets>
671
+ ```
672
+
609
673
  **Ce que les composants refusent de faire, et pourquoi :**
610
674
 
611
675
  - **Pas de second axe Y.** Deux mesures d'échelles différentes inventent une
@@ -617,6 +681,16 @@ const data = [
617
681
  Un nuage de points s'arrête à 3 séries.
618
682
  - **`PieChart` n'est pas fait pour comparer des valeurs proches** — l'œil compare
619
683
  mal des angles. Deux parts, c'est une `StatCard`.
684
+ - **La palette catégorielle ne peint pas une grandeur.** Les huit créneaux
685
+ répondent à « lequel » ; une rampe répond à « combien ». Dès qu'une couleur
686
+ encode une grandeur, la légende d'échelle est obligatoire.
687
+ - **Une `Heatmap` ne se découpe pas au-delà de 7 classes de couleur** — les cases
688
+ voisines cessent d'être distinguables. Sans `steps`, la rampe reste continue.
689
+ - **Les panneaux d'un `ChartFacets` partagent leur domaine.** Des échelles libres
690
+ ont l'air comparables et ne le sont pas : passez toujours le `domain` reçu.
691
+ - **La rampe divergente dit un sens, pas un jugement.** « Au-dessus » n'est pas
692
+ « bon » : un délai qui glisse est au-dessus. Le jugement appartient aux
693
+ couleurs de statut, toujours accompagnées d'un libellé.
620
694
 
621
695
  ### Cartes KPI
622
696
 
@@ -653,9 +727,18 @@ tout le kit sur une charte :
653
727
  --color-chart-1: #0f766e;
654
728
  --color-chart-2: #b45309;
655
729
  /* ... jusqu'à 8 */
730
+
731
+ /* Les trois rampes de grandeur, si le kit en affiche */
732
+ --color-chart-seq-1: #e0f2f1; /* ... jusqu'à 6, du clair au foncé */
733
+ --color-chart-ord-1: #4db6ac; /* ... jusqu'à 5, paliers ordonnés */
734
+ --color-chart-div-1: #00695c; /* ... jusqu'à 7, milieu neutre au 4 */
656
735
  }
657
736
  ```
658
737
 
738
+ Redéfinissez-les aussi sous `:root.dark` / `[data-theme="dark"]` : les rampes
739
+ sombres du kit ne sont pas les claires éclaircies, elles courent en sens inverse
740
+ (sur fond sombre, « plus » doit s'éloigner du fond).
741
+
659
742
  ### Card (Composable)
660
743
 
661
744
  ```tsx