@webority/theme 0.27.2 → 0.28.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 +2 -2
- package/dist/purge-safelist.json +2 -0
- package/dist/webority-brand-signal.css +1 -1
- package/dist/webority-theme.css +1 -1
- package/package.json +1 -1
- package/scss/_brand-signal.scss +52 -19
- package/scss/wui/_flow.scss +76 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webority/theme",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.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/_brand-signal.scss
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Signal: an opt-in brand layer, a violet-primary palette with ink headings and a serif display face.
|
|
2
|
+
// Its dark mode is pure black with neutral grey surfaces; violet is kept for accents only.
|
|
2
3
|
//
|
|
3
4
|
// Loaded AFTER webority-theme.css; the default theme never contains these values. It re-points the
|
|
4
5
|
// --wui-* tokens, then overrides the few Bootstrap values the theme compiles as literals (button
|
|
@@ -74,16 +75,17 @@
|
|
|
74
75
|
--wui-shadow-overlay: 0 8px 28px -6px rgba(22, 9, 58, 0.16);
|
|
75
76
|
--wui-shadow-overlay-lg: 0 24px 60px -16px rgba(22, 9, 58, 0.30);
|
|
76
77
|
|
|
77
|
-
|
|
78
|
-
--wui-dark-bg-
|
|
79
|
-
--wui-dark-bg-
|
|
80
|
-
--wui-dark-bg-
|
|
81
|
-
--wui-dark-
|
|
82
|
-
--wui-dark-border
|
|
83
|
-
--wui-dark-
|
|
84
|
-
--wui-dark-
|
|
85
|
-
--wui-dark-text
|
|
86
|
-
--wui-dark-text-
|
|
78
|
+
// Dark mode is pure black and neutral grey; violet appears only on accents (fills, links, focus, selection marks).
|
|
79
|
+
--wui-dark-bg-page: #000000;
|
|
80
|
+
--wui-dark-bg-elevated: #0F0F0F;
|
|
81
|
+
--wui-dark-bg-surface: #161616;
|
|
82
|
+
--wui-dark-bg-muted: #1E1E1E;
|
|
83
|
+
--wui-dark-border: #2A2A2A;
|
|
84
|
+
--wui-dark-border-strong: #333333;
|
|
85
|
+
--wui-dark-progress-track: #333333;
|
|
86
|
+
--wui-dark-text: #EDEDED;
|
|
87
|
+
--wui-dark-text-muted: #C0C0C0;
|
|
88
|
+
--wui-dark-text-subtle: #A0A0A0;
|
|
87
89
|
--wui-dark-primary: #A98BFF;
|
|
88
90
|
--wui-dark-primary-hover: #BFA6FF;
|
|
89
91
|
|
|
@@ -146,18 +148,20 @@
|
|
|
146
148
|
|
|
147
149
|
@mixin wui-signal-dark {
|
|
148
150
|
--wui-signal-heading: #C4AEFF;
|
|
149
|
-
|
|
151
|
+
// Selected, hover and highlight fills are a neutral lift; the violet stays on the text, border
|
|
152
|
+
// or edge that marks the state. check-contrast.mjs mirrors the 8%; change them together.
|
|
153
|
+
--color-primary-soft: color-mix(in srgb, #FFFFFF 8%, transparent);
|
|
150
154
|
// Ink on the lilac fill (--color-primary): 8:1 or better.
|
|
151
155
|
--color-primary-text: #16093A;
|
|
152
156
|
--color-progress-label: #16093A;
|
|
153
|
-
--bs-body-bg-rgb:
|
|
154
|
-
--bs-body-color-rgb: 237,
|
|
155
|
-
--bs-emphasis-color-rgb: 237,
|
|
156
|
-
--bs-secondary-color-rgb:
|
|
157
|
-
--bs-tertiary-color-rgb:
|
|
158
|
-
--bs-secondary-bg-rgb:
|
|
159
|
-
--bs-tertiary-bg-rgb:
|
|
160
|
-
--bs-border-color-rgb:
|
|
157
|
+
--bs-body-bg-rgb: 0, 0, 0;
|
|
158
|
+
--bs-body-color-rgb: 237, 237, 237;
|
|
159
|
+
--bs-emphasis-color-rgb: 237, 237, 237;
|
|
160
|
+
--bs-secondary-color-rgb: 192, 192, 192;
|
|
161
|
+
--bs-tertiary-color-rgb: 160, 160, 160;
|
|
162
|
+
--bs-secondary-bg-rgb: 22, 22, 22;
|
|
163
|
+
--bs-tertiary-bg-rgb: 30, 30, 30;
|
|
164
|
+
--bs-border-color-rgb: 42, 42, 42;
|
|
161
165
|
--bs-link-color: #A98BFF;
|
|
162
166
|
--bs-link-color-rgb: 169, 139, 255;
|
|
163
167
|
--bs-link-hover-color: #BFA6FF;
|
|
@@ -189,6 +193,35 @@
|
|
|
189
193
|
:where(.stepper:not(.wizard-stepper)) {
|
|
190
194
|
--wui-step-accent-fg: #16093A;
|
|
191
195
|
}
|
|
196
|
+
|
|
197
|
+
// Components that mix their violet fill inline rather than through --color-primary-soft.
|
|
198
|
+
// :where(&) keeps each rule at the component's own specificity, so a tone variant still wins.
|
|
199
|
+
:where(&) .struct-card.checked,
|
|
200
|
+
:where(&) .tpg-arrow:hover:not(:disabled),
|
|
201
|
+
:where(&) .tpg-page:hover:not(.is-active),
|
|
202
|
+
:where(&) .u-action:hover:not(:disabled),
|
|
203
|
+
:where(&) .tbl-empty-icon,
|
|
204
|
+
:where(&) .u-avatar,
|
|
205
|
+
:where(&) .wui-file-viewer-audio-art {
|
|
206
|
+
background: var(--color-primary-soft);
|
|
207
|
+
}
|
|
208
|
+
:where(&) .wui-calendar-view-btn[aria-pressed="true"],
|
|
209
|
+
:where(&) .compare-table td.is-highlight {
|
|
210
|
+
background: color-mix(in srgb, #FFFFFF 8%, var(--color-surface));
|
|
211
|
+
}
|
|
212
|
+
:where(&) .segmented {
|
|
213
|
+
--segmented-selected-bg: color-mix(in srgb, #FFFFFF 8%, var(--color-surface));
|
|
214
|
+
}
|
|
215
|
+
:where(&) .table-ledger tbody tr.is-selected:hover {
|
|
216
|
+
--bs-table-bg-state: color-mix(in srgb, #FFFFFF 12%, transparent);
|
|
217
|
+
}
|
|
218
|
+
// A grey row alone reads as disabled; the violet edge says chosen. One step below the row status
|
|
219
|
+
// bar's specificity, so a status row keeps its own colour bar.
|
|
220
|
+
:where(&) .table-ledger tbody tr.is-selected > :first-child {
|
|
221
|
+
box-shadow:
|
|
222
|
+
inset 3px 0 0 0 var(--color-primary),
|
|
223
|
+
inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));
|
|
224
|
+
}
|
|
192
225
|
}
|
|
193
226
|
|
|
194
227
|
:root[data-theme="dark"],
|
package/scss/wui/_flow.scss
CHANGED
|
@@ -20,6 +20,9 @@
|
|
|
20
20
|
// --wui-step-soft soft tint (active ring; the journey/icons "done" badge bg)
|
|
21
21
|
// --wui-step-soft-fg text/icon on the soft tint (the "done" badge check)
|
|
22
22
|
// --wui-step-connector the incomplete-rail colour
|
|
23
|
+
// --wui-step-done-accent, --wui-step-done-accent-fg, --wui-step-done-soft,
|
|
24
|
+
// --wui-step-done-soft-fg the same four, for COMPLETED steps only (badge, "STEP n"
|
|
25
|
+
// eyebrow, filled rail). Unset, completed steps follow the accent.
|
|
23
26
|
// --wui-step-size compact/vertical badge diameter (default 28px)
|
|
24
27
|
// --wui-step-badge-size icons-variant badge diameter (default 56px)
|
|
25
28
|
// Every variant defaults to the brand primary — active, done and rail share one accent
|
|
@@ -71,7 +74,7 @@
|
|
|
71
74
|
z-index: 0;
|
|
72
75
|
}
|
|
73
76
|
.step.done + .step::before {
|
|
74
|
-
background: var(--wui-step-accent, var(--color-primary));
|
|
77
|
+
background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
75
78
|
}
|
|
76
79
|
.step-circle {
|
|
77
80
|
position: relative;
|
|
@@ -95,9 +98,9 @@
|
|
|
95
98
|
box-shadow: 0 0 0 4px var(--wui-step-soft, var(--color-primary-soft));
|
|
96
99
|
}
|
|
97
100
|
.step.done .step-circle {
|
|
98
|
-
border-color: var(--wui-step-accent, var(--color-primary));
|
|
99
|
-
background: var(--wui-step-accent, var(--color-primary));
|
|
100
|
-
color: var(--wui-step-accent-fg, var(--color-on-scrim));
|
|
101
|
+
border-color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
102
|
+
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)));
|
|
101
104
|
}
|
|
102
105
|
.step-label {
|
|
103
106
|
max-width: 130px;
|
|
@@ -147,6 +150,22 @@ button.step:focus-visible .step-circle {
|
|
|
147
150
|
0 0 0 4px var(--wui-step-soft, var(--color-primary-soft)),
|
|
148
151
|
0 0 0 6px var(--wui-step-accent, var(--color-primary));
|
|
149
152
|
}
|
|
153
|
+
// A completed step keeps its own colour while hovered or focused, so a done-tone step does
|
|
154
|
+
// not flash the main accent. Unset, these resolve to the same accent as the rules above.
|
|
155
|
+
a.step.done:hover .step-circle,
|
|
156
|
+
button.step.done:hover .step-circle {
|
|
157
|
+
box-shadow: 0 0 0 4px var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft)));
|
|
158
|
+
}
|
|
159
|
+
a.step.done:hover .step-label,
|
|
160
|
+
button.step.done:hover .step-label {
|
|
161
|
+
color: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
162
|
+
}
|
|
163
|
+
a.step.done:focus-visible .step-circle,
|
|
164
|
+
button.step.done:focus-visible .step-circle {
|
|
165
|
+
box-shadow:
|
|
166
|
+
0 0 0 4px var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft))),
|
|
167
|
+
0 0 0 6px var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
168
|
+
}
|
|
150
169
|
// A step that failed its stage — a red circle with an alert, so an invalid step
|
|
151
170
|
// reads as wrong at a glance rather than merely "not done".
|
|
152
171
|
.step.error .step-circle {
|
|
@@ -201,8 +220,8 @@ button.step:focus-visible .step-circle {
|
|
|
201
220
|
transform 0.2s ease;
|
|
202
221
|
}
|
|
203
222
|
.stepper-journey .step.done .step-circle {
|
|
204
|
-
background: var(--wui-step-soft, var(--color-primary-soft));
|
|
205
|
-
color: var(--wui-step-soft-fg, var(--color-primary));
|
|
223
|
+
background: var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft)));
|
|
224
|
+
color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
|
|
206
225
|
}
|
|
207
226
|
.stepper-journey .step.active .step-circle {
|
|
208
227
|
background: var(--wui-step-accent, var(--color-primary));
|
|
@@ -227,7 +246,7 @@ button.step:focus-visible .step-circle {
|
|
|
227
246
|
color: var(--color-text-subtle);
|
|
228
247
|
}
|
|
229
248
|
.stepper-journey .step.done .step-index {
|
|
230
|
-
color: var(--wui-step-soft-fg, var(--color-primary));
|
|
249
|
+
color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
|
|
231
250
|
}
|
|
232
251
|
.stepper-journey .step.active .step-index {
|
|
233
252
|
color: var(--wui-step-accent, var(--color-primary));
|
|
@@ -275,7 +294,7 @@ button.step:focus-visible .step-circle {
|
|
|
275
294
|
background: var(--color-border-strong);
|
|
276
295
|
}
|
|
277
296
|
.stepper-journey .step-line.done {
|
|
278
|
-
background: var(--wui-step-accent, var(--color-primary));
|
|
297
|
+
background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
279
298
|
}
|
|
280
299
|
// Below xl the four label+title pairs no longer fit side by side, so the bar
|
|
281
300
|
// becomes a vertical list and the connectors go away.
|
|
@@ -353,7 +372,7 @@ button.step:focus-visible .step-circle {
|
|
|
353
372
|
z-index: 0;
|
|
354
373
|
}
|
|
355
374
|
.stepper-vertical .step.done:not(:last-child)::after {
|
|
356
|
-
background: var(--wui-step-accent, var(--color-primary));
|
|
375
|
+
background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
357
376
|
}
|
|
358
377
|
// The journey bar stacked vertically reuses its own narrow-width treatment: a plain
|
|
359
378
|
// column with the horizontal connectors dropped (a real vertical rail here would
|
|
@@ -403,8 +422,8 @@ button.step:focus-visible .step-circle {
|
|
|
403
422
|
}
|
|
404
423
|
.stepper-icons .step.done .step-circle {
|
|
405
424
|
border: none;
|
|
406
|
-
background: var(--wui-step-soft, var(--color-primary-soft));
|
|
407
|
-
color: var(--wui-step-soft-fg, var(--color-primary));
|
|
425
|
+
background: var(--wui-step-done-soft, var(--wui-step-soft, var(--color-primary-soft)));
|
|
426
|
+
color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
|
|
408
427
|
}
|
|
409
428
|
.stepper-icons .step.error .step-circle {
|
|
410
429
|
background: var(--color-danger-soft);
|
|
@@ -429,7 +448,7 @@ button.step:focus-visible .step-circle {
|
|
|
429
448
|
color: var(--wui-step-accent, var(--color-primary));
|
|
430
449
|
}
|
|
431
450
|
.stepper-icons .step.done .step-index {
|
|
432
|
-
color: var(--wui-step-soft-fg, var(--color-primary));
|
|
451
|
+
color: var(--wui-step-done-soft-fg, var(--wui-step-soft-fg, var(--color-primary)));
|
|
433
452
|
}
|
|
434
453
|
.stepper-icons .step.error .step-index {
|
|
435
454
|
color: var(--color-danger-text);
|
|
@@ -455,7 +474,7 @@ button.step:focus-visible .step-circle {
|
|
|
455
474
|
background: var(--wui-step-connector, var(--color-border));
|
|
456
475
|
}
|
|
457
476
|
.stepper-icons .step.done + .step::before {
|
|
458
|
-
background: var(--wui-step-accent, var(--color-primary));
|
|
477
|
+
background: var(--wui-step-done-accent, var(--wui-step-accent, var(--color-primary)));
|
|
459
478
|
}
|
|
460
479
|
// The compact hover ring is calibrated to the 28px badge; the 56px icon badge just
|
|
461
480
|
// lifts on hover instead.
|
|
@@ -483,6 +502,14 @@ button.step:focus-visible .step-circle {
|
|
|
483
502
|
}
|
|
484
503
|
}
|
|
485
504
|
|
|
505
|
+
// No connectors: the wizard's hide-connectors option drops the line between steps on every
|
|
506
|
+
// variant and orientation. Placed after the variants so it outranks their equal-specificity
|
|
507
|
+
// rails; the journey bar's .step-line siblings are simply not emitted.
|
|
508
|
+
.wui-stepper-no-connectors .step + .step::before,
|
|
509
|
+
.wui-stepper-no-connectors .step:not(:last-child)::after {
|
|
510
|
+
content: none;
|
|
511
|
+
}
|
|
512
|
+
|
|
486
513
|
@media (prefers-reduced-motion: reduce) {
|
|
487
514
|
a.step:hover .step-circle,
|
|
488
515
|
button.step:hover .step-circle,
|
|
@@ -531,6 +558,42 @@ button.step:focus-visible .step-circle {
|
|
|
531
558
|
--wui-step-soft-fg: var(--color-info-text);
|
|
532
559
|
}
|
|
533
560
|
|
|
561
|
+
// Done-tone presets — recolour COMPLETED steps only (their badge, "STEP n" eyebrow and the
|
|
562
|
+
// filled rail after them), leaving the active step on the accent above. Same ramps and the
|
|
563
|
+
// same placement rules as the tone presets: on the stepper or any ancestor (the wizard host).
|
|
564
|
+
// Error and skipped steps keep their own look.
|
|
565
|
+
// ----------------------------------------------------------------------------
|
|
566
|
+
.wui-step-done-tone-primary {
|
|
567
|
+
--wui-step-done-accent: var(--color-primary);
|
|
568
|
+
--wui-step-done-accent-fg: var(--color-primary-text);
|
|
569
|
+
--wui-step-done-soft: var(--color-primary-soft);
|
|
570
|
+
--wui-step-done-soft-fg: var(--color-primary);
|
|
571
|
+
}
|
|
572
|
+
.wui-step-done-tone-success {
|
|
573
|
+
--wui-step-done-accent: var(--color-success);
|
|
574
|
+
--wui-step-done-accent-fg: var(--color-progress-label);
|
|
575
|
+
--wui-step-done-soft: var(--color-success-soft);
|
|
576
|
+
--wui-step-done-soft-fg: var(--color-success-text);
|
|
577
|
+
}
|
|
578
|
+
.wui-step-done-tone-warning {
|
|
579
|
+
--wui-step-done-accent: var(--color-warning);
|
|
580
|
+
--wui-step-done-accent-fg: var(--color-progress-label);
|
|
581
|
+
--wui-step-done-soft: var(--color-warning-soft);
|
|
582
|
+
--wui-step-done-soft-fg: var(--color-warning-text);
|
|
583
|
+
}
|
|
584
|
+
.wui-step-done-tone-danger {
|
|
585
|
+
--wui-step-done-accent: var(--color-danger);
|
|
586
|
+
--wui-step-done-accent-fg: var(--color-progress-label);
|
|
587
|
+
--wui-step-done-soft: var(--color-danger-soft);
|
|
588
|
+
--wui-step-done-soft-fg: var(--color-danger-text);
|
|
589
|
+
}
|
|
590
|
+
.wui-step-done-tone-info {
|
|
591
|
+
--wui-step-done-accent: var(--color-info);
|
|
592
|
+
--wui-step-done-accent-fg: var(--color-progress-label);
|
|
593
|
+
--wui-step-done-soft: var(--color-info-soft);
|
|
594
|
+
--wui-step-done-soft-fg: var(--color-info-text);
|
|
595
|
+
}
|
|
596
|
+
|
|
534
597
|
// ============================================================================
|
|
535
598
|
// Pricing card. A tier's name, price, pitch, feature list and CTA.
|
|
536
599
|
//
|