@webority/theme 0.87.3 → 0.88.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.87.3",
3
+ "version": "0.88.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": {
@@ -583,6 +583,7 @@
583
583
  --bs-dropdown-item-padding-y: 0.5rem;
584
584
  --bs-dropdown-item-padding-x: 0.625rem;
585
585
  --bs-dropdown-border-color: var(--color-border);
586
+ --bs-dropdown-divider-bg: var(--color-border);
586
587
  --bs-dropdown-border-radius: var(--wui-radius-lg);
587
588
  --bs-dropdown-link-color: var(--color-text-body);
588
589
  --bs-dropdown-link-hover-color: var(--color-primary-hover);
@@ -434,6 +434,58 @@
434
434
  color: var(--color-text);
435
435
  }
436
436
 
437
+ // Every name wui-dark-theme sets; scripts/check-theme-modes.mjs keeps the two equal.
438
+ $wui-dark-layer-names: (
439
+ wui-shadow-thumb, wui-shadow-thumb-hover,
440
+ color-bg, color-bg-subtle, color-bg-muted, color-field-bg, color-surface, color-thumb,
441
+ color-border, color-border-light, color-border-strong, color-field-border, color-field-border-hover,
442
+ color-progress-track, color-progress-label,
443
+ color-text, color-text-muted, color-text-subtle, color-text-body, color-close-filter, color-focus-border,
444
+ wui-primary-5, wui-primary-10, wui-primary-15, wui-primary-20, wui-primary-30, wui-primary-50,
445
+ wui-surface-mute, wui-surface-soft, wui-surface-violet-soft, wui-danger-5,
446
+ bs-body-color, bs-emphasis-color, bs-secondary-color, bs-tertiary-color, bs-body-bg, bs-border-color,
447
+ bs-secondary-bg, bs-tertiary-bg,
448
+ bs-body-bg-rgb, bs-body-color-rgb, bs-emphasis-color-rgb, bs-secondary-color-rgb, bs-tertiary-color-rgb,
449
+ bs-secondary-bg-rgb, bs-tertiary-bg-rgb, bs-border-color-rgb,
450
+ color-primary, color-primary-hover, color-primary-soft, color-primary-text, color-primary-hover-text,
451
+ color-primary-ink, color-on-primary-ink, color-on-status-strong,
452
+ color-success-text, color-danger-text, color-warning-text, color-info-text,
453
+ color-success-text-on-soft, color-danger-text-on-soft, color-warning-text-on-soft, color-info-text-on-soft,
454
+ color-success-strong, color-danger-strong, color-info-strong, color-warning-strong,
455
+ color-success-soft, color-success-5, color-success-10,
456
+ color-warning-soft, color-warning-5, color-warning-10,
457
+ color-danger-soft, color-danger-5, color-danger-10,
458
+ color-info-soft, color-info-5, color-info-10,
459
+ color-success-50, color-warning-50, color-danger-50, color-info-50,
460
+ color-accent-soft, color-scrim, color-scrim-strong, color-on-scrim,
461
+ wui-chart-1, wui-chart-2, wui-chart-3, wui-chart-4, wui-chart-5, wui-chart-6, wui-chart-7, wui-chart-8,
462
+ wui-chart-seq-0, wui-chart-seq-1, wui-chart-seq-2, wui-chart-seq-3, wui-chart-seq-4, wui-chart-seq-5,
463
+ wui-chart-seq-6, wui-chart-diverging-low, wui-chart-diverging-mid, wui-chart-diverging-high, wui-chart-neutral
464
+ );
465
+
466
+ // A light box inside a dark section, such as a white result table in a dark band: the same attribute set
467
+ // to light gives it the page's light colour layer back. The page root keeps a copy of each name the dark
468
+ // layer sets, and a var() resolves where it is declared, so each copy holds the root's light value with
469
+ // the brand's own overrides. The copies sit on html rather than :root because the theme exporters read
470
+ // every :root name as a token. A dark page has no light values on its root to copy, so only a light page
471
+ // gets light boxes this way.
472
+ html {
473
+ @each $name in $wui-dark-layer-names {
474
+ --wui-light-#{$name}: var(--#{$name});
475
+ }
476
+ }
477
+
478
+ [data-theme="dark"]:not(:root) [data-theme="light"],
479
+ [data-theme="dark"]:not(:root) [data-bs-theme="light"],
480
+ [data-bs-theme="dark"]:not(:root) [data-theme="light"],
481
+ [data-bs-theme="dark"]:not(:root) [data-bs-theme="light"] {
482
+ @each $name in $wui-dark-layer-names {
483
+ --#{$name}: var(--wui-light-#{$name});
484
+ }
485
+ color-scheme: light;
486
+ color: var(--color-text);
487
+ }
488
+
437
489
  // Automatic dark mode — when data-theme="auto", detect system preference and apply dark tokens.
