@webority/theme 0.27.2 → 0.28.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/theme",
3
- "version": "0.27.2",
3
+ "version": "0.28.0",
4
4
  "description": "Webority shared design system — Bootstrap 5.3 SCSS overrides, --wui-* tokens, and shared component CSS. The single source of brand chrome for React portals and Razor sites.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {
@@ -1,4 +1,5 @@
1
1
  // Signal: an opt-in brand layer, a violet-primary palette with ink headings and a serif display face.
2
+ // Its dark mode is pure black with neutral grey surfaces; violet is kept for accents only.
2
3
  //
3
4
  // Loaded AFTER webority-theme.css; the default theme never contains these values. It re-points the
4
5
  // --wui-* tokens, then overrides the few Bootstrap values the theme compiles as literals (button
@@ -74,16 +75,17 @@
74
75
  --wui-shadow-overlay: 0 8px 28px -6px rgba(22, 9, 58, 0.16);
75
76
  --wui-shadow-overlay-lg: 0 24px 60px -16px rgba(22, 9, 58, 0.30);
76
77
 
77
- --wui-dark-bg-page: #120830;
78
- --wui-dark-bg-elevated: #0E0626;
79
- --wui-dark-bg-surface: #1A0F40;
80
- --wui-dark-bg-muted: #261853;
81
- --wui-dark-border: #35266B;
82
- --wui-dark-border-strong: #4B3A8A;
83
- --wui-dark-progress-track: #35266B;
84
- --wui-dark-text: #EDE9F8;
85
- --wui-dark-text-muted: #C2BADB;
86
- --wui-dark-text-subtle: #A59BC6;
78
+ // Dark mode is pure black and neutral grey; violet appears only on accents (fills, links, focus, selection marks).
79
+ --wui-dark-bg-page: #000000;
80
+ --wui-dark-bg-elevated: #0F0F0F;
81
+ --wui-dark-bg-surface: #161616;
82
+ --wui-dark-bg-muted: #1E1E1E;
83
+ --wui-dark-border: #2A2A2A;
84
+ --wui-dark-border-strong: #333333;
85
+ --wui-dark-progress-track: #333333;
86
+ --wui-dark-text: #EDEDED;
87
+ --wui-dark-text-muted: #C0C0C0;
88
+ --wui-dark-text-subtle: #A0A0A0;
87
89
  --wui-dark-primary: #A98BFF;
88
90
  --wui-dark-primary-hover: #BFA6FF;
89
91
 
@@ -146,18 +148,20 @@
146
148
 
