@webority/theme 0.39.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.
@@ -607,7 +607,7 @@ textarea.form-control.autosize {
607
607
  color: var(--color-text);
608
608
  }
609
609
  .num-stepper-btns button:active {
610
- color: var(--color-primary);
610
+ color: var(--color-primary-ink);
611
611
  }
612
612
  .input-date-wrap > .input {
613
613
  padding-right: 38px;
@@ -701,7 +701,7 @@ $wui-field-error-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/
701
701
  padding-left: 40px;
702
702
  }
703
703
  .input-icon:focus-within > .ic {
704
- color: var(--color-primary);
704
+ color: var(--color-primary-ink);
705
705
  }
706
706
 
707
707
  // Trailing action beside the field — a control (a labelled button, or a confirmation once the
@@ -751,7 +751,7 @@ $wui-field-error-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/
751
751
  background 0.12s ease;
752
752
  }
753
753
  .pw-toggle:hover {
754
- color: var(--color-primary);
754
+ color: var(--color-primary-ink);
755
755
  background: transparent;
756
756
  }
757
757
  .pw-toggle:focus-visible {
@@ -912,7 +912,7 @@ $wui-field-error-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/
912
912
  transform: translateY(-50%) scale(0.86);
913
913
  }
914
914
  .field-float .input:focus ~ .float-label {
915
- color: var(--color-primary);
915
+ color: var(--color-primary-ink);
916
916
  }
917
917
  .field-float .input.error ~ .float-label {
918
918
  color: var(--color-danger-text);
@@ -937,7 +937,7 @@ $wui-field-error-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/
937
937
  }
938
938
  .field-float:has(.search-select-control:focus) .float-label,
