@webority/theme 0.85.1 → 0.86.1

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.85.1",
3
+ "version": "0.86.1",
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": {
@@ -100,6 +100,20 @@
100
100
  --bs-btn-disabled-border-color: var(--wui-danger-strong);
101
101
  }
102
102
 
103
+ // White on the vivid amber fails AA (2.3:1), so the warning button uses the deeper
104
+ // --wui-warning-strong (4.7:1), like .btn-danger. Badges and dots keep --wui-warning.
105
+ .btn-warning {
106
+ --bs-btn-color: #fff;
107
+ --bs-btn-bg: var(--wui-warning-strong);
108
+ --bs-btn-border-color: var(--wui-warning-strong);
109
+ --bs-btn-hover-color: #fff;
110
+ --bs-btn-hover-bg: var(--wui-warning-strong-hover);
111
+ --bs-btn-hover-border-color: var(--wui-warning-strong-hover);
112
+ --bs-btn-active-color: #fff;
113
+ --bs-btn-active-bg: var(--wui-warning-strong-hover);
114
+ --bs-btn-active-border-color: var(--wui-warning-strong-hover);
115
+ }
116
+
103
117
  // Outline variants — tokenized like the solid buttons above so they follow a product's
104
118
  // RUNTIME --wui-* brand instead of Bootstrap's compile-time colours. Resting = brand outline
105
119
  // on a transparent fill; hover fills with the brand and flips the label to the on-brand text
package/scss/_tokens.scss CHANGED
@@ -262,9 +262,15 @@
262
262
 
263
263
  /// meaning: Warning colour as text on light surfaces, darkened to pass AA.
264
264
  --wui-warning-text: #876100;
265
+ // White on the vivid amber is only 2.3:1, so the warning button fills with these deeper
266
+ // tones instead: #9A6B00 is 4.7:1 under white, the hover deeper still.
267
+ /// meaning: Deep warning fill behind white text, such as the warning button.
268
+ --wui-warning-strong: #9A6B00;
269
+ /// meaning: Deep warning fill while a warning button with white text is hovered.
270
+ --wui-warning-strong-hover: #855C00;
265
271
  /// meaning: Active warning fill, the deepest vivid warning tone.
266
272
  --wui-warning-active: #DFA000;
267
- /// meaning: Vivid warning fill for badges, dots and warning buttons.
273
+ /// meaning: Vivid warning fill for badges and dots.
268
274
  --wui-warning: #DFA000;
269
275
  /// meaning: Warning tint 50 for borders and the strongest soft warning fill.
270
276
  --wui-warning-50: #FBD880;
@@ -482,18 +488,26 @@
482
488
  --wui-fs-2xl: clamp(1.5rem, 1.3rem + 1vw, 2rem);
483
489
  /// meaning: Triple extra-large step of the fluid type scale; a product opts in per element.
484
490
  --wui-fs-3xl: clamp(1.875rem, 1.5rem + 1.75vw, 2.75rem);
491
+ /// meaning: Fourth extra-large step of the fluid type scale; a product opts in per element.
492
+ --wui-fs-4xl: clamp(2.25rem, 1.7rem + 2.5vw, 3.5rem);
493
+ /// meaning: Fifth extra-large step of the fluid type scale; a product opts in per element.
494
+ --wui-fs-5xl: clamp(2.75rem, 1.9rem + 3.75vw, 4.5rem);
495
+ /// meaning: Sixth extra-large step of the fluid type scale; a product opts in per element.
496
+ --wui-fs-6xl: clamp(3.5rem, 2.2rem + 5.5vw, 6rem);
485
497
 
486
498
  // ---- Font stacks ---------------------------------------------------
487
499
  // Sans-serif body font (Bootstrap's system stack or product override).
488
500
  --font-sans: var(--bs-body-font-family);
489
501
 
490
- // ---- Display font slot --------------------------------------------
491
- // A dedicated slot for a display/heading typeface, kept separate from
492
- // $font-family-base so a product can point ONLY its display headings (.h-display) at a
493
- // serif or another brand face by overriding this one token, without touching body copy.
494
- // Defaults to Webority Serif ($font-family-display).
502
+ // ---- Typeface slots -----------------------------------------------
503
+ // Display (headings, Webority Serif), body (running text and controls) and mono (code, aligned figures)
504
+ // are the three typefaces Canvas themes and products name; a product repoints one without touching the others.
495
505
  /// meaning: Display typeface for headings marked as display text.
