@webority/theme 0.40.0 → 0.41.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 +1 -0
- package/dist/webority-theme.css +1 -1
- package/package.json +1 -1
- package/scss/_components.scss +11 -11
- package/scss/_tokens.scss +3 -0
- package/scss/wui/_data.scss +22 -2
- package/scss/wui/_shell.scss +13 -4
- package/scss/wui/_utilities.scss +4 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webority/theme",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.41.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/_components.scss
CHANGED
|
@@ -135,17 +135,17 @@
|
|
|
135
135
|
// instead of a solid red fill, for a quieter destructive action (e.g. a "Remove" that
|
|
136
136
|
// shouldn't shout like a solid .btn-danger). Mirrors .btn-secondary exactly — low-alpha
|
|
137
137
|
// tint deepening on hover/press, no border — but keyed off the danger tokens. The label
|
|
138
|
-
// uses --
|
|
138
|
+
// uses --color-danger-text (the AA-safe error red, lifted in dark mode to read on a dark surface),
|
|
139
139
|
// not the brighter --color-danger. Disabled falls through to the shared neutral-grey
|
|
140
140
|
// state below (it is not .btn-danger), like .btn-secondary.
|
|
141
141
|
.btn-secondary-danger {
|
|
142
|
-
--bs-btn-color: var(--
|
|
142
|
+
--bs-btn-color: var(--color-danger-text);
|
|
143
143
|
--bs-btn-bg: color-mix(in srgb, var(--color-danger) 12%, transparent);
|
|
144
144
|
--bs-btn-border-color: transparent;
|
|
145
|
-
--bs-btn-hover-color: var(--
|
|
145
|
+
--bs-btn-hover-color: var(--color-danger-text);
|
|
146
146
|
--bs-btn-hover-bg: color-mix(in srgb, var(--color-danger) 18%, transparent);
|
|
147
147
|
--bs-btn-hover-border-color: transparent;
|
|
148
|
-
--bs-btn-active-color: var(--
|
|
148
|
+
--bs-btn-active-color: var(--color-danger-text);
|
|
149
149
|
--bs-btn-active-bg: color-mix(in srgb, var(--color-danger) 26%, transparent);
|
|
150
150
|
--bs-btn-active-border-color: transparent;
|
|
151
151
|
}
|
|
@@ -411,9 +411,9 @@
|
|
|
411
411
|
--bs-dropdown-padding-y: 0.375rem;
|
|
412
412
|
--bs-dropdown-item-padding-y: 0.5rem;
|
|
413
413
|
--bs-dropdown-item-padding-x: 0.625rem;
|
|
414
|
-
--bs-dropdown-border-color: var(--
|
|
414
|
+
--bs-dropdown-border-color: var(--color-border);
|
|
415
415
|
--bs-dropdown-border-radius: var(--wui-radius-lg);
|
|
416
|
-
--bs-dropdown-link-color: var(--
|
|
416
|
+
--bs-dropdown-link-color: var(--color-text-body);
|
|
417
417
|
--bs-dropdown-link-hover-color: var(--color-primary-hover);
|
|
418
418
|
--bs-dropdown-link-hover-bg: var(--color-primary-soft);
|
|
419
419
|
--bs-dropdown-link-active-color: var(--color-primary-hover);
|
|
@@ -460,7 +460,7 @@
|
|
|
460
460
|
.wui-icon, i, svg {
|
|
461
461
|
flex-shrink: 0;
|
|
462
462
|
font-size: 1rem;
|
|
463
|
-
color: var(--
|
|
463
|
+
color: var(--color-text-subtle);
|
|
464
464
|
transition: color 0.12s ease;
|
|
465
465
|
}
|
|
466
466
|
&:hover .wui-icon, &:hover i, &:hover svg,
|
|
@@ -480,8 +480,8 @@
|
|
|
480
480
|
|
|
481
481
|
// Destructive row action — red label, red glyph, red-tinted hover.
|
|
482
482
|
&.danger {
|
|
483
|
-
--bs-dropdown-link-color: var(--
|
|
484
|
-
--bs-dropdown-link-hover-color: var(--
|
|
483
|
+
--bs-dropdown-link-color: var(--color-danger-text);
|
|
484
|
+
--bs-dropdown-link-hover-color: var(--color-danger-text);
|
|
485
485
|
--bs-dropdown-link-hover-bg: var(--color-danger-soft);
|
|
486
486
|
.wui-icon, i, svg { color: var(--wui-danger); }
|
|
487
487
|
&:hover .wui-icon, &:hover i, &:hover svg,
|
|
@@ -625,7 +625,7 @@
|
|
|
625
625
|
display: inline-flex;
|
|
626
626
|
align-items: center;
|
|
627
627
|
justify-content: center;
|
|
628
|
-
color: var(--
|
|
628
|
+
color: var(--color-text-subtle);
|
|
629
629
|
flex-shrink: 0;
|
|
630
630
|
font-size: 1rem;
|
|
631
631
|
line-height: 1;
|
|
@@ -645,7 +645,7 @@ button.wui-input-leading {
|
|
|
645
645
|
}
|
|
646
646
|
button.wui-input-trailing:hover,
|
|
647
647
|
button.wui-input-leading:hover {
|
|
648
|
-
color: var(--
|
|
648
|
+
color: var(--color-text-body);
|
|
649
649
|
}
|
|
650
650
|
button.wui-input-trailing:focus-visible,
|
|
651
651
|
button.wui-input-leading:focus-visible {
|
package/scss/_tokens.scss
CHANGED
|
@@ -339,6 +339,9 @@
|
|
|
339
339
|
// pick a rung from this list.
|
|
340
340
|
--wui-z-dropdown: 1000;
|
|
341
341
|
--wui-z-sticky: 1020;
|
|
342
|
+
// Desktop shell sidebar: its overflowing menus (the workspace switcher) paint over sticky page
|
|
343
|
+
// content, while the fixed corner layers (consent banner, floating buttons) still cover it.
|
|
344
|
+
--wui-z-shell-sidebar: 1025;
|
|
342
345
|
--wui-z-fixed: 1030;
|
|
343
346
|
--wui-z-shell: 1040; // splash, shell base chrome
|
|
344
347
|
--wui-z-shell-scrim: 1044; // mobile drawer scrim
|
package/scss/wui/_data.scss
CHANGED
|
@@ -511,17 +511,37 @@
|
|
|
511
511
|
}
|
|
512
512
|
// Facets size themselves: a select, multi-select or date range takes about 180 to 240px and the
|
|
513
513
|
// search box a wider 260 to 320px, so they wrap as a compact row instead of stacking at full
|
|
514
|
-
// width. Segments keep their own width.
|
|
515
|
-
|
|
514
|
+
// width. Segments keep their own width. A date range is the bare custom element, not a .field,
|
|
515
|
+
// and on its own it fills its line.
|
|
516
|
+
.wui-filter-bar > .field,
|
|
517
|
+
.wui-filter-bar > wui-date-range {
|
|
516
518
|
flex: 1 1 180px;
|
|
517
519
|
min-width: 0;
|
|
518
520
|
max-width: 240px;
|
|
519
521
|
}
|
|
522
|
+
.wui-filter-bar > wui-date-range .daterange {
|
|
523
|
+
width: 100%;
|
|
524
|
+
}
|
|
520
525
|
.wui-filter-bar > .search-wrap {
|
|
521
526
|
flex: 1 1 260px;
|
|
522
527
|
min-width: 0;
|
|
523
528
|
max-width: 320px;
|
|
524
529
|
}
|
|
530
|
+
// The Razor bar sits in a GET form beside its Apply button. Its own box would take a whole
|
|
531
|
+
// line and push Apply below it, so the form lays the controls, chips, Clear all and Apply out
|
|
532
|
+
// as one row. `!important` beats the bar's d-flex utility, which React shares.
|
|
533
|
+
.wui-filter-form > .wui-filter-bar {
|
|
534
|
+
display: contents !important;
|
|
535
|
+
}
|
|
536
|
+
// On a phone each facet takes its own line; segments and buttons keep their width.
|
|
537
|
+
@media (max-width: 575.98px) {
|
|
538
|
+
.wui-filter-bar > .field,
|
|
539
|
+
.wui-filter-bar > wui-date-range,
|
|
540
|
+
.wui-filter-bar > .search-wrap {
|
|
541
|
+
flex-basis: 100%;
|
|
542
|
+
max-width: none;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
525
545
|
|
|
526
546
|
// Pagination footer: a "10 per page" menu beside the page buttons, flush under a table. No row
|
|
527
547
|
// range and no total; the page buttons say where you are.
|
package/scss/wui/_shell.scss
CHANGED
|
@@ -223,9 +223,12 @@
|
|
|
223
223
|
left: 0;
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
+
// Sticky always makes a stacking context, so without a z-index here the page content after the
|
|
227
|
+
// sidebar paints over anything the sidebar lets out, such as an open workspace switcher menu.
|
|
226
228
|
.app-sidebar {
|
|
227
229
|
position: sticky;
|
|
228
230
|
top: 0;
|
|
231
|
+
z-index: var(--wui-z-shell-sidebar);
|
|
229
232
|
align-self: start;
|
|
230
233
|
height: 100vh;
|
|
231
234
|
display: flex;
|
|
@@ -234,7 +237,12 @@
|
|
|
234
237
|
// The bottom inset matches the gap between the collapse toggle and the rule above it,
|
|
235
238
|
// so the toggle row sits evenly spaced between the rule and the sidebar's bottom edge.
|
|
236
239
|
padding: 20px 16px var(--app-sidebar-toggle-gap);
|
|
237
|
-
|
|
240
|
+
// Clipped top to bottom only. The mobile drawer's transform makes it the box a fixed menu
|
|
241
|
+
// is placed in, so a horizontal clip would cut a 300px switcher menu at the drawer's 260px edge.
|
|
242
|
+
overflow: visible clip;
|
|
243
|
+
// A clip, unlike hidden, leaves the grid row free to grow to the whole nav list; this keeps
|
|
244
|
+
// a shell set in a fixed-height box at the box's height, with the nav scrolling inside it.
|
|
245
|
+
min-height: 0;
|
|
238
246
|
background: var(--color-surface);
|
|
239
247
|
transition: padding 0.2s var(--wui-ease-ui);
|
|
240
248
|
}
|
|
@@ -318,11 +326,11 @@
|
|
|
318
326
|
// the 88px rail, so the collapsed state hides it (the mobile drawer restores it).
|
|
319
327
|
// The compact twin (`sidebarStartCompact` / `<app-shell-sidebar-start-compact>`) is
|
|
320
328
|
// the inverse: hidden expanded, shown only on the desktop collapsed rail, sized for
|
|
321
|
-
// a 36px monogram control (AppWorkspaceSwitcher compact).
|
|
329
|
+
// a 36px monogram control (AppWorkspaceSwitcher compact). Neither slot clips: a menu opened
|
|
330
|
+
// from it has to reach past the sidebar's edge.
|
|
322
331
|
.app-sidebar-start {
|
|
323
332
|
flex: none;
|
|
324
333
|
margin-bottom: 8px;
|
|
325
|
-
overflow: hidden;
|
|
326
334
|
}
|
|
327
335
|
.app-sidebar-start-compact {
|
|
328
336
|
display: none;
|
|
@@ -331,11 +339,12 @@
|
|
|
331
339
|
// Centre the fixed square in the 88px rail so it lines up with the icon column.
|
|
332
340
|
justify-content: center;
|
|
333
341
|
align-items: center;
|
|
334
|
-
overflow: hidden;
|
|
335
342
|
}
|
|
343
|
+
// The sidebar clips only top to bottom, so a footer wider than the 88px rail is clipped here.
|
|
336
344
|
.app-sidebar-foot {
|
|
337
345
|
flex: none;
|
|
338
346
|
padding-top: 12px;
|
|
347
|
+
overflow-x: clip;
|
|
339
348
|
}
|
|
340
349
|
|
|
341
350
|
.app-nav-group {
|
package/scss/wui/_utilities.scss
CHANGED
|
@@ -436,14 +436,14 @@
|
|
|
436
436
|
// passwordRequirements) opens on focus. Rendered identically by React (a JSX <ul>) and Razor
|
|
437
437
|
// (the same <ul> built in webority-ui.js), so both surfaces read the same. `.pw-popover` is the
|
|
438
438
|
// custom class both put on Bootstrap's `.popover` panel.
|
|
439
|
-
// The card surface
|
|
440
|
-
// overlay shadow (the one ink menus/popovers/modals use; not a hand-rolled per-component shadow).
|
|
439
|
+
// The card surface, header and body alike, is the elevated surface (white in light mode), lifted
|
|
440
|
+
// off the page with the shared overlay shadow (the one ink menus/popovers/modals use; not a hand-rolled per-component shadow).
|
|
441
441
|
// The field help popover (AppInfoTip, `.infotip-popover`) shares the same card, so the two
|
|
442
442
|
// help surfaces a form shows read as one family.
|
|
443
443
|
.pw-popover,
|
|
444
444
|
.infotip-popover {
|
|
445
|
-
--bs-popover-bg: var(--
|
|
446
|
-
--bs-popover-header-bg: var(--
|
|
445
|
+
--bs-popover-bg: var(--color-surface);
|
|
446
|
+
--bs-popover-header-bg: var(--color-surface);
|
|
447
447
|
// A 14px heading: one step above the 13px body, so the card reads as help, not a dialog.
|
|
448
448
|
--bs-popover-header-font-size: 14px;
|
|
449
449
|
box-shadow: var(--wui-shadow-overlay);
|