@sentropic/design-system-vue 0.10.0 → 0.12.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.
Files changed (47) hide show
  1. package/dist/ComboChart.d.ts +119 -0
  2. package/dist/ComboChart.d.ts.map +1 -0
  3. package/dist/ComboChart.js +280 -0
  4. package/dist/ComboChart.js.map +1 -0
  5. package/dist/ForceGraph.d.ts +104 -0
  6. package/dist/ForceGraph.d.ts.map +1 -1
  7. package/dist/ForceGraph.js +193 -4
  8. package/dist/ForceGraph.js.map +1 -1
  9. package/dist/FunnelChart.d.ts +103 -0
  10. package/dist/FunnelChart.d.ts.map +1 -0
  11. package/dist/FunnelChart.js +191 -0
  12. package/dist/FunnelChart.js.map +1 -0
  13. package/dist/GaugeChart.d.ts +134 -0
  14. package/dist/GaugeChart.d.ts.map +1 -0
  15. package/dist/GaugeChart.js +152 -0
  16. package/dist/GaugeChart.js.map +1 -0
  17. package/dist/KpiCard.d.ts +151 -0
  18. package/dist/KpiCard.d.ts.map +1 -0
  19. package/dist/KpiCard.js +155 -0
  20. package/dist/KpiCard.js.map +1 -0
  21. package/dist/SelectableList.d.ts +98 -0
  22. package/dist/SelectableList.d.ts.map +1 -0
  23. package/dist/SelectableList.js +174 -0
  24. package/dist/SelectableList.js.map +1 -0
  25. package/dist/SelectableRow.d.ts +140 -0
  26. package/dist/SelectableRow.d.ts.map +1 -0
  27. package/dist/SelectableRow.js +130 -0
  28. package/dist/SelectableRow.js.map +1 -0
  29. package/dist/TimePicker.d.ts +1 -1
  30. package/dist/TreemapChart.d.ts +95 -0
  31. package/dist/TreemapChart.d.ts.map +1 -0
  32. package/dist/TreemapChart.js +255 -0
  33. package/dist/TreemapChart.js.map +1 -0
  34. package/dist/WaterfallChart.d.ts +84 -0
  35. package/dist/WaterfallChart.d.ts.map +1 -0
  36. package/dist/WaterfallChart.js +186 -0
  37. package/dist/WaterfallChart.js.map +1 -0
  38. package/dist/chartScale.d.ts +4 -0
  39. package/dist/chartScale.d.ts.map +1 -1
  40. package/dist/chartScale.js +44 -0
  41. package/dist/chartScale.js.map +1 -1
  42. package/dist/index.d.ts +16 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +8 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/styles.css +851 -2
  47. package/package.json +1 -1
