@webority/theme 0.128.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 +47 -54
- package/dist/webority-theme.css +1 -1
- package/package.json +2 -2
- package/scss/_bootstrap.generated.scss +1 -1
- package/scss/_components.scss +24 -2
- 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 +2 -1
- package/scss/wui/_cell.scss +56 -0
- package/scss/wui/_choice.scss +0 -7
- package/scss/wui/_controls.scss +1 -14
- package/scss/wui/_data.scss +2 -1
- package/scss/wui/_display.scss +9 -0
- 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/_overlays.scss +9 -0
- package/scss/wui/_pagination.scss +10 -2
- package/scss/wui/_rich-text.scss +5 -0
- package/scss/wui/_shell.scss +41 -0
- package/scss/wui/_typography.scss +25 -7
- package/scss/wui/_utilities.scss +31 -0
- package/token-meanings.json +15 -0
- package/scss/wui/_chat.scss +0 -156
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
@import "wui/navigation";
|
|
37
37
|
@import "wui/nav-list";
|
|
38
38
|
@import "wui/card";
|
|
39
|
+
@import "wui/card-options";
|
|
39
40
|
@import "wui/empty-state";
|
|
40
41
|
@import "wui/data";
|
|
41
42
|
@import "wui/pagination";
|
|
@@ -89,6 +90,7 @@
|
|
|
89
90
|
@import "wui/filter-popover";
|
|
90
91
|
@import "wui/metric-strip";
|
|
91
92
|
@import "wui/due-date";
|
|
93
|
+
@import "wui/cell";
|
|
92
94
|
|
|
93
95
|
// Country flags are NOT part of this aggregate. The 245 `.wui-flag-*` rules are about 187KB raw
|
|
94
96
|
// (38KB Brotli) of inlined SVG, and most sites never render a phone field or country picker.
|
|
@@ -96,15 +98,16 @@
|
|
|
96
98
|
// <wui-phone> and <wui-country-select> show an empty grey box where the flag should be.
|
|
97
99
|
@import "wui/shell";
|
|
98
100
|
@import "wui/shell-parts";
|
|
101
|
+
@import "wui/account-switcher";
|
|
99
102
|
@import "wui/dock";
|
|
100
103
|
@import "wui/consent-banner";
|
|
101
104
|
@import "wui/file-viewer";
|
|
102
105
|
@import "wui/lightbox";
|
|
103
106
|
@import "wui/toolbar";
|
|
104
107
|
@import "wui/theme-toggle";
|
|
108
|
+
@import "wui/auth-layout";
|
|
105
109
|
@import "wui/tree";
|
|
106
110
|
@import "wui/floating";
|
|
107
|
-
@import "wui/chat";
|
|
108
111
|
@import "wui/code-block";
|
|
109
112
|
// After `overlays`: anchors the shared modal shell to the top when it holds the palette card.
|
|
110
113
|
@import "wui/command-palette";
|
|
@@ -114,6 +117,9 @@
|
|
|
114
117
|
@import "wui/hover-card";
|
|
115
118
|
@import "wui/notification-center";
|
|
116
119
|
@import "wui/whats-new";
|
|
120
|
+
// Before field-floor, which restates the font sizes the size steps set.
|
|
121
|
+
@import "wui/field-busy";
|
|
122
|
+
@import "wui/field-sizes";
|
|
117
123
|
// After every component partial: restates each field's own font size with a 16px floor on touch screens.
|
|
118
124
|
@import "wui/field-floor";
|
|
119
125
|
// After every component partial: the shared focus ring and pressed wash settle ties with their hover rules.
|
package/scss/_wui-core.scss
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
@import "wui/navigation";
|
|
29
29
|
@import "wui/nav-list";
|
|
30
30
|
@import "wui/card";
|
|
31
|
+
@import "wui/card-options";
|
|
31
32
|
@import "wui/empty-state";
|
|
32
33
|
@import "wui/data";
|
|
33
34
|
@import "wui/pagination";
|
|
@@ -75,6 +76,7 @@
|
|
|
75
76
|
@import "wui/filter-popover";
|
|
76
77
|
@import "wui/metric-strip";
|
|
77
78
|
@import "wui/due-date";
|
|
79
|
+
@import "wui/cell";
|
|
78
80
|
|
|
79
81
|
// Country flags are NOT part of this layer. The 245 `.wui-flag-*` rules are about 187KB raw
|
|
80
82
|
// (38KB Brotli) of inlined SVG, and most sites never render a phone field or country picker.
|
|
@@ -82,10 +84,12 @@
|
|
|
82
84
|
// <wui-phone> and <wui-country-select> show an empty grey box where the flag should be.
|
|
83
85
|
@import "wui/shell";
|
|
84
86
|
@import "wui/shell-parts";
|
|
87
|
+
@import "wui/account-switcher";
|
|
85
88
|
@import "wui/consent-banner";
|
|
86
89
|
@import "wui/lightbox";
|
|
87
90
|
@import "wui/toolbar";
|
|
88
91
|
@import "wui/theme-toggle";
|
|
92
|
+
@import "wui/auth-layout";
|
|
89
93
|
@import "wui/floating";
|
|
90
94
|
@import "wui/code-block";
|
|
91
95
|
@import "wui/context-menu";
|
|
@@ -93,6 +97,9 @@
|
|
|
93
97
|
@import "wui/hover-card";
|
|
94
98
|
@import "wui/notification-center";
|
|
95
99
|
@import "wui/whats-new";
|
|
100
|
+
// Before field-floor, which restates the font sizes the size steps set.
|
|
101
|
+
@import "wui/field-busy";
|
|
102
|
+
@import "wui/field-sizes";
|
|
96
103
|
// After every component partial: restates each field's own font size with a 16px floor on touch screens.
|
|
97
104
|
@import "wui/field-floor";
|
|
98
105
|
// After every component partial: the shared focus ring and pressed wash settle ties with their hover rules.
|
|
@@ -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
|
+
}
|
package/scss/wui/_card.scss
CHANGED
|
@@ -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
|
+
}
|
package/scss/wui/_choice.scss
CHANGED
|
@@ -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,
|
package/scss/wui/_controls.scss
CHANGED
|
@@ -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
|
}
|
package/scss/wui/_data.scss
CHANGED
|
@@ -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
|
package/scss/wui/_display.scss
CHANGED
|
@@ -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
|
+
}
|
|
@@ -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;
|
package/scss/wui/_overlays.scss
CHANGED
|
@@ -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.
|
|
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;
|
|
@@ -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 {
|
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
|
+
}
|