@webority/theme 0.99.0 → 0.100.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.
Files changed (75) hide show
  1. package/README.md +9 -9
  2. package/dist/published-theme.json +8 -31
  3. package/dist/purge-safelist.json +1 -0
  4. package/dist/webority-theme.css +1 -1
  5. package/index.scss +4 -3
  6. package/package.json +6 -3
  7. package/scss/_bootstrap.generated.scss +18 -0
  8. package/scss/_components.scss +38 -38
  9. package/scss/_marketing.scss +8 -8
  10. package/scss/_tokens.generated.scss +831 -0
  11. package/scss/_tokens.scss +4 -638
  12. package/scss/_variables.scss +7 -12
  13. package/scss/_wui-components.scss +1 -1
  14. package/scss/_wui-residual.scss +8 -0
  15. package/scss/wui/_avatar-picker.scss +2 -2
  16. package/scss/wui/_calendar.scss +6 -6
  17. package/scss/wui/_card.scss +1 -1
  18. package/scss/wui/_carousel.scss +2 -2
  19. package/scss/wui/_chart-card.scss +2 -2
  20. package/scss/wui/_chart.scss +8 -8
  21. package/scss/wui/_chat.scss +2 -2
  22. package/scss/wui/_choice.scss +78 -78
  23. package/scss/wui/_code-block.scss +2 -2
  24. package/scss/wui/_command-palette.scss +9 -9
  25. package/scss/wui/_comment-thread.scss +5 -5
  26. package/scss/wui/_consent-banner.scss +2 -2
  27. package/scss/wui/_controls.scss +52 -52
  28. package/scss/wui/_data.scss +38 -38
  29. package/scss/wui/_disclosure.scss +6 -6
  30. package/scss/wui/_display.scss +51 -51
  31. package/scss/wui/_dock.scss +4 -4
  32. package/scss/wui/_drawer.scss +3 -3
  33. package/scss/wui/_file-viewer.scss +2 -2
  34. package/scss/wui/_filter-popover.scss +1 -1
  35. package/scss/wui/_floating.scss +1 -1
  36. package/scss/wui/_flow.scss +60 -60
  37. package/scss/wui/_groups.scss +7 -7
  38. package/scss/wui/_hover-card.scss +1 -1
  39. package/scss/wui/_image-crop.scss +3 -3
  40. package/scss/wui/_interaction.scss +3 -3
  41. package/scss/wui/_kanban.scss +4 -4
  42. package/scss/wui/_lightbox.scss +2 -2
  43. package/scss/wui/_media.scss +28 -28
  44. package/scss/wui/_mention-input.scss +4 -4
  45. package/scss/wui/_menu-motion.scss +1 -1
  46. package/scss/wui/_modal-remote.scss +2 -2
  47. package/scss/wui/_navigation-menu.scss +4 -4
  48. package/scss/wui/_navigation.scss +25 -25
  49. package/scss/wui/_notification-center.scss +4 -4
  50. package/scss/wui/_onboarding-checklist.scss +2 -2
  51. package/scss/wui/_overlays.scss +21 -21
  52. package/scss/wui/_pending.scss +1 -1
  53. package/scss/wui/_rich-text.scss +7 -7
  54. package/scss/wui/_rolling-number.scss +1 -1
  55. package/scss/wui/_score-scale.scss +1 -1
  56. package/scss/wui/_sections.scss +8 -8
  57. package/scss/wui/_shell-parts.scss +15 -15
  58. package/scss/wui/_shell.scss +20 -20
  59. package/scss/wui/_shortcuts.scss +1 -1
  60. package/scss/wui/_sortable.scss +2 -2
  61. package/scss/wui/_split-view.scss +4 -4
  62. package/scss/wui/_theme-toggle.scss +1 -1
  63. package/scss/wui/_tone-pill.scss +2 -2
  64. package/scss/wui/_toolbar.scss +2 -2
  65. package/scss/wui/_tree.scss +3 -3
  66. package/scss/wui/_typography.scss +6 -6
  67. package/scss/wui/_utilities.scss +27 -19
  68. package/scss/wui/_whats-new.scss +4 -4
  69. package/scss/wui/_workspace.scss +16 -16
  70. package/scss/wui/tour/_advance.scss +1 -1
  71. package/scss/wui/tour/_base.scss +1 -1
  72. package/scss/wui/tour/_end.scss +1 -1
  73. package/scss/wui/tour/_motion.scss +1 -1
  74. package/token-meanings.json +56 -64
  75. package/scss/_wui-aliases.scss +0 -495
