@webority/theme 0.107.0 → 0.108.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.
@@ -945,7 +945,7 @@
945
945
  // ── Logo picker ──
946
946
  // Round dropzone uploader (workspace/brand logo) and the settings-page photo
947
947
  // ring share this same interactive-uploader pattern.
948
- .set-uploader {
948
+ .wui-image-picker {
949
949
  // The ring diameter (--wui-logo-size) is set on the shell, not here, so the sibling remove
950
950
  // control inherits it too; the ring, initials font and icons all derive from it.
951
951
  display: inline-flex;
@@ -956,16 +956,16 @@
956
956
  color: inherit;
957
957
  cursor: pointer;
958
958
  }
959
- .set-uploader:disabled {
959
+ .wui-image-picker:disabled {
960
960
  cursor: progress;
961
961
  }
962
- .set-uploader-img {
962
+ .wui-image-picker-img {
963
963
  width: 100%;
964
964
  height: 100%;
965
965
  border-radius: 50%;
966
966
  object-fit: cover;
967
967
  }
968
- .set-uploader-ring {
968
+ .wui-image-picker-ring {
969
969
  position: relative;
970
970
  width: var(--wui-logo-size);
971
971
  height: var(--wui-logo-size);
@@ -975,16 +975,16 @@
975
975
  cursor: pointer;
976
976
  transition: border-color 0.18s;
977
977
  // Query container so the overlay can drop its label on a small ring (see the @container
978
- // rule after .set-uploader-overlay). container-type also makes the ring the containing
978
+ // rule after .wui-image-picker-overlay). container-type also makes the ring the containing
979
979
  // block for the absolute overlay — same role its position:relative already plays.
980
980
  container-type: inline-size;
981
981
  }
982
- .set-uploader-ring:hover,
983
- .set-uploader:hover .set-uploader-ring,
984
- .set-uploader:focus-visible .set-uploader-ring {
982
+ .wui-image-picker-ring:hover,
983
+ .wui-image-picker:hover .wui-image-picker-ring,
984
+ .wui-image-picker:focus-visible .wui-image-picker-ring {
985
985
  border-color: var(--color-primary);
986
986
  }
987
- .set-uploader-logo {
987
+ .wui-image-picker-logo {
988
988
  width: 100%;
989
989
  height: 100%;
990
990
  border-radius: 50%;
@@ -999,10 +999,10 @@
999
999
  }
1000
1000
  // Avatar variant — the standard avatar disc (muted fill) instead of the soft-primary
1001
1001
  // initials plate; used with a person icon when no initials are given.
1002
- .set-uploader--avatar .set-uploader-logo {
1002
+ .wui-image-picker-avatar .wui-image-picker-logo {
1003
1003
  background: color-mix(in srgb, var(--color-primary) 15%, var(--color-surface));
1004
1004
  }
1005
- .set-uploader-overlay {
1005
+ .wui-image-picker-overlay {
1006
1006
  position: absolute;
1007
1007
  inset: 5px;
1008
1008
  border-radius: 50%;
@@ -1023,9 +1023,9 @@
1023
1023
  opacity: 0;
1024
1024
  transition: opacity 0.18s;
1025
1025
  }
1026
- .set-uploader-ring:hover .set-uploader-overlay,
1027
- .set-uploader:hover .set-uploader-overlay,
1028
- .set-uploader:focus-visible .set-uploader-overlay {
1026
+ .wui-image-picker-ring:hover .wui-image-picker-overlay,
1027
+ .wui-image-picker:hover .wui-image-picker-overlay,
1028
+ .wui-image-picker:focus-visible .wui-image-picker-overlay {
1029
1029
  opacity: 1;
1030
1030
  }
1031
1031
  // A ring too small to fit "Update photo" without cramping it over the initials (sm = 72px,
@@ -1033,10 +1033,10 @@
1033
1033
  // affordance. The lone icon grows a little so it reads as the whole overlay's cue. Driven by a
1034
1034
  // container query on the ring, so it works for every size, preset or custom px.
1035
1035
  @container (max-width: 95px) {
1036
- .set-uploader-overlay > span {
1036
+ .wui-image-picker-overlay > span {
1037
1037
  display: none;
1038
1038
  }
1039
- .set-uploader-overlay > .wui-icon {
1039
+ .wui-image-picker-overlay > .wui-icon {
1040
1040
  width: calc(var(--wui-logo-size) * 0.34);
1041
1041
  height: calc(var(--wui-logo-size) * 0.34);
1042
1042
  }
@@ -1044,7 +1044,7 @@
1044
1044
  // (reusing the AppTooltip surface look). Text comes from data-overlay-label on the ring — a
1045
1045
  // distinct attribute from data-wui-tip so the global tooltip rule never fires this on a large
1046
1046
  // ring. Only rendered inside this container query, so md/lg (label visible) never get it.
1047
- .set-uploader-ring[data-overlay-label]::after {
1047
+ .wui-image-picker-ring[data-overlay-label]::after {
1048
1048
  content: attr(data-overlay-label);
1049
1049
  position: absolute;
1050
1050
  top: calc(100% + 8px);
@@ -1073,29 +1073,29 @@
1073
1073
  }
1074
1074
  // :not(:disabled) — a disabled/loading picker can't be updated, so it shows no tooltip
1075
1075
  // (mirrors the overlay, which isn't rendered in those states).
1076
- .set-uploader:not(:disabled):hover .set-uploader-ring[data-overlay-label]::after,
1077
- .set-uploader:not(:disabled):focus-visible .set-uploader-ring[data-overlay-label]::after {
1076
+ .wui-image-picker:not(:disabled):hover .wui-image-picker-ring[data-overlay-label]::after,
1077
+ .wui-image-picker:not(:disabled):focus-visible .wui-image-picker-ring[data-overlay-label]::after {
1078
1078
  opacity: 1;
1079
1079
  visibility: visible;
1080
1080
  }
1081
1081
  @media (prefers-reduced-motion: reduce) {
1082
- .set-uploader-ring[data-overlay-label]::after {
1082
+ .wui-image-picker-ring[data-overlay-label]::after {
1083
1083
  transition: none;
1084
1084
  }
1085
1085
  }
1086
1086
  }
1087
1087
  // While uploading: keep the overlay (spinner) visible and signal it's not
1088
1088
  // clickable.
1089
- .set-uploader-overlay.is-loading {
1089
+ .wui-image-picker-overlay.is-loading {
1090
1090
  opacity: 1;
1091
1091
  }
1092
- .set-uploader[aria-busy="true"] {
1092
+ .wui-image-picker[aria-busy="true"] {
1093
1093
  cursor: progress;
1094
1094
  }
1095
- .set-uploader[aria-busy="true"] .set-uploader-logo {
1095
+ .wui-image-picker[aria-busy="true"] .wui-image-picker-logo {
1096
1096
  visibility: hidden;
1097
1097
  }
1098
- .set-uploader-hint {
1098
+ .wui-image-picker-hint {
1099
1099
  margin: 12px 0 0;
1100
1100
  max-width: 240px;
1101
1101
  font-size: 12px;
@@ -1104,7 +1104,7 @@
1104
1104
  }
1105
1105
  // The picker field sizes to its content (the ring) rather than stretching to the
1106
1106
  // form width the way a text field does.
1107
- .set-uploader-field {
1107
+ .wui-image-picker-field {
1108
1108
  gap: 8px;
1109
1109
  width: max-content;
1110
1110
  max-width: 100%;
@@ -1112,7 +1112,7 @@
1112
1112
  // Positioning context for the remove control, which is a sibling of the button. It also owns the
1113
1113
  // one sizing knob — the ring diameter — so BOTH children (the button and the remove control)
1114
1114
  // inherit it. Presets and the numeric `size` prop set it inline; md (120px) is the default.
1115
- .set-uploader-shell {
1115
+ .wui-image-picker-shell {
1116
1116
  --wui-logo-size: 120px;
1117
1117
  position: relative;
1118
1118
  display: inline-block;
@@ -1121,35 +1121,35 @@
1121
1121
  // ── Inline (profile-row) layout ── ring on the left, a title/subtitle/hint column beside it —
1122
1122
  // the account-settings avatar row (name + role + allowed-files hint on one line). The field
1123
1123
  // spans its container rather than shrinking to the ring the way the stacked layout does.
1124
- .set-uploader-field--inline {
1124
+ .wui-image-picker-field-inline {
1125
1125
  width: 100%;
1126
1126
  max-width: none;
1127
1127
  }
1128
- .set-uploader-row {
1128
+ .wui-image-picker-row {
1129
1129
  display: flex;
1130
1130
  align-items: center;
1131
1131
  gap: 20px;
1132
1132
  }
1133
- .set-uploader-meta {
1133
+ .wui-image-picker-meta {
1134
1134
  display: flex;
1135
1135
  flex-direction: column;
1136
1136
  gap: 2px;
1137
1137
  min-width: 0;
1138
1138
  }
1139
- .set-uploader-title {
1139
+ .wui-image-picker-title {
1140
1140
  font-size: 15px;
1141
1141
  font-weight: 700;
1142
1142
  line-height: 1.35;
1143
1143
  color: var(--color-text);
1144
1144
  }
1145
- .set-uploader-subtitle {
1145
+ .wui-image-picker-subtitle {
1146
1146
  font-size: 14px;
1147
1147
  line-height: 1.4;
1148
1148
  color: var(--color-text-muted);
1149
1149
  }
1150
1150
  // In the row layout the hint sits under the subtitle in the meta column — no top gap to the
1151
1151
  // ring and no 240px cap (it reads as a full line beside the avatar, like the reference).
1152
- .set-uploader-meta .set-uploader-hint {
1152
+ .wui-image-picker-meta .wui-image-picker-hint {
1153
1153
  margin-top: 6px;
1154
1154
  max-width: none;
1155
1155
  }
@@ -1157,34 +1157,34 @@
1157
1157
  // ── Profile (vertical identity) layout ── the same title/subtitle/hint block as inline, but
1158
1158
  // stacked and centred beneath the ring — an account card / directory tile. The field shrinks to
1159
1159
  // its content and centres the ring + text column.
1160
- .set-uploader-field--profile {
1160
+ .wui-image-picker-field-profile {
1161
1161
  align-items: center;
1162
1162
  text-align: center;
1163
1163
  width: max-content;
1164
1164
  max-width: 100%;
1165
1165
  }
1166
- .set-uploader-field--profile .set-uploader-meta {
1166
+ .wui-image-picker-field-profile .wui-image-picker-meta {
1167
1167
  align-items: center;
1168
1168
  margin-top: 12px;
1169
1169
  }
1170
1170
  // Centred under the ring, the hint reads best with a sensible cap rather than running full width.
1171
- .set-uploader-field--profile .set-uploader-meta .set-uploader-hint {
1171
+ .wui-image-picker-field-profile .wui-image-picker-meta .wui-image-picker-hint {
1172
1172
  max-width: 240px;
1173
1173
  }
1174
1174
  // Ring highlights while a file is dragged over it.
1175
- .set-uploader.is-dragging .set-uploader-ring {
1175
+ .wui-image-picker.is-dragging .wui-image-picker-ring {
1176
1176
  border-color: var(--color-primary);
1177
1177
  background: var(--color-primary-soft);
1178
1178
  }
1179
1179
  // A plain disabled (not busy) picker: dim it and drop the pointer affordance.
1180
- .set-uploader:disabled:not([aria-busy="true"]) {
1180
+ .wui-image-picker:disabled:not([aria-busy="true"]) {
1181
1181
  cursor: not-allowed;
1182
1182
  opacity: var(--wui-disabled-opacity);
1183
1183
  }
1184
- .set-uploader:disabled:not([aria-busy="true"]) .set-uploader-ring {
1184
+ .wui-image-picker:disabled:not([aria-busy="true"]) .wui-image-picker-ring {
1185
1185
  border-style: solid;
1186
1186
  }
1187
- .set-uploader-remove {
1187
+ .wui-image-picker-remove {
1188
1188
  position: absolute;
1189
1189
  top: 2px;
1190
1190
  right: 2px;
@@ -1206,15 +1206,15 @@
1206
1206
  }
1207
1207
  // The × glyph scales with the button (its width/height attributes are set in JS/Razor as a
1208
1208
  // baseline; this overrides them, the way the overlay icon is scaled under its container query).
1209
- .set-uploader-remove > .wui-icon {
1209
+ .wui-image-picker-remove > .wui-icon {
1210
1210
  width: clamp(11px, calc(var(--wui-logo-size) * 0.115), 17px);
1211
1211
  height: clamp(11px, calc(var(--wui-logo-size) * 0.115), 17px);
1212
1212
  }
1213
- .set-uploader-remove:hover {
1213
+ .wui-image-picker-remove:hover {
1214
1214
  transform: scale(1.08);
1215
1215
  }
1216
1216
  // The control's own display would otherwise beat the UA [hidden] rule and keep it visible.
1217
- .set-uploader-remove[hidden] {
1217
+ .wui-image-picker-remove[hidden] {
1218
1218
  display: none;
1219
1219
  }
1220
1220
 
@@ -1222,16 +1222,16 @@
1222
1222
  // `size` prop / preset), so there are no per-size class rules to keep in sync.
1223
1223
 
1224
1224
  // Shape variants — every round face (ring, image, logo, overlay) shares one radius.
1225
- .set-uploader--rounded .set-uploader-ring,
1226
- .set-uploader--rounded .set-uploader-img,
1227
- .set-uploader--rounded .set-uploader-logo,
1228
- .set-uploader--rounded .set-uploader-overlay {
1225
+ .wui-image-picker-rounded .wui-image-picker-ring,
1226
+ .wui-image-picker-rounded .wui-image-picker-img,
1227
+ .wui-image-picker-rounded .wui-image-picker-logo,
1228
+ .wui-image-picker-rounded .wui-image-picker-overlay {
1229
1229
  border-radius: 18px;
1230
1230
  }
1231
- .set-uploader--square .set-uploader-ring,
1232
- .set-uploader--square .set-uploader-img,
1233
- .set-uploader--square .set-uploader-logo,
1234
- .set-uploader--square .set-uploader-overlay {
1231
+ .wui-image-picker-square .wui-image-picker-ring,
1232
+ .wui-image-picker-square .wui-image-picker-img,
1233
+ .wui-image-picker-square .wui-image-picker-logo,
1234
+ .wui-image-picker-square .wui-image-picker-overlay {
1235
1235
  border-radius: 8px;
1236
1236
  }
1237
1237
 
@@ -5,51 +5,6 @@
5
5
  // partials are a split of one stylesheet, not independent modules, so a rule
6
6
  // here may be overridden by a later partial. Never reorder the imports.
7
7
 
8
- // ── Drawer / Sidebar menu ──
9
- // AppSidebarMenu — react-bootstrap Offcanvas mapped onto the app tokens plus
10
- // a flex column layout for the header / scrolling body / sticky footer.
11
- .app-sidebar-menu.offcanvas {
12
- // Phone first: a side panel fills the screen, because a 420px panel on a 430px phone leaves a
13
- // sliver of page that reads as a rendering fault. From sm up it takes its own width (below).
14
- --bs-offcanvas-width: 100vw;
15
- --bs-offcanvas-bg: var(--color-surface);
16
- --bs-offcanvas-color: var(--color-text);
17
- --bs-offcanvas-border-color: var(--color-border);
18
- --bs-offcanvas-border-width: 1px;
19
- --bs-offcanvas-padding-x: 0;
20
- --bs-offcanvas-padding-y: 0;
21
- // A caller's own maxWidth still caps the panel on a phone.
22
- max-width: var(--asm-max-width, 100vw);
23
- display: flex;
24
- flex-direction: column;
25
- }
26
- @include media-breakpoint-up(sm) {
27
- .app-sidebar-menu.offcanvas {
28
- --bs-offcanvas-width: var(--asm-width, 420px);
29
- max-width: var(--asm-max-width, 92vw);
30
- }
31
- }
32
- .app-sidebar-menu .offcanvas-body {
33
- // Inset the content to the same 20px gutter as the header/footer so plain body
34
- // content doesn't stick to the panel edge. Full-bleed content (edge-to-edge nav
35
- // rows) can zero it back out via `bodyClassName="p-0"`.
36
- padding: 18px 20px;
37
- display: flex;
38
- flex-direction: column;
39
- flex: 1;
40
- min-height: 0;
41
- }
42
- // Let a caller's bodyClassName padding utility actually win over the default above
43
- // (the descendant selector would otherwise out-specify a single utility class).
44
- .app-sidebar-menu .offcanvas-body.p-0 {
45
- padding: 0;
46
- }
47
- .app-sidebar-menu .asm-footer {
48
- padding: 16px 20px;
49
- border-top: 1px solid var(--color-border);
50
- background: var(--color-surface);
51
- }
52
-
53
8
  .drawer {
54
9
  position: fixed;
55
10
  top: 0;
@@ -86,6 +86,10 @@
86
86
  padding: 10px 16px;
87
87
  border-bottom: 1px solid var(--color-border);
88
88
  }
89
+ .wui-notification-center-tabs {
90
+ padding: 0 var(--wui-space-lg);
91
+ border-bottom: 1px solid var(--color-border);
92
+ }
89
93
  .wui-notification-center-title {
90
94
  margin: 0;
91
95
  font-size: 1rem;
@@ -95,10 +95,9 @@
95
95
  flex-direction: column;
96
96
  overflow: hidden;
97
97
  }
98
- // The centred card keeps Bootstrap's own modal transition — a smooth fade + slide-down that
99
- // Bootstrap already disables under prefers-reduced-motion. Nothing to override here; both
100
- // react-bootstrap (animation on) and Bootstrap's JS drive it. Width comes from `size`, which
101
- // both surfaces resolve to `--wui-modal-max-width` on the shell (it inherits to `.wui-modal`).
98
+ // The centred card opens with the shared dialog motion (wui/_dialog-motion.scss: soft zoom by
99
+ // default). Width comes from `size`, which both surfaces resolve to `--wui-modal-max-width` on
100
+ // the shell (it inherits to `.wui-modal`).
102
101
  .wui-modal-header {
103
102
  flex: 0 0 auto;
104
103
  display: flex;
@@ -280,7 +279,7 @@
280
279
  // fixed across states: only the tint animates, so the button never morphs into a
281
280
  // circle. Slower on the way in than the way out.
282
281
  //
283
- // The drawer (AppSidebarMenu) header close shares the rule, so the two overlays dismiss with
282
+ // The drawer (AppDrawer) header close shares the rule, so the two overlays dismiss with
284
283
  // the same control.
285
284
  .wui-modal-close,
286
285
  .wui-drawer-close {
@@ -0,0 +1,168 @@
1
+ // Pager: the table-footer and standalone page controls.
2
+ //
3
+ // Part of the wui-components layer; imported right after _data.scss. Order within the layer is load-bearing (see _wui-components.scss).
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.
7
+ .table-pagination {
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: flex-end;
11
+ gap: var(--wui-space-lg);
12
+ padding: var(--wui-space-md) var(--wui-space-lg);
13
+ border-top: 1px solid var(--color-border);
14
+ font-size: var(--wui-fs-xs);
15
+ color: var(--color-text-muted);
16
+ flex-wrap: wrap;
17
+ }
18
+ .tpg-rows {
19
+ display: inline-flex;
20
+ align-items: center;
21
+ white-space: nowrap;
22
+ }
23
+ .select.tpg-select {
24
+ width: auto;
25
+ min-width: 64px;
26
+ height: var(--wui-control-sm);
27
+ min-height: var(--wui-control-sm);
28
+ padding: 0 var(--wui-space-2xl) 0 var(--wui-space-md);
29
+ font-size: var(--wui-fs-xs);
30
+ font-weight: var(--wui-fw-semibold);
31
+ border-radius: var(--wui-radius-md);
32
+ background-position: right 8px center;
33
+ background-size: 14px;
34
+ }
35
+ .tpg-range {
36
+ font-variant-numeric: tabular-nums;
37
+ white-space: nowrap;
38
+ font-size: var(--wui-fs-sm);
39
+ font-weight: var(--wui-fw-medium);
40
+ color: var(--color-text-muted);
41
+ }
42
+ .tpg-nav {
43
+ display: inline-flex;
44
+ flex-wrap: wrap;
45
+ justify-content: flex-end;
46
+ align-items: center;
47
+ gap: var(--wui-space-xs);
48
+ }
49
+ .tpg-arrow {
50
+ display: grid;
51
+ place-items: center;
52
+ width: var(--wui-control-sm);
53
+ height: var(--wui-control-sm);
54
+ border: none;
55
+ background: transparent;
56
+ color: var(--color-text-muted);
57
+ border-radius: 50%;
58
+ cursor: pointer;
59
+ transition:
60
+ background 0.14s ease,
61
+ color 0.14s ease;
62
+ }
63
+ .tpg-arrow:hover:not(:disabled) {
64
+ background: color-mix(in srgb, var(--color-primary) 10%, transparent);
65
+ color: var(--color-primary-text);
66
+ }
67
+ .tpg-arrow:focus-visible {
68
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
69
+ outline-offset: var(--wui-focus-ring-offset);
70
+ }
71
+ // Text-5 already reads as "unavailable", so there is no opacity dimming on top of it.
72
+ .tpg-arrow:disabled {
73
+ color: var(--color-border-strong);
74
+ cursor: not-allowed;
75
+ }
76
+
77
+ // Numbered mode (mode="numbered"): windowed page buttons sitting between the prev/next
78
+ // arrows in .tpg-nav, same 32px circular hit target as .tpg-arrow.
79
+ .tpg-page {
80
+ display: grid;
81
+ place-items: center;
82
+ min-width: var(--wui-control-sm);
83
+ height: var(--wui-control-sm);
84
+ padding: 0 var(--wui-space-sm);
85
+ border: none;
86
+ background: transparent;
87
+ color: var(--color-text-muted);
88
+ border-radius: 50%;
89
+ font-size: var(--wui-fs-xs);
90
+ font-weight: var(--wui-fw-semibold);
91
+ font-variant-numeric: tabular-nums;
92
+ text-decoration: none;
93
+ cursor: pointer;
94
+ transition:
95
+ background 0.14s ease,
96
+ color 0.14s ease;
97
+ }
98
+ .tpg-page:hover:not(.is-active) {
99
+ background: color-mix(in srgb, var(--color-primary) 10%, transparent);
100
+ color: var(--color-primary-text);
101
+ }
102
+ .tpg-page:focus-visible {
103
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
104
+ outline-offset: var(--wui-focus-ring-offset);
105
+ }
106
+ .tpg-page.is-active {
107
+ background: var(--color-primary);
108
+ color: var(--color-on-primary);
109
+ cursor: default;
110
+ }
111
+ .tpg-ellipsis {
112
+ display: grid;
113
+ place-items: center;
114
+ min-width: 24px;
115
+ height: var(--wui-control-sm);
116
+ color: var(--color-text-subtle);
117
+ font-size: var(--wui-fs-xs);
118
+ user-select: none;
119
+ }
120
+ // A finger needs a 44px target: the pager's controls grow to the control height on a phone.
121
+ @media (max-width: 575.98px) {
122
+ .select.tpg-select {
123
+ height: var(--wui-control-md);
124
+ min-height: var(--wui-control-md);
125
+ }
126
+ .tpg-arrow {
127
+ width: var(--wui-control-md);
128
+ height: var(--wui-control-md);
129
+ }
130
+ .tpg-page {
131
+ min-width: var(--wui-control-md);
132
+ height: var(--wui-control-md);
133
+ }
134
+ .tpg-ellipsis {
135
+ height: var(--wui-control-md);
136
+ }
137
+ }
138
+
139
+ // Standalone pager: centred under a card or list, no footer rule or padding.
140
+ .wui-table-pagination-standalone {
141
+ justify-content: center;
142
+ padding: 0;
143
+ border-top: none;
144
+ }
145
+
146
+ // The compact pager: 28px page and arrow buttons and 12px text. A phone keeps the 44px target.
147
+ .wui-table-pagination-sm {
148
+ font-size: var(--wui-fs-xs);
149
+ .tpg-arrow,
150
+ .tpg-page {
151
+ width: 28px;
152
+ min-width: 28px;
153
+ height: 28px;
154
+ }
155
+ .tpg-page {
156
+ font-size: var(--wui-fs-xs);
157
+ }
158
+ }
159
+ @media (max-width: 575.98px) {
160
+ .wui-table-pagination-sm {
161
+ .tpg-arrow,
162
+ .tpg-page {
163
+ width: var(--wui-control-md);
164
+ min-width: var(--wui-control-md);
165
+ height: var(--wui-control-md);
166
+ }
167
+ }
168
+ }
@@ -0,0 +1,31 @@
1
+ // Lead capture section of a marketing page (AppSectionLeadCapture).
2
+ //
3
+ // Part of the wui-components layer; imported after _sections.scss. Order within the layer is load-bearing (see _wui-components.scss).
4
+
5
+ .wui-section-lead-text {
6
+ max-width: 48rem;
7
+ margin: 0;
8
+ color: var(--color-text-muted);
9
+ }
10
+ .wui-section-lead-form,
11
+ .wui-section-lead-success {
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: var(--wui-space-md);
15
+ width: 100%;
16
+ max-width: 40rem;
17
+ }
18
+ .wui-section-center .wui-section-lead-form,
19
+ .wui-section-center .wui-section-lead-success {
20
+ margin-inline: auto;
21
+ }
22
+ .wui-section-lead-fields {
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: var(--wui-space-md);
26
+ }
27
+ .wui-section-lead-consent {
28
+ margin: 0;
29
+ color: var(--color-text-muted);
30
+ font-size: var(--wui-fs-sm);
31
+ }
@@ -134,6 +134,15 @@
134
134
  background: var(--color-bg-muted);
135
135
  color: var(--color-text);
136
136
  }
137
+ .wui-shortcut-group + .wui-shortcut-group {
138
+ margin-top: var(--wui-space-lg);
139
+ }
140
+ .wui-shortcut-group-title {
141
+ margin: 0 0 var(--wui-space-sm);
142
+ font-size: var(--wui-fs-sm);
143
+ font-weight: var(--wui-fw-semibold);
144
+ color: var(--color-text-subtle);
145
+ }
137
146
  .wui-shortcut-keys {
138
147
  display: grid;
139
148
  gap: 6px;
@@ -152,6 +161,6 @@
152
161
  .wui-shortcut-keys dd {
153
162
  margin: 0;
154
163
  color: var(--color-text-muted);
155
- font-size: 13px;
164
+ font-size: var(--wui-fs-sm);
156
165
  text-align: end;
157
166
  }
@@ -29,7 +29,7 @@
29
29
  .wui-table-server > .table-wrap[data-wui-table-error] > .table > tbody {
30
30
  display: none;
31
31
  }
32
- .wui-table-error .tbl-empty-icon {
32
+ .wui-table-error .empty-state-icon {
33
33
  color: var(--color-danger-text);
34
34
  background: var(--color-danger-soft);
35
35
  }
@@ -45,6 +45,23 @@
45
45
  .wui-whats-new:not([data-wui-unread]) .wui-whats-new-dot {
46
46
  display: none;
47
47
  }
48
+ // With indicator="count" the dot holds the unread number, so it widens into a pill around it.
49
+ .wui-whats-new[indicator="count"] .wui-whats-new-dot {
50
+ box-sizing: border-box;
51
+ width: auto;
52
+ min-width: 18px;
53
+ height: 18px;
54
+ padding: 0 var(--wui-space-xs);
55
+ border-radius: var(--wui-radius-pill);
56
+ background: var(--color-primary);
57
+ color: var(--color-on-primary);
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ font-size: var(--wui-fs-xs);
62
+ font-weight: var(--wui-fw-semibold);
63
+ line-height: var(--wui-lh-heading);
64
+ }
48
65
 
49
66
  .wui-whats-new-panel {
50
67
  display: none;