@webority/theme 0.121.0 → 0.124.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.121.0",
3
+ "version": "0.124.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": {
@@ -47,7 +47,7 @@
47
47
  "postcss": "^8.5.31"
48
48
  },
49
49
  "devDependencies": {
50
- "@webority/tokens": "0.121.0",
50
+ "@webority/tokens": "0.124.0",
51
51
  "bootstrap": "5.3.3",
52
52
  "country-flag-icons": "^1.6.20",
53
53
  "sass-embedded": "^1.97.0",
@@ -1,4 +1,4 @@
1
- // Generated by @webority/tokens 0.121.0 from its token source. Do not edit; run webority brand --library.
1
+ // Generated by @webority/tokens 0.124.0 from its token source. Do not edit; run webority brand --library.
2
2
  $body-color: #252f4a !default;
3
3
  $body-secondary-color: #4b5675 !default;
4
4
  $body-tertiary-color: #626a82 !default;
@@ -1,4 +1,4 @@
1
- // Generated by @webority/tokens 0.121.0 from its token source. Do not edit; run webority brand --library.
1
+ // Generated by @webority/tokens 0.124.0 from its token source. Do not edit; run webority brand --library.
2
2
 
3
3
  :root {
4
4
  --wui-primary: #4F46E5;
@@ -360,6 +360,13 @@
360
360
  --wui-surface-mute: var(--wui-dark-bg-muted);
361
361
  --wui-neutral-bg-dark: var(--wui-dark-bg-muted);
362
362
  --wui-neutral-bg-light: var(--wui-dark-bg-surface);
363
+ --wui-info-10: color-mix(in srgb, var(--wui-info) 16%, var(--wui-dark-bg-surface));
364
+ --wui-info-5: color-mix(in srgb, var(--wui-info) 10%, var(--wui-dark-bg-surface));
365
+ --wui-success-10: color-mix(in srgb, var(--wui-success) 16%, var(--wui-dark-bg-surface));
366
+ --wui-success-5: color-mix(in srgb, var(--wui-success) 10%, var(--wui-dark-bg-surface));
367
+ --wui-warning-10: color-mix(in srgb, var(--wui-warning) 16%, var(--wui-dark-bg-surface));
368
+ --wui-warning-5: color-mix(in srgb, var(--wui-warning) 10%, var(--wui-dark-bg-surface));
369
+ --wui-danger-10: color-mix(in srgb, var(--wui-danger) 16%, var(--wui-dark-bg-surface));
363
370
  --wui-danger-5: color-mix(in srgb, var(--wui-danger) 10%, var(--wui-dark-bg-surface));
364
371
  --wui-chart-1: var(--wui-dark-primary);
365
372
  --wui-chart-2: var(--wui-dark-chart-2);
@@ -380,6 +387,8 @@
380
387
  --wui-chart-diverging-mid: var(--wui-dark-chart-diverging-mid);
381
388
  --wui-chart-diverging-high: var(--wui-dark-chart-diverging-high);
382
389
  --wui-chart-neutral: var(--wui-dark-chart-neutral);
390
+ --wui-shadow-popover: 0px 8px 28px -6px rgba(0, 0, 0, 0.55);
391
+ --wui-shadow-modal: 0px 24px 60px -16px rgba(0, 0, 0, 0.7);
383
392
  --color-bg: var(--wui-dark-bg-page);
384
393
  --color-bg-subtle: var(--wui-dark-bg-elevated);
385
394
  --color-bg-muted: var(--wui-dark-bg-muted);
@@ -475,6 +484,7 @@
475
484
  --bs-emphasis-color: var(--color-text);
476
485
  --bs-secondary-color: var(--color-text-muted);
477
486
  --bs-tertiary-color: var(--color-text-subtle);
487
+ --bs-heading-color: var(--color-text);
478
488
  --bs-body-bg: var(--color-bg);
479
489
  --bs-border-color: var(--color-border);
480
490
  --bs-secondary-bg: var(--color-surface);
@@ -505,6 +515,13 @@
505
515
  --wui-surface-mute: var(--wui-dark-bg-muted);
506
516
  --wui-neutral-bg-dark: var(--wui-dark-bg-muted);
507
517
  --wui-neutral-bg-light: var(--wui-dark-bg-surface);
518
+ --wui-info-10: color-mix(in srgb, var(--wui-info) 16%, var(--wui-dark-bg-surface));
519
+ --wui-info-5: color-mix(in srgb, var(--wui-info) 10%, var(--wui-dark-bg-surface));
520
+ --wui-success-10: color-mix(in srgb, var(--wui-success) 16%, var(--wui-dark-bg-surface));
521
+ --wui-success-5: color-mix(in srgb, var(--wui-success) 10%, var(--wui-dark-bg-surface));
522
+ --wui-warning-10: color-mix(in srgb, var(--wui-warning) 16%, var(--wui-dark-bg-surface));
523
+ --wui-warning-5: color-mix(in srgb, var(--wui-warning) 10%, var(--wui-dark-bg-surface));
524
+ --wui-danger-10: color-mix(in srgb, var(--wui-danger) 16%, var(--wui-dark-bg-surface));
508
525
  --wui-danger-5: color-mix(in srgb, var(--wui-danger) 10%, var(--wui-dark-bg-surface));
509
526
  --wui-chart-1: var(--wui-dark-primary);
510
527
  --wui-chart-2: var(--wui-dark-chart-2);
@@ -525,6 +542,8 @@
525
542
  --wui-chart-diverging-mid: var(--wui-dark-chart-diverging-mid);
526
543
  --wui-chart-diverging-high: var(--wui-dark-chart-diverging-high);
527
544
  --wui-chart-neutral: var(--wui-dark-chart-neutral);
545
+ --wui-shadow-popover: 0px 8px 28px -6px rgba(0, 0, 0, 0.55);
546
+ --wui-shadow-modal: 0px 24px 60px -16px rgba(0, 0, 0, 0.7);
528
547
  --color-bg: var(--wui-dark-bg-page);
529
548
  --color-bg-subtle: var(--wui-dark-bg-elevated);
530
549
  --color-bg-muted: var(--wui-dark-bg-muted);
@@ -620,6 +639,7 @@
620
639
  --bs-emphasis-color: var(--color-text);
621
640
  --bs-secondary-color: var(--color-text-muted);
622
641
  --bs-tertiary-color: var(--color-text-subtle);
642
+ --bs-heading-color: var(--color-text);
623
643
  --bs-body-bg: var(--color-bg);
624
644
  --bs-border-color: var(--color-border);
625
645
  --bs-secondary-bg: var(--color-surface);
@@ -645,29 +665,30 @@
645
665
 
646
666
  $wui-dark-layer-names: (
647
667
  wui-primary-50, wui-primary-30, wui-primary-20, wui-primary-15, wui-primary-10, wui-primary-5,
648
- wui-surface-soft, wui-surface-violet-soft, wui-surface-mute, wui-neutral-bg-dark, wui-neutral-bg-light, wui-danger-5,
649
- wui-chart-1, wui-chart-2, wui-chart-3, wui-chart-4, wui-chart-5, wui-chart-6,
650
- wui-chart-7, wui-chart-8, wui-chart-seq-0, wui-chart-seq-1, wui-chart-seq-2, wui-chart-seq-3,
651
- wui-chart-seq-4, wui-chart-seq-5, wui-chart-seq-6, wui-chart-diverging-low, wui-chart-diverging-mid, wui-chart-diverging-high,
652
- wui-chart-neutral, color-bg, color-bg-subtle, color-bg-muted, color-surface, color-surface-inverse,
653
- color-text, color-text-body, color-text-muted, color-text-subtle, color-text-inverse, color-link,
654
- color-border, color-border-subtle, color-border-strong, color-field-bg, color-field-border, color-field-border-hover,
655
- color-field-border-focus, color-scrim, color-scrim-strong, color-progress-track, color-progress-label, color-thumb,
656
- color-scrollbar, color-scrollbar-hover, color-scrollbar-active, color-primary, color-primary-hover, color-primary-soft,
657
- color-primary-text, color-on-primary, color-success, color-success-pressed, color-success-soft, color-success-border,
658
- color-success-text, color-success-text-on-soft, color-success-strong, color-on-success, color-on-success-strong, color-warning,
659
- color-warning-pressed, color-warning-soft, color-warning-border, color-warning-text, color-warning-text-on-soft, color-warning-strong,
660
- color-warning-strong-hover, color-on-warning, color-on-warning-strong, color-danger, color-danger-pressed, color-danger-soft,
661
- color-danger-border, color-danger-text, color-danger-text-on-soft, color-danger-strong, color-danger-strong-hover, color-on-danger,
662
- color-on-danger-strong, color-info, color-info-pressed, color-info-soft, color-info-border, color-info-text,
663
- color-info-text-on-soft, color-info-strong, color-on-info, color-on-info-strong, color-chart-1, color-chart-2,
664
- color-chart-3, color-chart-4, color-chart-5, color-chart-6, color-chart-7, color-chart-8,
665
- color-chart-seq-0, color-chart-seq-1, color-chart-seq-2, color-chart-seq-3, color-chart-seq-4, color-chart-seq-5,
666
- color-chart-seq-6, color-chart-diverging-low, color-chart-diverging-mid, color-chart-diverging-high, color-chart-neutral, wui-close-filter,
667
- wui-thumb-shadow, wui-thumb-shadow-hover, bs-body-color, bs-emphasis-color, bs-secondary-color, bs-tertiary-color,
668
- bs-body-bg, bs-border-color, bs-secondary-bg, bs-tertiary-bg, bs-primary, bs-body-bg-rgb,
669
- bs-primary-rgb, bs-body-color-rgb, bs-emphasis-color-rgb, bs-secondary-color-rgb, bs-tertiary-color-rgb, bs-secondary-bg-rgb,
670
- bs-tertiary-bg-rgb, bs-border-color-rgb
668
+ wui-surface-soft, wui-surface-violet-soft, wui-surface-mute, wui-neutral-bg-dark, wui-neutral-bg-light, wui-info-10,
669
+ wui-info-5, wui-success-10, wui-success-5, wui-warning-10, wui-warning-5, wui-danger-10,
670
+ wui-danger-5, wui-chart-1, wui-chart-2, wui-chart-3, wui-chart-4, wui-chart-5,
671
+ wui-chart-6, wui-chart-7, wui-chart-8, wui-chart-seq-0, wui-chart-seq-1, wui-chart-seq-2,
672
+ wui-chart-seq-3, wui-chart-seq-4, wui-chart-seq-5, wui-chart-seq-6, wui-chart-diverging-low, wui-chart-diverging-mid,
673
+ wui-chart-diverging-high, wui-chart-neutral, wui-shadow-popover, wui-shadow-modal, color-bg, color-bg-subtle,
674
+ color-bg-muted, color-surface, color-surface-inverse, color-text, color-text-body, color-text-muted,
675
+ color-text-subtle, color-text-inverse, color-link, color-border, color-border-subtle, color-border-strong,
676
+ color-field-bg, color-field-border, color-field-border-hover, color-field-border-focus, color-scrim, color-scrim-strong,
677
+ color-progress-track, color-progress-label, color-thumb, color-scrollbar, color-scrollbar-hover, color-scrollbar-active,
678
+ color-primary, color-primary-hover, color-primary-soft, color-primary-text, color-on-primary, color-success,
679
+ color-success-pressed, color-success-soft, color-success-border, color-success-text, color-success-text-on-soft, color-success-strong,
680
+ color-on-success, color-on-success-strong, color-warning, color-warning-pressed, color-warning-soft, color-warning-border,
681
+ color-warning-text, color-warning-text-on-soft, color-warning-strong, color-warning-strong-hover, color-on-warning, color-on-warning-strong,
682
+ color-danger, color-danger-pressed, color-danger-soft, color-danger-border, color-danger-text, color-danger-text-on-soft,
683
+ color-danger-strong, color-danger-strong-hover, color-on-danger, color-on-danger-strong, color-info, color-info-pressed,
684
+ color-info-soft, color-info-border, color-info-text, color-info-text-on-soft, color-info-strong, color-on-info,
685
+ color-on-info-strong, color-chart-1, color-chart-2, color-chart-3, color-chart-4, color-chart-5,
686
+ color-chart-6, color-chart-7, color-chart-8, color-chart-seq-0, color-chart-seq-1, color-chart-seq-2,
687
+ color-chart-seq-3, color-chart-seq-4, color-chart-seq-5, color-chart-seq-6, color-chart-diverging-low, color-chart-diverging-mid,
688
+ color-chart-diverging-high, color-chart-neutral, wui-close-filter, wui-thumb-shadow, wui-thumb-shadow-hover, bs-body-color,
689
+ bs-emphasis-color, bs-secondary-color, bs-tertiary-color, bs-heading-color, bs-body-bg, bs-border-color,
690
+ bs-secondary-bg, bs-tertiary-bg, bs-primary, bs-body-bg-rgb, bs-primary-rgb, bs-body-color-rgb,
691
+ bs-emphasis-color-rgb, bs-secondary-color-rgb, bs-tertiary-color-rgb, bs-secondary-bg-rgb, bs-tertiary-bg-rgb, bs-border-color-rgb
671
692
  );
672
693
 
673
694
  // var() resolves where a name is declared, so the html copies keep the light values for a light box.
@@ -708,6 +729,13 @@ html {
708
729
  --wui-surface-mute: var(--wui-dark-bg-muted);
709
730
  --wui-neutral-bg-dark: var(--wui-dark-bg-muted);
710
731
  --wui-neutral-bg-light: var(--wui-dark-bg-surface);
732
+ --wui-info-10: color-mix(in srgb, var(--wui-info) 16%, var(--wui-dark-bg-surface));
733
+ --wui-info-5: color-mix(in srgb, var(--wui-info) 10%, var(--wui-dark-bg-surface));
734
+ --wui-success-10: color-mix(in srgb, var(--wui-success) 16%, var(--wui-dark-bg-surface));
735
+ --wui-success-5: color-mix(in srgb, var(--wui-success) 10%, var(--wui-dark-bg-surface));
736
+ --wui-warning-10: color-mix(in srgb, var(--wui-warning) 16%, var(--wui-dark-bg-surface));
737
+ --wui-warning-5: color-mix(in srgb, var(--wui-warning) 10%, var(--wui-dark-bg-surface));
738
+ --wui-danger-10: color-mix(in srgb, var(--wui-danger) 16%, var(--wui-dark-bg-surface));
711
739
  --wui-danger-5: color-mix(in srgb, var(--wui-danger) 10%, var(--wui-dark-bg-surface));
712
740
  --wui-chart-1: var(--wui-dark-primary);
713
741
  --wui-chart-2: var(--wui-dark-chart-2);
@@ -728,6 +756,8 @@ html {
728
756
  --wui-chart-diverging-mid: var(--wui-dark-chart-diverging-mid);
729
757
  --wui-chart-diverging-high: var(--wui-dark-chart-diverging-high);
730
758
  --wui-chart-neutral: var(--wui-dark-chart-neutral);
759
+ --wui-shadow-popover: 0px 8px 28px -6px rgba(0, 0, 0, 0.55);
760
+ --wui-shadow-modal: 0px 24px 60px -16px rgba(0, 0, 0, 0.7);
731
761
  --color-bg: var(--wui-dark-bg-page);
732
762
  --color-bg-subtle: var(--wui-dark-bg-elevated);
733
763
  --color-bg-muted: var(--wui-dark-bg-muted);
@@ -823,6 +853,7 @@ html {
823
853
  --bs-emphasis-color: var(--color-text);
824
854
  --bs-secondary-color: var(--color-text-muted);
825
855
  --bs-tertiary-color: var(--color-text-subtle);
856
+ --bs-heading-color: var(--color-text);
826
857
  --bs-body-bg: var(--color-bg);
827
858
  --bs-border-color: var(--color-border);
828
859
  --bs-secondary-bg: var(--color-surface);
@@ -89,3 +89,68 @@ wui-chat[position="start"] .wui-chat-panel {
89
89
  .wui-chat-composer .wui-field-message:empty {
90
90
  display: none;
91
91
  }
92
+
93
+ // Attachments wrap onto new rows as the composer or a sent question grows.
94
+ .wui-chat-attachments {
95
+ display: flex;
96
+ flex-wrap: wrap;
97
+ gap: var(--wui-space-xs);
98
+ }
99
+ .wui-chat-question-attachments {
100
+ display: flex;
101
+ flex-wrap: wrap;
102
+ justify-content: flex-end;
103
+ gap: var(--wui-space-xs);
104
+ }
105
+
106
+ // The banner that says a question is being edited, with its cancel control beside the text.
107
+ .wui-chat-editing {
108
+ display: flex;
109
+ align-items: center;
110
+ gap: var(--wui-space-sm);
111
+ padding: var(--wui-space-sm) var(--wui-space-md);
112
+ background: var(--color-bg-muted);
113
+ border-radius: var(--wui-radius-md);
114
+ color: var(--color-text-muted);
115
+ font-size: var(--wui-fs-sm);
116
+ }
117
+
118
+ // Copy, edit, retry and the other actions under an answer; they wrap rather than overflow the panel.
119
+ .wui-chat-turn-actions {
120
+ display: flex;
121
+ flex-wrap: wrap;
122
+ gap: var(--wui-space-xs);
123
+ margin-block-start: var(--wui-space-xs);
124
+ }
125
+
126
+ // Suggested follow-up questions under an answer, as wrapping chips.
127
+ .wui-chat-suggestions {
128
+ display: flex;
129
+ flex-wrap: wrap;
130
+ gap: var(--wui-space-xs);
131
+ }
132
+
133
+ // Past chats: a scrolling list in the body's padding, one row per chat.
134
+ .wui-chat-past {
135
+ display: flex;
136
+ flex-direction: column;
137
+ flex: 1 1 auto;
138
+ min-height: 0;
139
+ gap: var(--wui-space-xs);
140
+ padding: var(--wui-space-lg);
141
+ overflow: auto;
142
+ }
143
+ // min-width 0 lets the title inside the row shrink and truncate instead of pushing the row wider.
144
+ .wui-chat-past-row {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: var(--wui-space-sm);
148
+ min-width: 0;
149
+ }
150
+
151
+ // Bootstrap's d-flex is !important, so hidden needs its own rule.
152
+ .wui-chat-foot[hidden],
153
+ .wui-chat-past[hidden],
154
+ .wui-chat-suggestions[hidden] {
155
+ display: none !important;
156
+ }
@@ -255,6 +255,10 @@
255
255
  box-shadow: none;
256
256
  filter: none;
257
257
  }
258
+ // Bootstrap paints a mouse-focused box's border in its compiled indigo; the switch keeps its own transparent track.
259
+ .form-check-input:focus:not(:focus-visible):not(:checked):not([type="checkbox"]:indeterminate):not(.form-switch .form-check-input) {
260
+ border-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
261
+ }
258
262
  .form-check-input:checked,
259
263
  .wui-check:checked,
260
264
  .wui-radio:checked {
@@ -372,6 +376,50 @@
372
376
  border-radius: 50%;
373
377
  corner-shape: round;
374
378
  }
379
+
380
+ // Table-row switch (<app-row-switch>, AppRowSwitch): a button, not an input, so a row can post it.
381
+ // Same track, knob, colours and focus ring as the form switch above.
382
+ .wui-row-switch {
383
+ display: inline-flex;
384
+ align-items: center;
385
+ padding: 0;
386
+ border: 0;
387
+ background: none;
388
+ border-radius: var(--wui-radius-pill);
389
+ cursor: pointer;
390
+ }
391
+ .wui-row-switch:focus-visible {
392
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
393
+ outline-offset: var(--wui-focus-ring-offset);
394
+ }
395
+ .wui-row-switch__track {
396
+ position: relative;
397
+ display: block;
398
+ width: 40px;
399
+ height: 22px;
400
+ border-radius: var(--wui-radius-pill);
401
+ background-color: var(--color-border-strong);
402
+ }
403
+ .wui-row-switch__thumb {
404
+ position: absolute;
405
+ top: 2px;
406
+ left: 2px;
407
+ width: 18px;
408
+ height: 18px;
409
+ border-radius: 50%;
410
+ background-color: var(--color-surface);
411
+ }
412
+ .wui-row-switch[aria-checked="true"] .wui-row-switch__track {
413
+ background-color: var(--color-primary);
414
+ }
415
+ .wui-row-switch[aria-checked="true"] .wui-row-switch__thumb {
416
+ transform: translateX(18px);
417
+ }
418
+ .wui-row-switch:disabled,
419
+ .wui-row-switch[aria-busy="true"] {
420
+ opacity: var(--wui-disabled-opacity);
421
+ cursor: not-allowed;
422
+ }
375
423
  @media (prefers-reduced-motion: reduce) {
376
424
  .form-check-input,
377
425
  .wui-check,
@@ -1335,6 +1383,22 @@ wui-select[compact] {
1335
1383
  .field > .wui-score-scale {
1336
1384
  align-self: stretch;
1337
1385
  }
1386
+ // A chosen value's photo or initials sits at the control's start edge, and the start padding makes
1387
+ // room for it: the avatar's own width plus the control's gap. The width is .avatar-xs's fixed size,
1388
+ // a layout constant with no token. Logical properties, so the start edge follows the reading direction.
1389
+ .search-select-control.wui-has-value-avatar {
1390
+ --wui-search-select-value-avatar-size: 20px;
1391
+ position: relative;
1392
+ padding-inline-start: calc(var(--wui-space-md) + var(--wui-search-select-value-avatar-size) + var(--wui-space-sm));
1393
+ }
1394
+ .search-select-control.wui-has-value-avatar > .wui-search-select-value-avatar {
1395
+ position: absolute;
1396
+ inset-inline-start: var(--wui-space-md);
1397
+ top: 50%;
1398
+ transform: translateY(-50%);
1399
+ display: inline-flex;
1400
+ pointer-events: none;
1401
+ }
1338
1402
  // A file picker fills its column by default (align-self:stretch fills the field on the cross
1339
1403
  // axis, but the field itself collapses to its content when it is a flex item — the showcase
1340
1404
  // lays fields out in a flex row — so stretch the field to its container first). Override per
@@ -210,6 +210,14 @@
210
210
  .table-ledger tbody td:last-child {
211
211
  padding-right: 20px;
212
212
  }
213
+ // A loading bar follows its column's alignment: a block bar ignores text-align, so auto margins place it.
214
+ .table-ledger td.text-center > .skeleton {
215
+ margin-inline: auto;
216
+ }
217
+ .table-ledger td.wui-cell-end > .skeleton,
218
+ .table-ledger td.num > .skeleton {
219
+ margin-inline-start: auto;
220
+ }
213
221
  .table-ledger tbody tr:last-child td {
214
222
  border-bottom: none;
215
223
  }
@@ -758,8 +766,9 @@
758
766
  }
759
767
  .table-ledger.wui-table-stack > tbody > tr > td {
760
768
  min-width: 0;
761
- max-width: 100%;
762
- overflow-wrap: anywhere;
769
+ max-width: none;
770
+ white-space: normal;
771
+ overflow-wrap: break-word;
763
772
  }
764
773
  .table-ledger.wui-table-stack,
765
774
  .table-ledger.wui-table-stack > tbody,
@@ -817,7 +826,7 @@
817
826
  // its edge (a long email under an avatar did).
818
827
  .table-ledger.wui-table-stack > * > tr > td > * {
819
828
  min-width: 0;
820
- overflow-wrap: anywhere;
829
+ overflow-wrap: break-word;
821
830
  }
822
831
  .table-ledger.wui-table-stack > tbody > tr > td .u-meta {
823
832
  align-items: flex-end;
@@ -840,6 +849,9 @@
840
849
  .table-ledger.wui-table-stack .u-name {
841
850
  display: block;
842
851
  overflow: visible;
852
+ -webkit-line-clamp: none;
853
+ line-clamp: none;
854
+ overflow-wrap: break-word;
843
855
  }
844
856
  // A group header is a section label between the cards, not a card of its own.
845
857
  .table-ledger.wui-table-stack > tbody > tr.wui-group-row {
@@ -925,6 +937,12 @@
925
937
  .table-wrap.wui-table-scroll:has(> .table-ledger) {
926
938
  padding-top: 0;
927
939
  }
940
+ // A scrolling table that opens its card needs its spacing outside the scroll box: padding here
941
+ // would show scrolled rows above the sticky header. The card is a flex column, so the margin
942
+ // does not collapse out of it.
943
+ .card > .table-wrap.wui-table-scroll:has(> .table-ledger):first-child {
944
+ margin-top: var(--wui-card-pad);
945
+ }
928
946
 
929
947
  // Pinned first column (`stickyFirstColumn`): the identity column, and the select/expand columns the
930
948
  // library puts before it, hold their place while a wide table scrolls sideways. The identity column
@@ -981,6 +999,10 @@
981
999
  .table-ledger > :is(tbody, tfoot) > tr:not(.wui-row-expanded, .wui-group-row) > :is(.wui-pin-start, .wui-pin-end):has([aria-expanded="true"], .dropdown-menu.show) {
982
1000
  z-index: 4;
983
1001
  }
1002
+ // A group header holds its own open collapse toggle, so the rule above would lift it over the menu of the row above it. It stays below an open menu.
1003
+ .table-ledger > tbody > tr.wui-group-row > th.wui-group-cell:last-child:has([aria-expanded="true"]) {
1004
+ z-index: 1;
1005
+ }
984
1006
  // The wrap's padding is inside its scroll box, so a pinned cell stops one padding short of the
985
1007
  // scroller's edge and scrolled cells show in the strip beyond it. While content runs past that
986
1008
  // edge, the outermost pinned cell paints the strip. Its width is the wrap's measured padding
@@ -1492,7 +1492,11 @@ button.wui-link {
1492
1492
  .wui-link__label {
1493
1493
  position: relative;
1494
1494
  z-index: 0;
1495
- white-space: nowrap;
1495
+ white-space: var(--wui-link-label-white-space, nowrap);
1496
+ }
1497
+ // A link in a table cell may wrap: a nowrap label runs under the pinned actions column.
1498
+ .table-ledger td .wui-link__label {
1499
+ --wui-link-label-white-space: normal;
1496
1500
  }
1497
1501
  .wui-link__ic {
1498
1502
  display: inline-flex;
@@ -260,6 +260,7 @@ wui-file-viewer:fullscreen {
260
260
  flex: 1 1 auto;
261
261
  overflow: auto;
262
262
  min-width: 0;
263
+ background: var(--wui-file-viewer-scroll-bg, transparent);
263
264
  // The pages fit the width; a scrollbar appearing must not change that width and set off a
264
265
  // second fit.
265
266
  scrollbar-gutter: stable;
@@ -88,3 +88,9 @@
88
88
  .wui-markdown .table th {
89
89
  font-weight: 600;
90
90
  }
91
+ // A citation chip sits inside a line of text, so it takes the line's baseline.
92
+ .wui-markdown-citation {
93
+ display: inline-flex;
94
+ vertical-align: baseline;
95
+ margin-inline: var(--wui-space-xxs);
96
+ }
@@ -33,7 +33,7 @@ wui-navigation-menu {
33
33
  padding: 8px 12px;
34
34
  border: 0;
35
35
  border-radius: var(--wui-radius-sm);
36
- background: transparent;
36
+ background: var(--wui-nav-menu-item-bg, transparent);
37
37
  color: var(--color-text);
38
38
  font: inherit;
39
39
  font-size: 14px;
@@ -54,6 +54,8 @@ wui-navigation-menu {
54
54
  outline-offset: 1px;
55
55
  }
56
56
  &[aria-current="page"] {
57
+ // Set through the item variable, not background, so the hover fill above still wins.
58
+ --wui-nav-menu-item-bg: var(--wui-nav-menu-current-bg, transparent);
57
59
  color: var(--color-primary-text);
58
60
  }
59
61
  }
@@ -173,8 +173,10 @@
173
173
  // Break long unbroken names so they wrap within the heading instead of
174
174
  // running under the close button.
175
175
  .wui-modal-title {
176
- font-size: 17px;
177
- font-weight: 600;
176
+ font-family: var(--wui-modal-title-font-family, inherit);
177
+ font-size: var(--wui-modal-title-font-size, 17px);
178
+ font-weight: var(--wui-modal-title-font-weight, 600);
179
+ line-height: var(--wui-modal-title-line-height, inherit);
178
180
  color: var(--color-text);
179
181
  overflow-wrap: anywhere;
180
182
  }
@@ -425,11 +427,11 @@
425
427
  flex-direction: column;
426
428
  align-items: center;
427
429
  text-align: center;
428
- padding: 16px 12px 6px;
430
+ padding: 16px 12px var(--wui-confirm-content-padding-bottom, 6px);
429
431
  }
430
432
  .wui-confirm-icon {
431
433
  line-height: 0;
432
- margin-bottom: 22px;
434
+ margin-bottom: var(--wui-confirm-icon-gap, 22px);
433
435
  }
434
436
  // A caller-supplied illustration occupies the SAME footprint as the built-in badge, whatever
435
437
  // the source file measures — the box is the theme's, the artwork is the caller's. Without
@@ -262,6 +262,16 @@
262
262
  filter: none;
263
263
  opacity: 1;
264
264
  }
265
+ // Dark pages: a dark mark turns light, and the hover and focus reveal keeps that inversion.
266
+ :root[data-theme="dark"] .wui-section-logo-img {
267
+ filter: grayscale(1) invert(1);
268
+ opacity: 0.8;
269
+ }
270
+ :root[data-theme="dark"] .wui-section-logo-img:hover,
271
+ :root[data-theme="dark"] .wui-section-logo a:focus-visible .wui-section-logo-img {
272
+ filter: grayscale(1) invert(1);
273
+ opacity: 1;
274
+ }
265
275
  .wui-section-logo-text {
266
276
  font-family: inherit;
267
277
  font-weight: 600;
@@ -8,7 +8,7 @@
8
8
  // Phone floor: every control here is at least 44px tall below 768px, and nothing that opens is
9
9
  // wider than the viewport less 24px.
10
10
 
11
- .app-shell {
11
+ :root {
12
12
  // One height the tab bar, the content's bottom padding and the footer's offset agree on.
13
13
  --wui-tabbar-h: 60px;
14
14
  }