package/index.scss CHANGED
@@ -3,14 +3,15 @@
3
3
  // output import the partials individually with their OWN _variables before bootstrap.
4
4
  //
5
5
  // Load order is LOAD-BEARING — never reorder:
6
- // fonts -> variables (before bootstrap) -> bootstrap -> tokens -> aliases -> components -> wui-components
7
- // Country flags are NOT imported here, and neither does _wui-components: they are an opt-in
6
+ // fonts -> variables (ends with bootstrap.generated, the !default Bootstrap values from the token source)
7
+ // -> bootstrap -> tokens (tokens.generated, then wui-residual) -> components -> wui-components
8
+ // The token source generates _tokens.generated.scss and _bootstrap.generated.scss (`corepack pnpm run tokens`,
9
+ // run by build). Country flags are NOT imported here, and neither does _wui-components: they are an opt-in
8
10
  // layer (scss/_flags.scss, compiled on its own to dist/webority-flags.css) for sites that render
9
11
  // the phone input or country picker.
10
12
  @import "scss/fonts";
11
13
  @import "scss/variables";
12
14
  @import "bootstrap/scss/bootstrap";
13
15
  @import "scss/tokens";
14
- @import "scss/wui-aliases";
15
16
  @import "scss/components";
16
17
  @import "scss/wui-components";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/theme",
3
- "version": "0.99.0",
3
+ "version": "0.100.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": {
@@ -50,9 +50,12 @@
50
50
  "bootstrap": "5.3.3",
51
51
  "country-flag-icons": "^1.6.20",
52
52
  "sass-embedded": "^1.97.0",
53
- "vite": "^8.0.12"
53
+ "vite": "^8.0.12",
54
+ "@webority/tokens": "0.100.0"
54
55
  },
55
56
  "scripts": {
56
- "build": "sass index.scss dist/webority-theme.css --load-path=node_modules --style=compressed --no-source-map --quiet-deps --silence-deprecation=if-function && sass scss/_flags.scss dist/webority-flags.css --style=compressed --no-source-map --quiet && sass scss/_runtime-brand.scss dist/webority-runtime-brand.css --style=compressed --no-source-map --quiet && node ../../scripts/force-state-selectors.mjs dist/webority-theme.css && node ../../scripts/gen-purge-safelist.mjs && node ../../scripts/sync-rcl-assets.mjs theme && vite build --config vite.cli.config.js && node scripts/exportCanvasTheme.mjs"
57
+ "tokens": "node ../tokens/dist/webority.js brand --library --out ../tokens/dist --web scss/_tokens.generated.scss",
58
+ "tokens:check": "node ../tokens/dist/webority.js brand --library --out ../tokens/dist --web scss/_tokens.generated.scss --check",
59
+ "build": "corepack pnpm run tokens && sass index.scss dist/webority-theme.css --load-path=node_modules --style=compressed --no-source-map --quiet-deps --silence-deprecation=if-function && sass scss/_flags.scss dist/webority-flags.css --style=compressed --no-source-map --quiet && sass scss/_runtime-brand.scss dist/webority-runtime-brand.css --style=compressed --no-source-map --quiet && node ../../scripts/force-state-selectors.mjs dist/webority-theme.css && node ../../scripts/gen-purge-safelist.mjs && node ../../scripts/sync-rcl-assets.mjs theme && vite build --config vite.cli.config.js && node scripts/exportCanvasTheme.mjs"
57
60
  }