438
490
  :root[data-theme="auto"] {
439
491
  @media (prefers-color-scheme: dark) {
@@ -112,9 +112,9 @@
112
112
  }
113
113
 
114
114
  // ── Padding scale ── (header + body + footer). `md` is the Bootstrap default.
115
- .card-pad-none > .card-header,
116
- .card-pad-none > .card-body,
117
- .card-pad-none > .card-footer {
115
+ // `none` clears only the body, for a table or list that runs edge to edge: the header and footer
116
+ // are chrome the card draws itself, and nothing inside them can bring its own inset.
117
+ .card-pad-none > .card-body {
118
118
  padding: 0;
119
119
  }
120
120
  .card-pad-sm > .card-header,
@@ -198,11 +198,15 @@
198
198
  height: 48px;
199
199
  margin-bottom: 0;
200
200
  }
201
- .kpi.kpi-spotlight .kpi-label,
201
+ // The icon holds only the label row, so every row below it takes the full width: a large
202
+ // value at the hero size would otherwise overflow a column that leaves room for no icon.
203
+ .kpi.kpi-spotlight .kpi-label {
204
+ grid-column: 1;
205
+ }
202
206
  .kpi.kpi-spotlight .kpi-value,
203
207
  .kpi.kpi-spotlight .kpi-caption,
204
208
  .kpi.kpi-spotlight .kpi-delta {
205
- grid-column: 1;
209
+ grid-column: 1 / -1;
206
210
  }
207
211
  .kpi.kpi-spotlight .kpi-label {
208
212
  align-self: center;
@@ -1391,6 +1395,7 @@ a.info-row:hover .info-value {
1391
1395
  color: var(--color-text-subtle);
1392
1396
  }
1393
1397
  .result-icon {
1398
+ align-self: center;
1394
1399
  width: 64px;
1395
1400
  height: 64px;
1396
1401
  border-radius: var(--radius-lg);
@@ -342,8 +342,10 @@ button.step.done:focus-visible .step-circle {
342
342
  padding: 0;
343
343
  }
344
344
  // Each compact step becomes a two-column row: the circle in a fixed rail on the
345
- // left, the label and its description stacked on the right.
346
- .stepper-vertical .step {
345
+ // left, the label and its description stacked on the right. The journey step has
346
+ // its own badge and text column, so these rules skip it; :where keeps them at the
347
+ // specificity a modifier such as .stepper-icons expects to beat.
348
+ .stepper-vertical:where(:not(.stepper-journey)) .step {
347
349
  display: grid;
348
350
  grid-template-columns: var(--wui-step-size, 28px) 1fr;
349
351
  column-gap: 12px;
@@ -356,12 +358,12 @@ button.step.done:focus-visible .step-circle {
356
358
  // The circle spans the whole text block rather than sitting in the first row: a
357
359
  // row sized to the 28px circle would leave dead space below a single-line label
358
360
  // before the description. Spanning lets each row size to its text instead.
359
- .stepper-vertical .step-circle {
361
+ .stepper-vertical:where(:not(.stepper-journey)) .step-circle {
360
362
  grid-column: 1;
361
363
  grid-row: 1 / -1;
362
364
  align-self: start;
363
365
  }
364
- .stepper-vertical .step-label {
366
+ .stepper-vertical:where(:not(.stepper-journey)) .step-label {
365
367
  grid-column: 2;
366
368
  grid-row: 1;
367
369
  max-width: none;
@@ -369,13 +371,13 @@ button.step.done:focus-visible .step-circle {
369
371
  // a no-op when a description makes the row size to the label.
370
372
  align-self: center;
371
373
  }
372
- .stepper-vertical .step-desc {
374
+ .stepper-vertical:where(:not(.stepper-journey)) .step-desc {
373
375
  grid-column: 2;
374
376
  grid-row: 2;
375
377
  max-width: none;
376
378
  }
377
379
  // The vertical grid has no row gap, so the description sits right under the label.
378
- .stepper-vertical .step > .step-label + .step-desc {
380
+ .stepper-vertical:where(:not(.stepper-journey)) .step > .step-label + .step-desc {
379
381
  margin-top: 0;
380
382
  }
381
383
  // The compact connector is horizontal (::before); redraw it as a vertical segment
@@ -383,7 +385,7 @@ button.step.done:focus-visible .step-circle {
383
385
  .stepper-vertical .step + .step::before {
384
386
  content: none;
385
387
  }
386
- .stepper-vertical .step:not(:last-child)::after {
388
+ .stepper-vertical:where(:not(.stepper-journey)) .step:not(:last-child)::after {
387
389
  content: "";
388
390
  position: absolute;
389
391
  // Half the badge minus 1 for the 2px line's own width; runs from below the circle.
@@ -396,7 +398,7 @@ button.step.done:focus-visible .step-circle {
396
398
  background: var(--wui-step-connector, var(--color-border));
397
399
  z-index: 0;
398
400
  }
399
- .stepper-vertical .step.done:not(:last-child)::after {
401
+ .stepper-vertical:where(:not(.stepper-journey)) .step.done:not(:last-child)::after {
400
402
  background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary-ink)));
401
403
  }
402
404
  // The journey bar stacked vertically reuses its own narrow-width treatment: a plain
@@ -35,7 +35,7 @@
35
35
  .wui-score-scale__item--selected {
36
36
  border-color: var(--color-primary);
37
37
  background: var(--color-primary);
38
- color: var(--color-on-primary-ink);
38
+ color: var(--color-primary-text);
39
39
  }
40
40
  .wui-score-scale__item:has(input:focus-visible) {
41
41
  outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
@@ -771,7 +771,7 @@
771
771
  }
772
772
  .app-topbar[data-tone="primary"] {
773
773
  background: var(--color-primary);
774
- color: var(--color-on-primary-ink);
774
+ color: var(--color-primary-text);
775
775
  }
776
776
  .app-topbar[data-tone="primary"] :is(.app-topbar-menu, .topbar-icon-btn, .wui-usermenu-trigger) {
777
777
  color: inherit;
@@ -783,10 +783,10 @@
783
783
  }
784
784
  .app-topbar[data-tone="primary"] .app-topbar-menu {
785
785
  background: transparent;
786
- border-color: color-mix(in srgb, var(--color-on-primary-ink) 60%, transparent);
786
+ border-color: color-mix(in srgb, var(--color-primary-text) 60%, transparent);
787
787
  }
788
788
  .app-topbar[data-tone="primary"] :is(.app-topbar-menu, .topbar-icon-btn, .wui-usermenu-trigger):hover {
789
- background: color-mix(in srgb, var(--color-on-primary-ink) 12%, transparent);
789
+ background: color-mix(in srgb, var(--color-primary-text) 12%, transparent);
790
790
  }
791
791
  // Two groups: the leading one shrinks and ellipsises a long page title, the
792
792
  // trailing one is pinned so actions are never pushed off-screen.