@webority/theme 0.4.0 → 0.6.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.4.0",
3
+ "version": "0.6.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/_tokens.scss CHANGED
@@ -23,7 +23,12 @@
23
23
  --wui-text-heading: #071437;
24
24
  --wui-text-1: #252F4A;
25
25
  --wui-text-2: #4B5675;
26
- --wui-text-3: #78829D;
26
+ // Tertiary text — hints, captions, labels, timestamps, placeholders. Was #78829D,
27
+ // which measured 3.5:1 on white and 3.1:1 on a tinted panel: below WCAG AA (4.5:1)
28
+ // everywhere it was used. A tier meant for readable-but-secondary copy has to BE
29
+ // readable, so it darkens to 4.55:1 on every neutral surface. It stays clearly
30
+ // lighter than --wui-text-2; --wui-text-4/5 remain for genuinely decorative use.
31
+ --wui-text-3: #687088;
27
32
  --wui-text-4: #99A1B7;
28
33
  --wui-text-5: #C4CADA;
29
34
 
@@ -114,6 +119,7 @@
114
119
  // Canonical info/success/warning/danger scales: `active` (text/icon on
115
120
  // light), the base `100` (vivid fills/dots), then tints 50/30/20/10/5.
116
121
  // Shared by the portal (aliased to --color-*) and marketing alerts/badges.
122
+ --wui-info-text: #1460ba;
117
123
  --wui-info-active: #056EE9;
118
124
  --wui-info: #1B84FF;
119
125
  --wui-info-50: #8DC2FF;
@@ -122,6 +128,12 @@
122
128
  --wui-info-10: #E9F3FF;
123
129
  --wui-info-5: #F3F9FF;
124
130
 
131
+ // `-text` variants exist because the status colours are FILLS. #F8285A and #04B440
132
+ // are correct on a button or a badge, and both fail AA as text on a light surface
133
+ // (3.6:1 and 2.6:1) — which is how a validation error message, of all things, came
134
+ // to be unreadable. Darkening the base tokens would change every red button and
135
+ // green badge in the system, so text gets its own value and the fills keep theirs.
136
+ --wui-success-text: #0e7531;
125
137
  --wui-success-active: #04B440;
126
138
  --wui-success: #17C653;
127
139
  --wui-success-50: #8BE3A9;
@@ -130,6 +142,7 @@
130
142
  --wui-success-10: #E8FAEE;
131
143
  --wui-success-5: #F3FCF6;
132
144
 
145
+ --wui-warning-text: #876100;
133
146
  --wui-warning-active: #DFA000;
134
147
  --wui-warning: #F6B100;
135
148
  --wui-warning-50: #FBD880;
@@ -138,6 +151,7 @@
138
151
  --wui-warning-10: #FFF8E6;
139
152
  --wui-warning-5: #FEFBF2;
140
153
 
154
+ --wui-danger-text: #b61d42;
141
155
  --wui-danger-active: #E82646;
142
156
  --wui-danger: #F8285A;
143
157
  --wui-danger-50: #FC94AD;
@@ -47,6 +47,8 @@
47
47
  --color-info-5: var(--wui-info-5);
48
48
  --color-info-strong: var(--color-info-active);
49
49
  --color-info-soft: var(--color-info-10);
50
+ // Use this — never --color-info — when the colour IS the text.
51
+ --color-info-text: var(--wui-info-text);
50
52
 
51
53
  --color-success-active: var(--wui-success-active);
52
54
  --color-success: var(--wui-success);
@@ -57,6 +59,8 @@
57
59
  --color-success-5: var(--wui-success-5);
58
60
  --color-success-strong: var(--color-success-active);
59
61
  --color-success-soft: var(--color-success-10);
62
+ // Use this — never --color-success — when the colour IS the text.
63
+ --color-success-text: var(--wui-success-text);
60
64
 
61
65
  --color-warning-active: var(--wui-warning-active);
62
66
  --color-warning: var(--wui-warning);
@@ -67,6 +71,8 @@
67
71
  --color-warning-5: var(--wui-warning-5);
68
72
  --color-warning-strong: var(--color-warning-active);
69
73
  --color-warning-soft: var(--color-warning-10);