147
149
  @mixin wui-signal-dark {
148
150
  --wui-signal-heading: #C4AEFF;
149
- --color-primary-soft: color-mix(in srgb, #A98BFF 20%, transparent);
151
+ // Selected, hover and highlight fills are a neutral lift; the violet stays on the text, border
152
+ // or edge that marks the state. check-contrast.mjs mirrors the 8%; change them together.
153
+ --color-primary-soft: color-mix(in srgb, #FFFFFF 8%, transparent);
150
154
  // Ink on the lilac fill (--color-primary): 8:1 or better.
151
155
  --color-primary-text: #16093A;
152
156
  --color-progress-label: #16093A;
153
- --bs-body-bg-rgb: 18, 8, 48;
154
- --bs-body-color-rgb: 237, 233, 248;
155
- --bs-emphasis-color-rgb: 237, 233, 248;
156
- --bs-secondary-color-rgb: 194, 186, 219;
157
- --bs-tertiary-color-rgb: 165, 155, 198;
158
- --bs-secondary-bg-rgb: 26, 15, 64;
159
- --bs-tertiary-bg-rgb: 38, 24, 83;
160
- --bs-border-color-rgb: 53, 38, 107;
157
+ --bs-body-bg-rgb: 0, 0, 0;
158
+ --bs-body-color-rgb: 237, 237, 237;
159
+ --bs-emphasis-color-rgb: 237, 237, 237;
160
+ --bs-secondary-color-rgb: 192, 192, 192;
161
+ --bs-tertiary-color-rgb: 160, 160, 160;
162
+ --bs-secondary-bg-rgb: 22, 22, 22;
163
+ --bs-tertiary-bg-rgb: 30, 30, 30;
164
+ --bs-border-color-rgb: 42, 42, 42;
161
165
  --bs-link-color: #A98BFF;
162
166
  --bs-link-color-rgb: 169, 139, 255;
163
167
  --bs-link-hover-color: #BFA6FF;
@@ -189,6 +193,35 @@
189
193
  :where(.stepper:not(.wizard-stepper)) {
190
194
  --wui-step-accent-fg: #16093A;
191
195
  }
196
+
197
+ // Components that mix their violet fill inline rather than through --color-primary-soft.
198
+ // :where(&) keeps each rule at the component's own specificity, so a tone variant still wins.
199
+ :where(&) .struct-card.checked,
200
+ :where(&) .tpg-arrow:hover:not(:disabled),
201
+ :where(&) .tpg-page:hover:not(.is-active),
202
+ :where(&) .u-action:hover:not(:disabled),
203
+ :where(&) .tbl-empty-icon,
204
+ :where(&) .u-avatar,
205
+ :where(&) .wui-file-viewer-audio-art {
206
+ background: var(--color-primary-soft);
207
+ }
208
+ :where(&) .wui-calendar-view-btn[aria-pressed="true"],
209
+ :where(&) .compare-table td.is-highlight {
210
+ background: color-mix(in srgb, #FFFFFF 8%, var(--color-surface));
211
+ }
212
+ :where(&) .segmented {
213
+ --segmented-selected-bg: color-mix(in srgb, #FFFFFF 8%, var(--color-surface));
214
+ }
215
+ :where(&) .table-ledger tbody tr.is-selected:hover {
216
+ --bs-table-bg-state: color-mix(in srgb, #FFFFFF 12%, transparent);
217
+ }
218
+ // A grey row alone reads as disabled; the violet edge says chosen. One step below the row status
219
+ // bar's specificity, so a status row keeps its own colour bar.
220
+ :where(&) .table-ledger tbody tr.is-selected > :first-child {
221
+ box-shadow:
222
+ inset 3px 0 0 0 var(--color-primary),
223
+ inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));
224
+ }
192
225
  }
193
226
 
194
227
  :root[data-theme="dark"],
@@ -20,6 +20,9 @@
20
20
  // --wui-step-soft soft tint (active ring; the journey/icons "done" badge bg)
21
21
  // --wui-step-soft-fg text/icon on the soft tint (the "done" badge check)
22
22
  // --wui-step-connector the incomplete-rail colour
23
+ // --wui-step-done-accent, --wui-step-done-accent-fg, --wui-step-done-soft,
24
+ // --wui-step-done-soft-fg the same four, for COMPLETED steps only (badge, "STEP n"
25
+ // eyebrow, filled rail). Unset, completed steps follow the accent.
23
26
  // --wui-step-size compact/vertical badge diameter (default 28px)
24
27
  // --wui-step-badge-size icons-variant badge diameter (default 56px)
25
28
  // Every variant defaults to the brand primary — active, done and rail share one accent
@@ -71,7 +74,7 @@
71
74
  z-index: 0;
72
75
  }
73
76
  .step.done + .step::before {
74
- background: var(--wui-step-accent, var(--color-primary));
77
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
75
78
  }
76
79
  .step-circle {
77
80
  position: relative;
@@ -95,9 +98,9 @@
95
98
  box-shadow: 0 0 0 4px var(--wui-step-soft, var(--color-primary-soft));
96
99
  }
97
100
  .step.done .step-circle {
98
- border-color: var(--wui-step-accent, var(--color-primary));
99
- background: var(--wui-step-accent, var(--color-primary));
100
- color: var(--wui-step-accent-fg, var(--color-on-scrim));
101
+ border-color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
102
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
103
+ color: var(--wui-step-done-accent-fg, var(--wui-step-accent-fg, var(--color-on-scrim)));
101
104
  }
102
105
  .step-label {
103
106
  max-width: 130px;
@@ -147,6 +150,22 @@ button.step:focus-visible .step-circle {
147
150
  0 0 0 4px var(--wui-step-soft, var(--color-primary-soft)),
148
151
  0 0 0 6px var(--wui-step-accent, var(--color-primary));
149
152
  }
153
+ // A completed step keeps its own colour while hovered or focused, so a done-tone step does
154
+ // not flash the main accent. Unset, these resolve to the same accent as the rules above.
155
+ a.step.done:hover .step-circle,
156
+ button.step.done:hover .step-circle {
157
+ box-shadow: 0 0 0 4px var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft)));
158
+ }
159
+ a.step.done:hover .step-label,
160
+ button.step.done:hover .step-label {
161
+ color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
162
+ }
163
+ a.step.done:focus-visible .step-circle,
164
+ button.step.done:focus-visible .step-circle {
165
+ box-shadow:
166
+ 0 0 0 4px var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft))),
167
+ 0 0 0 6px var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
168
+ }
150
169
  // A step that failed its stage — a red circle with an alert, so an invalid step
