@webority/theme 0.104.0 → 0.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/theme",
3
- "version": "0.104.0",
3
+ "version": "0.106.0",
4
4
  "description": "Webority shared design system — Bootstrap 5.3 SCSS overrides, --wui-* tokens, and shared component CSS. The single source of brand chrome for React portals and Razor sites.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "publishConfig": {
@@ -51,7 +51,7 @@
51
51
  "country-flag-icons": "^1.6.20",
52
52
  "sass-embedded": "^1.97.0",
53
53
  "vite": "^8.0.12",
54
- "@webority/tokens": "0.104.0"
54
+ "@webority/tokens": "0.106.0"
55
55
  },
56
56
  "scripts": {
57
57
  "tokens": "node ../tokens/dist/webority.js brand --library --out ../tokens/dist --web scss/_tokens.generated.scss",
@@ -1,4 +1,4 @@
1
- // Generated by @webority/tokens 0.104.0 from its token source. Do not edit; run webority brand --library.
1
+ // Generated by @webority/tokens 0.106.0 from its token source. Do not edit; run webority brand --library.
2
2
  $body-color: #252f4a !default;
3
3
  $body-secondary-color: #4b5675 !default;
4
4
  $body-tertiary-color: #626a82 !default;
@@ -1,4 +1,4 @@
1
- // Generated by @webority/tokens 0.104.0 from its token source. Do not edit; run webority brand --library.
1
+ // Generated by @webority/tokens 0.106.0 from its token source. Do not edit; run webority brand --library.
2
2
 
3
3
  :root {
4
4
  --wui-primary: #4F46E5;
@@ -210,6 +210,10 @@
210
210
  --color-surface-inverse: var(--wui-text-heading);
211
211
  --color-surface-inverse-raised: color-mix(in srgb, var(--color-text-inverse) 5%, var(--color-surface-inverse));
212
212
  --color-surface-inverse-elevated: color-mix(in srgb, var(--color-text-inverse) 9%, var(--color-surface-inverse));
213
+ --color-surface-dark: var(--wui-text-heading);
214
+ --color-surface-dark-border: color-mix(in srgb, var(--wui-bg-light) 14%, var(--wui-text-heading));
215
+ --color-on-surface-dark: var(--wui-bg-light);
216
+ --color-on-surface-dark-muted: color-mix(in srgb, var(--wui-bg-light) 72%, var(--wui-text-heading));
213
217
  --color-text: var(--wui-text-heading);
214
218
  --color-text-body: var(--wui-text-1);
215
219
  --color-text-muted: var(--wui-text-2);
@@ -30,9 +30,11 @@
30
30
  @import "wui/pending";
31
31
  @import "wui/choice";
32
32
  @import "wui/media";
33
+ @import "wui/file-tiles";
33
34
  @import "wui/image-crop";
34
35
  @import "wui/avatar-picker";
35
36
  @import "wui/navigation";
37
+ @import "wui/nav-list";
36
38
  @import "wui/card";
37
39
  @import "wui/data";
38
40
  @import "wui/illustration";
@@ -62,6 +64,7 @@
62
64
  @import "wui/record-pager";
63
65
  @import "wui/shortcuts";
64
66
  @import "wui/split-view";
67
+ @import "wui/detail-pane";
65
68
  @import "wui/groups";
66
69
  @import "wui/carousel";
67
70
  @import "wui/onboarding-checklist";
@@ -23,8 +23,10 @@
23
23
  @import "wui/pending";
24
24
  @import "wui/choice";
25
25
  @import "wui/media";
26
+ @import "wui/file-tiles";
26
27
  @import "wui/avatar-picker";
27
28
  @import "wui/navigation";
29
+ @import "wui/nav-list";
28
30
  @import "wui/card";
29
31
  @import "wui/data";
30
32
  @import "wui/illustration";
@@ -51,6 +53,7 @@
51
53
  @import "wui/record-pager";
52
54
  @import "wui/shortcuts";
53
55
  @import "wui/split-view";
56
+ @import "wui/detail-pane";
54
57
  @import "wui/groups";
55
58
  @import "wui/carousel";
56
59
  @import "wui/onboarding-checklist";
@@ -275,6 +275,25 @@ wui-calendar[data-view="month"] .wui-calendar-chip-title {
275
275
  white-space: normal;
276
276
  }
277
277
 
278
+ // The "+N" link on a card that stands for several events: a small pill of its own inside the card.
279
+ .wui-calendar-stack {
280
+ display: inline-block;
281
+ margin-inline-start: var(--wui-space-xs);
282
+ padding: 0 var(--wui-space-xs);
283
+ border-radius: var(--wui-radius-pill);
284
+ background: var(--color-surface);
285
+ color: var(--color-text-body);
286
+ font-size: var(--wui-fs-xs);
287
+ font-weight: var(--wui-fw-semibold);
288
+ line-height: var(--wui-lh-heading);
289
+ text-decoration: none;
290
+ }
291
+
292
+ .wui-calendar-stack:hover,
293
+ .wui-calendar-stack:focus-visible {
294
+ background: var(--color-bg-muted);
295
+ }
296
+
278
297
  // What a page with no script shows until the element's script replaces it.
279
298
  .wui-calendar-fallback {
280
299
  margin: 0;
@@ -221,6 +221,26 @@ button.wui-reaction:hover,
221
221
  flex-wrap: wrap;
222
222
  gap: 8px;
223
223
  }
224
+ .wui-comment-composer-inline {
225
+ display: flex;
226
+ flex-direction: row;
227
+ flex-wrap: wrap;
228
+ align-items: flex-start;
229
+ gap: var(--wui-space-xs);
230
+ }
231
+ .wui-comment-composer-inline .wui-comment-composer-avatar {
232
+ flex: none;
233
+ }
234
+ .wui-comment-composer-inline .wui-mention-input {
235
+ flex: 1;
236
+ min-width: 0;
237
+ }
238
+ .wui-comment-composer-inline .wui-comment-form-actions {
239
+ margin: 0;
240
+ }
241
+ .wui-comment-composer-inline .wui-comment-error {
242
+ flex: 1 0 100%;
243
+ }
224
244
 
225
245
  .wui-comment-error {
226
246
  font-size: 12px;
@@ -0,0 +1,25 @@
1
+ // AppDetailPane / <app-detail-pane>: an in-page detail column beside a list, filled by WUI.pane.load.
2
+
3
+ .wui-detail-pane {
4
+ min-width: 0;
5
+ }
6
+ .wui-detail-pane[data-sticky] {
7
+ position: sticky;
8
+ top: var(--wui-detail-pane-top, var(--wui-space-4xl));
9
+ align-self: start;
10
+ max-height: calc(100dvh - var(--wui-detail-pane-top, var(--wui-space-4xl)) - var(--wui-space-lg));
11
+ overflow: auto;
12
+ }
13
+ .wui-detail-pane > .wui-modal {
14
+ max-width: none;
15
+ border: 1px solid var(--color-border);
16
+ border-radius: var(--wui-radius-lg);
17
+ box-shadow: none;
18
+ background: var(--color-surface);
19
+ }
20
+ .wui-detail-pane > .wui-modal > .wui-modal-body {
21
+ display: flex;
22
+ flex-direction: column;
23
+ gap: var(--wui-space-md);
24
+ padding: var(--wui-space-lg);
25
+ }
@@ -107,6 +107,45 @@
107
107
  padding-bottom: 16px;
108
108
  }
109
109
 
110
+ // Flat: a text toggle with a leading chevron, for a section header rather than a card.
111
+ .faq-list.wui-accordion-flat {
112
+ gap: 0;
113
+ }
114
+ .faq-list.wui-accordion-flat .faq-item {
115
+ border: 0;
116
+ background: none;
117
+ box-shadow: none;
118
+ }
119
+ .faq-list.wui-accordion-flat .faq-q {
120
+ display: flex;
121
+ align-items: center;
122
+ justify-content: flex-start;
123
+ gap: var(--wui-space-xs);
124
+ margin: var(--wui-space-lg) 0 var(--wui-space-xs);
125
+ padding: var(--wui-space-xxs) 0;
126
+ font-size: var(--wui-fs-sm);
127
+ font-weight: var(--wui-fw-semibold);
128
+ color: var(--color-text-muted);
129
+ background: none;
130
+ }
131
+ .faq-list.wui-accordion-flat .faq-q-icon {
132
+ transform: rotate(-90deg);
133
+ }
134
+ .faq-list.wui-accordion-flat .faq-item.open .faq-q-icon {
135
+ transform: none;
136
+ }
137
+
138
+ .wui-accordion-count {
139
+ display: inline-flex;
140
+ justify-content: center;
141
+ min-width: 20px;
142
+ padding: 0 var(--wui-space-xs);
143
+ border-radius: var(--wui-radius-pill);
144
+ background: var(--color-bg-muted);
145
+ color: var(--color-text-muted);
146
+ font-size: var(--wui-fs-xs);
147
+ }
148
+
110
149
  @media (prefers-reduced-motion: reduce) {
111
150
  .faq-a-wrap,
112
151
  .faq-q-icon,
@@ -25,6 +25,9 @@
25
25
  .wui-drawer[size="lg"] {
26
26
  --wui-drawer-width: 640px;
27
27
  }
28
+ .wui-drawer[size="xl"] {
29
+ --wui-drawer-width: 720px;
30
+ }
28
31
 
29
32
  .wui-drawer-backdrop {
30
33
  position: absolute;
@@ -0,0 +1,57 @@
1
+ // AppFileTiles / <app-file-tiles>: a read-only grid of file tiles with a type tile, name, size and meta line.
2
+
3
+ .wui-file-tiles {
4
+ display: grid;
5
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
6
+ gap: var(--wui-space-xs);
7
+ list-style: none;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+
12
+ .wui-file-tile {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: var(--wui-space-sm);
16
+ min-width: 0;
17
+ padding: var(--wui-space-xs) var(--wui-space-sm);
18
+ border: 1px solid var(--color-border);
19
+ border-radius: var(--wui-radius-md);
20
+ color: var(--color-text);
21
+ font-size: var(--wui-fs-sm);
22
+ text-decoration: none;
23
+ }
24
+
25
+ a.wui-file-tile:hover {
26
+ border-color: var(--color-primary);
27
+ }
28
+
29
+ .wui-file-tile-ext {
30
+ flex: none;
31
+ display: grid;
32
+ place-items: center;
33
+ width: 34px;
34
+ height: 34px;
35
+ border-radius: var(--wui-radius-sm);
36
+ background: var(--color-primary-soft);
37
+ color: var(--color-primary-text);
38
+ font-size: var(--wui-fs-xs);
39
+ font-weight: var(--wui-fw-bold);
40
+ }
41
+
42
+ .wui-file-tile-text {
43
+ display: flex;
44
+ flex-direction: column;
45
+ min-width: 0;
46
+ }
47
+
48
+ .wui-file-tile-name {
49
+ overflow: hidden;
50
+ text-overflow: ellipsis;
51
+ white-space: nowrap;
52
+ }
53
+
54
+ .wui-file-tile-meta {
55
+ font-size: var(--wui-fs-xs);
56
+ color: var(--color-text-subtle);
57
+ }
@@ -752,6 +752,29 @@
752
752
  overflow-wrap: anywhere;
753
753
  }
754
754
 
755
+ // The button form (AppFilePicker variant="button"): one outline button in a bare field, no dropzone.
756
+ // Positioned so the loading veil covers the button rather than the page.
757
+ .wui-file-input-button-field {
758
+ position: relative;
759
+ display: inline-flex;
760
+ flex-direction: column;
761
+ align-items: flex-start;
762
+ gap: var(--wui-space-xxs);
763
+ border: 0;
764
+ padding: 0;
765
+ background: none;
766
+ min-height: 0;
767
+ }
768
+ // The base .file-input fills its column and tints on hover and focus; the button form keeps its
769
+ // natural width and no band behind the button.
770
+ .file-input.wui-file-input-button-field {
771
+ width: auto;
772
+ }
773
+ .file-input.wui-file-input-button-field:hover:not(:focus-within),
774
+ .file-input.wui-file-input-button-field:focus-within {
775
+ background: none;
776
+ }
777
+
755
778
  // Large preview shown once an image exists; hover reveals a "Change image"
756
779
  // overlay.
757
780
  .file-preview {
@@ -55,7 +55,7 @@
55
55
  }
56
56
 
57
57
  // The remote drawer: the same shell and card, docked to the end edge at full height. Width
58
- // comes from `--wui-modal-max-width` (sm 360, md 480, lg 640), set on the shell by the script.
58
+ // comes from `--wui-modal-max-width` (sm 360, md 480, lg 640, xl 720), set on the shell by the script.
59
59
  .modal.wui-modal-shell.wui-remote-drawer {
60
60
  justify-content: flex-end;
61
61
  align-items: stretch;
@@ -0,0 +1,90 @@
1
+ // AppNavList / <app-nav-list>: a page-level rail of links with icons or dots, counts and a tinted current row.
2
+ // The current row is tinted by the primary soft fill and its text takes the AA primary text colour. Every colour is a theme token.
3
+ //
4
+ // Part of the wui-components layer, see _wui-components.scss for load order.
5
+
6
+ .wui-nav-list {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--wui-space-xxs);
10
+ }
11
+
12
+ .wui-nav-list-item {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: var(--wui-space-sm);
16
+ width: 100%;
17
+ min-height: 40px;
18
+ padding: var(--wui-space-xs) var(--wui-space-sm);
19
+ border: 0;
20
+ border-radius: var(--wui-radius-lg);
21
+ background: none;
22
+ color: var(--color-text);
23
+ font: inherit;
24
+ font-size: var(--wui-fs-sm);
25
+ text-align: start;
26
+ text-decoration: none;
27
+
28
+ &:hover {
29
+ background: var(--color-bg-muted);
30
+ }
31
+ &:focus-visible {
32
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
33
+ outline-offset: 1px;
34
+ }
35
+ &.is-active {
36
+ background: var(--color-primary-soft);
37
+ color: var(--color-primary-text);
38
+ font-weight: var(--wui-fw-medium);
39
+ }
40
+ }
41
+
42
+ .wui-nav-list-icon {
43
+ flex: none;
44
+ }
45
+
46
+ .wui-nav-list-label {
47
+ flex: 1;
48
+ min-width: 0;
49
+ overflow: hidden;
50
+ text-overflow: ellipsis;
51
+ white-space: nowrap;
52
+ }
53
+
54
+ .wui-nav-list-dot {
55
+ flex: none;
56
+ width: 10px;
57
+ height: 10px;
58
+ border-radius: 50%;
59
+ background: var(--color-text-subtle);
60
+
61
+ &.tone-primary {
62
+ background: var(--color-primary);
63
+ }
64
+ &.tone-info {
65
+ background: var(--color-info);
66
+ }
67
+ &.tone-success {
68
+ background: var(--color-success);
69
+ }
70
+ &.tone-warning {
71
+ background: var(--color-warning);
72
+ }
73
+ &.tone-danger {
74
+ background: var(--color-danger);
75
+ }
76
+ }
77
+
78
+ .wui-nav-list-count {
79
+ margin-inline-start: auto;
80
+ color: var(--color-text-subtle);
81
+ font-size: var(--wui-fs-xs);
82
+ }
83
+
84
+ .wui-nav-list-divider {
85
+ height: 0;
86
+ margin: var(--wui-space-xs) var(--wui-space-xxs);
87
+ border: 0;
88
+ border-top: 1px solid var(--color-border);
89
+ opacity: 1;
90
+ }
@@ -34,6 +34,13 @@
34
34
  z-index: var(--wui-z-modal);
35
35
  padding: 20px;
36
36
  }
37
+ // A dialog opened over a side panel (drawer or offcanvas) sits above it and its dim layer.
38
+ .modal.wui-modal-stacked {
39
+ z-index: calc(var(--bs-modal-zindex, 1055) + 10);
40
+ }
41
+ .modal-backdrop.wui-modal-backdrop-stacked {
42
+ z-index: calc(var(--bs-modal-zindex, 1055) + 9);
43
+ }
37
44
  // `display: flex` ONLY while the dialog is actually open.
38
45
  //
39
46
  // This was `display: flex !important` on the rule above, which beat Bootstrap's
@@ -143,6 +150,14 @@
143
150
  .wui-modal-headtext {
144
151
  min-width: 0;
145
152
  }
153
+ // Actions beside the title sit before the close button, pushed to the trailing edge.
154
+ .wui-modal-header-actions {
155
+ display: flex;
156
+ align-items: center;
157
+ gap: var(--wui-space-xs);
158
+ flex-wrap: wrap;
159
+ margin-inline-start: auto;
160
+ }
146
161
  .wui-modal-headicon {
147
162
  display: inline-flex;
148
163
  align-items: center;
@@ -490,6 +505,18 @@
490
505
  .wui-confirm-actions .btn {
491
506
  flex: 1;
492
507
  }
508
+ // Plain confirm: text reads from the start edge, and its small buttons keep their natural width,
509
+ // right-aligned, instead of sharing the row.
510
+ .wui-confirm-plain .wui-confirm-content {
511
+ align-items: flex-start;
512
+ text-align: start;
513
+ }
514
+ .wui-confirm-plain .wui-confirm-actions {
515
+ justify-content: flex-end;
516
+ }
517
+ .wui-confirm-plain .wui-confirm-actions .btn {
518
+ flex: none;
519
+ }
493
520
 
494
521
  // ── Tooltip ──
495
522
  // Both surfaces render Bootstrap's .tooltip / .tooltip-inner (React via react-bootstrap
@@ -40,6 +40,12 @@ wui-sortable[disabled] .wui-sortable-item,
40
40
  .wui-sortable-item[data-disabled] {
41
41
  color: var(--color-text-muted);
42
42
  }
43
+ wui-sortable[borderless] .wui-sortable-item {
44
+ border-color: transparent;
45
+ background: transparent;
46
+ padding: 0;
47
+ box-shadow: none;
48
+ }
43
49
 
44
50
  .wui-sortable-handle {
45
51
  display: grid;
@@ -79,6 +85,27 @@ wui-sortable[disabled] .wui-sortable-item,
79
85
  color: var(--color-text-subtle);
80
86
  }
81
87
 
88
+ // The gutter keeps the handle's space whether or not it shows, so showing it moves nothing.
89
+ wui-sortable[handle-display="hover"] {
90
+ padding-inline-start: var(--wui-space-lg);
91
+ }
92
+ wui-sortable[handle-display="hover"] .wui-sortable-handle {
93
+ margin-inline-start: calc(-1 * var(--wui-space-lg));
94
+ }
95
+ wui-sortable[handle-display="hover"] .wui-sortable-handle {
96
+ opacity: 0;
97
+ }
98
+ wui-sortable[handle-display="hover"] .wui-sortable-item:hover .wui-sortable-handle,
99
+ wui-sortable[handle-display="hover"] .wui-sortable-handle:focus-visible,
100
+ wui-sortable[handle-display="hover"] .wui-sortable-handle[aria-pressed="true"] {
101
+ opacity: 1;
102
+ }
103
+ @media (hover: none) {
104
+ wui-sortable[handle-display="hover"] .wui-sortable-handle {
105
+ opacity: 1;
106
+ }
107
+ }
108
+
82
109
  .wui-sortable-body {
83
110
  flex: 1 1 auto;
84
111
  // Lets long content wrap instead of widening the list past a 375px phone.
@@ -273,6 +273,16 @@
273
273
  color: var(--color-text-muted);
274
274
  margin-top: 2px;
275
275
  }
276
+ .wui-page-header-subtitle-inline .page-titlebar {
277
+ align-items: baseline;
278
+ flex-wrap: wrap;
279
+ column-gap: var(--wui-space-sm);
280
+ }
281
+ .wui-page-header-subtitle-inline .page-subtitle {
282
+ margin: 0;
283
+ font-size: var(--wui-fs-sm);
284
+ color: var(--color-text-subtle);
285
+ }
276
286
  .page-actions {
277
287
  display: flex;
278
288
  gap: 8px;