58
61
  }
@@ -0,0 +1,18 @@
1
+ // Generated by @webority/tokens 0.100.0 from its token source. Do not edit; run webority brand --library.
2
+ $body-color: #252f4a !default;
3
+ $body-secondary-color: #4b5675 !default;
4
+ $body-tertiary-color: #626a82 !default;
5
+ $body-secondary-bg: #f9fbfc !default;
6
+ $body-tertiary-bg: #f5f6fa !default;
7
+ $border-color: #ebedf3 !default;
8
+ $border-color-translucent: rgba(13, 24, 43, 0.08) !default;
9
+ $border-radius: 10px !default;
10
+ $border-radius-sm: 8px !default;
11
+ $border-radius-lg: 14px !default;
12
+ $border-radius-pill: 9999px !default;
13
+ $wui-shadow-overlay: 0px 8px 28px -6px rgba(7, 20, 55, 0.14) !default;
14
+ $wui-shadow-overlay-lg: 0px 24px 60px -16px rgba(7, 20, 55, 0.28) !default;
15
+ $link-color: #4f46e5 !default;
16
+ $line-height-base: 1.55 !default;
17
+ $headings-line-height: 1.2 !default;
18
+ $display-line-height: 1.05 !default;
@@ -6,7 +6,7 @@
6
6
  // ---- Button polish (used by both Razor + React) ---------------------
7
7
  // Flat buttons — no drop shadow. Active-press feedback (1px nudge) is
8
8
  // retained because it's a tactile signal, not a depth cue.
9
- // A button is exactly as tall as a field of the same size (the --wui-control-height ladder, 32/36/44px), so a
9
+ // A button is exactly as tall as a field of the same size (the --wui-control-md ladder, 32/36/44px), so a
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) {
@@ -16,7 +16,7 @@
16
16
  display: inline-flex;
17
17
  align-items: center;
18
18
  justify-content: center;
19
- min-height: var(--wui-control-height);
19
+ min-height: var(--wui-control-md);
20
20
  }
21
21
 
22
22
  // Tactile press feedback — every variant AND every size (sm/md/lg). Kept
@@ -27,7 +27,7 @@
27
27
  }
28
28
 
29
29
  .btn-primary {
30
- // Hover and press read --color-primary-hover: the pressed primary in light and the lifted dark primary in dark (_wui-aliases.scss), so a rebrand and dark mode both track it.
30
+ // Hover and press read --color-primary-hover: the pressed primary in light and the lifted dark primary in dark (_tokens.generated.scss), so a rebrand and dark mode both track it.
31
31
  --bs-btn-hover-bg: var(--color-primary-hover);
32
32
  --bs-btn-hover-border-color: var(--color-primary-hover);
33
33
  --bs-btn-active-bg: var(--color-primary-hover);
@@ -37,8 +37,8 @@
37
37
  // runtime CSS var. Routing it through the token makes a light-primary brand's
38
38
  // --wui-primary-text override reach the button.
39
39
  --bs-btn-color: var(--wui-primary-text);
40
- --bs-btn-hover-color: var(--color-primary-hover-text);
41
- --bs-btn-active-color: var(--color-primary-hover-text);
40
+ --bs-btn-hover-color: var(--color-on-primary);
41
+ --bs-btn-active-color: var(--color-on-primary);
42
42
  }
43
43
 
44
44
  // Secondary — a soft brand tint (matches the design reference's secondary): a
@@ -48,13 +48,13 @@
48
48
  // then press. No border (the tint carries the shape). Disabled is the shared
49
49
  // neutral-grey state below, like every other variant.
