@webority/theme 0.128.0 → 0.130.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.
@@ -0,0 +1,70 @@
1
+ // Account switcher: shared by React <AppAccountSwitcher> and Razor <app-account-switcher>.
2
+ // Rows are Bootstrap dropdown items inside the shell's user menu (.wui-usermenu-menu, see
3
+ // _shell-parts.scss), so they inherit that menu's padding and hover. Every rule here is scoped
4
+ // under .wui-account-switcher so it wins over Bootstrap's .dropdown-item specificity.
5
+
6
+ .wui-account-switcher {
7
+ padding-block: var(--wui-space-xxs);
8
+ }
9
+
10
+ .wui-account-switcher-label {
11
+ padding: var(--wui-space-sm);
12
+ font-size: var(--wui-fs-sm);
13
+ color: var(--color-text-muted);
14
+ }
15
+
16
+ .wui-account-switcher-list {
17
+ display: flex;
18
+ flex-direction: column;
19
+ max-height: 40vh;
20
+ overflow-y: auto;
21
+ }
22
+
23
+ .wui-account-switcher .wui-account-switcher-option {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: var(--wui-space-sm);
27
+ }
28
+
29
+ .wui-account-switcher-option-text {
30
+ flex: 1 1 auto;
31
+ min-width: 0;
32
+ }
33
+
34
+ .wui-account-switcher-option-name {
35
+ display: block;
36
+ overflow: hidden;
37
+ text-overflow: ellipsis;
38
+ white-space: nowrap;
39
+ }
40
+
41
+ .wui-account-switcher-option-note {
42
+ display: block;
43
+ overflow: hidden;
44
+ font-size: var(--wui-fs-xs);
45
+ color: var(--color-text-muted);
46
+ text-overflow: ellipsis;
47
+ white-space: nowrap;
48
+ }
49
+
50
+ .wui-account-switcher-badge {
51
+ flex: none;
52
+ padding: var(--wui-space-xxs) var(--wui-space-sm);
53
+ border-radius: var(--wui-radius-pill);
54
+ background: var(--color-bg-subtle);
55
+ color: var(--color-text-muted);
56
+ font-size: var(--wui-fs-xs);
57
+ font-weight: var(--wui-fw-semibold);
58
+ }
59
+
60
+ // The current account keeps its tint through hover, so the tick is never the only cue.
61
+ .wui-account-switcher .wui-account-switcher-option.is-active,
62
+ .wui-account-switcher .wui-account-switcher-option.is-active:hover {
63
+ background: var(--color-primary-soft);
64
+ color: var(--color-primary-text);
65
+ }
66
+
67
+ .wui-account-switcher-tick {
68
+ flex: none;
69
+ color: var(--color-primary-text);
70
+ }
@@ -0,0 +1,77 @@
1
+ // ── Auth layout ──
2
+ // AppAuthLayout / <app-auth-layout>: a sign-in page, centred by default. The form panel sits in
3
+ // the middle of the page; `.wui-auth-split` (variant="split") adds an aside on the right from the
4
+ // lg tier up, and below lg the aside is hidden so the form is alone and centred.
5
+ // <div class="wui-auth wui-auth-centred|wui-auth-split">
6
+ // <div class="wui-auth-main"><div class="wui-auth-panel">logo, body, footer</div></div>
7
+ // <aside class="wui-auth-aside">…</aside>
8
+ // The aside follows the form in the DOM and sits on the right; nothing reorders it.
9
+ //
10
+ // Part of the wui-components layer, see _wui-components.scss for load order.
11
+
12
+ .wui-auth {
13
+ display: grid;
14
+ grid-template-columns: minmax(0, 1fr);
15
+ min-height: var(--wui-auth-min-height, 100dvh);
16
+ background: var(--color-bg);
17
+ color: var(--color-text);
18
+ }
19
+
20
+ .wui-auth-main {
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ min-width: 0;
25
+ padding: var(--wui-space-xl) var(--wui-space-lg);
26
+ }
27
+
28
+ .wui-auth-panel {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: var(--wui-space-xl);
32
+ width: 100%;
33
+ max-width: var(--wui-auth-width, 420px);
34
+ }
35
+
36
+ .wui-auth-logo {
37
+ display: flex;
38
+ justify-content: center;
39
+ }
40
+ .wui-auth-logo img,
41
+ .wui-auth-logo svg {
42
+ max-width: 100%;
43
+ max-height: 48px;
44
+ height: auto;
45
+ }
46
+
47
+ .wui-auth-body {
48
+ padding: var(--wui-space-xl);
49
+ border: 1px solid var(--color-border);
50
+ border-radius: var(--wui-radius-lg);
51
+ background: var(--color-surface);
52
+ }
53
+
54
+ .wui-auth-footer {
55
+ color: var(--color-text-muted);
56
+ font-size: var(--wui-fs-sm);
57
+ text-align: center;
58
+ }
59
+
60
+ .wui-auth-aside {
61
+ display: none;
62
+ }
63
+
64
+ @include media-breakpoint-up(lg) {
65
+ .wui-auth-split {
66
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
67
+ }
68
+ .wui-auth-split .wui-auth-aside {
69
+ display: flex;
70
+ flex-direction: column;
71
+ justify-content: center;
72
+ min-width: 0;
73
+ padding: var(--wui-space-3xl);
74
+ background: var(--color-primary-soft);
75
+ color: var(--color-text);
76
+ }
77
+ }
@@ -0,0 +1,45 @@
1
+ // Card options: `flush` (content runs to the card's rounded corners) and `divided`
2
+ // (a rule under the header).
3
+ //
4
+ // Part of the wui-components layer, see _wui-components.scss for the load
5
+ // order. This partial loads directly after `wui/card`, because its padding
6
+ // rules must win over the header rule in _card.scss.
7
+
8
+ // A consumer class can set --wui-card-divider-color to retune the rule.
9
+ .card {
10
+ --wui-card-divider-color: var(--color-border);
11
+ }
12
+
13
+ // The card's own border-radius clips the content, so a table or image keeps the corners.
14
+ .card-flush {
15
+ overflow: hidden;
16
+ }
17
+
18
+ // A 1px hairline stays raw: it is a rule, not a spacing or type value.
19
+ .card-divided > .card-header {
20
+ border-bottom: 1px solid var(--wui-card-divider-color);
21
+ }
22
+ // _card.scss removes the body's top padding under any header. A divided card keeps the
23
+ // body's padding step, so each padding class restores its own value here.
24
+ .card-divided > .card-header + .card-body {
25
+ padding-top: var(--bs-card-spacer-y);
26
+ }
27
+ .card-pad-sm.card-divided > .card-header + .card-body {
28
+ padding-top: var(--wui-space-md);
29
+ }
30
+ .card-pad-lg.card-divided > .card-header + .card-body {
31
+ padding-top: var(--wui-space-xl);
32
+ }
33
+ .card-pad-none.card-divided > .card-header + .card-body {
34
+ padding-top: 0;
35
+ }
36
+ .card-compact.card-divided > .card-header + .card-body {
37
+ padding-top: var(--wui-space-lg);
38
+ }
39
+
40
+ // Last, so it wins every tie: flush clears the body only, as `.card-pad-none` does.
41
+ // The header and footer keep their padding.
42
+ .card.card-flush > .card-body,
43
+ .card.card-flush > .card-header + .card-body {
44
+ padding: 0;
45
+ }
@@ -47,7 +47,8 @@
47
47
  // Bootstrap has its own `.card-title` (a bare margin-bottom) — these override it,