939
939
  .field-float:has(.search-select-control.open) .float-label {
940
- color: var(--color-primary);
940
+ color: var(--color-primary-ink);
941
941
  // The control turns white while focused/open, so the label mask follows (a filled-but-closed
942
942
  // select keeps the default muted mask, matching its muted resting fill).
943
943
  background: var(--color-surface);
@@ -1243,15 +1243,15 @@ wui-select[compact] {
1243
1243
  flex: none;
1244
1244
  }
1245
1245
  .num-btn:hover:not(:disabled) {
1246
- color: var(--color-primary);
1246
+ color: var(--color-primary-ink);
1247
1247
  background: var(--color-bg-muted);
1248
1248
  }
1249
1249
  .num-btn:focus-visible {
1250
1250
  outline: none;
1251
- color: var(--color-primary);
1251
+ color: var(--color-primary-ink);
1252
1252
  }
1253
1253
  .num-btn:active:not(:disabled) {
1254
- color: color-mix(in srgb, var(--color-primary) 80%, black);
1254
+ color: color-mix(in srgb, var(--color-primary-ink) 80%, black);
1255
1255
  }
1256
1256
  .num-btn:disabled {
1257
1257
  color: var(--color-text-subtle);
@@ -1320,7 +1320,7 @@ wui-select[compact] {
1320
1320
  border: 1px solid var(--color-border);
1321
1321
  }
1322
1322
  .badge-primary {
1323
- @include wui-tone-pill-colors(primary, var(--color-primary));
1323
+ @include wui-tone-pill-colors(primary, var(--color-primary-ink));
1324
1324
  border-color: color-mix(in srgb, var(--color-primary) 25%, transparent);
1325
1325
  }
1326
1326
  .badge-success {
@@ -1373,7 +1373,7 @@ wui-select[compact] {
1373
1373
  @include wui-tone-pill-colors(info);
1374
1374
  }
1375
1375
  .status-label.primary {
1376
- @include wui-tone-pill-colors(primary, var(--color-primary));
1376
+ @include wui-tone-pill-colors(primary, var(--color-primary-ink));
1377
1377
  }
1378
1378
  // Default/neutral — also the bare `.status-label` look, so an unknown or omitted
1379
1379
  // tone still renders as a proper pill instead of transparent text.
@@ -1423,7 +1423,7 @@ wui-select[compact] {
1423
1423
  // full-strength primary line (they read as the same selection language).
1424
1424
  border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
1425
1425
  background: var(--color-primary-soft);
1426
- color: var(--color-primary);
1426
+ color: var(--color-primary-ink);
1427
1427
  }
1428
1428
 
1429
1429
  // A count badge inside a selectable chip — "Active 12". Inverts on selection for
@@ -1439,7 +1439,7 @@ wui-select[compact] {
1439
1439
  }
1440
1440
  .choice-chip.checked .count {
1441
1441
  background: var(--color-surface);
1442
- color: var(--color-primary);
1442
+ color: var(--color-primary-ink);
1443
1443
  }
1444
1444
 
1445
1445
  // Size scale (`size`): padding, gap and font step together; md is the base above.
@@ -44,7 +44,7 @@
44
44
  height: 48px;
45
45
  border-radius: var(--radius-lg);
46
46
  background: var(--color-primary-soft);
47
- color: var(--color-primary);
47
+ color: var(--color-primary-ink);
48
48
  display: inline-flex;
49
49
  align-items: center;
50
50
  justify-content: center;
@@ -69,7 +69,7 @@
69
69
  height: 50px;
70
70
  border-radius: 50%;
71
71
  background: color-mix(in srgb, var(--color-primary) 10%, transparent);
72
- color: var(--color-primary);
72
+ color: var(--color-primary-ink);
73
73
  margin-bottom: 16px;
74
74
  }
75
75
  .tbl-empty-title {
@@ -511,17 +511,37 @@
511
511
  }
512
512
  // Facets size themselves: a select, multi-select or date range takes about 180 to 240px and the
513
513
  // search box a wider 260 to 320px, so they wrap as a compact row instead of stacking at full
514
- // width. Segments keep their own width.
515
- .wui-filter-bar > .field {
514
+ // width. Segments keep their own width. A date range is the bare custom element, not a .field,
515
+ // and on its own it fills its line.
516
+ .wui-filter-bar > .field,
517
+ .wui-filter-bar > wui-date-range {
516
518
  flex: 1 1 180px;
517
519
  min-width: 0;
518
520
  max-width: 240px;
519
521
  }
522
+ .wui-filter-bar > wui-date-range .daterange {
523
+ width: 100%;
524
+ }
520
525
  .wui-filter-bar > .search-wrap {
521
526
  flex: 1 1 260px;
522
527
  min-width: 0;
523
528
  max-width: 320px;
524
529
  }
530
+ // The Razor bar sits in a GET form beside its Apply button. Its own box would take a whole
531
+ // line and push Apply below it, so the form lays the controls, chips, Clear all and Apply out
532
+ // as one row. `!important` beats the bar's d-flex utility, which React shares.
533
+ .wui-filter-form > .wui-filter-bar {
534
+ display: contents !important;
535
+ }
536
+ // On a phone each facet takes its own line; segments and buttons keep their width.
537
+ @media (max-width: 575.98px) {
538
+ .wui-filter-bar > .field,
539
+ .wui-filter-bar > wui-date-range,
540
+ .wui-filter-bar > .search-wrap {
541
+ flex-basis: 100%;
542
+ max-width: none;
543
+ }
544
+ }
525
545
 
526
546
  // Pagination footer: a "10 per page" menu beside the page buttons, flush under a table. No row
527
547
  // range and no total; the page buttons say where you are.
@@ -583,7 +603,7 @@
583
603
  }
584
604
  .tpg-arrow:hover:not(:disabled) {
585
605
  background: color-mix(in srgb, var(--color-primary) 10%, transparent);
586
- color: var(--color-primary);
606
+ color: var(--color-primary-ink);
587
607
  }
588
608
  .tpg-arrow:focus-visible {
589
609
  outline: 2px solid var(--color-primary);
@@ -618,7 +638,7 @@
618
638
  }
619
639
  .tpg-page:hover:not(.is-active) {
620
640
  background: color-mix(in srgb, var(--color-primary) 10%, transparent);
621
- color: var(--color-primary);
641
+ color: var(--color-primary-ink);
622
642
  }
623
643
  .tpg-page:focus-visible {
624
644
  outline: 2px solid var(--color-primary);
@@ -1084,7 +1104,7 @@
1084
1104
  }
1085
1105
  .u-action:hover:not(:disabled) {
1086
1106
  background: color-mix(in srgb, var(--color-primary) 10%, transparent);
1087
- color: var(--color-primary);
1107
+ color: var(--color-primary-ink);
1088
1108
  }
1089
1109
  .u-action:focus-visible {
1090
1110
  outline: 2px solid var(--color-primary);
@@ -1103,7 +1123,7 @@
1103
1123
  }
1104
1124
  .u-action.u-action-preview {
1105
1125
  background: var(--color-primary-soft);
1106
- color: var(--color-primary);
1126
+ color: var(--color-primary-ink);
1107
1127
  }
1108
1128
  .u-action.u-action-download {
1109
1129
  background: var(--color-success-soft);
@@ -1115,7 +1135,7 @@
1115
1135
  }
1116
1136
  .u-action.u-action-preview:hover:not(:disabled) {
1117
1137
  background: var(--color-primary-soft);
1118
- color: var(--color-primary);
1138
+ color: var(--color-primary-ink);
1119
1139
  }
1120
1140
  .u-action.u-action-download:hover:not(:disabled) {
1121
1141
  background: var(--color-success-soft);
@@ -1145,7 +1165,7 @@
1145
1165
  place-items: center;
1146
1166
  font-size: 16px;
1147
1167
  font-weight: 600;
1148
- color: var(--color-primary);
1168
+ color: var(--color-primary-ink);
1149
1169
  background: color-mix(in srgb, var(--color-primary) 20%, transparent);
1150
1170
  }
1151
1171
  .u-meta {
@@ -1218,7 +1238,7 @@
1218
1238
  .table th.sortable[aria-sort="ascending"] .sort-icon,
1219
1239
  .table th.sortable[aria-sort="descending"] .sort-icon {
1220
1240
  opacity: 1;
1221
- color: var(--color-primary);
1241
+ color: var(--color-primary-ink);
1222
1242
  }
1223
1243
  .table th.sortable[aria-sort="descending"] .sort-icon {
1224
1244
  transform: rotate(180deg);
@@ -54,14 +54,14 @@
54
54
  transition: color 0.12s ease;
55
55
  }
56
56
  .faq-q:hover {
57
- color: var(--color-primary);
57
+ color: var(--color-primary-ink);
58
58
  }
59
59
  .faq-q:focus-visible {
60
60
  outline: 2px solid var(--color-primary);
61
61
  outline-offset: -2px;
62
62
  }
63
63
  .faq-item.open .faq-q {
64
- color: var(--color-primary);
64
+ color: var(--color-primary-ink);
65
65
  }
66
66
  // Chevron rotates to point up when the pane is open.
67
67
  .faq-q-icon {
@@ -73,7 +73,7 @@
73
73
  }
74
74
  .faq-item.open .faq-q-icon {
75
75
  transform: rotate(180deg);
76
- color: var(--color-primary);
76
+ color: var(--color-primary-ink);
77
77
  }
78
78
 
79
79
  // The animating track. `min-height: 0` on the inner element is required — a grid
@@ -25,14 +25,14 @@
25
25
  margin-bottom: 12px;
26
26
  border-radius: 999px;
27
27
  background: var(--color-primary-soft);
28
- color: var(--color-primary);
28
+ color: var(--color-primary-ink);
29
29
  }
30
30
  // Tone modifiers — same semantic vocabulary as .badge/.status-label (success / warning /
31
31
  // danger / info / primary / neutral). primary is the default look above, restated here so
32
32
  // an explicit icon-tone="primary" matches an omitted one.
33
33
  .kpi-icon-primary {
34
34
  background: var(--color-primary-soft);
35
- color: var(--color-primary);
35
+ color: var(--color-primary-ink);
36
36
  }
37
37
  .kpi-icon-success {
38
38
  background: var(--color-success-soft);
@@ -107,7 +107,7 @@
107
107
  width: 48px;
108
108
  height: 16px;
109
109
  margin-top: 8px;
110
- color: var(--color-primary);
110
+ color: var(--color-primary-ink);
111
111
  }
112
112
  .kpi-sparkline polyline {
113
113
  stroke-width: 1.5;
@@ -292,7 +292,7 @@ a.kpi:focus-visible {
292
292
  place-items: center;
293
293
  border-radius: 999px;
294
294
  background: var(--color-primary-soft);
295
- color: var(--color-primary);
295
+ color: var(--color-primary-ink);
296
296
  }
297
297
  .info-meta {
298
298
  display: flex;
@@ -325,7 +325,7 @@ a.info-row:hover {
325
325
  text-decoration: none;
326
326
  }
327
327
  a.info-row:hover .info-value {
328
- color: var(--color-primary);
328
+ color: var(--color-primary-ink);
329
329
  text-decoration: underline;
330
330
  }
331
331
 
@@ -481,7 +481,7 @@ a.info-row:hover .info-value {
481
481
  white-space: nowrap;
482
482
  }
483
483
  .segmented-option:hover {
484
- color: var(--color-primary);
484
+ color: var(--color-primary-ink);
485
485
  }
486
486
  // A per-option sub-label under the main text — optional, so a segment without one keeps the
487
487
  // plain single-line layout above untouched.
@@ -510,7 +510,7 @@ a.info-row:hover .info-value {
510
510
  .segmented-option:has(.segmented-input:checked) {
511
511
  background: var(--segmented-selected-bg);
512
512
  box-shadow: inset 0 0 0 2px var(--color-primary);
513
- color: var(--color-primary);
513
+ color: var(--color-primary-ink);
514
514
  }
515
515
  // The ring is drawn on the label because the input it belongs to has no box.
516
516
  .segmented-option:has(.segmented-input:focus-visible) {
@@ -1008,7 +1008,7 @@ a.info-row:hover .info-value {
1008
1008
  }
1009
1009
  .compare-table th.is-highlight {
1010
1010
  background: var(--color-primary-soft);
1011
- color: var(--color-primary);
1011
+ color: var(--color-primary-ink);
1012
1012
  }
1013
1013
  .compare-table td.is-highlight {
1014
1014
  background: color-mix(in srgb, var(--color-primary) 4%, var(--color-surface));
@@ -1074,7 +1074,7 @@ a.info-row:hover .info-value {
1074
1074
  place-items: center;
1075
1075
  border-radius: 999px;
1076
1076
  background: var(--color-primary-soft);
1077
- color: var(--color-primary);
1077
+ color: var(--color-primary-ink);
1078
1078
  transition: background 0.3s var(--wui-ease-out-quart);
1079
1079
  }
1080
1080
  // On hover the card takes the soft tint, so the icon inverts to the surface
@@ -1097,7 +1097,7 @@ a.info-row:hover .info-value {
1097
1097
  transition: color 0.3s var(--wui-ease-out-quart);
1098
1098
  }
1099
1099
  .res-card:hover .res-card-title {
1100
- color: var(--color-primary);
1100
+ color: var(--color-primary-ink);
1101
1101
  }
1102
1102
  .res-card-text {
1103
1103
  margin-top: 2px;
@@ -1214,14 +1214,14 @@ a.info-row:hover .info-value {
1214
1214
  align-items: center;
1215
1215
  gap: 0.35em;
1216
1216
  position: relative;
1217
- color: var(--color-primary);
1217
+ color: var(--color-primary-ink);
1218
1218
  font-weight: 500;
1219
1219
  cursor: pointer;
1220
1220
  border-radius: 4px;
1221
1221
  transition: color 0.25s var(--wui-ease-out-quart);
1222
1222
  }
1223
1223
  .wui-link:hover {
1224
- color: var(--color-primary);
1224
+ color: var(--color-primary-ink);
1225
1225
  }
1226
1226
  .wui-link:focus-visible {
1227
1227
  outline: 2px solid var(--color-primary);
@@ -1356,7 +1356,7 @@ a.info-row:hover .info-value {
1356
1356
  }
1357
1357
  .wui-link--fade:hover,
1358
1358
  .wui-link--fade:focus-visible {
1359
- color: var(--color-primary);
1359
+ color: var(--color-primary-ink);
1360
1360
  }
1361
1361
 
1362
1362
  // static — the same thin single line, always visible (no text-decoration, so it matches
@@ -1489,6 +1489,6 @@ a.info-row:hover .info-value {
1489
1489
  .wui-link--shine .wui-link__label {
1490
1490
  background-image: none;
1491
1491
  -webkit-text-fill-color: var(--color-primary);
1492
- color: var(--color-primary);
1492
+ color: var(--color-primary-ink);
1493
1493
  }
1494
1494
  }
@@ -46,7 +46,7 @@ wui-dock {
46
46
  .dock-item:hover,
47
47
  .dock-item:focus-visible {
48
48
  background: var(--color-primary-soft);
49
- color: var(--color-primary);
49
+ color: var(--color-primary-ink);
50
50
  }
51
51
  .dock-item:focus-visible {
52
52
  outline: 2px solid var(--color-primary);
@@ -465,7 +465,7 @@ wui-file-viewer:fullscreen {
465
465
  height: 96px;
466
466
  border-radius: 50%;
467
467
  background: color-mix(in srgb, var(--color-primary) 12%, transparent);
468
- color: var(--color-primary);
468
+ color: var(--color-primary-ink);
469
469
  }
470
470
  .wui-file-viewer-controls {
471
471
  flex: 0 0 auto;
@@ -49,10 +49,10 @@
49
49
  // var fallbacks instead — which now also default to primary. :where() keeps this at ZERO
50
50
  // specificity, so a .wui-step-tone-* class or an inline --wui-step-* override still wins.
51
51
  :where(.stepper:not(.wizard-stepper)) {
52
- --wui-step-accent: var(--color-primary);
53
- --wui-step-accent-fg: var(--color-primary-text);
52
+ --wui-step-accent: var(--color-primary-ink);
53
+ --wui-step-accent-fg: var(--color-on-primary-ink);
54
54
  --wui-step-soft: var(--color-primary-soft);
55
- --wui-step-soft-fg: var(--color-primary);
55
+ --wui-step-soft-fg: var(--color-primary-ink);
56
56
  }
57
57
  .step {
58
58
  position: relative;
@@ -78,7 +78,7 @@
78
78
  z-index: 0;
79
79
  }
80
80
  .step.done + .step::before {
81
- background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
81
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
82
82
  }
83
83
  // The active circle's 4px ring would swallow the 4px gap, so both connectors touching the
84
84
  // active step start 4px further out and keep the same gap from the ring's edge.
@@ -104,18 +104,18 @@
104
104
  font-weight: 600;
105
105
  color: var(--color-text-subtle);
106
106
  }
107
- // An untoned wizard sets no --wui-step-* vars, so the ink fallback must pair with the primary
108
- // fill fallback: white on the dark theme's light primary is under AA.
107
+ // An untoned wizard sets no --wui-step-* vars, so the fallbacks fill with the primary ink (AA as
108
+ // text whatever the brand) under --color-on-primary-ink, which clears AA on it in both themes.
109
109
  .step.active .step-circle {
110
- border-color: var(--wui-step-accent, var(--color-primary));
111
- background: var(--wui-step-accent, var(--color-primary));
112
- color: var(--wui-step-accent-fg, var(--color-primary-text));
110
+ border-color: var(--wui-step-accent, var(--color-primary-ink));
111
+ background: var(--wui-step-accent, var(--color-primary-ink));
112
+ color: var(--wui-step-accent-fg, var(--color-on-primary-ink));
113
113
  box-shadow: 0 0 0 4px var(--wui-step-soft, var(--color-primary-soft));
114
114
  }
115
115
  .step.done .step-circle {
116
- border-color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
117
- background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
118
- color: var(--wui-step-done-accent-fg, var(--wui-step-accent-fg, var(--color-primary-text)));
116
+ border-color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
117
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
118
+ color: var(--wui-step-done-accent-fg, var(--wui-step-accent-fg, var(--color-on-primary-ink)));
119
119
  }
120
120
  .step-label {
121
121
  max-width: 130px;
@@ -152,7 +152,7 @@ button.step:hover .step-circle {
152
152
  }
153
153
  a.step:hover .step-label,
154
154
  button.step:hover .step-label {
155
- color: var(--wui-step-accent, var(--color-primary));
155
+ color: var(--wui-step-accent, var(--color-primary-ink));
156
156
  }
157
157
  a.step:focus-visible,
158
158
  button.step:focus-visible {
@@ -163,7 +163,7 @@ a.step:focus-visible .step-circle,
163
163
  button.step:focus-visible .step-circle {
164
164
  box-shadow:
165
165
  0 0 0 4px var(--wui-step-soft, var(--color-primary-soft)),
166
- 0 0 0 6px var(--wui-step-accent, var(--color-primary));
166
+ 0 0 0 6px var(--wui-step-accent, var(--color-primary-ink));
167
167
  }
168
168
  // A completed step keeps its own colour while hovered or focused, so a done-tone step does
169
169
  // not flash the main accent. Unset, these resolve to the same accent as the rules above.
@@ -173,13 +173,13 @@ button.step.done:hover .step-circle {
173
173
  }
174
174
  a.step.done:hover .step-label,
175
175
  button.step.done:hover .step-label {
176
- color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
176
+ color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
177
177
  }
178
178
  a.step.done:focus-visible .step-circle,
179
179
  button.step.done:focus-visible .step-circle {
180
180
  box-shadow:
181
181
  0 0 0 4px var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft))),
182
- 0 0 0 6px var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
182
+ 0 0 0 6px var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
183
183
  }
184
184
  // A step that failed its stage — a red circle with an alert, so an invalid step
185
185
  // reads as wrong at a glance rather than merely "not done".
@@ -236,11 +236,11 @@ button.step.done:focus-visible .step-circle {
236
236
  }
237
237
  .stepper-journey .step.done .step-circle {
238
238
  background: var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft)));
239
- color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
239
+ color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary-ink)));
240
240
  }
241
241
  .stepper-journey .step.active .step-circle {
242
- background: var(--wui-step-accent, var(--color-primary));
243
- color: var(--wui-step-accent-fg, var(--color-primary-text));
242
+ background: var(--wui-step-accent, var(--color-primary-ink));
243
+ color: var(--wui-step-accent-fg, var(--color-on-primary-ink));
244
244
  box-shadow: none;
245
245
  transform: scale(1.06);
246
246
  }
@@ -261,10 +261,10 @@ button.step.done:focus-visible .step-circle {
261
261
  color: var(--color-text-subtle);
262
262
  }
263
263
  .stepper-journey .step.done .step-index {
264
- color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
264
+ color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary-ink)));
265
265
  }
266
266
  .stepper-journey .step.active .step-index {
267
- color: var(--wui-step-accent, var(--color-primary));
267
+ color: var(--wui-step-accent, var(--color-primary-ink));
268
268
  }
269
269
  .stepper-journey .step.error .step-circle {
270
270
  background: var(--color-danger-soft);
@@ -309,7 +309,7 @@ button.step.done:focus-visible .step-circle {
309
309
  background: var(--color-border-strong);
310
310
  }
311
311
  .stepper-journey .step-line.done {
312
- background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
312
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
313
313
  }
314
314
  // Below xl the four label+title pairs no longer fit side by side, so the bar
315
315
  // becomes a vertical list and the connectors go away.
@@ -387,7 +387,7 @@ button.step.done:focus-visible .step-circle {
387
387
  z-index: 0;
388
388
  }
389
389
  .stepper-vertical .step.done:not(:last-child)::after {
390
- background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
390
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
391
391
  }
392
392
  // The journey bar stacked vertically reuses its own narrow-width treatment: a plain
393
393
  // column with the horizontal connectors dropped (a real vertical rail here would
@@ -429,8 +429,8 @@ button.step.done:focus-visible .step-circle {
429
429
  // active badge, a soft-primary done badge, a primary rail. Every colour routes through the
430
430
  // shared --wui-step-* vars, so a `.wui-step-tone-*` class or an override recolours it.
431
431
  .stepper-icons .step.active .step-circle {
432
- background: var(--wui-step-accent, var(--color-primary));
433
- color: var(--wui-step-accent-fg, var(--color-primary-text));
432
+ background: var(--wui-step-accent, var(--color-primary-ink));
433
+ color: var(--wui-step-accent-fg, var(--color-on-primary-ink));
434
434
  // The compact variant rings the active circle; here the solid fill carries it, so
435
435
  // drop the ring to match the flat badge look.
436
436
  box-shadow: none;
@@ -438,7 +438,7 @@ button.step.done:focus-visible .step-circle {
438
438
  .stepper-icons .step.done .step-circle {
439
439
  border: none;
440
440
  background: var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft)));
441
- color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
441
+ color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary-ink)));
442
442
  }