50
50
  .btn-secondary {
51
- --bs-btn-color: var(--color-primary-ink);
51
+ --bs-btn-color: var(--color-primary-text);
52
52
  --bs-btn-bg: color-mix(in srgb, var(--color-primary) 12%, transparent);
53
53
  --bs-btn-border-color: transparent;
54
- --bs-btn-hover-color: var(--color-primary-ink);
54
+ --bs-btn-hover-color: var(--color-primary-text);
55
55
  --bs-btn-hover-bg: color-mix(in srgb, var(--color-primary) 18%, transparent);
56
56
  --bs-btn-hover-border-color: transparent;
57
- --bs-btn-active-color: var(--color-primary-ink);
57
+ --bs-btn-active-color: var(--color-primary-text);
58
58
  --bs-btn-active-bg: color-mix(in srgb, var(--color-primary) 26%, transparent);
59
59
  --bs-btn-active-border-color: transparent;
60
60
  }
@@ -119,16 +119,16 @@
119
119
  // on a transparent fill; hover fills with the brand and flips the label to the on-brand text
120
120
  // token; active deepens to the pressed fill.
121
121
  .btn-outline-primary {
122
- --bs-btn-color: var(--color-primary-ink);
122
+ --bs-btn-color: var(--color-primary-text);
123
123
  --bs-btn-border-color: var(--color-primary);
124
124
  // The hover fill is the theme's primary (the lifted one in dark mode), so its label is too.
125
- --bs-btn-hover-color: var(--color-primary-text);
125
+ --bs-btn-hover-color: var(--color-on-primary);
126
126
  --bs-btn-hover-bg: var(--color-primary);
127
127
  --bs-btn-hover-border-color: var(--color-primary);
128
128
  --bs-btn-active-color: var(--wui-primary-text);
129
129
  --bs-btn-active-bg: var(--wui-primary-pressed);
130
130
  --bs-btn-active-border-color: var(--wui-primary-pressed);
131
- --bs-btn-disabled-color: var(--color-primary-ink);
131
+ --bs-btn-disabled-color: var(--color-primary-text);
132
132
  --bs-btn-disabled-border-color: var(--color-primary);
133
133
  }
134
134
 
@@ -276,21 +276,21 @@
276
276
 
277
277
  // ---- Component radii from tokens ------------------------------------
278
278
  // .btn/.card/.input capture Bootstrap's compiled $*-border-radius (the library
279
- // ladder) before a product loads, so a product's --wui-radius* override never
279
+ // ladder) before a product loads, so a product's --wui-radius-md* override never
280
280
  // reached them. Re-drive the radius from the tokens — the way the dropdown above
281
281
  // already does — so overriding the radius tokens once flows to every control.
282
282
  // sm/lg are re-asserted so they keep their own rung instead of the base value.
283
283
  // Per-size type + padding scale, matched to the design reference: the three
284
284
  // sizes step font-size, horizontal padding and radius together (vertical size
285
- // comes from --wui-control-height, so a button lines up with an input). Weight
285
+ // comes from --wui-control-md, so a button lines up with an input). Weight
286
286
  // is 600 on every rung — buttons read as a deliberate action, not body text.
287
- // Medium (default): 14px / 600, about 12px side padding, 14px squircle radius, --wui-control-height tall.
287
+ // Medium (default): 14px / 600, about 12px side padding, 14px squircle radius, --wui-control-md tall.
288
288
  // Side padding is always twice the vertical padding. A button is its field's height with the label
289
289
  // line centred, so its vertical padding is (height - both borders - one line) / 2 and its side
290
290
  // padding the height less both borders and one line: about 5.7/11.4, 6.2/12.3 and 8.6/17.2px at sm,
291
291
  // md and lg with the theme's line height.