48
48
  // so they must stay in the layer that loads after Bootstrap.
49
49
  // A product sets its title type with --wui-card-title-font-family, -fs, -fw and -lh.
50
- .card-title {
50
+ .card-title,
51
+ .result-title {
51
52
  margin: 0;
52
53
  font-family: var(--wui-card-title-font-family, inherit);
53
54
  font-size: var(--wui-card-title-fs, 16px);
@@ -0,0 +1,56 @@
1
+ // ── Cell ──
2
+ // AppCell / <app-cell>: one table or list cell with a primary line and an optional secondary line.
3
+ // Markup contract, shared by both surfaces and the rules below:
4
+ //
5
+ // Component: React AppCell Razor <app-cell>
6
+ // Props: primary string|node Razor: attribute `primary`, or the tag child content when `primary` is absent
7
+ // secondary string|node Razor: attribute `secondary`; absent or empty draws no second line
8
+ // href string when set the primary is an <a>, else a <span>
9
+ // mono bool, false monospace on the primary line only
10
+ // numeric bool, false right-aligned, tabular digits, both lines
11
+ // className string React; Razor uses plain `class`
12
+ // Markup (identical on both surfaces, class order fixed):
13
+ // <div class="wui-cell [wui-cell-numeric] [wui-cell-mono] [extra]" data-wui="AppCell">
14
+ // <a|span class="wui-cell-primary" [href="..."]>PRIMARY</a|span>
15
+ // <span class="wui-cell-secondary">SECONDARY</span> (omitted when no secondary)
16
+ // </div>
17
+ // Empty primary (null, undefined, "" and no child content) draws the placeholder "-" (React EMPTY_PLACEHOLDER from ../lib/emptyValue, Razor EmptyValue.Placeholder).
18
+ // 0 is real data and draws as "0".
19
+ // Classes (all new, all wui-*): wui-cell, wui-cell-primary, wui-cell-secondary, wui-cell-numeric, wui-cell-mono
20
+ //
21
+ // Part of the wui-components layer, see _wui-components.scss for load order.
22
+
23
+ .wui-cell {
24
+ display: block;
25
+ min-width: 0;
26
+ line-height: var(--wui-lh-heading);
27
+ }
28
+
29
+ .wui-cell-primary {
30
+ display: block;
31
+ font-weight: var(--wui-fw-medium);
32
+ color: var(--color-text);
33
+ }
34
+
35
+ a.wui-cell-primary {
36
+ text-decoration: none;
37
+
38
+ &:hover {
39
+ text-decoration: underline;
40
+ }
41
+ }
42
+
43
+ .wui-cell-secondary {
44
+ display: block;
45
+ font-size: var(--wui-fs-sm);
46
+ color: var(--color-text-muted);
47
+ }
48
+
49
+ .wui-cell-numeric {
50
+ text-align: right;
51
+ font-variant-numeric: tabular-nums;
52
+ }
53
+
54
+ .wui-cell-mono > .wui-cell-primary {
55
+ font-family: var(--wui-font-mono);
56
+ }
@@ -336,13 +336,6 @@
336
336
  font-size: 16px;
337
337
  border-radius: var(--wui-field-lg-radius);
338
338
  }
339
- // xl: the 52px select, the same height as an AppInput at size="xl". A literal height, as on the input.
340
- .wui-search-select-xl .search-select-control {
341
- height: 52px;
342
- min-height: 52px;
343
- font-size: 16px;
344
- border-radius: var(--wui-field-lg-radius);
345
- }
346
339
  // Multi-select grows with its chips, so a size sets the FLOOR (min-height from the rule
347
340
  // above) but never a fixed height — reset height:auto so a second row of chips can appear.
348
341
  .search-select-sm .search-select-multi,
@@ -479,15 +479,6 @@
479
479
  font-size: 16px;
480
480
  border-radius: var(--wui-field-lg-radius);
481
481
  }