74
+ // Use this — never --color-warning — when the colour IS the text.
75
+ --color-warning-text: var(--wui-warning-text);
70
76
 
71
77
  --color-danger-active: var(--wui-danger-active);
72
78
  --color-danger: var(--wui-danger);
@@ -77,6 +83,8 @@
77
83
  --color-danger-5: var(--wui-danger-5);
78
84
  --color-danger-strong: var(--color-danger-active);
79
85
  --color-danger-soft: var(--color-danger-10);
86
+ // Use this — never --color-danger — when the colour IS the text.
87
+ --color-danger-text: var(--wui-danger-text);
80
88
 
81
89
  // Accent → warning ramp
82
90
  --color-accent: var(--color-warning);
@@ -117,6 +125,14 @@
117
125
  --color-primary-hover: var(--wui-dark-primary-hover);
118
126
  --color-primary-soft: color-mix(in srgb, var(--wui-primary) 20%, transparent);
119
127
 
128
+ // On a dark surface the FILL colours are already the readable ones — the darkened
129
+ // `-text` values would sink into the background. So dark mode maps text back to the
130
+ // bright tokens rather than inheriting light mode's.
131
+ --color-success-text: var(--wui-success);
132
+ --color-danger-text: var(--wui-danger);
133
+ --color-warning-text: var(--wui-warning);
134
+ --color-info-text: var(--wui-info);
135
+
120
136
  --color-success-soft: color-mix(in srgb, var(--wui-success) 18%, transparent);
121
137
  --color-warning-soft: color-mix(in srgb, var(--wui-warning) 18%, transparent);
122
138
  --color-danger-soft: color-mix(in srgb, var(--wui-danger) 18%, transparent);