496
506
  --wui-font-display: #{$font-family-display};
507
+ /// meaning: Body typeface for running text and controls.
508
+ --wui-font-body: #{$font-family-sans-serif};
509
+ /// meaning: Monospace typeface for code, identifiers and figures that must line up.
510
+ --wui-font-mono: #{$font-family-monospace};
497
511
 
498
512
  // ---- Z-index scale -------------------------------------------------
499
513
  // One page-level ladder. Local stacking inside a component (1, 5, 10, 40…) is
@@ -90,8 +90,10 @@
90
90
  flex-wrap: wrap;
91
91
  column-gap: 24px;
92
92
  }
93
+ // Options in a group read as a list, so the label sits a little further from its radio.
93
94
  .wui-radio-group > .form-check {
94
95
  margin-bottom: 0;
96
+ column-gap: 16px;
95
97
  }
96
98
  // A lone .form-check lets its label shrink to nothing so long consent text can wrap; in a row
97
99
  // of options that broke words mid-way ("Mont hly"). Keep each option's words whole and let the
@@ -124,7 +126,7 @@
124
126
  position: relative;
125
127
  padding: 14px 16px;
126
128
  min-height: 56px;
127
- border: 1.5px solid var(--color-border);
129
+ border: 1px solid var(--color-border);
128
130
  border-radius: var(--radius);
129
131
  background: var(--color-surface);
130
132
  transition:
@@ -173,10 +175,16 @@
173
175
  border-color: var(--color-danger);
174
176
  }
175
177
 
178
+ // The group's label gets 10px of its own below it, on top of .field's 10px gap.
179
+ .field:has(> .wui-radio-group) > .label {
180
+ margin-bottom: 10px;
181
+ }
182
+
176
183
  // Beside-label forms centre a label on a text control; a radio group's first option is shorter,
177
184
  // so its label lines up with that row instead.
178
185
  .wui-form-labels-start .field:has(> .wui-radio-group) > .label {
179
186
  padding-top: 0;
187
+ margin-bottom: 0;
180
188
  }
181
189
 
182
190
  // Glyph — shared by BS form-check-input and the wui-check alias.
@@ -600,7 +608,7 @@ textarea.form-control.autosize {
600
608
  // Must clear AA against the surface: --color-danger-active (#E82646) is 4.38:1 at this
601
609
  // 12px size, under the 4.5:1 floor the a11y gate enforces.
602
610
  color: var(--color-danger-text);
603
- // Tighten the space above the message: .field's 4px gap → effective 2px, without
611
+ // Tighten the space above the message: .field's 10px gap → effective 8px, without
604
612
  // touching the label→control gap.
605
613
  margin-top: -2px;
606
614
  }
@@ -1166,7 +1174,7 @@ $wui-field-error-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/
1166
1174
  // `.field` is align-items:flex-start, so a shrink-wrapped count would sit on the LEFT —
1167
1175
  // text-align alone can't move it. align-self pushes it to the control's right edge.
1168
1176
  align-self: flex-end;
1169
- // Tighten the space above the count: .field's 4px gap → effective 2px, matching .field-error.
1177
+ // Tighten the space above the count: .field's 10px gap → effective 8px, matching .field-error.
1170
1178
  margin-top: -2px;
1171
1179
  font-size: 12px;
1172
1180
  line-height: normal;
@@ -1215,7 +1223,7 @@ $wui-field-error-glyph: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/
1215
1223
  display: flex;
1216
1224
  flex-direction: column;
1217
1225
  align-items: flex-start;
1218
- gap: 4px;
1226
+ gap: 10px;
1219
1227
  min-width: 0;
1220
1228
  }
1221
1229
  // Inside the flex column it sizes to its content, so it stretches to the field instead.
@@ -1326,6 +1326,7 @@
1326
1326
  height: var(--wui-action-size);
1327
1327
  padding: 0;
1328
1328
  border: none;
1329
+ text-decoration: none;
1329
1330
  // No disc at rest: a row of actions reads as quiet icons, and the tint below appears on hover.