482
- // xl (size="xl"): the 52px control for large forms. A literal height, because the control-height
483
- // ladder stops at 44px and its tokens live in the theme's token file. A floating label needs no
484
- // rule of its own: it centres on the field's box, so it stays inside at 52px.
485
- .wui-input-xl {
486
- height: 52px;
487
- padding: 9px 16px;
488
- font-size: 16px;
489
- border-radius: var(--wui-field-lg-radius);
490
- }
491
482
  .textarea,
492
483
  textarea.form-control {
493
484
  height: auto;
@@ -917,8 +908,7 @@ $wui-field-error-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/
917
908
  --wui-input-icon-size: 14px;
918
909
  --wui-input-icon-gap: 10px;
919
910
  }
920
- .input-icon:has(> .input-lg),
921
- .input-icon:has(> .wui-input-xl) {
911
+ .input-icon:has(> .input-lg) {
922
912
  --wui-input-icon-slot: 48px;
923
913
  --wui-input-icon-size: 18px;
924
914
  --wui-input-icon-gap: 14px;
@@ -1477,9 +1467,6 @@ wui-select[compact] {
1477
1467
  .input-with-unit .num-input.input-lg {
1478
1468
  height: calc(var(--wui-control-lg) - 2px);
1479
1469
  }
1480
- .input-with-unit .num-input.wui-input-xl {
1481
- height: calc(52px - 2px);
1482
- }
1483
1470
  .input-with-unit .num-input:focus {
1484
1471
  box-shadow: none;
1485
1472
  }
@@ -97,10 +97,11 @@
97
97
  }
98
98
 
99
99
  // ── Table ──
100
- // DataTable cell helpers
100
+ // DataTable cell helpers. End-aligned cells use tabular digits so the figures in a column line up.
101
101
  .table-ledger .wui-cell-end,
102
102
  .table-ledger thead th.wui-cell-end {
103
103
  text-align: right;
104
+ font-variant-numeric: tabular-nums;
104
105
  }
105
106
 
106
107
  // Row expansion (renderExpanded) — a narrow leading toggle column, a chevron that rotates when
@@ -1496,6 +1496,15 @@ button.wui-link {
1496
1496
  z-index: 0;
1497
1497
  white-space: var(--wui-link-label-white-space, nowrap);
1498
1498
  }
1499
+ // maxLines: the label wraps and stops at that many lines, the clamp drawing the ellipsis. The
1500
+ // underline sits 1px inside the label's bottom edge, so overflow: hidden does not clip it.
1501
+ .wui-link--clamp .wui-link__label {
1502
+ white-space: normal;
1503
+ display: -webkit-box;
1504
+ -webkit-box-orient: vertical;
1505
+ -webkit-line-clamp: var(--wui-link-max-lines, none);
1506
+ overflow: hidden;
1507
+ }
1499
1508
  // A link in a table cell may wrap: a nowrap label runs under the pinned actions column.
1500
1509
  .table-ledger td .wui-link__label {
1501
1510
  --wui-link-label-white-space: normal;
@@ -0,0 +1,50 @@
1
+ // The busy state of a form field (React loading, Razor loading, <wui-*> loading). Part of the wui-components layer, see _wui-components.scss for load order.
2
+
3
+ @property --wui-busy-angle {
4
+ syntax: "<angle>";
5
+ inherits: false;
6
+ initial-value: 0deg;
7
+ }
8
+ @keyframes wui-field-busy-spin {
9
+ to {
10
+ --wui-busy-angle: 360deg;
11
+ }
12
+ }
13
+
14
+ .wui-field-busy {
15
+ cursor: progress;
16
+ pointer-events: none;
17
+ }
18
+
19
+ .input.wui-field-busy,
20
+ .textarea.wui-field-busy,
21
+ .form-control.wui-field-busy,
22
+ .select.wui-field-busy {
23
+ padding-inline-end: var(--wui-space-2xl);
24
+ background-repeat: no-repeat;
25
+ background-position: right 12px center;
26
+ background-size: 18px 18px;
27
+ background-image:
28
+ radial-gradient(circle, var(--color-surface) 0 5px, transparent 5.5px),
29
+ conic-gradient(from var(--wui-busy-angle), transparent 0 30%, var(--color-primary) 30% 100%);
30
+ animation: wui-field-busy-spin 0.7s linear infinite;
31
+ }
32
+
33
+ @media (prefers-reduced-motion: reduce) {
34
+ .input.wui-field-busy,
35
+ .textarea.wui-field-busy,
36
+ .form-control.wui-field-busy,
37
+ .select.wui-field-busy {
38
+ animation: none;
39
+ }
40
+ }
41
+
42
+ .form-check-input.wui-field-busy,
43
+ .segmented.wui-field-busy,
44
+ .struct-card.wui-field-busy,
45
+ .choice-chip.wui-field-busy,
46
+ .wui-rating.wui-field-busy,
47
+ .slider.wui-field-busy,
48
+ .otp.wui-field-busy {
49
+ opacity: var(--wui-disabled-opacity);
50
+ }
@@ -39,10 +39,6 @@
39
39
  font-size: max(16px, #{$form-select-font-size-lg});
40
40
  }
41
41
 
42
- .wui-input-xl {
43
- font-size: max(16px, 16px);
44
- }
45
-
46
42
  input,
47
43
  textarea,
48
44
  select {
@@ -0,0 +1,55 @@
1
+ // Size steps for fields that had none: textarea, checkbox, switch, OTP. Part of the wui-components layer, see _wui-components.scss for load order.
2
+
3
+ // .textarea sets its own padding and height after .input-sm/.input-lg, so the shared step classes
4
+ // need restating with the textarea's specificity.
5
+ // A typed-in field stays at 16px or more on a phone, or iOS zooms on focus; --wui-fs-lg is the smallest text step that does.
6
+ .textarea.input-sm {
7
+ padding: var(--wui-space-sm) var(--wui-space-md) var(--wui-space-sm);
8
+ font-size: var(--wui-fs-lg);
9
+ border-radius: var(--wui-field-sm-radius);
10
+ }
11
+ .textarea.input-lg {
12
+ padding: var(--wui-space-md) var(--wui-space-lg) var(--wui-space-lg);
13
+ font-size: var(--wui-fs-lg);
14
+ border-radius: var(--wui-field-lg-radius);
15
+ }
16
+
17
+ .form-check.form-check-sm .form-check-input {
18
+ width: 16px;
19
+ height: 16px;
20
+ background-size: 12px 12px;
21
+ }
22
+ .form-check.form-check-lg .form-check-input {
23
+ width: 24px;
24
+ height: 24px;
25
+ background-size: 18px 18px;
26
+ }
27
+ .form-check.form-check-sm .form-check-label {
28
+ font-size: var(--wui-fs-xs);
29
+ }
30
+ .form-check.form-check-lg .form-check-label {
31
+ font-size: var(--wui-fs-base);
32
+ }
33
+
34
+ // Written after the checkbox rules: equal specificity, so the switch sizes win on a switch.
35
+ .form-switch.form-check-sm .form-check-input {
36
+ width: 32px;
37
+ height: 18px;
38
+ background-size: 14px 14px;
39
+ }
40
+ .form-switch.form-check-lg .form-check-input {
41
+ width: 48px;
42
+ height: 26px;
43
+ background-size: 22px 22px;
44
+ }
45
+
46
+ wui-otp[size="sm"] .otp-slot {
47
+ width: 36px;
48
+ height: var(--wui-control-sm);
49
+ font-size: var(--wui-fs-sm);
50
+ }
51
+ wui-otp[size="lg"] .otp-slot {
52
+ width: 52px;
53
+ height: 52px;
54
+ font-size: var(--wui-fs-lg);
55
+ }
@@ -1,5 +1,5 @@
1
1
  // ── Floating stack ──
2
- // The one fixed corner container the compact floating buttons (the chat launcher, the report-an-issue
2
+ // The one fixed corner container the compact floating buttons (AppFloatingButton: the chat launcher, the report-an-issue
3
3
  // button) portal into, so they stack with a gap and never overlap or need a hand-set offset. React's
4
4
  // useFloatingStack creates it; the items inside are not fixed themselves.
5
5
  //
@@ -42,7 +42,7 @@
42
42
  }
43
43
 
44
44
  // ── Compact floating button ──
45
- // An icon-only circle. The label lives in the tooltip and the aria-label, never on the button.
45
+ // An icon-only circle in three sizes. The label lives in the tooltip and the aria-label, never on the button.
46
46
  .wui-floating-btn {
47
47
  --wui-floating-size: 48px;
48
48
 
@@ -55,6 +55,13 @@
55
55
  border-radius: 50%;
56
56
  box-shadow: var(--wui-shadow-popover);
57
57
  }
58
+ // Sizes of the circle. The base class is the 48px medium size.
59
+ .wui-floating-btn--sm {
60
+ --wui-floating-size: 40px;
61
+ }
62
+ .wui-floating-btn--lg {
63
+ --wui-floating-size: 56px;
64
+ }
58
65
  // Quieter than the primary circle: a light brand tint, the brand icon and a thin brand border.
59
66
  .wui-floating-btn--secondary {
60
67
  --wui-floating-size: 40px;
@@ -46,7 +46,7 @@
46
46
  .wui-split-button .btn:focus-visible {
47
47
  z-index: 2;
48
48
  }
49
- .wui-split-button > .btn.btn-text:first-child {
49
+ .wui-split-button > .btn.btn-link-primary:first-child {
50
50
  padding-inline-end: 0.5rem;
51
51
  }
52
52
 
@@ -64,6 +64,12 @@
64
64
  .wui-inline-edit-value[data-wui-empty] {
65
65
  color: var(--color-text-subtle);
66
66
  }
67
+ // wrap={false}: one line, as a table cell or a tight header expects.
68
+ .wui-inline-edit--nowrap,
69
+ .wui-inline-edit--nowrap .wui-inline-edit-value {
70
+ white-space: nowrap;
71
+ overflow-wrap: normal;
72
+ }
67
73
 
68
74
  .wui-inline-edit-icon {
69
75
  display: inline-flex;
@@ -658,7 +658,7 @@ body[data-rr-ui-modal-open] {
658
658
 
659
659
  // Tone presets — swap the three colour vars; the arrow follows --bs-tooltip-bg automatically.
660
660
  // Fills that carry white text use the AA-cleared -strong tokens; warning stays dark-on-yellow.
661
- .tooltip.wui-tooltip.tone-dark {
661
+ .tooltip.wui-tooltip.wui-tooltip-inverse {
662
662
  --wui-tooltip-bg: var(--color-text);
663
663
  --wui-tooltip-color: var(--color-bg);
664
664
  --wui-tooltip-border: transparent;
@@ -695,6 +695,15 @@ body[data-rr-ui-modal-open] {
695
695
  flex-direction: column;
696
696
  gap: 8px;
697
697
  max-width: min(92vw, 400px);
698
+ --wui-toast-offset: var(--wui-toast-edge-offset);
699
+ }
700
+
701
+ // Bootstrap's p-3 pads every side; the pinned edge takes the offset instead, and the side inset stays.
702
+ .wui-toast-container.top-0 {
703
+ padding-top: var(--wui-toast-offset) !important;
704
+ }
705
+ .wui-toast-container.bottom-0 {
706
+ padding-bottom: var(--wui-toast-offset) !important;
698
707
  }
699
708
 
700
709
  // An end-side stack moves clear of an open side drawer, so a toast never covers the panel's
@@ -2,8 +2,8 @@
2
2
  //
3
3
  // Part of the wui-components layer; imported right after _data.scss. Order within the layer is load-bearing (see _wui-components.scss).
4
4
 
5
- // Pagination footer: a "10 per page" menu beside the page buttons, flush under a table. No row
6
- // range and no total; the page buttons say where you are.
5
+ // Pagination footer: a "10 per page" menu beside the page buttons, flush under a table. A range
6
+ // summary ("Showing x to y of z") shows only with summary, otherwise the page buttons say where you are.
7
7
  .table-pagination {
8
8
  display: flex;
9
9
  align-items: center;
@@ -20,6 +20,11 @@
20
20
  align-items: center;
21
21
  white-space: nowrap;
22
22
  }
23
+ .wui-pager-summary {
24
+ margin-inline-end: auto;
25
+ white-space: nowrap;
26
+ font-variant-numeric: tabular-nums;
27
+ }
23
28
  .select.tpg-select {
24
29
  width: auto;
25
30
  min-width: 64px;
@@ -152,6 +157,9 @@
152
157
  padding: 0;
153
158
  border-top: none;
154
159
  }
160
+ .wui-table-pagination-standalone > .wui-pager-summary {
161
+ margin-inline-end: 0;
162
+ }
155
163
 
156
164
  // The compact pager: 28px page and arrow buttons and 12px text. A phone keeps the 44px target.
157
165
  .wui-table-pagination-sm {
@@ -310,3 +310,8 @@ wui-rich-text[readonly] .wui-rich-text-prose {
310
310
  ):active:not(:disabled, [aria-disabled="true"]) {
311
311
  background-image: linear-gradient(var(--wui-pressed-overlay), var(--wui-pressed-overlay)) !important;
312
312
  }
313
+
314
+ // The busy dim of wui/field-busy, kept here because the shell class belongs to this on-demand layer.
315
+ .wui-rich-text-shell.wui-field-busy {
316
+ opacity: var(--wui-disabled-opacity);
317
+ }
@@ -273,6 +273,30 @@
273
273
  flex: none;
274
274
  overflow: hidden;
275
275
  }
276
+ .app-sidebar-brand .wui-brand-logo,
277
+ .app-sidebar-brand .wui-brand-mark {
278
+ display: block;
279
+ flex: none;
280
+ height: var(--wui-brand-logo-height, 32px);
281
+ width: auto;
282
+ max-width: 100%;
283
+ }
284
+ .app-sidebar-brand .wui-brand-mark {
285
+ display: none;
286
+ width: var(--wui-brand-logo-height, 32px);
287
+ }
288
+ .app-sidebar-brand.wui-brand-mark-only .wui-brand-mark {
289
+ display: block;
290
+ }
291
+ .app-sidebar-brand .wui-brand-dark {
292
+ display: none;
293
+ }
294
+ :root[data-theme="dark"] .app-sidebar-brand.wui-brand-themed .wui-brand-light {
295
+ display: none;
296
+ }
297
+ :root[data-theme="dark"] .app-sidebar-brand .wui-brand-dark {
298
+ display: block;
299
+ }
276
300
  // The nav list scrolls independently while the brand row stays put. `min-height: 0`
277
301
  // is load-bearing — without it this flex child refuses to shrink below its content
278
302
  // and the overflow never engages, so the lower nav items become unreachable.
@@ -545,6 +569,23 @@
545
569
  gap: 0;
546
570
  padding: 0;
547
571
  }
572
+ .app-shell.collapsed .app-sidebar-brand.wui-brand-has-mark .wui-brand-logo {
573
+ display: none;
574
+ }
575
+ .app-shell.collapsed .app-sidebar-brand.wui-brand-has-mark .wui-brand-mark {
576
+ display: block;
577
+ }
578
+ .app-shell.collapsed .app-sidebar-brand:not(.wui-brand-has-mark) .wui-brand-logo {
579
+ width: var(--wui-brand-logo-height, 32px);
580
+ object-fit: cover;
581
+ object-position: left center;
582
+ }
583
+ :root[data-theme="dark"] .app-shell.collapsed .app-sidebar-brand.wui-brand-themed .wui-brand-mark.wui-brand-light {
584
+ display: none;
585
+ }
586
+ :root[data-theme="dark"] .app-shell.collapsed .app-sidebar-brand .wui-brand-mark.wui-brand-dark {
587
+ display: block;
588
+ }
548
589
  // The label leaves the VISUAL flow but must stay in the accessibility tree — an
549
590
  // icon-only rail link with display:none text has no accessible name (axe
550
591
  // link-name, serious). Clip-rect keeps the name; no phantom gap since it takes
@@ -33,7 +33,7 @@
33
33
  color: inherit;
34
34
  }
35
35
  // The default tooltip sits on the plain surface colour, so its chip takes the plain chip look.
36
- .tooltip.wui-tooltip:not(.tone-dark):not(.tone-primary):not(.tone-success):not(.tone-danger):not(.tone-warning) .wui-kbd {
36
+ .tooltip.wui-tooltip:not(.wui-tooltip-inverse):not(.tone-primary):not(.tone-success):not(.tone-danger):not(.tone-warning) .wui-kbd {
37
37
  border-color: var(--color-border);
38
38
  background: var(--color-bg-muted);
39
39
  color: var(--color-text);