@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/theme",
3
- "version": "0.40.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": {
@@ -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 --wui-danger-text (the AA-safe error red designed to read on a light red tint),
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(--wui-danger-text);
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(--wui-danger-text);
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(--wui-danger-text);
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(--wui-border-light);
414
+ --bs-dropdown-border-color: var(--color-border);
415
415
  --bs-dropdown-border-radius: var(--wui-radius-lg);
416
- --bs-dropdown-link-color: var(--wui-text-1);
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(--wui-text-3);
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(--wui-danger-text);
484
- --bs-dropdown-link-hover-color: var(--wui-danger-text);
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(--wui-text-3);
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(--wui-text-1);
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
@@ -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
- .wui-filter-bar > .field {
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.
@@ -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
- overflow: hidden;
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 {
@@ -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 — header and body alike — is pure white, lifted off the page with the shared
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(--wui-bg-light);
446
- --bs-popover-header-bg: var(--wui-bg-light);
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);