package/dist/styles.css CHANGED
@@ -809,7 +809,7 @@
809
809
  .st-chatMessage--failed .st-chatMessage__bubble {
810
810
  border-color: var(
811
811
  --st-component-chatMessage-errorBorder,
812
- var(--st-semantic-feedback-danger, #b91c1c)
812
+ var(--st-semantic-feedback-error, #b91c1c)
813
813
  );
814
814
  }
815
815
 
@@ -2395,6 +2395,14 @@
2395
2395
  .st-forceGraph__node { transition: opacity 120ms ease; }
2396
2396
  .st-forceGraph__node--dim { opacity: 0.3; }
2397
2397
 
2398
+ /* During a merge the opacity/transform are driven per-frame via rAF, so the
2399
+ CSS transitions are disabled to avoid a lag that would smear the glide. The
2400
+ fading/masked `from` node is also taken out of hit-testing so the invisible
2401
+ node cannot be hovered, focused or clicked. */
2402
+ .st-forceGraph__node--merging,
2403
+ .st-forceGraph__edge--merging { transition: none; }
2404
+ .st-forceGraph__node--merging { pointer-events: none; }
2405
+
2398
2406
  .st-forceGraph__dot {
2399
2407
  cursor: pointer;
2400
2408
  fill-opacity: 0.9;
@@ -2936,7 +2944,7 @@
2936
2944
  }
2937
2945
 
2938
2946
  .st-iconButton--danger {
2939
- color: var(--st-semantic-feedback-danger, #b91c1c);
2947
+ color: var(--st-semantic-feedback-error, #b91c1c);
2940
2948
  }
2941
2949
 
2942
2950
  .st-iconButton:hover:not(:disabled) {
@@ -8148,3 +8156,844 @@
8148
8156
  top: 50%;
8149
8157
  margin-top: -0.25rem;
8150
8158
  }
8159
+
8160
+ /* ---------------------------------------------------------------------------
8161
+ SelectableRow — compact, full-width selectable list/rail row. By DEFAULT the
8162
+ selected state is just two calm signals — a tinted surface + accented text —
8163
+ deliberately NOT the off-theme "boudin box" (inset box-shadow + heavy rounded
8164
+ border) it replaces, and NOT a reflow-causing font-weight bump. The fine left
8165
+ accent bar is OPT-IN via the `accentBar` prop / `--accentBar` modifier.
8166
+ --------------------------------------------------------------------------- */
8167
+ .st-selectableRow {
8168
+ align-items: center;
8169
+ background: transparent;
8170
+ border-radius: var(--st-radius-sm, 0.25rem);
8171
+ box-sizing: border-box;
8172
+ color: var(--st-semantic-text-secondary, #475569);
8173
+ cursor: pointer;
8174
+ display: flex;
8175
+ gap: var(--st-spacing-2, 0.5rem);
8176
+ padding: 0.5rem 0.75rem;
8177
+ position: relative;
8178
+ text-align: left;
8179
+ transition:
8180
+ background-color var(--st-motion-fast, 120ms) var(--st-motion-easing, ease),
8181
+ color var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
8182
+ user-select: none;
8183
+ width: 100%;
8184
+ }
8185
+
8186
+ /* Opt-in accent bar: reserve the 2px gutter only when enabled so text never
8187
+ shifts on selection. */
8188
+ .st-selectableRow--accentBar {
8189
+ padding-left: calc(0.75rem - 2px);
8190
+ border-left: 2px solid transparent;
8191
+ }
8192
+
8193
+ .st-selectableRow:hover:not(.st-selectableRow--disabled):not(.st-selectableRow--selected) {
8194
+ background: var(
8195
+ --st-component-control-hoverBackground,
8196
+ var(--st-semantic-surface-subtle, #f8fafc)
8197
+ );
8198
+ color: var(--st-semantic-text-primary, #0f172a);
8199
+ }
8200
+
8201
+ /* Focus ring as an EXTERNAL offset (not inset) so it reads as a focus
8202
+ affordance around the row rather than an inner stroke. */
8203
+ .st-selectableRow:focus-visible {
8204
+ outline: 2px solid var(--st-semantic-border-interactive, var(--st-semantic-action-primary));
8205
+ outline-offset: 2px;
8206
+ }
8207
+
8208
+ /* Selected: two signals by default — tinted surface + accented (contrast-safe)
8209
+ text. The token values carry a flat fallback; the inline color-mix is only a
8210
+ last-resort default when the token is unset. */
8211
+ .st-selectableRow--selected {
8212
+ background: var(
8213
+ --st-component-selectableRow-selectedBackground,
8214
+ color-mix(in oklch, var(--st-semantic-action-primary, #2563eb) 12%, transparent)
8215
+ );
8216
+ color: var(
8217
+ --st-component-selectableRow-selectedText,
8218
+ color-mix(in oklch, var(--st-semantic-action-primary, #2563eb) 78%, black)
8219
+ );
8220
+ }
8221
+
8222
+ /* The left accent bar paints only when opt-in AND selected. */
8223
+ .st-selectableRow--accentBar.st-selectableRow--selected {
8224
+ border-left-color: var(
8225
+ --st-component-selectableRow-selectedAccent,
8226
+ var(--st-semantic-action-primary, #2563eb)
8227
+ );
8228
+ }
8229
+
8230
+ /* color-mix fallback: engines without color-mix() get a flat tinted surface +
8231
+ a solid accent text from the resolved tokens' plain values. */
8232
+ @supports not (color: color-mix(in oklch, red, blue)) {
8233
+ .st-selectableRow--selected {
8234
+ background: var(
8235
+ --st-component-selectableRow-selectedBackground,
8236
+ var(--st-semantic-surface-subtle, #eef2ff)
8237
+ );
8238
+ color: var(
8239
+ --st-component-selectableRow-selectedText,
8240
+ var(--st-semantic-action-primary, #1d4ed8)
8241
+ );
8242
+ }
8243
+ }
8244
+
8245
+ .st-selectableRow--disabled {
8246
+ cursor: not-allowed;
8247
+ opacity: 0.55;
8248
+ }
8249
+
8250
+ .st-selectableRow__leading,
8251
+ .st-selectableRow__trailing {
8252
+ align-items: center;
8253
+ display: inline-flex;
8254
+ flex: 0 0 auto;
8255
+ }
8256
+
8257
+ .st-selectableRow__content {
8258
+ flex: 1 1 auto;
8259
+ min-width: 0;
8260
+ overflow: hidden;
8261
+ text-overflow: ellipsis;
8262
+ white-space: nowrap;
8263
+ }
8264
+
8265
+ @media (prefers-reduced-motion: reduce) {
8266
+ .st-selectableRow {
8267
+ transition: none;
8268
+ }
8269
+ }
8270
+
8271
+ /* ---------------------------------------------------------------------------
8272
+ SelectableList — accessible listbox wrapper owning a roving tabindex for its
8273
+ SelectableRow children (role=listbox → option).
8274
+ --------------------------------------------------------------------------- */
8275
+ .st-selectableList {
8276
+ display: flex;
8277
+ flex-direction: column;
8278
+ gap: var(--st-spacing-1, 0.25rem);
8279
+ width: 100%;
8280
+ }
8281
+
8282
+ /* ---------------------------------------------------------------------------
8283
+ KpiCard — single metric card with optional delta + sparkline.
8284
+ --------------------------------------------------------------------------- */
8285
+ .st-kpiCard {
8286
+ background: var(--st-component-card-background, var(--st-semantic-surface-raised));
8287
+ border-width: var(--st-component-card-anatomy-shape-borderWidth, 1px);
8288
+ border-style: var(--st-component-card-anatomy-shape-borderStyle, solid);
8289
+ border-color: var(--st-component-card-border, var(--st-semantic-border-subtle));
8290
+ border-radius: var(--st-component-card-anatomy-shape-radius, 0.5rem);
8291
+ box-shadow: var(--st-component-card-shadow, 0 1px 2px rgb(15 23 42 / 0.08));
8292
+ color: var(--st-semantic-text-primary);
8293
+ display: flex;
8294
+ flex-direction: column;
8295
+ gap: var(--st-spacing-2, 0.5rem);
8296
+ padding: var(--st-spacing-4, 1rem);
8297
+ }
8298
+
8299
+ .st-kpiCard--sm {
8300
+ gap: var(--st-spacing-1, 0.25rem);
8301
+ padding: var(--st-spacing-3, 0.75rem);
8302
+ }
8303
+
8304
+ .st-kpiCard--lg {
8305
+ gap: var(--st-spacing-3, 0.75rem);
8306
+ padding: var(--st-spacing-6, 1.5rem);
8307
+ }
8308
+
8309
+ /* Accent catégoriel : pastille inline discrète devant l'étiquette.
8310
+ (Pas de liseré gauche sur un conteneur arrondi — anti-pattern proscrit.) */
8311
+ .st-kpiCard__label {
8312
+ align-items: center;
8313
+ color: var(--st-semantic-text-secondary);
8314
+ display: flex;
8315
+ font-size: 0.8125rem;
8316
+ font-weight: 500;
8317
+ gap: var(--st-spacing-2, 0.5rem);
8318
+ line-height: 1.25;
8319
+ margin: 0;
8320
+ }
8321
+
8322
+ .st-kpiCard__swatch {
8323
+ background: var(--st-kpiCard-accent, var(--st-semantic-data-category1));
8324
+ border-radius: var(--st-radius-full, 9999px);
8325
+ display: inline-block;
8326
+ flex: 0 0 auto;
8327
+ height: 0.5rem;
8328
+ width: 0.5rem;
8329
+ }
8330
+
8331
+ .st-kpiCard--lg .st-kpiCard__label {
8332
+ font-size: 0.875rem;
8333
+ }
8334
+
8335
+ .st-kpiCard__value {
8336
+ align-items: baseline;
8337
+ color: var(--st-semantic-text-primary);
8338
+ display: flex;
8339
+ flex-wrap: wrap;
8340
+ gap: var(--st-spacing-1, 0.25rem);
8341
+ margin: 0;
8342
+ }
8343
+
8344
+ .st-kpiCard__number {
8345
+ font-size: 1.5rem;
8346
+ font-weight: 700;
8347
+ letter-spacing: 0;
8348
+ line-height: 1.1;
8349
+ }
8350
+
8351
+ .st-kpiCard--sm .st-kpiCard__number {
8352
+ font-size: 1.25rem;
8353
+ }
8354
+
8355
+ .st-kpiCard--lg .st-kpiCard__number {
8356
+ font-size: 2.25rem;
8357
+ }
8358
+
8359
+ .st-kpiCard__unit {
8360
+ color: var(--st-semantic-text-secondary);
8361
+ font-size: 0.875rem;
8362
+ font-weight: 500;
8363
+ }
8364
+
8365
+ .st-kpiCard__footer {
8366
+ align-items: center;
8367
+ display: flex;
8368
+ flex-wrap: wrap;
8369
+ gap: var(--st-spacing-3, 0.75rem);
8370
+ justify-content: space-between;
8371
+ }
8372
+
8373
+ .st-kpiCard__delta {
8374
+ align-items: center;
8375
+ display: inline-flex;
8376
+ font-size: 0.8125rem;
8377
+ font-weight: 600;
8378
+ gap: var(--st-spacing-1, 0.25rem);
8379
+ line-height: 1;
8380
+ }
8381
+
8382
+ .st-kpiCard__arrow {
8383
+ display: block;
8384
+ flex: 0 0 auto;
8385
+ }
8386
+
8387
+ .st-kpiCard__delta--up {
8388
+ color: var(--st-semantic-feedback-success);
8389
+ }
8390
+
8391
+ .st-kpiCard__delta--down {
8392
+ color: var(--st-semantic-feedback-error);
8393
+ }
8394
+
8395
+ .st-kpiCard__delta--flat {
8396
+ color: var(--st-semantic-text-secondary);
8397
+ }
8398
+
8399
+ .st-kpiCard--category1 { --st-kpiCard-accent: var(--st-semantic-data-category1); }
8400
+ .st-kpiCard--category2 { --st-kpiCard-accent: var(--st-semantic-data-category2); }
8401
+ .st-kpiCard--category3 { --st-kpiCard-accent: var(--st-semantic-data-category3); }
8402
+ .st-kpiCard--category4 { --st-kpiCard-accent: var(--st-semantic-data-category4); }
8403
+ .st-kpiCard--category5 { --st-kpiCard-accent: var(--st-semantic-data-category5); }
8404
+ .st-kpiCard--category6 { --st-kpiCard-accent: var(--st-semantic-data-category6); }
8405
+ .st-kpiCard--category7 { --st-kpiCard-accent: var(--st-semantic-data-category7); }
8406
+ .st-kpiCard--category8 { --st-kpiCard-accent: var(--st-semantic-data-category8); }
8407
+
8408
+ /* ---------------------------------------------------------------------------
8409
+ ComboChart — grouped bars on a left axis + lines on a right axis.
8410
+ --------------------------------------------------------------------------- */
8411
+ .st-comboChart {
8412
+ color: var(--st-semantic-text-secondary);
8413
+ display: block;
8414
+ font-family: inherit;
8415
+ position: relative;
8416
+ width: 100%;
8417
+ }
8418
+
8419
+ .st-comboChart svg {
8420
+ display: block;
8421
+ overflow: visible;
8422
+ }
8423
+
8424
+ .st-comboChart__visual {
8425
+ display: block;
8426
+ }
8427
+
8428
+ .st-comboChart__grid {
8429
+ stroke: var(--st-component-comboChart-gridStroke, var(--st-semantic-border-subtle));
8430
+ stroke-dasharray: 2 3;
8431
+ stroke-width: 1;
8432
+ opacity: 0.7;
8433
+ }
8434
+
8435
+ .st-comboChart__axis {
8436
+ stroke: var(--st-component-comboChart-axisStroke, var(--st-semantic-border-subtle));
8437
+ stroke-width: 1;
8438
+ }
8439
+
8440
+ .st-comboChart__tickLabel,
8441
+ .st-comboChart__categoryLabel {
8442
+ fill: var(--st-component-comboChart-labelColor, var(--st-semantic-text-secondary));
8443
+ font-size: 0.6875rem;
8444
+ }
8445
+
8446
+ .st-comboChart__axisLabel {
8447
+ fill: var(--st-component-comboChart-labelColor, var(--st-semantic-text-secondary));
8448
+ font-size: 0.6875rem;
8449
+ font-weight: 600;
8450
+ }
8451
+
8452
+ .st-comboChart__bar {
8453
+ cursor: pointer;
8454
+ transition: opacity 120ms ease;
8455
+ }
8456
+
8457
+ .st-comboChart__bar:hover {
8458
+ opacity: 0.82;
8459
+ }
8460
+
8461
+ .st-comboChart__bar--category1 { fill: var(--st-semantic-data-category1); }
8462
+ .st-comboChart__bar--category2 { fill: var(--st-semantic-data-category2); }
8463
+ .st-comboChart__bar--category3 { fill: var(--st-semantic-data-category3); }
8464
+ .st-comboChart__bar--category4 { fill: var(--st-semantic-data-category4); }
8465
+ .st-comboChart__bar--category5 { fill: var(--st-semantic-data-category5); }
8466
+ .st-comboChart__bar--category6 { fill: var(--st-semantic-data-category6); }
8467
+ .st-comboChart__bar--category7 { fill: var(--st-semantic-data-category7); }
8468
+ .st-comboChart__bar--category8 { fill: var(--st-semantic-data-category8); }
8469
+
8470
+ .st-comboChart__line--category1 { stroke: var(--st-semantic-data-category1); }
8471
+ .st-comboChart__line--category2 { stroke: var(--st-semantic-data-category2); }
8472
+ .st-comboChart__line--category3 { stroke: var(--st-semantic-data-category3); }
8473
+ .st-comboChart__line--category4 { stroke: var(--st-semantic-data-category4); }
8474
+ .st-comboChart__line--category5 { stroke: var(--st-semantic-data-category5); }
8475
+ .st-comboChart__line--category6 { stroke: var(--st-semantic-data-category6); }
8476
+ .st-comboChart__line--category7 { stroke: var(--st-semantic-data-category7); }
8477
+ .st-comboChart__line--category8 { stroke: var(--st-semantic-data-category8); }
8478
+
8479
+ .st-comboChart__dot {
8480
+ stroke: var(--st-semantic-surface-default);
8481
+ stroke-width: 1.5;
8482
+ cursor: pointer;
8483
+ transition: r 120ms ease;
8484
+ }
8485
+
8486
+ .st-comboChart__dot:hover {
8487
+ r: 5.5;
8488
+ }
8489
+
8490
+ .st-comboChart__dot--category1 { fill: var(--st-semantic-data-category1); }
8491
+ .st-comboChart__dot--category2 { fill: var(--st-semantic-data-category2); }
8492
+ .st-comboChart__dot--category3 { fill: var(--st-semantic-data-category3); }
8493
+ .st-comboChart__dot--category4 { fill: var(--st-semantic-data-category4); }
8494
+ .st-comboChart__dot--category5 { fill: var(--st-semantic-data-category5); }
8495
+ .st-comboChart__dot--category6 { fill: var(--st-semantic-data-category6); }
8496
+ .st-comboChart__dot--category7 { fill: var(--st-semantic-data-category7); }
8497
+ .st-comboChart__dot--category8 { fill: var(--st-semantic-data-category8); }
8498
+
8499
+ @media (prefers-reduced-motion: reduce) {
8500
+ .st-comboChart__bar,
8501
+ .st-comboChart__dot {
8502
+ transition: none;
8503
+ }
8504
+ }
8505
+
8506
+ .st-comboChart__legend {
8507
+ display: flex;
8508
+ flex-wrap: wrap;
8509
+ gap: var(--st-spacing-3, 0.75rem);
8510
+ list-style: none;
8511
+ margin: var(--st-spacing-2, 0.5rem) 0 0;
8512
+ padding: 0;
8513
+ }
8514
+
8515
+ .st-comboChart__legendItem {
8516
+ align-items: center;
8517
+ color: var(--st-semantic-text-secondary);
8518
+ display: inline-flex;
8519
+ font-size: 0.75rem;
8520
+ gap: var(--st-spacing-1, 0.25rem);
8521
+ }
8522
+
8523
+ .st-comboChart__legendSwatch {
8524
+ display: inline-block;
8525
+ flex: none;
8526
+ }
8527
+
8528
+ .st-comboChart__legendSwatch--bar {
8529
+ border-radius: 2px;
8530
+ height: 0.75rem;
8531
+ width: 0.75rem;
8532
+ }
8533
+
8534
+ .st-comboChart__legendSwatch--line {
8535
+ border-radius: 999px;
8536
+ height: 0.25rem;
8537
+ width: 1rem;
8538
+ }
8539
+
8540
+ .st-comboChart__legendSwatch--category1 { background: var(--st-semantic-data-category1); }
8541
+ .st-comboChart__legendSwatch--category2 { background: var(--st-semantic-data-category2); }
8542
+ .st-comboChart__legendSwatch--category3 { background: var(--st-semantic-data-category3); }
8543
+ .st-comboChart__legendSwatch--category4 { background: var(--st-semantic-data-category4); }
8544
+ .st-comboChart__legendSwatch--category5 { background: var(--st-semantic-data-category5); }
8545
+ .st-comboChart__legendSwatch--category6 { background: var(--st-semantic-data-category6); }
8546
+ .st-comboChart__legendSwatch--category7 { background: var(--st-semantic-data-category7); }
8547
+ .st-comboChart__legendSwatch--category8 { background: var(--st-semantic-data-category8); }
8548
+
8549
+ .st-comboChart__tooltip {
8550
+ background: var(--st-component-comboChart-tooltipBackground, var(--st-semantic-surface-inverse));
8551
+ border-radius: var(--st-radius-sm, 0.25rem);
8552
+ color: var(--st-component-comboChart-tooltipText, var(--st-semantic-text-inverse));
8553
+ display: inline-flex;
8554
+ flex-direction: column;
8555
+ font-size: 0.75rem;
8556
+ gap: 0.125rem;
8557
+ line-height: 1.2;
8558
+ padding: 0.375rem 0.5rem;
8559
+ pointer-events: none;
8560
+ position: absolute;
8561
+ transform: translate(-50%, calc(-100% - 8px));
8562
+ white-space: nowrap;
8563
+ z-index: 1;
8564
+ }
8565
+
8566
+ .st-comboChart__tooltipLabel {
8567
+ font-weight: 600;
8568
+ }
8569
+
8570
+ .st-comboChart__tooltipValue {
8571
+ opacity: 0.85;
8572
+ }
8573
+
8574
+ /* ---------------------------------------------------------------------------
8575
+ GaugeChart — radial meter with optional threshold bands and a needle.
8576
+ --------------------------------------------------------------------------- */
8577
+ .st-gaugeChart {
8578
+ color: var(--st-semantic-text-secondary);
8579
+ display: block;
8580
+ font-family: inherit;
8581
+ max-width: 100%;
8582
+ position: relative;
8583
+ }
8584
+
8585
+ .st-gaugeChart__visual,
8586
+ .st-gaugeChart svg {
8587
+ display: block;
8588
+ overflow: visible;
8589
+ }
8590
+
8591
+ .st-gaugeChart__track {
8592
+ stroke: var(--st-semantic-surface-subtle);
8593
+ stroke-linecap: round;
8594
+ }
8595
+
8596
+ .st-gaugeChart__band {
8597
+ stroke-linecap: butt;
8598
+ }
8599
+
8600
+ .st-gaugeChart__progress {
8601
+ stroke: var(--st-semantic-action-primary);
8602
+ stroke-linecap: round;
8603
+ transition: d var(--st-motion-fast, 200ms) var(--st-motion-easing, ease);
8604
+ }
8605
+
8606
+ .st-gaugeChart__needle {
8607
+ fill: var(--st-semantic-text-primary);
8608
+ transition: d var(--st-motion-fast, 200ms) var(--st-motion-easing, ease);
8609
+ }
8610
+
8611
+ .st-gaugeChart__hub {
8612
+ fill: var(--st-semantic-text-primary);
8613
+ }
8614
+
8615
+ .st-gaugeChart__value {
8616
+ fill: var(--st-semantic-text-primary);
8617
+ font-size: 1.5rem;
8618
+ font-variant-numeric: tabular-nums;
8619
+ font-weight: 700;
8620
+ }
8621
+
8622
+ .st-gaugeChart__label {
8623
+ fill: var(--st-semantic-text-secondary);
8624
+ font-size: 0.8125rem;
8625
+ font-weight: 500;
8626
+ }
8627
+
8628
+ .st-gaugeChart__band--neutral { stroke: var(--st-semantic-surface-subtle, var(--st-semantic-border-subtle)); }
8629
+ .st-gaugeChart__band--info { stroke: var(--st-semantic-feedback-info, var(--st-semantic-action-primary)); }
8630
+ .st-gaugeChart__band--success { stroke: var(--st-semantic-feedback-success); }
8631
+ .st-gaugeChart__band--warning { stroke: var(--st-semantic-feedback-warning); }
8632
+ .st-gaugeChart__band--error { stroke: var(--st-semantic-feedback-error); }
8633
+
8634
+ .st-gaugeChart__band--category1 { stroke: var(--st-semantic-data-category1); }
8635
+ .st-gaugeChart__band--category2 { stroke: var(--st-semantic-data-category2); }
8636
+ .st-gaugeChart__band--category3 { stroke: var(--st-semantic-data-category3); }
8637
+ .st-gaugeChart__band--category4 { stroke: var(--st-semantic-data-category4); }
8638
+ .st-gaugeChart__band--category5 { stroke: var(--st-semantic-data-category5); }
8639
+ .st-gaugeChart__band--category6 { stroke: var(--st-semantic-data-category6); }
8640
+ .st-gaugeChart__band--category7 { stroke: var(--st-semantic-data-category7); }
8641
+ .st-gaugeChart__band--category8 { stroke: var(--st-semantic-data-category8); }
8642
+
8643
+ @media (prefers-reduced-motion: reduce) {
8644
+ .st-gaugeChart__progress,
8645
+ .st-gaugeChart__needle {
8646
+ transition: none;
8647
+ }
8648
+ }
8649
+
8650
+ /* ---------------------------------------------------------------------------
8651
+ FunnelChart — decreasing trapezoid stages, vertical or horizontal.
8652
+ --------------------------------------------------------------------------- */
8653
+ .st-funnelChart {
8654
+ color: var(--st-semantic-text-secondary);
8655
+ display: block;
8656
+ font-family: inherit;
8657
+ position: relative;
8658
+ width: 100%;
8659
+ }
8660
+
8661
+ .st-funnelChart svg,
8662
+ .st-funnelChart__visual {
8663
+ display: block;
8664
+ overflow: visible;
8665
+ }
8666
+
8667
+ .st-funnelChart__segment {
8668
+ cursor: pointer;
8669
+ stroke: var(--st-semantic-surface-default, #fff);
8670
+ stroke-width: 1;
8671
+ transition: opacity 120ms ease;
8672
+ }
8673
+
8674
+ .st-funnelChart__segment--dim {
8675
+ opacity: 0.45;
8676
+ }
8677
+
8678
+ .st-funnelChart__segment--category1 { fill: var(--st-semantic-data-category1); }
8679
+ .st-funnelChart__segment--category2 { fill: var(--st-semantic-data-category2); }
8680
+ .st-funnelChart__segment--category3 { fill: var(--st-semantic-data-category3); }
8681
+ .st-funnelChart__segment--category4 { fill: var(--st-semantic-data-category4); }
8682
+ .st-funnelChart__segment--category5 { fill: var(--st-semantic-data-category5); }
8683
+ .st-funnelChart__segment--category6 { fill: var(--st-semantic-data-category6); }
8684
+ .st-funnelChart__segment--category7 { fill: var(--st-semantic-data-category7); }
8685
+ .st-funnelChart__segment--category8 { fill: var(--st-semantic-data-category8); }
8686
+
8687
+ /* Couleur de texte fixée inline par le composant selon la luminance du fill
8688
+ (contraste WCAG garanti) ; ces règles ne portent que la typo. */
8689
+ .st-funnelChart__label {
8690
+ font-size: 0.75rem;
8691
+ font-weight: 600;
8692
+ pointer-events: none;
8693
+ }
8694
+
8695
+ .st-funnelChart__value {
8696
+ font-size: 0.6875rem;
8697
+ pointer-events: none;
8698
+ }
8699
+
8700
+ .st-funnelChart__tooltip {
8701
+ background: var(--st-semantic-surface-inverse);
8702
+ border-radius: var(--st-radius-sm, 0.25rem);
8703
+ color: var(--st-semantic-text-inverse);
8704
+ display: inline-flex;
8705
+ flex-direction: column;
8706
+ font-size: 0.75rem;
8707
+ gap: 0.125rem;
8708
+ line-height: 1.2;
8709
+ padding: 0.375rem 0.5rem;
8710
+ pointer-events: none;
8711
+ position: absolute;
8712
+ transform: translate(-50%, calc(-100% - 8px));
8713
+ white-space: nowrap;
8714
+ z-index: 1;
8715
+ }
8716
+
8717
+ .st-funnelChart__tooltipLabel { font-weight: 600; }
8718
+ .st-funnelChart__tooltipValue { opacity: 0.85; }
8719
+
8720
+ .st-funnelChart__legend {
8721
+ display: flex;
8722
+ flex-wrap: wrap;
8723
+ gap: 0.75rem;
8724
+ list-style: none;
8725
+ margin: 0.5rem 0 0;
8726
+ padding: 0;
8727
+ }
8728
+
8729
+ .st-funnelChart__legendItem {
8730
+ align-items: center;
8731
+ color: var(--st-semantic-text-secondary);
8732
+ display: inline-flex;
8733
+ font-size: 0.75rem;
8734
+ gap: 0.35rem;
8735
+ }
8736
+
8737
+ .st-funnelChart__legendSwatch {
8738
+ border-radius: 2px;
8739
+ height: 0.7rem;
8740
+ width: 0.7rem;
8741
+ }
8742
+
8743
+ .st-funnelChart__legendSwatch--category1 { background: var(--st-semantic-data-category1); }
8744
+ .st-funnelChart__legendSwatch--category2 { background: var(--st-semantic-data-category2); }
8745
+ .st-funnelChart__legendSwatch--category3 { background: var(--st-semantic-data-category3); }
8746
+ .st-funnelChart__legendSwatch--category4 { background: var(--st-semantic-data-category4); }
8747
+ .st-funnelChart__legendSwatch--category5 { background: var(--st-semantic-data-category5); }
8748
+ .st-funnelChart__legendSwatch--category6 { background: var(--st-semantic-data-category6); }
8749
+ .st-funnelChart__legendSwatch--category7 { background: var(--st-semantic-data-category7); }
8750
+ .st-funnelChart__legendSwatch--category8 { background: var(--st-semantic-data-category8); }
8751
+
8752
+ @media (prefers-reduced-motion: reduce) {
8753
+ .st-funnelChart__segment {
8754
+ transition: none;
8755
+ }
8756
+ }
8757
+
8758
+ /* ---------------------------------------------------------------------------
8759
+ WaterfallChart — floating bars tracing a running cumulative total.
8760
+ --------------------------------------------------------------------------- */
8761
+ .st-waterfallChart {
8762
+ color: var(--st-semantic-text-secondary);
8763
+ display: block;
8764
+ font-family: inherit;
8765
+ position: relative;
8766
+ width: 100%;
8767
+ }
8768
+
8769
+ .st-waterfallChart svg {
8770
+ display: block;
8771
+ overflow: visible;
8772
+ }
8773
+
8774
+ .st-waterfallChart__visual {
8775
+ display: block;
8776
+ }
8777
+
8778
+ .st-waterfallChart__grid {
8779
+ stroke: var(--st-component-waterfallChart-gridStroke, var(--st-semantic-border-subtle));
8780
+ stroke-dasharray: 2 3;
8781
+ stroke-width: 1;
8782
+ opacity: 0.7;
8783
+ }
8784
+
8785
+ .st-waterfallChart__axis {
8786
+ stroke: var(--st-component-waterfallChart-axisStroke, var(--st-semantic-border-subtle));
8787
+ stroke-width: 1;
8788
+ }
8789
+
8790
+ .st-waterfallChart__zero {
8791
+ stroke: var(--st-component-waterfallChart-zeroStroke, var(--st-semantic-border-strong));
8792
+ stroke-width: 1;
8793
+ }
8794
+
8795
+ .st-waterfallChart__connector {
8796
+ stroke: var(--st-component-waterfallChart-connectorStroke, var(--st-semantic-border-strong));
8797
+ stroke-dasharray: 3 2;
8798
+ stroke-width: 1;
8799
+ opacity: 0.6;
8800
+ }
8801
+
8802
+ .st-waterfallChart__tickLabel,
8803
+ .st-waterfallChart__categoryLabel {
8804
+ fill: var(--st-component-waterfallChart-labelColor, var(--st-semantic-text-secondary));
8805
+ font-size: 0.6875rem;
8806
+ }
8807
+
8808
+ .st-waterfallChart__bar {
8809
+ cursor: pointer;
8810
+ transition: opacity 120ms ease;
8811
+ }
8812
+
8813
+ .st-waterfallChart__bar:hover {
8814
+ opacity: 0.82;
8815
+ }
8816
+
8817
+ .st-waterfallChart__bar--increase {
8818
+ fill: var(--st-component-waterfallChart-increaseFill, var(--st-semantic-feedback-success));
8819
+ }
8820
+ .st-waterfallChart__bar--decrease {
8821
+ fill: var(--st-component-waterfallChart-decreaseFill, var(--st-semantic-feedback-error));
8822
+ }
8823
+ .st-waterfallChart__bar--total {
8824
+ fill: var(--st-component-waterfallChart-totalFill, var(--st-semantic-data-category1));
8825
+ }
8826
+
8827
+ @media (prefers-reduced-motion: reduce) {
8828
+ .st-waterfallChart__bar {
8829
+ transition: none;
8830
+ }
8831
+ }
8832
+
8833
+ .st-waterfallChart__legend {
8834
+ display: flex;
8835
+ flex-wrap: wrap;
8836
+ gap: var(--st-spacing-3, 0.75rem);
8837
+ list-style: none;
8838
+ margin: var(--st-spacing-2, 0.5rem) 0 0;
8839
+ padding: 0;
8840
+ }
8841
+
8842
+ .st-waterfallChart__legendItem {
8843
+ align-items: center;
8844
+ color: var(--st-semantic-text-secondary);
8845
+ display: inline-flex;
8846
+ font-size: 0.75rem;
8847
+ gap: var(--st-spacing-1, 0.25rem);
8848
+ }
8849
+
8850
+ .st-waterfallChart__legendSwatch {
8851
+ border-radius: var(--st-radius-sm, 0.25rem);
8852
+ display: inline-block;
8853
+ height: 0.75rem;
8854
+ width: 0.75rem;
8855
+ }
8856
+
8857
+ .st-waterfallChart__legendSwatch--increase {
8858
+ background: var(--st-component-waterfallChart-increaseFill, var(--st-semantic-feedback-success));
8859
+ }
8860
+ .st-waterfallChart__legendSwatch--decrease {
8861
+ background: var(--st-component-waterfallChart-decreaseFill, var(--st-semantic-feedback-error));
8862
+ }
8863
+ .st-waterfallChart__legendSwatch--total {
8864
+ background: var(--st-component-waterfallChart-totalFill, var(--st-semantic-data-category1));
8865
+ }
8866
+
8867
+ .st-waterfallChart__tooltip {
8868
+ background: var(--st-component-waterfallChart-tooltipBackground, var(--st-semantic-surface-inverse));
8869
+ border-radius: var(--st-radius-sm, 0.25rem);
8870
+ color: var(--st-component-waterfallChart-tooltipText, var(--st-semantic-text-inverse));
8871
+ display: inline-flex;
8872
+ flex-direction: column;
8873
+ font-size: 0.75rem;
8874
+ gap: 0.125rem;
8875
+ line-height: 1.2;
8876
+ padding: 0.375rem 0.5rem;
8877
+ pointer-events: none;
8878
+ position: absolute;
8879
+ transform: translate(-50%, calc(-100% - 8px));
8880
+ white-space: nowrap;
8881
+ z-index: 1;
8882
+ }
8883
+
8884
+ .st-waterfallChart__tooltipLabel {
8885
+ font-weight: 600;
8886
+ }
8887
+
8888
+ .st-waterfallChart__tooltipValue {
8889
+ opacity: 0.85;
8890
+ }
8891
+
8892
+ /* ---------------------------------------------------------------------------
8893
+ TreemapChart — squarified hierarchical rectangles (1 or 2 levels).
8894
+ --------------------------------------------------------------------------- */
8895
+ .st-treemapChart {
8896
+ color: var(--st-semantic-text-secondary);
8897
+ display: block;
8898
+ font-family: inherit;
8899
+ position: relative;
8900
+ width: 100%;
8901
+ }
8902
+
8903
+ .st-treemapChart svg,
8904
+ .st-treemapChart__visual {
8905
+ display: block;
8906
+ overflow: visible;
8907
+ }
8908
+
8909
+ .st-treemapChart__rect {
8910
+ cursor: pointer;
8911
+ stroke: var(--st-semantic-surface-default, #fff);
8912
+ stroke-width: 1.5;
8913
+ transition: opacity 120ms ease;
8914
+ }
8915
+
8916
+ .st-treemapChart__rect--dim {
8917
+ opacity: 0.45;
8918
+ }
8919
+
8920
+ @media (prefers-reduced-motion: reduce) {
8921
+ .st-treemapChart__rect {
8922
+ transition: none;
8923
+ }
8924
+ }
8925
+
8926
+ .st-treemapChart__rect--category1 { fill: var(--st-semantic-data-category1); }
8927
+ .st-treemapChart__rect--category2 { fill: var(--st-semantic-data-category2); }
8928
+ .st-treemapChart__rect--category3 { fill: var(--st-semantic-data-category3); }
8929
+ .st-treemapChart__rect--category4 { fill: var(--st-semantic-data-category4); }
8930
+ .st-treemapChart__rect--category5 { fill: var(--st-semantic-data-category5); }
8931
+ .st-treemapChart__rect--category6 { fill: var(--st-semantic-data-category6); }
8932
+ .st-treemapChart__rect--category7 { fill: var(--st-semantic-data-category7); }
8933
+ .st-treemapChart__rect--category8 { fill: var(--st-semantic-data-category8); }
8934
+
8935
+ /* Couleur de texte fixée inline par le composant selon la luminance du fill
8936
+ (contraste WCAG garanti) ; ces règles ne portent que la typo. */
8937
+ .st-treemapChart__label {
8938
+ font-size: 0.75rem;
8939
+ font-weight: 600;
8940
+ pointer-events: none;
8941
+ }
8942
+
8943
+ .st-treemapChart__value {
8944
+ font-size: 0.6875rem;
8945
+ opacity: 0.85;
8946
+ pointer-events: none;
8947
+ }
8948
+
8949
+ .st-treemapChart__tooltip {
8950
+ background: var(--st-semantic-surface-inverse);
8951
+ border-radius: var(--st-radius-sm, 0.25rem);
8952
+ color: var(--st-semantic-text-inverse);
8953
+ display: inline-flex;
8954
+ flex-direction: column;
8955
+ font-size: 0.75rem;
8956
+ gap: 0.125rem;
8957
+ line-height: 1.2;
8958
+ padding: 0.375rem 0.5rem;
8959
+ pointer-events: none;
8960
+ position: absolute;
8961
+ transform: translate(-50%, calc(-100% - 8px));
8962
+ white-space: nowrap;
8963
+ z-index: 1;
8964
+ }
8965
+
8966
+ .st-treemapChart__tooltipLabel { font-weight: 600; }
8967
+ .st-treemapChart__tooltipValue { opacity: 0.85; }
8968
+
8969
+ .st-treemapChart__legend {
8970
+ display: flex;
8971
+ flex-wrap: wrap;
8972
+ gap: var(--st-spacing-3, 0.75rem);
8973
+ list-style: none;
8974
+ margin: var(--st-spacing-2, 0.5rem) 0 0;
8975
+ padding: 0;
8976
+ }
8977
+
8978
+ .st-treemapChart__legendItem {
8979
+ align-items: center;
8980
+ color: var(--st-semantic-text-secondary);
8981
+ display: inline-flex;
8982
+ font-size: 0.75rem;
8983
+ gap: var(--st-spacing-1, 0.35rem);
8984
+ }
8985
+
8986
+ .st-treemapChart__legendSwatch {
8987
+ border-radius: 2px;
8988
+ height: 0.7rem;
8989
+ width: 0.7rem;
8990
+ }
8991
+
8992
+ .st-treemapChart__legendSwatch--category1 { background: var(--st-semantic-data-category1); }
8993
+ .st-treemapChart__legendSwatch--category2 { background: var(--st-semantic-data-category2); }
8994
+ .st-treemapChart__legendSwatch--category3 { background: var(--st-semantic-data-category3); }
8995
+ .st-treemapChart__legendSwatch--category4 { background: var(--st-semantic-data-category4); }
8996
+ .st-treemapChart__legendSwatch--category5 { background: var(--st-semantic-data-category5); }
8997
+ .st-treemapChart__legendSwatch--category6 { background: var(--st-semantic-data-category6); }
8998
+ .st-treemapChart__legendSwatch--category7 { background: var(--st-semantic-data-category7); }
8999
+ .st-treemapChart__legendSwatch--category8 { background: var(--st-semantic-data-category8); }