1330
1331
  background: transparent;
1331
1332
  border-radius: 999px;
@@ -480,6 +480,9 @@ a.info-row:hover .info-value {
480
480
  position: relative;
481
481
  z-index: 1;
482
482
  display: inline-flex;
483
+ // An option keeps its content width, so a narrow box scrolls or wraps the control instead of
484
+ // squeezing the selected label past its pill.
485
+ flex: none;
483
486
  align-items: center;
484
487
  gap: 5px;
485
488
  min-height: var(--segmented-option-h);
@@ -1381,6 +1384,10 @@ a.info-row:hover .info-value {
1381
1384
  .result {
1382
1385
  text-align: center;
1383
1386
  padding: 48px 24px;
1387
+ display: flex;
1388
+ flex-direction: column;
1389
+ // Stretch, not center: a part keeps the card's full width (its text centres itself), so a long title wraps at the card edge as before.
1390
+ align-items: stretch;
1384
1391
  color: var(--color-text-subtle);
1385
1392
  }
1386
1393
  .result-icon {
@@ -305,10 +305,11 @@ wui-file-viewer:fullscreen {
305
305
  width: 100%;
306
306
  height: 100%;
307
307
  }
308
+ // A page that is still loading reads as a blank page in both modes, matching the sheet it sits in.
308
309
  .wui-file-viewer-skeleton {
309
310
  width: 100%;
310
311
  height: 100%;
311
- background: var(--color-bg-muted);
312
+ background: #fff;
312
313
  }
313
314
 
314
315
  // The text layer: transparent text laid over the drawing for selecting, copying and searching.
@@ -1209,7 +1209,7 @@ button.wui-step-tile-body:hover .step-label {
1209
1209
  }
1210
1210
  // Below md, collapse to 1 column.
1211
1211
  @include media-breakpoint-down(md) {
1212
- .form-row-grid.form-row-grid {
1212
+ .form-row-grid.form-row-grid:not(.wui-form-row-keep) {
1213
1213
  grid-template-columns: 1fr;
1214
1214
  }
1215
1215
  }
@@ -12,7 +12,8 @@ $wui-roll-cell: 1.2em;
12
12
  position: relative;
13
13
  display: inline-block;
14
14
  vertical-align: bottom;
15
- line-height: $wui-roll-cell;
15
+ // Unitless, so a digit column whose font size differs from the figure's keeps its own cell height.
16
+ line-height: 1.2;
16
17
  font-variant-numeric: tabular-nums;
17
18
  white-space: nowrap;
18
19
  }
@@ -35,10 +36,12 @@ $wui-roll-cell: 1.2em;
35
36
  }
36
37
  .wui-rolling-number-char {
37
38
  display: inline-block;
39
+ vertical-align: top;
38
40
  height: $wui-roll-cell;
39
41
  }
40
42
  .wui-rolling-number-digit {
41
43
  display: inline-block;
44
+ vertical-align: top;
42
45
  height: $wui-roll-cell;
43
46
  overflow: hidden;
44
47
  }
@@ -46,12 +49,15 @@ $wui-roll-cell: 1.2em;
46
49
  display: flex;
47
50
  flex-direction: column;
48
51
  transform: translateY(calc(var(--wui-roll-digit, 0) * -#{$wui-roll-cell}));
49
- transition: transform var(--wui-roll-duration, 600ms) var(--wui-ease-out-quart);
50
52
  > span {
51
53
  display: block;
52
54
  height: $wui-roll-cell;
53
55
  }
54
56
  }
57
+ // Only a figure that is moving has a transition, so a still render never catches a reel mid-move.
58
+ .wui-rolling-number[data-rolling] .wui-rolling-number-reel {
59
+ transition: transform var(--wui-roll-duration, 600ms) var(--wui-ease-out-quart);
60
+ }
55
61
 
56
62
  @media (prefers-reduced-motion: reduce) {
57
63
  .wui-rolling-number-reel {
@@ -230,7 +230,10 @@
230
230
  top: 0;
231
231
  z-index: var(--wui-z-shell-sidebar);
232
232
  align-self: start;
233
- height: 100vh;
233
+ // The sidebar takes its grid area's height, so a shell in a box shorter than the viewport fits it.
234
+ // The max-height keeps it within the viewport, so a long menu never stretches the page and it stays sticky.
235
+ height: 100%;
236
+ max-height: 100vh;
234
237
  display: flex;
235
238
  flex-direction: column;
236
239
  gap: 2px;
@@ -9,11 +9,17 @@
9
9
  // ── Icon base ──
10
10
  // Every library glyph (React <Icon>, Razor <app-icon>, wui-element internals) is an
11
11
  // inline SVG carrying this class; size comes from its width/height attributes.
12
+ // An ancestor may set --wui-icon-color (a Canvas node's iconColor does) to colour every icon
13
+ // below it that no rule or colour prop colours itself.
12
14
  .wui-icon {
13
15
  display: inline-block;
14
16
  flex-shrink: 0;
15
17
  vertical-align: -.125em;
16
18
  }
19
+ // Zero specificity: a rule that colours an icon itself, such as .search-select-caret, keeps winning.
20
+ :where(.wui-icon) {
21
+ color: var(--wui-icon-color, currentColor);
22
+ }
17
23
 
18
24
  // ── Grid / layout utils ──
19
25
  // Responsive card grids (Bootstrap has no grid-template utility).
@@ -175,9 +175,14 @@
175
175
  "--wui-focus-ring-inset": "Offset that draws the focus ring inside a scrolling container.",
176
176
  "--wui-focus-ring-offset": "Gap between a control and its keyboard focus ring.",
177
177
  "--wui-focus-ring-width": "Width of the keyboard focus ring.",
178
+ "--wui-font-body": "Body typeface for running text and controls.",
178
179
  "--wui-font-display": "Display typeface for headings marked as display text.",
180
+ "--wui-font-mono": "Monospace typeface for code, identifiers and figures that must line up.",
179
181
  "--wui-fs-2xl": "Double extra-large step of the fluid type scale; a product opts in per element.",
180
182
  "--wui-fs-3xl": "Triple extra-large step of the fluid type scale; a product opts in per element.",
183
+ "--wui-fs-4xl": "Fourth extra-large step of the fluid type scale; a product opts in per element.",
184
+ "--wui-fs-5xl": "Fifth extra-large step of the fluid type scale; a product opts in per element.",
185
+ "--wui-fs-6xl": "Sixth extra-large step of the fluid type scale; a product opts in per element.",
181
186
  "--wui-fs-base": "Body-size step of the fluid type scale, close to Bootstrap's 1rem.",
182
187
  "--wui-fs-lg": "Large step of the fluid type scale; a product opts in per element.",
183
188
  "--wui-fs-sm": "Small step of the fluid type scale; a product opts in per element.",
@@ -245,13 +250,15 @@
245
250
  "--wui-text-4": "Decorative faint ink, not for text a person must read.",
246
251
  "--wui-text-5": "Faintest ink, for decorative marks and the strong border tone.",
247
252
  "--wui-text-heading": "Heading ink for page and section titles.",
248
- "--wui-warning": "Vivid warning fill for badges, dots and warning buttons.",
253
+ "--wui-warning": "Vivid warning fill for badges and dots.",
249
254
  "--wui-warning-10": "Warning tint 10, the soft background of warning alerts and badges.",
250
255
  "--wui-warning-20": "Warning tint 20 for soft fills behind warning alerts and badges.",
251
256
  "--wui-warning-30": "Warning tint 30 for soft fills and borders of alerts and badges.",
252
257
  "--wui-warning-5": "Faintest warning tint, for hover washes and soft warning backgrounds.",
253
258
  "--wui-warning-50": "Warning tint 50 for borders and the strongest soft warning fill.",
254
259
  "--wui-warning-active": "Active warning fill, the deepest vivid warning tone.",
260
+ "--wui-warning-strong": "Deep warning fill behind white text, such as the warning button.",
261
+ "--wui-warning-strong-hover": "Deep warning fill while a warning button with white text is hovered.",
255
262
  "--wui-warning-text": "Warning colour as text on light surfaces, darkened to pass AA.",
256
263
  "--wui-z-dropdown": "Stacking layer of in-page dropdown menus.",
257
264
  "--wui-z-fixed": "Stacking layer of fixed corner layers such as the consent banner.",