@@ -291,7 +291,7 @@ textarea.textarea:focus {
291
291
  .field-error {
292
292
  font-size: 12px;
293
293
  line-height: normal;
294
- color: var(--color-danger);
294
+ color: var(--color-danger-text);
295
295
  }
296
296
 
297
297
  // Native select with a rounded squircle, custom chevron, off-surface fill.
@@ -431,7 +431,7 @@ textarea.textarea:focus {
431
431
  display: grid;
432
432
  place-items: center;
433
433
  pointer-events: none;
434
- color: var(--color-danger);
434
+ color: var(--color-danger-text);
435
435
  }
436
436
 
437
437
  // Leading-icon input — icon turns brand on focus.
@@ -515,7 +515,7 @@ textarea.textarea:focus {
515
515
  color: var(--color-text-subtle);
516
516
  }
517
517
  .required {
518
- color: var(--color-danger);
518
+ color: var(--color-danger-text);
519
519
  // The gap is CSS, not a significant space in the markup. RequiredMark used to render
520
520
  // `{' '}*` while AppDatePicker and every Razor helper rendered a bare `*`, so the same
521
521
  // asterisk sat 4px further out in some fields than others — and no check could see it,
@@ -644,22 +644,22 @@ textarea.textarea:focus {
644
644
  }
645
645
  .badge-success {
646
646
  background: var(--color-success-soft);
647
- color: var(--color-success-strong);
647
+ color: var(--color-success-text);
648
648
  border-color: transparent;
649
649
  }
650
650
  .badge-warn {
651
651
  background: var(--color-warning-soft);
652
- color: var(--color-warning-strong);
652
+ color: var(--color-warning-text);
653
653
  border-color: transparent;
654
654
  }
655
655
  .badge-danger {
656
656
  background: var(--color-danger-soft);
657
- color: var(--color-danger-strong);
657
+ color: var(--color-danger-text);
658
658
  border-color: transparent;
659
659
  }
660
660
  .badge-info {
661
661
  background: var(--color-info-soft);
662
- color: var(--color-info-strong);
662
+ color: var(--color-info-text);
663
663
  border-color: transparent;
664
664
  }
665
665
  .badge-dot::before {
@@ -697,24 +697,24 @@ textarea.textarea:focus {
697
697
  .status-label.tone-ok,
698
698
  .status-label.tone-green {
699
699
  background: color-mix(in srgb, var(--color-success) 16%, transparent);
700
- color: var(--color-success-strong);
700
+ color: var(--color-success-text);
701
701
  }
702
702
  .status-label.warning,
703
703
  .status-label.tone-warn,
704
704
  .status-label.tone-amber {
705
705
  background: color-mix(in srgb, var(--color-warning) 16%, transparent);
706
- color: var(--color-warning-strong);
706
+ color: var(--color-warning-text);
707
707
  }
708
708
  .status-label.danger,
709
709
  .status-label.tone-bad,
710
710
  .status-label.tone-red {
711
711
  background: color-mix(in srgb, var(--color-danger) 16%, transparent);
712
- color: var(--color-danger-strong);
712
+ color: var(--color-danger-text);
713
713
  }
714
714
  .status-label.info,
715
715
  .status-label.tone-blue {
716
716
  background: color-mix(in srgb, var(--color-info) 16%, transparent);
717
- color: var(--color-info-strong);
717
+ color: var(--color-info-text);
718
718
  }
719
719
  .status-label.primary {
720
720
  background: var(--color-primary-soft);
@@ -726,7 +726,9 @@ textarea.textarea:focus {
726
726
  .status-label.neutral,
727
727
  .status-label.tone-grey {
728
728
  background: color-mix(in srgb, var(--color-text-subtle) 16%, transparent);
729
- color: var(--color-text-subtle);
729
+ // The tertiary tier is readable on a plain surface but not on its own 16% tint,
730
+ // so the neutral pill takes the secondary tier instead of a sixth `-text` token.
731
+ color: var(--color-text-muted);
730
732
  }
731
733
 
732
734
  // ── Choice chip ──
@@ -493,11 +493,11 @@
493
493
  cursor: not-allowed;
494
494
  }
495
495
  .u-action.danger {
496
- color: var(--color-danger);
496
+ color: var(--color-danger-text);
497
497
  }
498
498
  .u-action.danger:hover:not(:disabled) {
499
499
  background: color-mix(in srgb, var(--color-danger) 10%, transparent);
500
- color: var(--color-danger);
500
+ color: var(--color-danger-text);
501
501
  }
502
502
  .u-action.u-action-preview {
503
503
  background: var(--color-primary-soft);
@@ -505,11 +505,11 @@
505
505
  }
506
506
  .u-action.u-action-download {
507
507
  background: var(--color-success-soft);
508
- color: var(--color-success-active);
508
+ color: var(--color-success-text);
509
509
  }
510
510
  .u-action.u-action-share {
511
511
  background: var(--color-warning-soft);
512
- color: var(--color-warning-active);
512
+ color: var(--color-warning-text);
513
513
  }
514
514
  .u-action.u-action-preview:hover:not(:disabled) {
515
515
  background: var(--color-primary-soft);
@@ -517,14 +517,14 @@
517
517
  }
518
518
  .u-action.u-action-download:hover:not(:disabled) {
519
519
  background: var(--color-success-soft);
520
- color: var(--color-success-active);
520
+ color: var(--color-success-text);
521
521
  }
522
522
  .u-action.u-action-share:hover:not(:disabled) {
523
523
  background: var(--color-warning-soft);
524
- color: var(--color-warning-active);
524
+ color: var(--color-warning-text);
525
525
  }
526
526
  .u-action.u-action-danger:hover {
527
- color: var(--color-danger);
527
+ color: var(--color-danger-text);
528
528
  background: color-mix(in srgb, var(--color-danger) 10%, transparent);
529
529
  }
530
530
 
@@ -54,10 +54,10 @@
54
54
  color: var(--color-text-muted);
55
55
  }
56
56
  .kpi-delta.up {
57
- color: var(--color-success-strong);
57
+ color: var(--color-success-text);
58
58
  }
59
59
  .kpi-delta.down {
60
- color: var(--color-danger);
60
+ color: var(--color-danger-text);
61
61
  }
62
62
 
63
63
  // Icon-left layout: the icon spans the label/value/delta stack instead of sitting above it.
@@ -312,19 +312,19 @@ a.info-row:hover .info-value {
312
312
  box-shadow: 0 0 0 3px var(--color-surface);
313
313
  }
314
314
  .timeline-item.success .timeline-dot {
315
- color: var(--color-success-strong);
315
+ color: var(--color-success-text);
316
316
  background: color-mix(in srgb, var(--color-success-strong) 16%, var(--color-surface));
317
317
  }
318
318
  .timeline-item.warning .timeline-dot {
319
- color: var(--color-warning-strong);
319
+ color: var(--color-warning-text);
320
320
  background: color-mix(in srgb, var(--color-warning-strong) 18%, var(--color-surface));
321
321
  }
322
322
  .timeline-item.danger .timeline-dot {
323
- color: var(--color-danger);
323
+ color: var(--color-danger-text);
324
324
  background: color-mix(in srgb, var(--color-danger) 16%, var(--color-surface));
325
325
  }
326
326
  .timeline-item.info .timeline-dot {
327
- color: var(--color-info-strong);
327
+ color: var(--color-info-text);
328
328
  background: color-mix(in srgb, var(--color-info-strong) 16%, var(--color-surface));
329
329
  }
330
330
  .timeline-body {
@@ -407,7 +407,7 @@ a.info-row:hover .info-value {
407
407
  font-weight: 500;
408
408
  }
409
409
  .compare-yes {
410
- color: var(--color-success-strong);
410
+ color: var(--color-success-text);
411
411
  }
412
412
  .compare-no {
413
413
  color: var(--color-text-subtle);
@@ -136,7 +136,7 @@ a.step:focus-visible .step-circle {
136
136
  }
137
137
  .stepper-journey .step.done .step-circle {
138
138
  background: var(--color-success-soft);
139
- color: var(--color-success-strong);
139
+ color: var(--color-success-text);
140
140
  }
141
141
  .stepper-journey .step.active .step-circle {
142
142
  background: var(--color-primary);
@@ -161,7 +161,7 @@ a.step:focus-visible .step-circle {
161
161
  color: var(--color-text-subtle);
162
162
  }
163
163
  .stepper-journey .step.done .step-index {
164
- color: var(--color-success-strong);
164
+ color: var(--color-success-text);
165
165
  }
166
166
  .stepper-journey .step.active .step-index {
167
167
  color: var(--color-primary);
@@ -171,18 +171,18 @@
171
171
  }
172
172
  // A destructive tab reads as destructive whether or not it is the active one.
173
173
  .app-tab.danger {
174
- color: var(--color-danger);
174
+ color: var(--color-danger-text);
175
175
  }
176
176
  .app-tab.danger:hover:not(:disabled):not(.active) {
177
- color: var(--color-danger-active);
177
+ color: var(--color-danger-text);
178
178
  }
179
179
  .app-tab.danger.active {
180
- color: var(--color-danger);
180
+ color: var(--color-danger-text);
181
181
  border-bottom-color: var(--color-danger);
182
182
  }
183
183
  .app-tab.danger .app-tab-count {
184
184
  background: var(--color-danger-soft);
185
- color: var(--color-danger-strong);
185
+ color: var(--color-danger-text);
186
186
  }
187
187
  // Trailing count pill.
188
188
  .app-tab-count {
@@ -270,7 +270,7 @@
270
270
  }
271
271
  .lx-modal-close:hover {
272
272
  background: var(--color-danger-soft);
273
- color: var(--color-danger);
273
+ color: var(--color-danger-text);
274
274
  corner-shape: round;
275
275
  transition:
276
276
  background 280ms cubic-bezier(0.16, 1, 0.3, 1),
@@ -131,22 +131,22 @@
131
131
  .chip.success {
132
132
  border-color: transparent;
133
133
  background: var(--color-success-soft);
134
- color: var(--color-success-active);
134
+ color: var(--color-success-text);
135
135
  }
136
136
  .chip.warning {
137
137
  border-color: transparent;
138
138
  background: var(--color-warning-soft);
139
- color: var(--color-warning-active);
139
+ color: var(--color-warning-text);
140
140
  }
141
141
  .chip.danger {
142
142
  border-color: transparent;
143
143
  background: var(--color-danger-soft);
144
- color: var(--color-danger-active);
144
+ color: var(--color-danger-text);
145
145
  }
146
146
  .chip.info {
147
147
  border-color: transparent;
148
148
  background: var(--color-info-soft);
149
- color: var(--color-info-active);
149
+ color: var(--color-info-text);
150
150
  }
151
151
  .chip.primary .chip-ic,
152
152
  .chip.success .chip-ic,