292
292
  .btn {
293
- --wui-btn-height: var(--wui-control-height);
293
+ --wui-btn-height: var(--wui-control-md);
294
294
  --bs-btn-border-radius: 14px;
295
295
  --bs-btn-font-size: 0.875rem;
296
296
  --bs-btn-font-weight: 600;
@@ -302,26 +302,26 @@
302
302
  // Small: 12px, about 11px side padding, 12px squircle radius (proportional to md), as tall as a small field.
303
303
  .btn-sm:not(.btn-icon),
304
304
  .btn-group-sm > .btn:not(.btn-icon) {
305
- --wui-btn-height: var(--wui-control-height-sm);
305
+ --wui-btn-height: var(--wui-control-sm);
306
306
  --bs-btn-padding-y: 0;
307
307
  --bs-btn-border-radius: 12px;
308
308
  --bs-btn-font-size: 0.75rem;
309
309
  display: inline-flex;
310
310
  align-items: center;
311
311
  justify-content: center;
312
- min-height: var(--wui-control-height-sm);
312
+ min-height: var(--wui-control-sm);
313
313
  }
314
314
  // Large: 16px, about 17px side padding, 18px squircle radius (proportional to md), as tall as a large field.
315
315
  .btn-lg:not(.btn-icon),
316
316
  .btn-group-lg > .btn:not(.btn-icon) {
317
- --wui-btn-height: var(--wui-control-height-lg);
317
+ --wui-btn-height: var(--wui-control-lg);
318
318
  --bs-btn-padding-y: 0;
319
319
  --bs-btn-border-radius: 18px;
320
320
  --bs-btn-font-size: 1rem;
321
321
  display: inline-flex;
322
322
  align-items: center;
323
323
  justify-content: center;
324
- min-height: var(--wui-control-height-lg);
324
+ min-height: var(--wui-control-lg);
325
325
  }
326
326
 
327
327
  // ---- Hover animation options (opt-in modifiers) ---------------------
@@ -593,7 +593,7 @@
593
593
  --bs-dropdown-header-color: var(--color-text-muted);
594
594
  --bs-dropdown-header-padding-x: 0.625rem;
595
595
  --bs-dropdown-header-padding-y: 0.25rem;
596
- box-shadow: var(--wui-shadow-overlay);
596
+ box-shadow: var(--wui-shadow-popover);
597
597
  // A long menu (account / workspace lists) must never spill past the screen and clip its
598
598
  // last rows: cap the panel to the viewport and scroll INSIDE it. The room subtracted
599
599
  // leaves space for a topbar-height trigger + margin — the common anchor for these long
@@ -645,7 +645,7 @@
645
645
  }
646
646
  &:hover .wui-icon, &:hover i, &:hover svg,
647
647
  &:focus .wui-icon, &:focus i, &:focus svg {
648
- color: var(--color-primary-ink);
648
+ color: var(--color-primary-text);
649
649
  }
650
650
 
651
651
  // A leading picture instead of a glyph — an external logo/avatar, a brand mark.
@@ -708,16 +708,16 @@
708
708
  // No .btn-ghost-sm/-lg rungs: it is an ordinary .btn variant and sizes with Bootstrap's
709
709
  // own .btn-sm/.btn-lg, like .btn-primary.
710
710
  .btn-ghost {
711
- --bs-btn-color: var(--color-primary-ink);
711
+ --bs-btn-color: var(--color-primary-text);
712
712
  --bs-btn-bg: transparent;
713
713
  --bs-btn-border-color: transparent;
714
- --bs-btn-hover-color: var(--color-primary-ink);
714
+ --bs-btn-hover-color: var(--color-primary-text);
715
715
  --bs-btn-hover-bg: color-mix(in srgb, var(--color-primary) 12%, transparent);
716
716
  --bs-btn-hover-border-color: transparent;
717
- --bs-btn-active-color: var(--color-primary-ink);
717
+ --bs-btn-active-color: var(--color-primary-text);
718
718
  --bs-btn-active-bg: color-mix(in srgb, var(--color-primary) 18%, transparent);
719
719
  --bs-btn-active-border-color: transparent;
720
- --bs-btn-disabled-color: var(--color-primary-ink);
720
+ --bs-btn-disabled-color: var(--color-primary-text);
721
721
  --bs-btn-disabled-bg: transparent;
722
722
  --bs-btn-disabled-border-color: transparent;
723
723
  }
