@webority/theme 0.72.0 → 0.74.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.72.0",
3
+ "version": "0.74.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": {
@@ -10,6 +10,9 @@
10
10
  // button beside an input lines up in every form row. Heights are min-height with the label flex-centred; sm/lg
11
11
  // set theirs in their size blocks below.
12
12
  .btn:not(.btn-sm):not(.btn-lg):not(.btn-pill):not(.btn-pill-sm):not(.u-action):not(.btn-icon) {
13
+ // The height is the field height and the label is flex-centred, so no vertical padding: it
14
+ // would push a button past its field height.
15
+ --bs-btn-padding-y: 0;
13
16
  display: inline-flex;
14
17
  align-items: center;
15
18
  justify-content: center;
@@ -19,7 +22,7 @@
19
22
  // Tactile press feedback — every variant AND every size (sm/md/lg). Kept
20
23
  // separate from the height rule above so sm/lg (which opt out of the shared
21
24
  // control height) still get the nudge. A signal, not a depth cue.
22
- .btn:not(.btn-pill):not(.btn-pill-sm):not(.u-action):not(.btn-icon):not(.btn-ghost):active:not(:disabled) {
25
+ .btn:not(.btn-pill):not(.btn-pill-sm):not(.u-action):not(.btn-icon):active:not(:disabled) {
23
26
  transform: translateY(1px);
24
27
  }
25
28
 
@@ -137,7 +140,7 @@
137
140
  --bs-btn-color: var(--color-text-muted);
138
141
  --bs-btn-border-color: var(--color-border-strong);
139
142
  --bs-btn-hover-color: var(--color-text);
140
- --bs-btn-hover-bg: var(--color-bg-muted);
143
+ --bs-btn-hover-bg: color-mix(in srgb, var(--color-primary) 12%, transparent);
141
144
  --bs-btn-hover-border-color: var(--color-border-strong);
142
145
  --bs-btn-active-color: var(--color-text);
143
146
  --bs-btn-active-bg: var(--color-border);
@@ -169,16 +172,17 @@
169
172
  --bs-btn-focus-box-shadow: 0 0 0 0.25rem color-mix(in srgb, var(--color-danger) 50%, transparent);
170
173
  }
171
174
 
172
- // Soft neutral tinted button — a quieter alternative to .btn-light for a secondary
173
- // action that shouldn't compete with a primary/danger CTA in the same row.
174
- .btn-subtle {
175
- --bs-btn-bg: var(--color-bg-muted);
175
+ // Neutral grey button: the secondary button's shape in grey instead of the brand tint, for a
176
+ // supporting action (Back, Skip, Close) that should not carry the brand colour. The fill is the
177
+ // text colour at 8%, 12% on hover and 16% pressed, so it follows the theme in light and dark.
178
+ .btn-neutral {
179
+ --bs-btn-bg: color-mix(in srgb, var(--color-text) 8%, transparent);
176
180
  --bs-btn-color: var(--color-text);
177
181
  --bs-btn-border-color: transparent;
178
- --bs-btn-hover-bg: var(--color-border);
182
+ --bs-btn-hover-bg: color-mix(in srgb, var(--color-text) 12%, transparent);
179
183
  --bs-btn-hover-color: var(--color-text);
180
184
  --bs-btn-hover-border-color: transparent;
181
- --bs-btn-active-bg: var(--color-border-strong);
185
+ --bs-btn-active-bg: color-mix(in srgb, var(--color-text) 16%, transparent);
182
186
  --bs-btn-active-color: var(--color-text);
183
187
  --bs-btn-active-border-color: transparent;
184
188
  --bs-btn-focus-box-shadow: 0 0 0 0.25rem var(--bs-focus-ring-color);
@@ -234,7 +238,7 @@
234
238
  opacity: 1;
235
239
  cursor: progress;
236
240
  }
237
- // Transparent-fill variants (secondary/ghost/subtle/outline-*) have no fill to tint from —
241
+ // Transparent-fill variants (secondary/ghost/text/neutral/outline-*) have no fill to tint from —
238
242
  // key the wash and the label off the accent (text) colour so the hue still shows.
239
243
  .btn-secondary.is-loading:disabled,
240
244
  .btn-secondary.is-loading.disabled,
@@ -242,8 +246,10 @@
242
246
  .btn-secondary-danger.is-loading.disabled,
243
247
  .btn-ghost.is-loading:disabled,
244
248
  .btn-ghost.is-loading.disabled,
245
- .btn-subtle.is-loading:disabled,
246
- .btn-subtle.is-loading.disabled,
249
+ .btn-text.is-loading:disabled,
250
+ .btn-text.is-loading.disabled,
251
+ .btn-neutral.is-loading:disabled,
252
+ .btn-neutral.is-loading.disabled,
247
253
  .btn-outline-primary.is-loading:disabled,
248
254
  .btn-outline-primary.is-loading.disabled,
249
255
  .btn-outline-danger.is-loading:disabled,
@@ -265,33 +271,40 @@
265
271
  // sizes step font-size, horizontal padding and radius together (vertical size
266
272
  // comes from --wui-control-height, so a button lines up with an input). Weight
267
273
  // is 600 on every rung — buttons read as a deliberate action, not body text.
268
- // Medium (default): 14px / 600, 24px side padding, 18px squircle radius, --wui-control-height tall.
274
+ // Medium (default): 14px / 600, about 20px side padding, 18px squircle radius, --wui-control-height tall.
275
+ // Side padding is always twice the vertical padding. A button is its field's height with the label
276
+ // line centred, so its vertical padding is (height - both borders - one line) / 2 and its side
277
+ // padding the height less both borders and one line: about 7.7/15.4, 10.2/20.3 and 12.6/25.2px at sm,
278
+ // md and lg with the theme's line height.
269
279
  .btn {
280
+ --wui-btn-height: var(--wui-control-height);
270
281
  --bs-btn-border-radius: 18px;
271
282
  --bs-btn-font-size: 0.875rem;
272
283
  --bs-btn-font-weight: 600;
273
- --bs-btn-padding-x: 1.5rem;
284
+ --bs-btn-padding-x: calc(var(--wui-btn-height) - 2 * var(--bs-btn-border-width) - var(--bs-btn-font-size) * var(--bs-btn-line-height));
274
285
  // Progressive enhancement only (Chrome/Safari recent). Unsupported engines
275
286
  // keep a plain border-radius arc — not a cross-browser design contract.
276
287
  corner-shape: squircle;
277
288
  }
278
- // Small: 12px, 18px side padding, 14px squircle radius (proportional to md), as tall as a small field.
289
+ // Small: 12px, about 15px side padding, 14px squircle radius (proportional to md), as tall as a small field.
279
290
  .btn-sm:not(.btn-icon),
280
291
  .btn-group-sm > .btn:not(.btn-icon) {
292
+ --wui-btn-height: var(--wui-control-height-sm);
293
+ --bs-btn-padding-y: 0;
281
294
  --bs-btn-border-radius: 14px;
282
295
  --bs-btn-font-size: 0.75rem;
283
- --bs-btn-padding-x: 1.125rem;
284
296
  display: inline-flex;
285
297
  align-items: center;
286
298
  justify-content: center;
287
299
  min-height: var(--wui-control-height-sm);
288
300
  }
289
- // Large: 16px, 32px side padding, 22px squircle radius (proportional to md), as tall as a large field.
301
+ // Large: 16px, about 25px side padding, 22px squircle radius (proportional to md), as tall as a large field.
290
302
  .btn-lg:not(.btn-icon),
291
303
  .btn-group-lg > .btn:not(.btn-icon) {
304
+ --wui-btn-height: var(--wui-control-height-lg);
305
+ --bs-btn-padding-y: 0;
292
306
  --bs-btn-border-radius: 22px;
293
307
  --bs-btn-font-size: 1rem;
294
- --bs-btn-padding-x: 2rem;
295
308
  display: inline-flex;
296
309
  align-items: center;
297
310
  justify-content: center;
@@ -304,7 +317,7 @@
304
317
  // with .btn-anim-none. Every option reads on EVERY variant — the moving layer
305
318
  // is tinted from the button's OWN colour (color-mix on currentColor / the
306
319
  // resolved --bs-btn fill), so it's a pale sheen on solid fills, a brand shimmer
307
- // on outline/ghost, a neutral gloss on subtle/light. All snap off under
320
+ // on outline/ghost, a neutral gloss on neutral/light. All snap off under
308
321
  // prefers-reduced-motion (below). Icon-only / link-style actions never animate.
309
322
  //
310
323
  // (default) royal angled sheen sweep + a restrained −1px lift
@@ -313,6 +326,8 @@
313
326
  // .btn-anim-expand a radial glow blooms from the centre
314
327
  // .btn-anim-glow a soft colour-matched glow ring + lift
315
328
  // .btn-anim-none no hover motion
329
+ // .btn-anim-roll the label rolls up and a trailing icon slides through a round well
330
+ // (AppButton animation="roll" renders the copies it needs)
316
331
  //
317
332
  // Shared plumbing — a clipped, isolated box so a z-index:-1 layer can sit above
318
333
  // the fill but below the label; overflow clips it to the squircle corners.
@@ -323,8 +338,8 @@
323
338
  }
324
339
 
325
340
  // --- Sheen (default + .btn-anim-sheen): slim angled glossy band sweeps across.
326
- .btn:not(.btn-icon):not(.u-action):not(.btn-ghost):not([class*="btn-anim-"])::before,
327
- .btn-anim-sheen:not(.btn-ghost)::before {
341
+ .btn:not(.btn-icon):not(.u-action):not([class*="btn-anim-"])::before,
342
+ .btn-anim-sheen::before {
328
343
  content: "";
329
344
  position: absolute;
330
345
  top: 0;
@@ -342,12 +357,12 @@
342
357
  transition: transform 0.7s cubic-bezier(0.22, 1, 0.36, 1);
343
358
  pointer-events: none;
344
359
  }
345
- .btn:not(.btn-icon):not(.u-action):not(.btn-ghost):not([class*="btn-anim-"]):hover:not(:disabled)::before,
346
- .btn-anim-sheen:not(.btn-ghost):hover:not(:disabled)::before {
360
+ .btn:not(.btn-icon):not(.u-action):not([class*="btn-anim-"]):hover:not(:disabled)::before,
361
+ .btn-anim-sheen:hover:not(:disabled)::before {
347
362
  transform: translateX(320%) skewX(-18deg);
348
363
  }
349
- .btn:not(.btn-icon):not(.u-action):not(.btn-ghost):not([class*="btn-anim-"]):hover:not(:disabled),
350
- .btn-anim-sheen:not(.btn-ghost):hover:not(:disabled) {
364
+ .btn:not(.btn-icon):not(.u-action):not([class*="btn-anim-"]):hover:not(:disabled),
365
+ .btn-anim-sheen:hover:not(:disabled) {
351
366
  transform: translateY(-1px);
352
367
  }
353
368
 
@@ -417,6 +432,129 @@
417
432
  box-shadow: none;
418
433
  }
419
434
 
435
+ // --- Roll (AppButton animation="roll"): the label rolls up and out while a copy rolls in from
436
+ // below, and a trailing icon in a round well slides out to the right while a copy slides in from
437
+ // the left. Colours stay put; no sheen and no lift. The component renders the label copy and the
438
+ // icon copy (aria-hidden), so this class alone on a plain .btn does nothing.
439
+ .btn-anim-roll {
440
+ --wui-btn-roll-ease: cubic-bezier(0.32, 0.72, 0, 1);
441
+ }
442
+ // The icon well and the pinned icon's end inset scale with the button size, so the well keeps
443
+ // the same share of the button's height and an even gap above, below and beside it.
444
+ :is(.btn-anim-roll, .wui-btn-pin-end) {
445
+ --wui-btn-roll-well: 28px;
446
+ --wui-btn-pin-inset: 8px;
447
+ // How far the arrow sits inside its well: (well - icon) / 2, with the 16, 14 and 20px icons.
448
+ --wui-btn-well-pad: 6px;
449
+ }
450
+ :is(.btn-anim-roll, .wui-btn-pin-end).btn-sm {
451
+ --wui-btn-roll-well: 22px;
452
+ --wui-btn-pin-inset: 6px;
453
+ --wui-btn-well-pad: 4px;
454
+ }
455
+ :is(.btn-anim-roll, .wui-btn-pin-end).btn-lg {
456
+ --wui-btn-roll-well: 34px;
457
+ --wui-btn-pin-inset: 10px;
458
+ --wui-btn-well-pad: 7px;
459
+ }
460
+ .btn-anim-roll:hover:not(:disabled) {
461
+ transform: none;
462
+ }
463
+ .wui-btn-roll {
464
+ position: relative;
465
+ display: inline-block;
466
+ overflow: hidden;
467
+ vertical-align: top;
468
+ }
469
+ .wui-btn-roll__a,
470
+ .wui-btn-roll__b {
471
+ display: block;
472
+ transition: transform 0.5s var(--wui-btn-roll-ease);
473
+ }
474
+ .wui-btn-roll__b {
475
+ position: absolute;
476
+ top: 100%;
477
+ left: 0;
478
+ width: 100%;
479
+ }
480
+ .btn-anim-roll:is(:hover, :focus-visible):not(:disabled) :is(.wui-btn-roll__a, .wui-btn-roll__b) {
481
+ transform: translateY(-100%);
482
+ }
483
+ .wui-btn-roll-ico {
484
+ position: relative;
485
+ display: inline-grid;
486
+ flex: none;
487
+ place-items: center;
488
+ width: var(--wui-btn-roll-well);
489
+ height: var(--wui-btn-roll-well);
490
+ margin-block: calc((1lh - var(--wui-btn-roll-well)) / 2);
491
+ border-radius: 50%;
492
+ overflow: hidden;
493
+ background: color-mix(in srgb, currentColor 20%, transparent);
494
+ vertical-align: middle;
495
+ }
496
+ .wui-btn-roll-ico > * {
497
+ grid-area: 1 / 1;
498
+ transition: transform 0.5s var(--wui-btn-roll-ease);
499
+ }
500
+ .wui-btn-roll-ico > .wui-btn-roll-ico__next {
501
+ transform: translateX(calc(var(--wui-btn-roll-well) * -1));
502
+ }
503
+ .btn-anim-roll:is(:hover, :focus-visible):not(:disabled) .wui-btn-roll-ico > :not(.wui-btn-roll-ico__next) {
504
+ transform: translateX(var(--wui-btn-roll-well));
505
+ }
506
+ .btn-anim-roll:is(:hover, :focus-visible):not(:disabled) .wui-btn-roll-ico > .wui-btn-roll-ico__next {
507
+ transform: translateX(0);
508
+ }
509
+
510
+ // Pinned trailing icon (AppButton pinRightIcon): the trailing icon in a round well (the roll
511
+ // animation's well when it rolls) sits at the button's end edge and the label centres across the button. Padding on both
512
+ // sides keeps the label centred and clear of the icon; meant for a wide or full-width button.
513
+ .wui-btn-pin-end {
514
+ // The label is centred optically: in the space before the pinned icon, with the same gap from
515
+ // the start edge as from the arrow, so a content-sized button does not look empty on the start
516
+ // side. The end padding holds the well and its inset on top of that gap. The extra 6px gives
517
+ // the label more room on each side than a plain button.
518
+ --wui-btn-pin-extra: 6px;
519
+ --wui-btn-pin-side: calc(var(--bs-btn-padding-x) + var(--wui-btn-pin-extra));
520
+ display: inline-flex;
521
+ align-items: center;
522
+ justify-content: center;
523
+ // The gap from the start edge to the label equals the gap from the label to the arrow itself
524
+ // (the eye reads the arrow, not its pale well), so the end side gives back the well's inner pad.
525
+ // The start gap counts the border.
526
+ padding-inline: calc(var(--wui-btn-pin-side) - var(--bs-btn-border-width))
527
+ calc(var(--wui-btn-roll-well, 1.75em) + var(--wui-btn-pin-inset) + var(--wui-btn-pin-side) - var(--wui-btn-well-pad));
528
+ }
529
+ .wui-btn-pin-end > .wui-btn-pin-icon {
530
+ position: absolute;
531
+ top: 50%;
532
+ right: var(--wui-btn-pin-inset);
533
+ margin: 0;
534
+ transform: translateY(-50%);
535
+ }
536
+ // Shape (AppButton shape): `rounded` is the default squircle radius of each size; `pill` rounds
537
+ // the ends fully and `sharp` has square corners, on every variant and size. Declared after the
538
+ // size rungs so it wins over their radius. The roll and pinned icon wells stay round.
539
+ .btn.wui-btn-shape-pill {
540
+ --bs-btn-border-radius: 999px;
541
+ corner-shape: round;
542
+ }
543
+ .btn.wui-btn-shape-sharp {
544
+ --bs-btn-border-radius: 0;
545
+ corner-shape: round;
546
+ }
547
+
548
+ // Without the roll animation the pinned icon still sits in the round well, tinted from the label.
549
+ .wui-btn-pin-end > .wui-btn-pin-icon:not(.wui-btn-roll-ico) {
550
+ display: inline-grid;
551
+ place-items: center;
552
+ width: var(--wui-btn-roll-well, 1.75em);
553
+ height: var(--wui-btn-roll-well, 1.75em);
554
+ border-radius: 50%;
555
+ background: color-mix(in srgb, currentColor 20%, transparent);
556
+ }
557
+
420
558
  // ---- Dropdown menu (AppDropdown / <app-dropdown>) -------------------
421
559
  // Bootstrap ships a bare .dropdown-item; the design system gives the menu real
422
560
  // padding, an icon–label gap, a rounded hover highlight tinted with the brand,
@@ -543,9 +681,9 @@
543
681
  }
544
682
 
545
683
  // ---- Ghost button: the tertiary action --------------------------------
546
- // Brand-coloured text with no box at rest and no underline. Hover lays a light grey fill behind
547
- // it, pressing deepens that fill a step, and keyboard focus draws the shared ring. No sheen sweep,
548
- // no lift or press nudge, and no grey box when disabled or loading.
684
+ // Brand-coloured text with no box at rest and no underline. Hover lays the secondary button's fill behind
685
+ // it with the shared sheen sweep and lift, pressing deepens that fill a step with the press nudge,
686
+ // and keyboard focus draws the shared ring. No grey box when disabled or loading.
549
687
  // AppButton's `ghost` variant emits this class on both surfaces.
550
688
  //
551
689
  // No .btn-ghost-sm/-lg rungs: it is an ordinary .btn variant and sizes with Bootstrap's
@@ -555,10 +693,10 @@
555
693
  --bs-btn-bg: transparent;
556
694
  --bs-btn-border-color: transparent;
557
695
  --bs-btn-hover-color: var(--color-primary-ink);
558
- --bs-btn-hover-bg: var(--color-bg-muted);
696
+ --bs-btn-hover-bg: color-mix(in srgb, var(--color-primary) 12%, transparent);
559
697
  --bs-btn-hover-border-color: transparent;
560
698
  --bs-btn-active-color: var(--color-primary-ink);
561
- --bs-btn-active-bg: color-mix(in srgb, var(--color-bg-muted) 92%, var(--color-text));
699
+ --bs-btn-active-bg: color-mix(in srgb, var(--color-primary) 18%, transparent);
562
700
  --bs-btn-active-border-color: transparent;
563
701
  --bs-btn-disabled-color: var(--color-primary-ink);
564
702
  --bs-btn-disabled-bg: transparent;
@@ -589,6 +727,75 @@
589
727
  opacity: 1;
590
728
  }
591
729
 
730
+ // ---- Text button: an action that reads as a link --------------------------
731
+ // Brand-coloured text with no box in any state: no fill at rest, on hover or pressed, no sheen and
732
+ // no lift, and no side padding, so it lines up with the text around it. Hover deepens the colour.
733
+ // It pairs with animation="roll", whose label roll and round icon well carry the motion.
734
+ // AppButton's `text` variant emits this class on both surfaces.
735
+ .btn-text {
736
+ --bs-btn-color: var(--color-primary-ink);
737
+ --bs-btn-bg: transparent;
738
+ --bs-btn-border-color: transparent;
739
+ --bs-btn-hover-color: color-mix(in srgb, var(--color-primary-ink) 80%, var(--color-text));
740
+ --bs-btn-hover-bg: transparent;
741
+ --bs-btn-hover-border-color: transparent;
742
+ --bs-btn-active-color: color-mix(in srgb, var(--color-primary-ink) 70%, var(--color-text));
743
+ --bs-btn-active-bg: transparent;
744
+ --bs-btn-active-border-color: transparent;
745
+ --bs-btn-disabled-color: var(--color-primary-ink);
746
+ --bs-btn-disabled-bg: transparent;
747
+ --bs-btn-disabled-border-color: transparent;
748
+ }
749
+ // After the size rungs and at their weight, so sm and lg text buttons lose the side padding too.
750
+ .btn.btn-text {
751
+ --bs-btn-padding-x: 0;
752
+ }
753
+ .btn.btn-text,
754
+ .btn.btn-text:hover,
755
+ .btn.btn-text:active,
756
+ .btn.btn-text:focus-visible {
757
+ text-decoration: none;
758
+ }
759
+ .btn.btn-text::before {
760
+ display: none;
761
+ }
762
+ .btn.btn-text:hover:not(:disabled) {
763
+ transform: none;
764
+ }
765
+ .btn.btn-text:focus-visible {
766
+ outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
767
+ outline-offset: var(--wui-focus-ring-offset);
768
+ box-shadow: none;
769
+ }
770
+ // A text button's icons follow the text: each icon is the text size, and the roll or pinned well
771
+ // is 18, 20 and 22px at sm, md and lg, a snug ring around the icon that never outweighs the label.
772
+ .btn.btn-text {
773
+ --wui-btn-roll-well: 20px;
774
+ --wui-btn-well-pad: 3px;
775
+ --wui-btn-text-icon: 14px;
776
+ }
777
+ .btn.btn-text.btn-sm {
778
+ --wui-btn-roll-well: 18px;
779
+ --wui-btn-well-pad: 3px;
780
+ --wui-btn-text-icon: 12px;
781
+ }
782
+ .btn.btn-text.btn-lg {
783
+ --wui-btn-roll-well: 22px;
784
+ --wui-btn-well-pad: 3px;
785
+ --wui-btn-text-icon: 16px;
786
+ }
787
+ .btn.btn-text svg {
788
+ width: var(--wui-btn-text-icon);
789
+ height: var(--wui-btn-text-icon);
790
+ }
791
+ .btn.btn-text.btn-text:disabled,
792
+ .btn.btn-text.btn-text.disabled {
793
+ background-color: transparent;
794
+ border-color: transparent;
795
+ color: var(--color-primary-ink);
796
+ opacity: 0.55;
797
+ }
798
+
592
799
  // ---- Card hover-lift (name is historical) -----------------------------
593
800
  // `.card-lifted` does NOT cast a shadow — in-page cards stay flat. It only
594
801
  // nudges 1px on hover (tactile signal). API prop stays `lifted` / class
@@ -900,6 +1107,19 @@ html.is-scrolling body::-webkit-scrollbar-thumb {
900
1107
  transform: none;
901
1108
  box-shadow: none;
902
1109
  }
1110
+ // The roll stays still: the label and the icon keep their resting copy.
1111
+ .wui-btn-roll__a,
1112
+ .wui-btn-roll__b,
1113
+ .wui-btn-roll-ico > * {
1114
+ transition: none;
1115
+ }
1116
+ .btn-anim-roll:is(:hover, :focus-visible):not(:disabled) :is(.wui-btn-roll__a, .wui-btn-roll__b),
1117
+ .btn-anim-roll:is(:hover, :focus-visible):not(:disabled) .wui-btn-roll-ico > :not(.wui-btn-roll-ico__next) {
1118
+ transform: none;
1119
+ }
1120
+ .btn-anim-roll:is(:hover, :focus-visible):not(:disabled) .wui-btn-roll-ico > .wui-btn-roll-ico__next {
1121
+ transform: translateX(calc(var(--wui-btn-roll-well) * -1));
1122
+ }
903
1123
  }
904
1124
 
905
1125
  // ---- Theme-flipped typography utilities ------------------------------------
@@ -572,15 +572,21 @@
572
572
  min-width: 240px;
573
573
  }
574
574
  .wui-filter-more-panel > .field,
575
+ .wui-filter-more-panel > .wui-filter-popover-field > .field,
575
576
  .wui-filter-more-panel > wui-select,
577
+ .wui-filter-more-panel > .wui-filter-popover-field > wui-select,
576
578
  .wui-filter-more-panel > wui-multiselect,
579
+ .wui-filter-more-panel > .wui-filter-popover-field > wui-multiselect,
577
580
  .wui-filter-more-panel > wui-date-range,
578
- .wui-filter-more-panel > .search-wrap {
581
+ .wui-filter-more-panel > .wui-filter-popover-field > wui-date-range,
582
+ .wui-filter-more-panel > .search-wrap,
583
+ .wui-filter-more-panel > .wui-filter-popover-field > .search-wrap {
579
584
  flex: none;
580
585
  min-width: 0;
581
586
  max-width: none;
582
587
  }
583
- .wui-filter-more-panel > wui-date-range .daterange {
588
+ .wui-filter-more-panel > wui-date-range .daterange,
589
+ .wui-filter-more-panel > .wui-filter-popover-field > wui-date-range .daterange {
584
590
  width: 100%;
585
591
  }
586
592
  .wui-filter-more-head {
@@ -103,8 +103,10 @@
103
103
  min-width: 0;
104
104
  font-weight: 500;
105
105
  }
106
+ // !important: a consumer's footer is often a Bootstrap display utility (.d-flex is display:flex !important),
107
+ // which would otherwise keep Cancel and Submit showing beside the discard question.
106
108
  .wui-drawer-discarding > :not(.wui-drawer-discard) {
107
- display: none;
109
+ display: none !important;
108
110
  }
109
111
 
110
112
  // Side drawer: from md up.
@@ -17,18 +17,6 @@ html.wui-theme-switching::view-transition-new(root) {
17
17
  // flashes in full for the frame or two between the snapshot and the animation start.
18
18
  clip-path: inset(50%);
19
19
  }
20
- // The pressed control carries its own view-transition-name for the switch (the engine sets it),
21
- // so it is rendered as its own live layer above the sweep: no old image, no cross-fade, just
22
- // the control as it now is, with its ring sliding or its glyph swapped the moment it is pressed.
23
- html.wui-theme-switching::view-transition-group(wui-theme-toggle),
24
- html.wui-theme-switching::view-transition-new(wui-theme-toggle) {
25
- animation: none;
26
- }
27
- html.wui-theme-switching::view-transition-old(wui-theme-toggle) {
28
- animation: none;
29
- opacity: 0;
30
- }
31
-
32
20
  // The new page is rendered live under the moving clip, so anything still changing on it repaints
33
21
  // the whole page every frame. A theme flip starts a colour transition on hundreds of elements at
34
22
  // once (Bootstrap's buttons, inputs and links all transition color and background), which is