@webority/theme 0.31.0 → 0.33.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/dist/purge-safelist.json +2 -0
- package/dist/webority-theme.css +1 -1
- package/package.json +1 -1
- package/scss/_wui-aliases.scss +3 -0
- package/scss/wui/_display.scss +5 -5
- package/scss/wui/_flow.scss +15 -13
- package/scss/wui/_kanban.scss +67 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webority/theme",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.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": {
|
package/scss/_wui-aliases.scss
CHANGED
|
@@ -21,6 +21,9 @@
|
|
|
21
21
|
--color-progress-track: var(--wui-progress-track);
|
|
22
22
|
// Label text inside a progress bar fill.
|
|
23
23
|
--color-progress-label: var(--wui-bg-light);
|
|
24
|
+
// Ink on a solid status fill (success, warning, danger, info): near-black in both modes, since
|
|
25
|
+
// white fails AA on the bright fills.
|
|
26
|
+
--color-on-status-fill: #0F0F0F;
|
|
24
27
|
|
|
25
28
|
// Text ramp
|
|
26
29
|
--color-text: var(--wui-text-heading);
|
package/scss/wui/_display.scss
CHANGED
|
@@ -842,27 +842,27 @@ a.info-row:hover .info-value {
|
|
|
842
842
|
background: var(--color-surface);
|
|
843
843
|
box-shadow: inset 0 0 0 2px var(--color-border);
|
|
844
844
|
}
|
|
845
|
-
// Solid status discs with a
|
|
845
|
+
// Solid status discs with a near-black glyph (white fails AA on the bright fills) and a soft concentric halo ring in the
|
|
846
846
|
// dot's own hue. The fill is softened a touch (mixed toward the surface) so the
|
|
847
847
|
// states read gentler than the raw brand tones.
|
|
848
848
|
.timeline--progress .timeline-item.is-done .timeline-dot {
|
|
849
|
-
color: var(--color-
|
|
849
|
+
color: var(--color-on-status-fill);
|
|
850
850
|
background: color-mix(in srgb, var(--color-success) 82%, var(--color-surface));
|
|
851
851
|
box-shadow: 0 0 0 var(--wui-timeline-halo) var(--color-success-soft);
|
|
852
852
|
}
|
|
853
853
|
.timeline--progress .timeline-item.is-current .timeline-dot {
|
|
854
|
-
color: var(--color-
|
|
854
|
+
color: var(--color-on-status-fill);
|
|
855
855
|
background: color-mix(in srgb, var(--color-warning) 82%, var(--color-surface));
|
|
856
856
|
box-shadow: 0 0 0 var(--wui-timeline-halo) var(--color-warning-soft);
|
|
857
857
|
}
|
|
858
858
|
.timeline--progress .timeline-item.is-rejected .timeline-dot {
|
|
859
|
-
color: var(--color-
|
|
859
|
+
color: var(--color-on-status-fill);
|
|
860
860
|
background: color-mix(in srgb, var(--color-danger) 82%, var(--color-surface));
|
|
861
861
|
box-shadow: 0 0 0 var(--wui-timeline-halo) var(--color-danger-soft);
|
|
862
862
|
}
|
|
863
863
|
// Blocked / waiting on an external action — informational blue.
|
|
864
864
|
.timeline--progress .timeline-item.is-on-hold .timeline-dot {
|
|
865
|
-
color: var(--color-
|
|
865
|
+
color: var(--color-on-status-fill);
|
|
866
866
|
background: color-mix(in srgb, var(--color-info) 82%, var(--color-surface));
|
|
867
867
|
box-shadow: 0 0 0 var(--wui-timeline-halo) var(--color-info-soft);
|
|
868
868
|
}
|
package/scss/wui/_flow.scss
CHANGED
|
@@ -91,16 +91,18 @@
|
|
|
91
91
|
font-weight: 600;
|
|
92
92
|
color: var(--color-text-subtle);
|
|
93
93
|
}
|
|
94
|
+
// An untoned wizard sets no --wui-step-* vars, so the ink fallback must pair with the primary
|
|
95
|
+
// fill fallback: white on the dark theme's light primary is under AA.
|
|
94
96
|
.step.active .step-circle {
|
|
95
97
|
border-color: var(--wui-step-accent, var(--color-primary));
|
|
96
98
|
background: var(--wui-step-accent, var(--color-primary));
|
|
97
|
-
color: var(--wui-step-accent-fg, var(--color-
|
|
99
|
+
color: var(--wui-step-accent-fg, var(--color-primary-text));
|
|
98
100
|
box-shadow: 0 0 0 4px var(--wui-step-soft, var(--color-primary-soft));
|
|
99
101
|
}
|
|
100
102
|
.step.done .step-circle {
|
|
101
103
|
border-color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
102
104
|
background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
103
|
-
color: var(--wui-step-done-accent-fg, var(--wui-step-accent-fg, var(--color-
|
|
105
|
+
color: var(--wui-step-done-accent-fg, var(--wui-step-accent-fg, var(--color-primary-text)));
|
|
104
106
|
}
|
|
105
107
|
.step-label {
|
|
106
108
|
max-width: 130px;
|
|
@@ -225,7 +227,7 @@ button.step.done:focus-visible .step-circle {
|
|
|
225
227
|
}
|
|
226
228
|
.stepper-journey .step.active .step-circle {
|
|
227
229
|
background: var(--wui-step-accent, var(--color-primary));
|
|
228
|
-
color: var(--wui-step-accent-fg, var(--color-
|
|
230
|
+
color: var(--wui-step-accent-fg, var(--color-primary-text));
|
|
229
231
|
box-shadow: none;
|
|
230
232
|
transform: scale(1.06);
|
|
231
233
|
}
|
|
@@ -415,7 +417,7 @@ button.step.done:focus-visible .step-circle {
|
|
|
415
417
|
// shared --wui-step-* vars, so a `.wui-step-tone-*` class or an override recolours it.
|
|
416
418
|
.stepper-icons .step.active .step-circle {
|
|
417
419
|
background: var(--wui-step-accent, var(--color-primary));
|
|
418
|
-
color: var(--wui-step-accent-fg, var(--color-
|
|
420
|
+
color: var(--wui-step-accent-fg, var(--color-primary-text));
|
|
419
421
|
// The compact variant rings the active circle; here the solid fill carries it, so
|
|
420
422
|
// drop the ring to match the flat badge look.
|
|
421
423
|
box-shadow: none;
|
|
@@ -532,28 +534,28 @@ button.step.done:focus-visible .step-circle {
|
|
|
532
534
|
--wui-step-soft: var(--color-primary-soft);
|
|
533
535
|
--wui-step-soft-fg: var(--color-primary);
|
|
534
536
|
}
|
|
535
|
-
// Text on a bright status fill:
|
|
537
|
+
// Text on a bright status fill: a near-black ink in both modes, where white fails AA.
|
|
536
538
|
.wui-step-tone-success {
|
|
537
539
|
--wui-step-accent: var(--color-success);
|
|
538
|
-
--wui-step-accent-fg: var(--color-
|
|
540
|
+
--wui-step-accent-fg: var(--color-on-status-fill);
|
|
539
541
|
--wui-step-soft: var(--color-success-soft);
|
|
540
542
|
--wui-step-soft-fg: var(--color-success-text);
|
|
541
543
|
}
|
|
542
544
|
.wui-step-tone-warning {
|
|
543
545
|
--wui-step-accent: var(--color-warning);
|
|
544
|
-
--wui-step-accent-fg: var(--color-
|
|
546
|
+
--wui-step-accent-fg: var(--color-on-status-fill);
|
|
545
547
|
--wui-step-soft: var(--color-warning-soft);
|
|
546
548
|
--wui-step-soft-fg: var(--color-warning-text);
|
|
547
549
|
}
|
|
548
550
|
.wui-step-tone-danger {
|
|
549
551
|
--wui-step-accent: var(--color-danger);
|
|
550
|
-
--wui-step-accent-fg: var(--color-
|
|
552
|
+
--wui-step-accent-fg: var(--color-on-status-fill);
|
|
551
553
|
--wui-step-soft: var(--color-danger-soft);
|
|
552
554
|
--wui-step-soft-fg: var(--color-danger-text);
|
|
553
555
|
}
|
|
554
556
|
.wui-step-tone-info {
|
|
555
557
|
--wui-step-accent: var(--color-info);
|
|
556
|
-
--wui-step-accent-fg: var(--color-
|
|
558
|
+
--wui-step-accent-fg: var(--color-on-status-fill);
|
|
557
559
|
--wui-step-soft: var(--color-info-soft);
|
|
558
560
|
--wui-step-soft-fg: var(--color-info-text);
|
|
559
561
|
}
|
|
@@ -571,25 +573,25 @@ button.step.done:focus-visible .step-circle {
|
|
|
571
573
|
}
|
|
572
574
|
.wui-step-done-tone-success {
|
|
573
575
|
--wui-step-done-accent: var(--color-success);
|
|
574
|
-
--wui-step-done-accent-fg: var(--color-
|
|
576
|
+
--wui-step-done-accent-fg: var(--color-on-status-fill);
|
|
575
577
|
--wui-step-done-soft: var(--color-success-soft);
|
|
576
578
|
--wui-step-done-soft-fg: var(--color-success-text);
|
|
577
579
|
}
|
|
578
580
|
.wui-step-done-tone-warning {
|
|
579
581
|
--wui-step-done-accent: var(--color-warning);
|
|
580
|
-
--wui-step-done-accent-fg: var(--color-
|
|
582
|
+
--wui-step-done-accent-fg: var(--color-on-status-fill);
|
|
581
583
|
--wui-step-done-soft: var(--color-warning-soft);
|
|
582
584
|
--wui-step-done-soft-fg: var(--color-warning-text);
|
|
583
585
|
}
|
|
584
586
|
.wui-step-done-tone-danger {
|
|
585
587
|
--wui-step-done-accent: var(--color-danger);
|
|
586
|
-
--wui-step-done-accent-fg: var(--color-
|
|
588
|
+
--wui-step-done-accent-fg: var(--color-on-status-fill);
|
|
587
589
|
--wui-step-done-soft: var(--color-danger-soft);
|
|
588
590
|
--wui-step-done-soft-fg: var(--color-danger-text);
|
|
589
591
|
}
|
|
590
592
|
.wui-step-done-tone-info {
|
|
591
593
|
--wui-step-done-accent: var(--color-info);
|
|
592
|
-
--wui-step-done-accent-fg: var(--color-
|
|
594
|
+
--wui-step-done-accent-fg: var(--color-on-status-fill);
|
|
593
595
|
--wui-step-done-soft: var(--color-info-soft);
|
|
594
596
|
--wui-step-done-soft-fg: var(--color-info-text);
|
|
595
597
|
}
|
package/scss/wui/_kanban.scss
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
// classes, so a React re-render never wipes it.
|
|
6
6
|
//
|
|
7
7
|
// Below md the board is one column per screen: a scroll-snapped strip with a column switcher
|
|
8
|
-
// above it
|
|
8
|
+
// above it that stays at the top of the viewport while the page scrolls. The board scrolls inside
|
|
9
|
+
// itself, so the page never scrolls sideways.
|
|
9
10
|
//
|
|
10
11
|
// Sizing variables, set on .wui-kanban (or any ancestor) to override:
|
|
11
12
|
// --wui-kanban-column-width basis width of an open column (288px)
|
|
@@ -13,6 +14,8 @@
|
|
|
13
14
|
// --wui-kanban-gap space between columns (16px)
|
|
14
15
|
// --wui-kanban-column-min-height least height of a column, so short columns still read as
|
|
15
16
|
// lanes (560px; not applied in the phone one-column mode)
|
|
17
|
+
// --wui-kanban-sticky-top where the phone switcher sticks (0, or under the app shell's
|
|
18
|
+
// topbar inside .app-shell)
|
|
16
19
|
//
|
|
17
20
|
// Part of the wui-components layer, see _wui-components.scss for load order.
|
|
18
21
|
|
|
@@ -21,11 +24,18 @@
|
|
|
21
24
|
--wui-kanban-collapsed-width: 56px;
|
|
22
25
|
--wui-kanban-gap: 16px;
|
|
23
26
|
--wui-kanban-column-min-height: 560px;
|
|
27
|
+
--wui-kanban-sticky-top: 0px;
|
|
24
28
|
display: block;
|
|
25
29
|
position: relative;
|
|
26
30
|
min-width: 0;
|
|
27
31
|
max-width: 100%;
|
|
28
32
|
}
|
|
33
|
+
// The shell's topbar is sticky too, so the switcher stops below it. 72px is .app-topbar's
|
|
34
|
+
// min-height in _shell.scss; change both together. :where() keeps this at .wui-kanban's own
|
|
35
|
+
// weight, so a page's `.wui-kanban { --wui-kanban-sticky-top: … }` still wins inside the shell.
|
|
36
|
+
:where(.app-shell) .wui-kanban {
|
|
37
|
+
--wui-kanban-sticky-top: 72px;
|
|
38
|
+
}
|
|
29
39
|
|
|
30
40
|
.wui-kanban-board {
|
|
31
41
|
display: flex;
|
|
@@ -210,9 +220,42 @@
|
|
|
210
220
|
outline: 2px solid var(--color-primary);
|
|
211
221
|
outline-offset: 2px;
|
|
212
222
|
}
|
|
213
|
-
.wui-kanban-card[hidden]
|
|
223
|
+
.wui-kanban-card[hidden],
|
|
224
|
+
.wui-kanban-card[data-wui-overflow] {
|
|
225
|
+
display: none;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// "Show N more" under a capped column's cards; "Show fewer" once it is open.
|
|
229
|
+
.wui-kanban-more {
|
|
230
|
+
display: block;
|
|
231
|
+
width: calc(100% - 16px);
|
|
232
|
+
min-height: 36px;
|
|
233
|
+
margin: 0 8px 8px;
|
|
234
|
+
padding: 6px 10px;
|
|
235
|
+
border: 0;
|
|
236
|
+
border-radius: var(--wui-radius);
|
|
237
|
+
background: transparent;
|
|
238
|
+
color: var(--color-text-muted);
|
|
239
|
+
font-size: 0.8125rem;
|
|
240
|
+
font-weight: 600;
|
|
241
|
+
cursor: pointer;
|
|
242
|
+
}
|
|
243
|
+
.wui-kanban-more[hidden] {
|
|
214
244
|
display: none;
|
|
215
245
|
}
|
|
246
|
+
.wui-kanban-more:hover {
|
|
247
|
+
background: var(--color-surface);
|
|
248
|
+
color: var(--color-text);
|
|
249
|
+
}
|
|
250
|
+
.wui-kanban-more:focus-visible {
|
|
251
|
+
outline: 2px solid var(--color-primary);
|
|
252
|
+
outline-offset: 2px;
|
|
253
|
+
}
|
|
254
|
+
@media (pointer: coarse) {
|
|
255
|
+
.wui-kanban-more {
|
|
256
|
+
min-height: 44px;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
216
259
|
.wui-kanban[readonly] .wui-kanban-card,
|
|
217
260
|
.wui-kanban-card[data-wui-locked] {
|
|
218
261
|
cursor: default;
|
|
@@ -354,6 +397,7 @@
|
|
|
354
397
|
}
|
|
355
398
|
.wui-kanban-summary,
|
|
356
399
|
.wui-kanban-body,
|
|
400
|
+
.wui-kanban-more,
|
|
357
401
|
.wui-kanban-empty {
|
|
358
402
|
display: none;
|
|
359
403
|
}
|
|
@@ -365,18 +409,34 @@
|
|
|
365
409
|
}
|
|
366
410
|
}
|
|
367
411
|
|
|
368
|
-
// ── Phone column switcher (hidden from md up) ──
|
|
369
|
-
.wui-kanban-switcher
|
|
412
|
+
// ── Phone column switcher and swipe hint (hidden from md up) ──
|
|
413
|
+
.wui-kanban-switcher,
|
|
414
|
+
.wui-kanban-hint {
|
|
370
415
|
display: none;
|
|
371
416
|
}
|
|
372
417
|
|
|
373
418
|
@media (max-width: 767.98px) {
|
|
419
|
+
// Sticky over the page's own background, under the shell topbar (z-index 10).
|
|
374
420
|
.wui-kanban-switcher {
|
|
421
|
+
position: sticky;
|
|
422
|
+
top: var(--wui-kanban-sticky-top);
|
|
423
|
+
z-index: 5;
|
|
375
424
|
display: flex;
|
|
376
425
|
gap: 6px;
|
|
377
426
|
margin-bottom: 12px;
|
|
427
|
+
padding-block: 6px;
|
|
378
428
|
overflow-x: auto;
|
|
379
429
|
scrollbar-width: none;
|
|
430
|
+
background: var(--color-bg);
|
|
431
|
+
}
|
|
432
|
+
.wui-kanban-hint {
|
|
433
|
+
display: flex;
|
|
434
|
+
align-items: center;
|
|
435
|
+
justify-content: center;
|
|
436
|
+
gap: 6px;
|
|
437
|
+
margin: -6px 0 12px;
|
|
438
|
+
color: var(--color-text-muted);
|
|
439
|
+
font-size: 0.75rem;
|
|
380
440
|
}
|
|
381
441
|
.wui-kanban-switch {
|
|
382
442
|
display: inline-flex;
|
|
@@ -443,6 +503,9 @@
|
|
|
443
503
|
.wui-kanban-body {
|
|
444
504
|
display: flex;
|
|
445
505
|
}
|
|
506
|
+
.wui-kanban-more:not([hidden]) {
|
|
507
|
+
display: block;
|
|
508
|
+
}
|
|
446
509
|
.wui-kanban-empty:not([hidden]) {
|
|
447
510
|
display: block;
|
|
448
511
|
}
|