@@ -738,7 +738,7 @@
738
738
  .btn.btn-ghost.btn-ghost.disabled {
739
739
  background-color: transparent;
740
740
  border-color: transparent;
741
- color: var(--color-primary-ink);
741
+ color: var(--color-primary-text);
742
742
  opacity: var(--wui-disabled-opacity);
743
743
  }
744
744
  .btn.btn-ghost.btn-ghost.is-loading:disabled,
@@ -752,16 +752,16 @@
752
752
  // It pairs with animation="roll", whose label roll and round icon well carry the motion.
753
753
  // AppButton's `text` variant emits this class on both surfaces.
754
754
  .btn-text {
755
- --bs-btn-color: var(--color-primary-ink);
755
+ --bs-btn-color: var(--color-primary-text);
756
756
  --bs-btn-bg: transparent;
757
757
  --bs-btn-border-color: transparent;
758
- --bs-btn-hover-color: color-mix(in srgb, var(--color-primary-ink) 80%, var(--color-text));
758
+ --bs-btn-hover-color: color-mix(in srgb, var(--color-primary-text) 80%, var(--color-text));
759
759
  --bs-btn-hover-bg: transparent;
760
760
  --bs-btn-hover-border-color: transparent;
761
- --bs-btn-active-color: color-mix(in srgb, var(--color-primary-ink) 70%, var(--color-text));
761
+ --bs-btn-active-color: color-mix(in srgb, var(--color-primary-text) 70%, var(--color-text));
762
762
  --bs-btn-active-bg: transparent;
763
763
  --bs-btn-active-border-color: transparent;
764
- --bs-btn-disabled-color: var(--color-primary-ink);
764
+ --bs-btn-disabled-color: var(--color-primary-text);
765
765
  --bs-btn-disabled-bg: transparent;
766
766
  --bs-btn-disabled-border-color: transparent;
767
767
  }
@@ -811,7 +811,7 @@
811
811
  .btn.btn-text.btn-text.disabled {
812
812
  background-color: transparent;
813
813
  border-color: transparent;
814
- color: var(--color-primary-ink);
814
+ color: var(--color-primary-text);
815
815
  opacity: var(--wui-disabled-opacity);
816
816
  }
817
817
 
@@ -820,7 +820,7 @@
820
820
  // nudges 1px on hover (tactile signal). API prop stays `lifted` / class
821
821
  // `card-lifted` so call sites don't break.
822
822
  .card-lifted {
823
- transition: transform 0.2s var(--wui-ease-out-quart);
823
+ transition: transform 0.2s var(--wui-ease-out);
824
824
  &:hover {
825
825
  transform: translateY(-1px);
826
826
  }
@@ -868,7 +868,7 @@
868
868
  margin: -6px -6px -6px auto;
869
869
  padding: 0;
870
870
  border: 0;
871
- border-radius: var(--radius);
871
+ border-radius: var(--wui-radius-md);
872
872
  // The same resting grey as the modal and drawer close buttons.
873
873
  background: var(--color-bg-subtle);
874
874
  color: var(--color-text-muted);
@@ -915,10 +915,10 @@
915
915
  align-items: center;
916
916
  gap: 0.5rem;
917
917
  padding-inline: 0.875rem;
918
- height: var(--wui-control-height);
918
+ height: var(--wui-control-md);
919
919
  background: var(--color-surface);
920
920
  border: 1px solid var(--color-border);
921
- border-radius: var(--radius);
921
+ border-radius: var(--wui-radius-md);
922
922
  transition: border-color 0.15s ease;
923
923
  }