151
170
  // reads as wrong at a glance rather than merely "not done".
152
171
  .step.error .step-circle {
@@ -201,8 +220,8 @@ button.step:focus-visible .step-circle {
201
220
  transform 0.2s ease;
202
221
  }
203
222
  .stepper-journey .step.done .step-circle {
204
- background: var(--wui-step-soft, var(--color-primary-soft));
205
- color: var(--wui-step-soft-fg, var(--color-primary));
223
+ background: var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft)));
224
+ color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
206
225
  }
207
226
  .stepper-journey .step.active .step-circle {
208
227
  background: var(--wui-step-accent, var(--color-primary));
@@ -227,7 +246,7 @@ button.step:focus-visible .step-circle {
227
246
  color: var(--color-text-subtle);
228
247
  }
229
248
  .stepper-journey .step.done .step-index {
230
- color: var(--wui-step-soft-fg, var(--color-primary));
249
+ color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
231
250
  }
232
251
  .stepper-journey .step.active .step-index {
233
252
  color: var(--wui-step-accent, var(--color-primary));
@@ -275,7 +294,7 @@ button.step:focus-visible .step-circle {
275
294
  background: var(--color-border-strong);
276
295
  }
277
296
  .stepper-journey .step-line.done {
278
- background: var(--wui-step-accent, var(--color-primary));
297
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
279
298
  }
280
299
  // Below xl the four label+title pairs no longer fit side by side, so the bar
281
300
  // becomes a vertical list and the connectors go away.
@@ -353,7 +372,7 @@ button.step:focus-visible .step-circle {
353
372
  z-index: 0;
354
373
  }
355
374
  .stepper-vertical .step.done:not(:last-child)::after {
356
- background: var(--wui-step-accent, var(--color-primary));
375
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
357
376
  }
358
377
  // The journey bar stacked vertically reuses its own narrow-width treatment: a plain
359
378
  // column with the horizontal connectors dropped (a real vertical rail here would
@@ -403,8 +422,8 @@ button.step:focus-visible .step-circle {
403
422
  }
404
423
  .stepper-icons .step.done .step-circle {
405
424
  border: none;
406
- background: var(--wui-step-soft, var(--color-primary-soft));
407
- color: var(--wui-step-soft-fg, var(--color-primary));
425
+ background: var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft)));
426
+ color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
408
427
  }