443
443
  .stepper-icons .step.error .step-circle {
444
444
  background: var(--color-danger-soft);
@@ -460,10 +460,10 @@ button.step.done:focus-visible .step-circle {
460
460
  color: var(--color-text-subtle);
461
461
  }
462
462
  .stepper-icons .step.active .step-index {
463
- color: var(--wui-step-accent, var(--color-primary));
463
+ color: var(--wui-step-accent, var(--color-primary-ink));
464
464
  }
465
465
  .stepper-icons .step.done .step-index {
466
- color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
466
+ color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary-ink)));
467
467
  }
468
468
  .stepper-icons .step.error .step-index {
469
469
  color: var(--color-danger-text);
@@ -489,7 +489,7 @@ button.step.done:focus-visible .step-circle {
489
489
  background: var(--wui-step-connector, var(--color-border));
490
490
  }
491
491
  .stepper-icons .step.done + .step::before {
492
- background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
492
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
493
493
  }
494
494
  // The compact hover ring is calibrated to the 28px badge; the 56px icon badge just
495
495
  // lifts on hover instead.
@@ -542,10 +542,10 @@ button.step.done:focus-visible .step-circle {
542
542
  // class recolours every variant consistently; error steps stay red regardless (semantic).
543
543
  // ----------------------------------------------------------------------------
544
544
  .wui-step-tone-primary {
545
- --wui-step-accent: var(--color-primary);
546
- --wui-step-accent-fg: var(--color-primary-text);
545
+ --wui-step-accent: var(--color-primary-ink);
546
+ --wui-step-accent-fg: var(--color-on-primary-ink);
547
547
  --wui-step-soft: var(--color-primary-soft);
548
- --wui-step-soft-fg: var(--color-primary);
548
+ --wui-step-soft-fg: var(--color-primary-ink);
549
549
  }
550
550
  // Like primary, each tone fills with its deep shade (the -text token) under white ink in light mode,
551
551
  // and with the bright fill under near-black ink in dark mode; both pairs clear AA.
@@ -580,10 +580,10 @@ button.step.done:focus-visible .step-circle {
580
580
  // Error and skipped steps keep their own look.
581
581
  // ----------------------------------------------------------------------------
582
582
  .wui-step-done-tone-primary {
583
- --wui-step-done-accent: var(--color-primary);
584
- --wui-step-done-accent-fg: var(--color-primary-text);
583
+ --wui-step-done-accent: var(--color-primary-ink);
584
+ --wui-step-done-accent-fg: var(--color-on-primary-ink);
585
585
  --wui-step-done-soft: var(--color-primary-soft);
586
- --wui-step-done-soft-fg: var(--color-primary);
586
+ --wui-step-done-soft-fg: var(--color-primary-ink);
587
587
  }
588
588
  .wui-step-done-tone-success {
589
589
  --wui-step-done-accent: var(--color-success-text);
@@ -765,7 +765,7 @@ button.step.done:focus-visible .step-circle {
765
765
  .plan-feature-icon {
766
766
  flex: none;
767
767
  margin-top: 2px;
768
- color: var(--color-primary);
768
+ color: var(--color-primary-ink);
769
769
  }
770
770
  // A feature the tier does NOT include, kept in the list so every card has the
771
771
  // same rows and the columns line up when read across.
@@ -851,7 +851,7 @@ button.step.done:focus-visible .step-circle {
851
851
  place-items: center;
852
852
  border-radius: var(--radius-sm);
853
853
  background: var(--color-primary-soft);
854
- color: var(--color-primary);
854
+ color: var(--color-primary-ink);
855
855
  font-size: 12px;
856
856
  font-weight: 700;
857
857
  }
@@ -35,7 +35,7 @@
35
35
  height: var(--avatar-size, 32px);
36
36
  border-radius: 999px;
37
37
  background: color-mix(in srgb, var(--color-primary) 15%, var(--color-surface));
38
- color: var(--color-primary);
38
+ color: var(--color-primary-ink);
39
39
  font-size: calc(var(--avatar-size, 32px) * 0.375);
40
40
  font-weight: 600;
41
41
  display: inline-flex;
@@ -329,7 +329,7 @@
329
329
  justify-content: center;
330
330
  border-radius: 999px;
331
331
  background: var(--color-primary-soft);
332
- color: var(--color-primary);
332
+ color: var(--color-primary-ink);
333
333
  }
334
334
  .attach-drop:hover .attach-drop-icon {
335
335
  background: var(--color-surface);
@@ -358,7 +358,7 @@
358
358
  flex: 0 0 auto;
359
359
  font-size: 12px;
360
360
  font-weight: 600;
361
- color: var(--color-primary);
361
+ color: var(--color-primary-ink);
362
362
  border: 1px solid var(--color-border);
363
363
  border-radius: 999px;
364
364
  padding: 5px 14px;
@@ -478,7 +478,7 @@
478
478
  border-radius: var(--radius);
479
479
  overflow: hidden;
480
480
  background: var(--color-bg-muted);
481
- color: var(--color-primary);
481
+ color: var(--color-primary-ink);
482
482
  }
483
483
  .attach-item-media img {
484
484
  width: 100%;
@@ -705,7 +705,7 @@
705
705
  height: 54px;
706
706
  border-radius: 50%;
707
707
  background: var(--color-primary-soft);
708
- color: var(--color-primary);
708
+ color: var(--color-primary-ink);
709
709
  transition: transform 0.15s ease;
710
710
  }
711
711
  .file-input.file-input-tall.dragging .file-input-icon {
@@ -717,7 +717,7 @@
717
717
  color: var(--color-text);
718
718
  }
719
719
  .file-input-title .browse {
720
- color: var(--color-primary);
720
+ color: var(--color-primary-ink);
721
721
  }
722
722
  .file-input.file-input-tall .file-input-text {
723
723
  padding: 0;
@@ -887,7 +887,7 @@
887
887
  align-items: center;
888
888
  justify-content: center;
889
889
  background: color-mix(in srgb, var(--color-surface) 65%, transparent);
890
- color: var(--color-primary);
890
+ color: var(--color-primary-ink);
891
891
  cursor: progress;
892
892
  }
893
893
 
@@ -943,7 +943,7 @@
943
943
  font-size: calc(var(--wui-logo-size) * 0.32);
944
944
  font-weight: 700;
945
945
  letter-spacing: -0.02em;
946
- color: var(--color-primary);
946
+ color: var(--color-primary-ink);
947
947
  background: var(--color-primary-soft);
948
948
  }
949
949
  // Avatar variant — the standard avatar disc (muted fill) instead of the soft-primary