@webority/theme 0.127.0 → 0.129.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/README.md +8 -3
- package/dist/published-theme.json +2 -1
- package/dist/purge-safelist.json +55 -53
- package/dist/webority-theme.css +1 -1
- package/package.json +2 -2
- package/scss/_bootstrap.generated.scss +1 -1
- package/scss/_components.scss +33 -3
- package/scss/_tokens.generated.scss +395 -23
- package/scss/_variables.scss +12 -15
- package/scss/_wui-components.scss +7 -1
- package/scss/_wui-core.scss +7 -0
- package/scss/wui/_account-switcher.scss +70 -0
- package/scss/wui/_auth-layout.scss +77 -0
- package/scss/wui/_card-options.scss +45 -0
- package/scss/wui/_card.scss +5 -3
- package/scss/wui/_cell.scss +56 -0
- package/scss/wui/_choice.scss +6 -8
- package/scss/wui/_controls.scss +8 -14
- package/scss/wui/_data.scss +6 -1
- package/scss/wui/_dialog-motion.scss +90 -0
- package/scss/wui/_display.scss +12 -1
- package/scss/wui/_field-busy.scss +50 -0
- package/scss/wui/_field-floor.scss +0 -4
- package/scss/wui/_field-sizes.scss +55 -0
- package/scss/wui/_floating.scss +9 -2
- package/scss/wui/_inline-edit.scss +6 -0
- package/scss/wui/_interaction.scss +9 -1
- package/scss/wui/_overlays.scss +18 -1
- package/scss/wui/_pagination.scss +20 -2
- package/scss/wui/_rich-text.scss +5 -0
- package/scss/wui/_shell-parts.scss +17 -0
- package/scss/wui/_shell.scss +65 -0
- package/scss/wui/_typography.scss +25 -7
- package/scss/wui/_utilities.scss +35 -0
- package/scss/wui/_workspace.scss +12 -0
- package/token-meanings.json +15 -0
- package/scss/wui/_chat.scss +0 -156
|
@@ -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
|
+
}
|
package/scss/wui/_floating.scss
CHANGED
|
@@ -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;
|
|
@@ -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;
|
|
@@ -268,9 +268,17 @@ html:has(.form-actions-sticky) {
|
|
|
268
268
|
.app-tabs-scroll-btn {
|
|
269
269
|
min-width: 44px;
|
|
270
270
|
}
|
|
271
|
-
wui-select
|
|
271
|
+
wui-select .search-select-control {
|
|
272
272
|
min-height: 44px;
|
|
273
273
|
}
|
|
274
|
+
.app-tabs-sm .app-tab {
|
|
275
|
+
min-height: 44px;
|
|
276
|
+
}
|
|
277
|
+
// An inline link grows its hit area, not its line: the negative margin pays the padding back.
|
|
278
|
+
.wui-link {
|
|
279
|
+
padding-block: var(--wui-space-md);
|
|
280
|
+
margin-block: calc(-1 * var(--wui-space-md));
|
|
281
|
+
}
|
|
274
282
|
}
|
|
275
283
|
|
|
276
284
|
// Touch pointers at any width: the same 44px floor for controls the phone block does not reach.
|
package/scss/wui/_overlays.scss
CHANGED
|
@@ -93,7 +93,15 @@
|
|
|
93
93
|
max-height: calc(100vh - 40px);
|
|
94
94
|
display: flex;
|
|
95
95
|
flex-direction: column;
|
|
96
|
-
|
|
96
|
+
// clip, not hidden: hidden makes the card a scroll container, so a focused control near its foot scrolled the card, not .wui-modal-body.
|
|
97
|
+
overflow: clip;
|
|
98
|
+
}
|
|
99
|
+
// The document gutter is reserved (html, body in _components.scss) and AppModal locks the page itself
|
|
100
|
+
// (ui-react lib/pageScrollLock.js), so the modal manager's scrollbar padding on body only bares a strip of
|
|
101
|
+
// page beside the backdrop. Bootstrap and react-bootstrap write it inline, which only !important outranks.
|
|
102
|
+
body.modal-open,
|
|
103
|
+
body[data-rr-ui-modal-open] {
|
|
104
|
+
padding-right: 0 !important;
|
|
97
105
|
}
|
|
98
106
|
// The centred card opens with the shared dialog motion (wui/_dialog-motion.scss: soft zoom by
|
|
99
107
|
// default). Width comes from `size`, which both surfaces resolve to `--wui-modal-max-width` on
|
|
@@ -687,6 +695,15 @@
|
|
|
687
695
|
flex-direction: column;
|
|
688
696
|
gap: 8px;
|
|
689
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;
|
|
690
707
|
}
|
|
691
708
|
|
|
692
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.
|
|
6
|
-
//
|
|
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;
|
|
@@ -119,6 +124,16 @@
|
|
|
119
124
|
}
|
|
120
125
|
// A finger needs a 44px target: the pager's controls grow to the control height on a phone.
|
|
121
126
|
@media (max-width: 575.98px) {
|
|
127
|
+
// On a phone the parts spread across the row and the page buttons take their own centred line.
|
|
128
|
+
.table-pagination {
|
|
129
|
+
justify-content: space-between;
|
|
130
|
+
gap: var(--wui-space-sm) var(--wui-space-md);
|
|
131
|
+
padding: var(--wui-space-md);
|
|
132
|
+
}
|
|
133
|
+
.tpg-nav {
|
|
134
|
+
flex-basis: 100%;
|
|
135
|
+
justify-content: center;
|
|
136
|
+
}
|
|
122
137
|
.select.tpg-select {
|
|
123
138
|
height: var(--wui-control-md);
|
|
124
139
|
min-height: var(--wui-control-md);
|
|
@@ -142,6 +157,9 @@
|
|
|
142
157
|
padding: 0;
|
|
143
158
|
border-top: none;
|
|
144
159
|
}
|
|
160
|
+
.wui-table-pagination-standalone > .wui-pager-summary {
|
|
161
|
+
margin-inline-end: 0;
|
|
162
|
+
}
|
|
145
163
|
|
|
146
164
|
// The compact pager: 28px page and arrow buttons and 12px text. A phone keeps the 44px target.
|
|
147
165
|
.wui-table-pagination-sm {
|
package/scss/wui/_rich-text.scss
CHANGED
|
@@ -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
|
+
}
|
|
@@ -246,6 +246,23 @@
|
|
|
246
246
|
color: var(--color-text-body);
|
|
247
247
|
font-weight: var(--wui-fw-medium);
|
|
248
248
|
}
|
|
249
|
+
.wui-usermenu-extra {
|
|
250
|
+
margin-top: var(--wui-space-xxs);
|
|
251
|
+
font-size: var(--wui-fs-xs);
|
|
252
|
+
line-height: var(--wui-lh-body);
|
|
253
|
+
color: var(--color-text-muted);
|
|
254
|
+
}
|
|
255
|
+
// 6px is the menu's row gap: no token sits between xs and sm, so it is the two below it.
|
|
256
|
+
.wui-usermenu-section {
|
|
257
|
+
margin-bottom: calc(var(--wui-space-xs) + var(--wui-space-xxs));
|
|
258
|
+
padding-bottom: calc(var(--wui-space-xs) + var(--wui-space-xxs));
|
|
259
|
+
border-bottom: 1px solid var(--color-border);
|
|
260
|
+
}
|
|
261
|
+
.wui-usermenu-foot {
|
|
262
|
+
margin-top: calc(var(--wui-space-xs) + var(--wui-space-xxs));
|
|
263
|
+
padding-top: var(--wui-space-sm);
|
|
264
|
+
border-top: 1px solid var(--color-border);
|
|
265
|
+
}
|
|
249
266
|
.wui-usermenu-logout {
|
|
250
267
|
margin: 0;
|
|
251
268
|
}
|
package/scss/wui/_shell.scss
CHANGED
|
@@ -222,6 +222,15 @@
|
|
|
222
222
|
.app-shell.no-sidebar .app-footer {
|
|
223
223
|
left: 0;
|
|
224
224
|
}
|
|
225
|
+
// Below lg the drawer and the phone tab bar carry the navigation, so the topbar menu waits for lg.
|
|
226
|
+
.app-shell.wui-shell-top .wui-shell-top-nav {
|
|
227
|
+
display: none;
|
|
228
|
+
}
|
|
229
|
+
.wui-shell-top-brand {
|
|
230
|
+
display: flex;
|
|
231
|
+
align-items: center;
|
|
232
|
+
flex: none;
|
|
233
|
+
}
|
|
225
234
|
|
|
226
235
|
// Sticky always makes a stacking context, so without a z-index here the page content after the
|
|
227
236
|
// sidebar paints over anything the sidebar lets out, such as an open workspace switcher menu.
|
|
@@ -264,6 +273,30 @@
|
|
|
264
273
|
flex: none;
|
|
265
274
|
overflow: hidden;
|
|
266
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
|
+
}
|
|
267
300
|
// The nav list scrolls independently while the brand row stays put. `min-height: 0`
|
|
268
301
|
// is load-bearing — without it this flex child refuses to shrink below its content
|
|
269
302
|
// and the overflow never engages, so the lower nav items become unreachable.
|
|
@@ -536,6 +569,23 @@
|
|
|
536
569
|
gap: 0;
|
|
537
570
|
padding: 0;
|
|
538
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
|
+
}
|
|
539
589
|
// The label leaves the VISUAL flow but must stay in the accessibility tree — an
|
|
540
590
|
// icon-only rail link with display:none text has no accessible name (axe
|
|
541
591
|
// link-name, serious). Clip-rect keeps the name; no phantom gap since it takes
|
|
@@ -715,6 +765,21 @@
|
|
|
715
765
|
display: none;
|
|
716
766
|
}
|
|
717
767
|
@include media-breakpoint-up(lg) {
|
|
768
|
+
.app-shell.wui-shell-top {
|
|
769
|
+
grid-template-columns: 1fr;
|
|
770
|
+
}
|
|
771
|
+
.app-shell.wui-shell-top .app-sidebar,
|
|
772
|
+
.app-shell.wui-shell-top .app-sidebar-toggle {
|
|
773
|
+
display: none;
|
|
774
|
+
}
|
|
775
|
+
.app-shell.wui-shell-top .app-footer {
|
|
776
|
+
left: 0;
|
|
777
|
+
}
|
|
778
|
+
.app-shell.wui-shell-top .wui-shell-top-nav {
|
|
779
|
+
display: flex;
|
|
780
|
+
align-items: center;
|
|
781
|
+
min-width: 0;
|
|
782
|
+
}
|
|
718
783
|
.app-shell.collapsed .app-nav-item[data-label]::after {
|
|
719
784
|
content: attr(data-label);
|
|
720
785
|
position: absolute;
|
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
// partials are a split of one stylesheet, not independent modules, so a rule
|
|
7
7
|
// here may be overridden by a later partial. Never reorder the imports.
|
|
8
8
|
|
|
9
|
+
// Bootstrap reads its text face from --bs-font-sans-serif (through --bs-body-font-family). Pointing it at the
|
|
10
|
+
// theme token means a product that sets --wui-font-ui restyles Bootstrap-only controls too, with no sheet of its own.
|
|
11
|
+
:root {
|
|
12
|
+
--bs-font-sans-serif: var(--wui-font-ui);
|
|
13
|
+
}
|
|
14
|
+
|
|
9
15
|
// ── Text-scale utilities (wui-text-*) ──
|
|
10
16
|
.wui-text-xs {
|
|
11
17
|
font-size: 12px;
|
|
@@ -15,6 +21,11 @@
|
|
|
15
21
|
font-size: 13.5px;
|
|
16
22
|
line-height: 1.5;
|
|
17
23
|
}
|
|
24
|
+
// Text a person typed: keep their line breaks and break a long unbroken run (a URL) instead of overflowing.
|
|
25
|
+
.wui-prewrap {
|
|
26
|
+
white-space: pre-wrap;
|
|
27
|
+
overflow-wrap: anywhere;
|
|
28
|
+
}
|
|
18
29
|
.wui-text-base {
|
|
19
30
|
font-size: 15px;
|
|
20
31
|
line-height: 1.5;
|
|
@@ -351,7 +362,8 @@
|
|
|
351
362
|
.search-select-multi {
|
|
352
363
|
align-items: center;
|
|
353
364
|
gap: 6px;
|
|
354
|
-
|
|
365
|
+
// The md field height is the floor, so a one-row multi-select lines up with the inputs and buttons beside it.
|
|
366
|
+
min-height: var(--wui-control-md);
|
|
355
367
|
height: auto;
|
|
356
368
|
padding-top: 5px;
|
|
357
369
|
padding-bottom: 5px;
|
|
@@ -490,12 +502,6 @@ wui-multiselect[collapse-chips] .ms-chips {
|
|
|
490
502
|
}
|
|
491
503
|
// AppTagInput renders its input inside the chip row, after the chips, so the shared
|
|
492
504
|
// `.ms-chips > .ms-input` rule above lets it wrap with them and fill the rest of the line.
|
|
493
|
-
// Match AppInput's per-size heights: the shared `.search-select-multi` floor is lower than the md
|
|
494
|
-
// control height, so raise it; sm and lg come from the size-specific `.search-select-{sm,lg}
|
|
495
|
-
// .search-select-control` rules.
|
|
496
|
-
wui-taginput .search-select-multi {
|
|
497
|
-
min-height: var(--wui-control-md);
|
|
498
|
-
}
|
|
499
505
|
|
|
500
506
|
/* ── Choice card: image / custom-template variant ── */
|
|
501
507
|
.struct-card-img-card {
|
|
@@ -525,3 +531,15 @@ wui-taginput .search-select-multi {
|
|
|
525
531
|
top: 8px;
|
|
526
532
|
right: 8px;
|
|
527
533
|
}
|
|
534
|
+
|
|
535
|
+
// Line breaks in the text are kept and long lines still wrap. Used by multiline on app-value, app-description and AppDescriptions items.
|
|
536
|
+
.wui-pre-line {
|
|
537
|
+
white-space: pre-line;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// Monospace text for codes and references. The control selectors give a field the same family as plain text.
|
|
541
|
+
.wui-mono,
|
|
542
|
+
.form-control.wui-mono,
|
|
543
|
+
.input.wui-mono {
|
|
544
|
+
font-family: var(--bs-font-monospace);
|
|
545
|
+
}
|
package/scss/wui/_utilities.scss
CHANGED
|
@@ -725,6 +725,10 @@
|
|
|
725
725
|
// They read the --color-*-strong aliases, not --wui-*-strong, because dark mode remaps the
|
|
726
726
|
// aliases to the lifted fills: the deep fills sink into the dark track (about 2:1). The label
|
|
727
727
|
// flips to a dark ink there (--color-progress-label), which clears AA on all five dark fills.
|
|
728
|
+
// The product's own primary, for a bar that tracks a brand action.
|
|
729
|
+
.wui-progress-primary {
|
|
730
|
+
background-color: var(--color-primary);
|
|
731
|
+
}
|
|
728
732
|
.wui-progress-info {
|
|
729
733
|
background-color: var(--color-info-strong);
|
|
730
734
|
}
|
|
@@ -865,6 +869,7 @@
|
|
|
865
869
|
// data-theme attribute and the auto media query alike, with no per-component dark rules.
|
|
866
870
|
.alert-info {
|
|
867
871
|
--bs-alert-bg: var(--color-info-soft);
|
|
872
|
+
--alert-tone: var(--color-info);
|
|
868
873
|
--bs-alert-border-color: var(--color-info-border);
|
|
869
874
|
--bs-alert-color: var(--color-text-body);
|
|
870
875
|
--alert-accent: var(--wui-info-active);
|
|
@@ -873,6 +878,7 @@
|
|
|
873
878
|
}
|
|
874
879
|
.alert-success {
|
|
875
880
|
--bs-alert-bg: var(--color-success-soft);
|
|
881
|
+
--alert-tone: var(--color-success);
|
|
876
882
|
--bs-alert-border-color: var(--color-success-border);
|
|
877
883
|
--bs-alert-color: var(--color-text-body);
|
|
878
884
|
--alert-accent: var(--wui-success-active);
|
|
@@ -881,6 +887,7 @@
|
|
|
881
887
|
}
|
|
882
888
|
.alert-warning {
|
|
883
889
|
--bs-alert-bg: var(--color-warning-soft);
|
|
890
|
+
--alert-tone: var(--color-warning);
|
|
884
891
|
--bs-alert-border-color: var(--color-warning-border);
|
|
885
892
|
--bs-alert-color: var(--color-text-body);
|
|
886
893
|
--alert-accent: var(--wui-warning-active);
|
|
@@ -889,6 +896,7 @@
|
|
|
889
896
|
}
|
|
890
897
|
.alert-danger {
|
|
891
898
|
--bs-alert-bg: var(--color-danger-soft);
|
|
899
|
+
--alert-tone: var(--color-danger);
|
|
892
900
|
--bs-alert-border-color: var(--color-danger-border);
|
|
893
901
|
--bs-alert-color: var(--color-text-body);
|
|
894
902
|
--alert-accent: var(--wui-danger-active);
|
|
@@ -996,6 +1004,33 @@
|
|
|
996
1004
|
align-items: center;
|
|
997
1005
|
gap: 8px;
|
|
998
1006
|
}
|
|
1007
|
+
// A tinted, outline, ghost or text button in the action slot takes the alert's tone instead of
|
|
1008
|
+
// the brand colour, so it reads as part of the alert. The label is the alert's AA-safe text
|
|
1009
|
+
// colour. Solid buttons (primary, danger, warning) keep their own fill, which carries meaning.
|
|
1010
|
+
.alert-action :is(.btn-secondary, .btn-outline-primary, .btn-ghost, .btn-text) {
|
|
1011
|
+
--bs-btn-color: var(--alert-text);
|
|
1012
|
+
--bs-btn-hover-color: var(--alert-text);
|
|
1013
|
+
--bs-btn-active-color: var(--alert-text);
|
|
1014
|
+
--bs-btn-disabled-color: var(--alert-text);
|
|
1015
|
+
--bs-btn-focus-box-shadow: 0 0 0 0.25rem color-mix(in srgb, var(--alert-tone) 40%, transparent);
|
|
1016
|
+
}
|
|
1017
|
+
.alert-action .btn-secondary {
|
|
1018
|
+
--bs-btn-bg: color-mix(in srgb, var(--alert-tone) 16%, transparent);
|
|
1019
|
+
--bs-btn-hover-bg: color-mix(in srgb, var(--alert-tone) 24%, transparent);
|
|
1020
|
+
--bs-btn-active-bg: color-mix(in srgb, var(--alert-tone) 32%, transparent);
|
|
1021
|
+
}
|
|
1022
|
+
.alert-action .btn-outline-primary {
|
|
1023
|
+
--bs-btn-border-color: var(--alert-tone);
|
|
1024
|
+
--bs-btn-hover-bg: color-mix(in srgb, var(--alert-tone) 16%, transparent);
|
|
1025
|
+
--bs-btn-hover-border-color: var(--alert-tone);
|
|
1026
|
+
--bs-btn-active-bg: color-mix(in srgb, var(--alert-tone) 24%, transparent);
|
|
1027
|
+
--bs-btn-active-border-color: var(--alert-tone);
|
|
1028
|
+
--bs-btn-disabled-border-color: var(--alert-tone);
|
|
1029
|
+
}
|
|
1030
|
+
.alert-action .btn-ghost {
|
|
1031
|
+
--bs-btn-hover-bg: color-mix(in srgb, var(--alert-tone) 16%, transparent);
|
|
1032
|
+
--bs-btn-active-bg: color-mix(in srgb, var(--alert-tone) 24%, transparent);
|
|
1033
|
+
}
|
|
999
1034
|
@include media-breakpoint-up(md) {
|
|
1000
1035
|
.alert-has-action {
|
|
1001
1036
|
flex-wrap: nowrap;
|
package/scss/wui/_workspace.scss
CHANGED
|
@@ -121,6 +121,18 @@
|
|
|
121
121
|
height: 32px;
|
|
122
122
|
padding: 0;
|
|
123
123
|
}
|
|
124
|
+
// A finger needs a 44px target: the small and compact switchers grow on a phone or a touch screen.
|
|
125
|
+
@media (max-width: 575.98px), (pointer: coarse) {
|
|
126
|
+
.workspace-switcher-sm .workspace-switcher-trigger {
|
|
127
|
+
min-height: 44px;
|
|
128
|
+
}
|
|
129
|
+
.workspace-switcher-trigger.is-compact,
|
|
130
|
+
.workspace-switcher-sm .workspace-switcher-trigger.is-compact {
|
|
131
|
+
width: 44px;
|
|
132
|
+
height: 44px;
|
|
133
|
+
min-height: 44px;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
124
136
|
.workspace-switcher-sm .workspace-switcher-mark {
|
|
125
137
|
width: 24px;
|
|
126
138
|
height: 24px;
|
package/token-meanings.json
CHANGED
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"--color-field-border-focus": "Border of a focused, open or active control such as an input or select.",
|
|
40
40
|
"--color-field-border-hover": "Hover border of an input-like control.",
|
|
41
41
|
"--color-focus-ring": "Colour of the keyboard focus ring drawn on focus-visible controls.",
|
|
42
|
+
"--color-focus-ring-soft": "Translucent step of the focus ring colour, for a soft halo around a focused field.",
|
|
42
43
|
"--color-info": "Vivid info fill for badges and dots.",
|
|
43
44
|
"--color-info-border": "Tinted info border of alerts and badges.",
|
|
44
45
|
"--color-info-pressed": "Info fill while a control is pressed.",
|
|
@@ -64,6 +65,10 @@
|
|
|
64
65
|
"--color-success-text": "Success colour as text on light surfaces.",
|
|
65
66
|
"--color-success-text-on-soft": "Success text on a soft success tint, such as an alert heading.",
|
|
66
67
|
"--color-surface": "Card and panel surface.",
|
|
68
|
+
"--color-surface-inverse-wash-12": "Medium translucent wash over an inverse band, for a selected or pressed tile or row.",
|
|
69
|
+
"--color-surface-inverse-wash-24": "Strong translucent wash over an inverse band, for a divider or a filled chip.",
|
|
70
|
+
"--color-surface-inverse-wash-4": "Faintest translucent wash over an inverse band, for a resting tile or row.",
|
|
71
|
+
"--color-surface-inverse-wash-8": "Light translucent wash over an inverse band, for a hovered tile or row.",
|
|
67
72
|
"--color-text": "Main heading and body ink.",
|
|
68
73
|
"--color-text-body": "Body copy on a tinted surface such as an alert body.",
|
|
69
74
|
"--color-text-muted": "Secondary text for descriptions and muted copy.",
|
|
@@ -84,8 +89,11 @@
|
|
|
84
89
|
"--wui-border-light": "Default hairline border of cards, tables and dividers.",
|
|
85
90
|
"--wui-border-soft": "Softest border, for inner dividers.",
|
|
86
91
|
"--wui-border-strong": "Strong border for emphasised separators, chart axes and unselected control outlines.",
|
|
92
|
+
"--wui-card-pad": "Padding inside a card and its header; a card class can set it to retune one card.",
|
|
87
93
|
"--wui-card-shadow-lifted": "Shadow of a lifted card, none in this theme.",
|
|
88
94
|
"--wui-card-shadow-lifted-hover": "Shadow of a lifted card while it is hovered, none in this theme.",
|
|
95
|
+
"--wui-card-title-fs": "Font size of a card title.",
|
|
96
|
+
"--wui-card-title-lh": "Line height of a card title.",
|
|
89
97
|
"--wui-chart-1": "Colour of chart series 1, the brand primary.",
|
|
90
98
|
"--wui-chart-2": "Colour of chart series 2 of the eight categorical series.",
|
|
91
99
|
"--wui-chart-3": "Colour of chart series 3 of the eight categorical series.",
|
|
@@ -155,6 +163,7 @@
|
|
|
155
163
|
"--wui-dark-text-muted": "Secondary text colour in dark mode.",
|
|
156
164
|
"--wui-dark-text-subtle": "Tertiary text colour in dark mode, for hints and captions.",
|
|
157
165
|
"--wui-disabled-opacity": "Opacity of a control that dims as a whole when disabled.",
|
|
166
|
+
"--wui-drawer-max": "Height of a bottom sheet drawer as a count of viewport height percent.",
|
|
158
167
|
"--wui-ease-elastic": "Overshooting easing for the tab ink bar's spring into place.",
|
|
159
168
|
"--wui-ease-out": "Easing curve matching the locked design's motion exports.",
|
|
160
169
|
"--wui-ease-ui": "Easing curve for interface transitions.",
|
|
@@ -171,6 +180,7 @@
|
|
|
171
180
|
"--wui-first-day": "Weekday calendars start their week on, from 0 for Sunday to 6 for Saturday.",
|
|
172
181
|
"--wui-focus-ring-inset": "Offset that draws the focus ring inside a scrolling container.",
|
|
173
182
|
"--wui-focus-ring-offset": "Gap between a control and its keyboard focus ring.",
|
|
183
|
+
"--wui-focus-ring-soft-shadow": "Soft halo drawn around a focused text field, in the translucent focus ring colour.",
|
|
174
184
|
"--wui-focus-ring-width": "Width of the keyboard focus ring.",
|
|
175
185
|
"--wui-font-display": "Display typeface for headings marked as display text.",
|
|
176
186
|
"--wui-font-mono": "Monospace typeface for code, identifiers and figures that must line up.",
|
|
@@ -201,9 +211,12 @@
|
|
|
201
211
|
"--wui-info-active": "Info ink for icons and active states on light surfaces.",
|
|
202
212
|
"--wui-info-text": "Info colour as text on light surfaces.",
|
|
203
213
|
"--wui-ink": "Pure black ink, the highest-contrast text colour.",
|
|
214
|
+
"--wui-kpi-value-size": "Font size of the main figure in a KPI tile.",
|
|
204
215
|
"--wui-lh-body": "Line height of running text and of any text that is not a heading or display text.",
|
|
205
216
|
"--wui-lh-display": "Line height of display-size text such as hero titles.",
|
|
206
217
|
"--wui-lh-heading": "Line height of headings.",
|
|
218
|
+
"--wui-modal-max-width": "Maximum width of a modal dialog; each dialog sets it from its size.",
|
|
219
|
+
"--wui-nav-menu-current-bg": "Background of the current item in a navigation menu.",
|
|
207
220
|
"--wui-neutral-bg-dark": "Muted background of table emphasis rows and mega-menu hover.",
|
|
208
221
|
"--wui-neutral-bg-light": "Faint background for table emphasis and mega-menu hover.",
|
|
209
222
|
"--wui-neutral-border-dark": "Border tone of table emphasis rows and dividers.",
|
|
@@ -232,6 +245,7 @@
|
|
|
232
245
|
"--wui-scrollbar-active": "Scrollbar thumb colour while it is dragged.",
|
|
233
246
|
"--wui-scrollbar-hover": "Scrollbar thumb colour while it is hovered.",
|
|
234
247
|
"--wui-shadow-card": "Shadow under in-page cards, none in this theme so cards stay flat.",
|
|
248
|
+
"--wui-shadow-elevated": "Shadow of a surface lifted slightly above the page, such as a toast, a sticky bar or a floating action button.",
|
|
235
249
|
"--wui-shadow-modal": "Larger overlay shadow, for the largest floating surfaces.",
|
|
236
250
|
"--wui-shadow-popover": "Shadow of floating overlays such as menus and popovers.",
|
|
237
251
|
"--wui-space-2xl": "Double extra-large step of the spacing scale.",
|
|
@@ -244,6 +258,7 @@
|
|
|
244
258
|
"--wui-space-xl": "Extra-large step of the spacing scale.",
|
|
245
259
|
"--wui-space-xs": "Extra-small step of the spacing scale.",
|
|
246
260
|
"--wui-space-xxs": "Hairline step of the spacing scale.",
|
|
261
|
+
"--wui-step-tile-size": "Width and height of the numbered circle in a step tile.",
|
|
247
262
|
"--wui-success": "Vivid success fill for badges, dots and success buttons.",
|
|
248
263
|
"--wui-success-10": "Success tint 10, the soft background of success alerts and badges.",
|
|
249
264
|
"--wui-success-20": "Success tint 20 for soft fills behind success alerts and badges.",
|