924
924
  .wui-input-group:hover:not(:focus-within):not(.is-disabled) {
@@ -993,7 +993,7 @@ button.wui-input-trailing:focus-visible,
993
993
  button.wui-input-leading:focus-visible {
994
994
  outline: var(--wui-focus-ring-width) solid var(--color-focus-ring);
995
995
  outline-offset: var(--wui-focus-ring-offset);
996
- color: var(--color-primary-ink);
996
+ color: var(--color-primary-text);
997
997
  border-radius: 9999px;
998
998
  }
999
999
 
@@ -1027,8 +1027,8 @@ button.wui-input-leading:focus-visible {
1027
1027
 
1028
1028
  // ---- Subtle hover lift -----------------------------------------------
1029
1029
  .lift-on-hover {
1030
- transition: transform 0.2s var(--wui-ease-out-quart),
1031
- box-shadow 0.2s var(--wui-ease-out-quart);
1030
+ transition: transform 0.2s var(--wui-ease-out),
1031
+ box-shadow 0.2s var(--wui-ease-out);
1032
1032
  }
1033
1033
  .lift-on-hover:hover {
1034
1034
  transform: translateY(-1px);
@@ -30,7 +30,7 @@
30
30
  font-size: 14px;
31
31
  font-weight: 700;
32
32
  line-height: 1;
33
- color: var(--color-primary-ink);
33
+ color: var(--color-primary-text);
34
34
  }
35
35
  .eyebrow::before {
36
36
  content: "";
@@ -189,7 +189,7 @@
189
189
 
190
190
  // ---- Single-element fade-in ------------------------------------------
191
191
  .fade-in {
192
- animation: fadeIn 220ms var(--wui-ease-out-quart);
192
+ animation: fadeIn 220ms var(--wui-ease-out);
193
193
  }
194
194
 
195
195
  // ---- Stagger groups --------------------------------------------------
@@ -197,7 +197,7 @@
197
197
  // cascade in 40ms apart, capped at 12 children. For bigger groups,
198
198
  // use the IntersectionObserver-driven `[data-reveal]` pattern below.
199
199
  .stagger-children > * {
200
- animation: staggerRise 360ms var(--wui-ease-out-quart) backwards;
200
+ animation: staggerRise 360ms var(--wui-ease-out) backwards;
201
201
  }
202
202
  .stagger-children > *:nth-child(1) { animation-delay: 0ms; }
203
203
  .stagger-children > *:nth-child(2) { animation-delay: 40ms; }
@@ -217,7 +217,7 @@
217
217
  // individual items inside a non-stagger-children container.
218
218
  .stagger-item {
219
219
  opacity: 0;
220
- animation: rise 320ms var(--wui-ease-out-quart) forwards;
220
+ animation: rise 320ms var(--wui-ease-out) forwards;
221
221
  animation-delay: var(--stagger, 0ms);
222
222
  }
223
223
 
@@ -243,8 +243,8 @@
243
243
  opacity: 0;
244
244
  transform: translateY(8px);
245
245
  transition:
246
- opacity 540ms var(--wui-ease-out-quart),
247
- transform 540ms var(--wui-ease-out-quart);
246
+ opacity 540ms var(--wui-ease-out),
247
+ transform 540ms var(--wui-ease-out);
248
248
  will-change: opacity, transform;
249
249
  }
250
250
  [data-reveal].is-visible {
@@ -256,8 +256,8 @@
256
256
  opacity: 0;
257
257
  transform: translateY(8px);
258
258
  transition:
259
- opacity 540ms var(--wui-ease-out-quart),
260
- transform 540ms var(--wui-ease-out-quart);
259
+ opacity 540ms var(--wui-ease-out),
260
+ transform 540ms var(--wui-ease-out);
261
261
  }
262
262
  [data-reveal-stagger].is-visible > * {
263
263
  opacity: 1;