409
428
  .stepper-icons .step.error .step-circle {
410
429
  background: var(--color-danger-soft);
@@ -429,7 +448,7 @@ button.step:focus-visible .step-circle {
429
448
  color: var(--wui-step-accent, var(--color-primary));
430
449
  }
431
450
  .stepper-icons .step.done .step-index {
432
- color: var(--wui-step-soft-fg, var(--color-primary));
451
+ color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
433
452
  }
434
453
  .stepper-icons .step.error .step-index {
435
454
  color: var(--color-danger-text);
@@ -455,7 +474,7 @@ button.step:focus-visible .step-circle {
455
474
  background: var(--wui-step-connector, var(--color-border));
456
475
  }
457
476
  .stepper-icons .step.done + .step::before {
458
- background: var(--wui-step-accent, var(--color-primary));
477
+ background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
459
478
  }
460
479
  // The compact hover ring is calibrated to the 28px badge; the 56px icon badge just
461
480
  // lifts on hover instead.
@@ -483,6 +502,14 @@ button.step:focus-visible .step-circle {
483
502
  }
484
503
  }
485
504
 
505
+ // No connectors: the wizard's hide-connectors option drops the line between steps on every
506
+ // variant and orientation. Placed after the variants so it outranks their equal-specificity
507
+ // rails; the journey bar's .step-line siblings are simply not emitted.
508
+ .wui-stepper-no-connectors .step + .step::before,
509
+ .wui-stepper-no-connectors .step:not(:last-child)::after {
510
+ content: none;
511
+ }
512
+
486
513
  @media (prefers-reduced-motion: reduce) {
487
514
  a.step:hover .step-circle,
488
515
  button.step:hover .step-circle,
@@ -531,6 +558,42 @@ button.step:focus-visible .step-circle {
531
558
  --wui-step-soft-fg: var(--color-info-text);
532
559
  }
533
560
 
561
+ // Done-tone presets — recolour COMPLETED steps only (their badge, "STEP n" eyebrow and the
562
+ // filled rail after them), leaving the active step on the accent above. Same ramps and the
563
+ // same placement rules as the tone presets: on the stepper or any ancestor (the wizard host).
564
+ // Error and skipped steps keep their own look.
565
+ // ----------------------------------------------------------------------------
566
+ .wui-step-done-tone-primary {
567
+ --wui-step-done-accent: var(--color-primary);
568
+ --wui-step-done-accent-fg: var(--color-primary-text);
569
+ --wui-step-done-soft: var(--color-primary-soft);
570
+ --wui-step-done-soft-fg: var(--color-primary);
571
+ }
572
+ .wui-step-done-tone-success {
573
+ --wui-step-done-accent: var(--color-success);
574
+ --wui-step-done-accent-fg: var(--color-progress-label);
575
+ --wui-step-done-soft: var(--color-success-soft);
576
+ --wui-step-done-soft-fg: var(--color-success-text);
577
+ }
578
+ .wui-step-done-tone-warning {
579
+ --wui-step-done-accent: var(--color-warning);
580
+ --wui-step-done-accent-fg: var(--color-progress-label);
581
+ --wui-step-done-soft: var(--color-warning-soft);
582
+ --wui-step-done-soft-fg: var(--color-warning-text);
583
+ }
584
+ .wui-step-done-tone-danger {
585
+ --wui-step-done-accent: var(--color-danger);
586
+ --wui-step-done-accent-fg: var(--color-progress-label);
587
+ --wui-step-done-soft: var(--color-danger-soft);
588
+ --wui-step-done-soft-fg: var(--color-danger-text);
589
+ }
590
+ .wui-step-done-tone-info {
591
+ --wui-step-done-accent: var(--color-info);
592
+ --wui-step-done-accent-fg: var(--color-progress-label);
593
+ --wui-step-done-soft: var(--color-info-soft);
594
+ --wui-step-done-soft-fg: var(--color-info-text);
595
+ }
596
+
534
597
  // ============================================================================
535
598
  // Pricing card. A tier's name, price, pitch, feature list and CTA.
536
599
  //