@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/theme",
3
- "version": "0.31.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": {
@@ -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);
@@ -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 light glyph (a dark ink in dark mode, where white fails on the bright fills) and a soft concentric halo ring in the
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-progress-label);
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-progress-label);
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-progress-label);
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-progress-label);
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
  }
@@ -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-on-scrim));
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-on-scrim)));
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-on-scrim));
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-on-scrim));
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: white in light mode, a dark ink in dark mode, where white fails AA.
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-progress-label);
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-progress-label);
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-progress-label);
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-progress-label);
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-progress-label);
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-progress-label);
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-progress-label);
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-progress-label);
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
  }
@@ -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. The board scrolls inside itself, so the page never scrolls sideways.
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
  }