@nxgt/material 3.23.0 → 3.24.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +4 -3
  3. package/dist/backgrounds/css/motifs.css +12 -11
  4. package/dist/backgrounds/css-react/icons.css +9 -10
  5. package/dist/components/theme-tokens.css +12 -0
  6. package/dist/components/ui/layout/app-shell/activity-backdrop.css +3 -16
  7. package/dist/{components-BaUx5Nax.js → components-CbuWrY21.js} +6836 -6834
  8. package/dist/components.js +1 -1
  9. package/dist/lib/components/ui/selection/native-select/native-select.d.ts +1 -0
  10. package/dist/main.js +1 -1
  11. package/dist/material.css +1 -1
  12. package/dist/styles.css +1 -0
  13. package/docs/components/navigation-and-layout.md +2 -2
  14. package/docs/components/selection-and-choice.md +3 -1
  15. package/docs/guides/app-shell.md +17 -1
  16. package/docs/guides/theming.md +40 -0
  17. package/docs/previews/navigation-layout-threadlayout.webp +0 -0
  18. package/docs/troubleshooting.md +49 -1
  19. package/lib/backgrounds/css/motifs.css +12 -11
  20. package/lib/backgrounds/css-react/icons.css +9 -10
  21. package/lib/components/theme-tokens.css +12 -0
  22. package/lib/components/ui/layout/app-shell/activity-backdrop.css +3 -16
  23. package/lib/styles.css +1 -0
  24. package/lib/themes/ambre.css +3 -1
  25. package/lib/themes/ardoise.css +3 -1
  26. package/lib/themes/bleumono.css +3 -1
  27. package/lib/themes/bluemoon.css +3 -1
  28. package/lib/themes/corail.css +3 -1
  29. package/lib/themes/foret.css +3 -1
  30. package/lib/themes/lavande.css +3 -1
  31. package/lib/themes/menthe.css +3 -1
  32. package/lib/themes/ocean.css +3 -1
  33. package/lib/themes/pink.css +3 -1
  34. package/lib/themes/prune.css +3 -1
  35. package/lib/themes/sable.css +3 -1
  36. package/lib/themes/slate.css +3 -1
  37. package/lib/themes/teal.css +3 -1
  38. package/package.json +2 -2
package/dist/styles.css CHANGED
@@ -52,6 +52,7 @@
52
52
  --color-paper: --alpha(var(--primary) / 0.5%);
53
53
  --color-strix: var(--strix);
54
54
  --color-background: var(--background);
55
+ --color-ground: var(--ground);
55
56
  --color-background-paper: --alpha(var(--primary) / 5%);
56
57
  --color-background-light: --alpha(var(--background) / 30%);
57
58
  --color-foreground: var(--foreground);
@@ -31,7 +31,7 @@ documentation-site shell. Everything is imported from
31
31
 
32
32
  ![ActivityLayout](../previews/navigation-layout-appshell.webp)
33
33
 
34
- App shell: sidebar built from `items`, a header with a mobile sheet, route breadcrumbs and a titled page. See the [app shell guide](../guides/app-shell.md).
34
+ App shell: sidebar built from `items`, a header with a mobile sheet, route breadcrumbs and a titled page. It paints the tinted page ground (`bg-ground`) under the content, with the sidebar and the app bar flat on `--background` and the cards on `bg-card`. See the [app shell guide](../guides/app-shell.md).
35
35
 
36
36
  ```tsx
37
37
  import { Outlet } from 'react-router';
@@ -414,7 +414,7 @@ open the pane (`ListDetailsTrigger` takes the `view` to show), and their `childr
414
414
  layout state. A server, which has no screen width, renders the wide layout,
415
415
  as does a hydrating client; a phone switches right after hydrating. A page
416
416
  rendered only in the browser starts on the real layout. `ThreadLayout` is a centred column over the app
417
- [background](#background) for focused flows (sign-in, onboarding), with no
417
+ [background](#background) on the page ground (`bg-ground`, so a `bg-card` card stands apart) for focused flows (sign-in, onboarding), with no
418
418
  app bar.
419
419
 
420
420
  | Prop | Type | Default | Effect |
@@ -97,7 +97,9 @@ phone, no portal). Parts: `NativeSelect`, `NativeSelectOption`,
97
97
  and every other attribute go to the `<select>`. It is 44px high like the
98
98
  other fields; `size="sm"` makes it 36px for a compact toolbar and
99
99
  `size="lg"` 52px, and a number
100
- is still the `<select>`'s own `size` (rows shown). It is tinted while the
100
+ is still the `<select>`'s own `size` (rows shown). It fills its container
101
+ like the other fields; a width class on it (`className="w-24"`, or `w-fit` for
102
+ the width of its widest option) keeps it compact, and its chevron follows. It is tinted while the
101
103
  chosen option has a value, and an option with `value=""` reads as a
102
104
  placeholder.
103
105
 
@@ -209,7 +209,7 @@ partitionMenu(items); // { content, footer }
209
209
  | `align` | `'start' \| 'center'` | `'start'` | Where the collapsed rail's entries sit: right under the brand, or centred in the height below it |
210
210
  | `menuOpen` | `boolean` | — | Controls the phone's menu sheet: open while `true`. Leave it out and the layout manages the sheet. Only a phone shows the sheet |
211
211
  | `onMenuOpenChange` | `(open: boolean) => void` | — | Called for every change of the sheet: the menu button, Escape, the close button, a followed link, a new location |
212
- | `backdrop` | `ReactNode \| false` | — | An exception to the theme's background, which the layout draws by default (Lavande's: the built-in gradient and blobs). A node replaces it for this screen: usually a `Background` preset from `@nxgt/material/backgrounds` (see [Use a background preset behind the shell](#use-a-background-preset-behind-the-shell)); `false` draws no background, a plain page |
212
+ | `backdrop` | `ReactNode \| false` | — | An exception to the theme's background (the page ground, [`--ground`](#the-page-ground), is painted either way), which the layout draws by default (Lavande's: the built-in gradient and blobs). A node replaces it for this screen: usually a `Background` preset from `@nxgt/material/backgrounds` (see [Use a background preset behind the shell](#use-a-background-preset-behind-the-shell)); `false` draws no background, a plain page |
213
213
 
214
214
  On a page with `viewport-fit=cover` (an installed PWA drawing under a
215
215
  notch and the home indicator), the shell pads clear of
@@ -502,6 +502,22 @@ while the sheet is open, so leave ids out of it. A link in `brand` (a home
502
502
  link around the logo) is the sheet's first focusable element, so it takes
503
503
  the focus when the sheet opens.
504
504
 
505
+ ## The page ground
506
+
507
+ The layout paints `bg-ground` (the `--ground` token, see [Page ground](./theming.md#page-ground))
508
+ on its root, so the content, the gutters and the space between the chrome and
509
+ the content are tinted, with or without a `backdrop`, in light and dark. The
510
+ sidebar and the app bar stay on `--background`: flat rectangles with no radius
511
+ and no shadow (translucent over a backdrop, about 90 % without one), so the edge
512
+ between chrome and content is the change of colour. The cards, and the
513
+ `ActivityContent` header card (`bg-card`), stand on the ground with their
514
+ hairline and soft shadow. With `scroll="container"` the same ground stays behind
515
+ the scrolling region.
516
+
517
+ `--ground: var(--background)` on the layout or an ancestor opts out. An app
518
+ sets no page colour of its own under the layout, and no colour on a backdrop;
519
+ `--ground` is the one place to tune it.
520
+
505
521
  ## The theme's background
506
522
 
507
523
  `ActivityLayout` draws the background of the nearest theme (`NxgtThemeProvider`
@@ -72,6 +72,7 @@ at the top are needed is in [getting started](../getting-started.md#styles).
72
72
  | `--primary-indicator` | `bg-primary-indicator`, `border-primary-indicator`, `ring-primary-indicator`, `stroke-primary-indicator` | primary drawn as a non-text mark that carries a state (WCAG 1.4.11, 3:1): an active bar or dot, a selected or focused border, a ring, a spinner arc. Equal to `--primary` in light; in dark, `--primary` mixed 25 % with white (`color-mix(in oklab, var(--primary) 75%, white)`), 4.8:1 on `--background`, 4.5:1 on `--card`, 4.2:1 on `--muted` (`--primary` itself gives 2.7, 2.5 and 2.3:1) |
73
73
  | `--error-text` | `text-error-text` | error drawn as text: field messages, `HelperText` in its error state, form and dialog errors, `variant="error"` menu items |
74
74
  | `--destructive` | `bg-destructive`, `text-destructive` | deprecated alias of `--error`: the light theme sets it to `var(--error)`, the dark theme keeps its own value; use `--error` |
75
+ | `--ground` | `bg-ground` | the page's ground under `ActivityLayout`: the tinted colour the cards stand on (see [Page ground](#page-ground)) |
75
76
  | `--card`, `--popover`, `--tooltip` (+ `-foreground`) | `bg-card`, `bg-popover`, `bg-tooltip` | surfaces |
76
77
  | `--border`, `--input`, `--ring` | `border-border`, `border-input`, `ring-ring` | outlines |
77
78
  | `--chart-1` … `--chart-5` | `bg-chart-1`, … | chart series (the charts read them at runtime) |
@@ -95,6 +96,45 @@ container is the accent colour itself, the same as `bg-accent`.
95
96
 
96
97
  Put `text-foreground` on a container; it stays well above 4.5:1 in both themes.
97
98
 
99
+ ## Page ground
100
+
101
+ `--ground` (`bg-ground`) is the colour of the page under the content: the page,
102
+ the gutters and what the app bar and the sidebar float on. `ActivityLayout`
103
+ paints it by default, with or without a `backdrop` (so does `ThreadLayout`), so a card (`bg-card`) stands
104
+ apart from the page in every screen and an app sets no page colour.
105
+
106
+ | Mode | Value | What it does |
107
+ | --- | --- | --- |
108
+ | light | `color-mix(in oklab, var(--primary) 7%, var(--background))` | the primary at 7 % over the page: a quiet tint, 0.03 to 0.04 ΔEOK from a white card |
109
+ | dark | `color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black))` | darker than `--background` (lightness about 0.105 against 0.150) and than `--card`, so the cards lift off it: 0.08 to 0.09 ΔEOK |
110
+
111
+ The mixes are in `oklab`, never `oklch`: `oklch` skews the hue when a colour is
112
+ mixed with white. Every built-in theme and every `defineTheme` output carries
113
+ the token (light block and dark block), written from the theme's own
114
+ `--primary` and `--background`, so a zone gets its own ground. Text on it keeps
115
+ AA: foreground, muted foreground and primary text are measured on the ground in
116
+ both modes.
117
+
118
+ The sidebar and the app bar do **not** take the tint: they stay on
119
+ `--background` (near-white in light), flat, with no radius and no shadow, so
120
+ only the content ground carries the colour. The cards keep `bg-card`, their
121
+ hairline border and their soft shadow.
122
+
123
+ ```css
124
+ /* A custom tint, anywhere above the layout (or on a zone): */
125
+ :root { --ground: color-mix(in oklab, var(--primary) 10%, var(--background)); }
126
+
127
+ /* Opt out: the page is flat again, as before 3.24. */
128
+ [data-slot="activity-layout"] { --ground: var(--background); }
129
+ ```
130
+
131
+ A theme overrides it like any token: `defineTheme({ …, tokens: { light: { ground:
132
+ 'var(--background)' } } })`, and `checkThemeContrast` measures the override.
133
+
134
+ Do not paint your own page background under the layout (`bg-background`,
135
+ `bg-muted`, a gradient) or add a shadow to every card: both fight the ground.
136
+ A backdrop's colours come from the theme; set none on it.
137
+
98
138
  ## The neutral palette
99
139
 
100
140
  The default theme's page is plain: pure white in light and the one dark night
@@ -25,6 +25,7 @@ words in your error.
25
25
 
26
26
  **Styles & assets**
27
27
 
28
+ - [The page and the cards look the same](#the-page-and-the-cards-look-the-same)
28
29
  - [Components render unstyled, with no error](#components-render-unstyled-with-no-error)
29
30
  - [A link is blue and underlined on hover and focus](#a-link-of-mine-or-of-a-component-is-blue-and-underlined-on-hover-and-focus)
30
31
  - [The light and dark neutrals turned violet after upgrading to 3.6](#the-light-and-dark-neutrals-turned-violet-after-upgrading-to-36)
@@ -319,6 +320,7 @@ words in your error.
319
320
  - [My inputs look rounder or tinted, or lost the hover ring, after upgrading](#my-inputs-look-rounder-or-tinted-or-lost-the-hover-ring-after-upgrading)
320
321
  - [An input inside an `InputGroup` lost a class or a style of `Input`](#an-input-inside-an-inputgroup-lost-a-class-or-a-style-of-input)
321
322
  - [A `NativeSelect` is taller, or a `Select` trigger or list measures differently](#a-nativeselect-is-taller-or-a-select-trigger-or-list-measures-differently)
323
+ - [A `NativeSelect` is now as wide as its container, where it was as wide as its selected option](#a-nativeselect-is-now-as-wide-as-its-container-where-it-was-as-wide-as-its-selected-option)
322
324
  - [A `Combobox` clear button is not found, its list sits 3px from the field, or `ComboboxInput` rejects `size={n}`](#a-combobox-clear-button-is-not-found-its-list-sits-3px-from-the-field-or-comboboxinput-rejects-sizen)
323
325
  - [An `Autocomplete` list covers its helper text, or a chip test no longer finds its markup](#an-autocomplete-list-covers-its-helper-text-or-a-chip-test-no-longer-finds-its-markup)
324
326
  - [A `CountryField` lost its chip, or its `renderOption` or `filter` does nothing](#a-countryfield-lost-its-chip-or-its-renderoption-or-filter-does-nothing)
@@ -710,6 +712,33 @@ Vite and React Router apps use:
710
712
 
711
713
  ## Styles & assets
712
714
 
715
+ ### The page and the cards look the same
716
+
717
+ **When:** a screen under `ActivityLayout`, after the 3.24 upgrade or on an older
718
+ setup. The cards, tiles and the header card have no visible edge against the
719
+ page.
720
+ **Why:** the page ground (`--ground`, `bg-ground`) is flat again, equal to
721
+ `--background`: an app's CSS paints its own page colour under the layout (a
722
+ `bg-background` or `bg-white` on a wrapper, `body`, a route), sets
723
+ `--ground: var(--background)`, a stylesheet loaded without `theme-tokens.css`
724
+ (no `--ground`, so `bg-ground` paints nothing), or a theme whose `tokens`
725
+ override made `ground` equal to `card`.
726
+ **Fix:** remove the page background under the layout, import
727
+ `@nxgt/material/styles.css` (it carries the token), and read the value on the
728
+ layout:
729
+
730
+ ```css
731
+ /* a custom tint is fine; a flat page is the opt-out */
732
+ :root { --ground: color-mix(in oklab, var(--primary) 7%, var(--background)); }
733
+ ```
734
+
735
+ ```ts
736
+ getComputedStyle(document.querySelector('[data-slot="activity-layout"]')!).backgroundColor;
737
+ ```
738
+
739
+ Also drop app-level card shadows: the cards already carry a hairline and a soft
740
+ shadow.
741
+
713
742
  ### Components render unstyled, with no error
714
743
 
715
744
  **When:** on the first page load. Components have their structure but no
@@ -5807,11 +5836,30 @@ tint with `data-placeholder` (absent once a value is chosen) and the open
5807
5836
  state with `data-open`:
5808
5837
 
5809
5838
  ```tsx
5810
- <NativeSelect size="sm" aria-label="Rows per page">…</NativeSelect>
5839
+ <NativeSelect size="sm" aria-label="Rows per page" className="w-fit">…</NativeSelect>
5811
5840
 
5812
5841
  expect(screen.getByRole('combobox', { name: 'Fruit' })).not.toHaveAttribute('data-placeholder');
5813
5842
  ```
5814
5843
 
5844
+ ### A `NativeSelect` is now as wide as its container, where it was as wide as its selected option
5845
+
5846
+ **When:** after upgrading, a `NativeSelect` in a toolbar, a filter bar or a
5847
+ row of buttons stretches across the row, where it used to be as wide as its
5848
+ widest option.
5849
+ **Why:** it shrank to its content while `SelectField`, `TextField` and the
5850
+ other fields fill their column, so in a form it sat narrower than the
5851
+ fields around it. It fills its container now, like them.
5852
+ **Fix:** give it the width you want. A width class on the `<select>` keeps the
5853
+ whole control, chevron included, at that width:
5854
+
5855
+ ```tsx
5856
+ <NativeSelect size="sm" aria-label="Rows per page" className="w-fit">…</NativeSelect>
5857
+ <NativeSelect aria-label="Sort" className="w-40">…</NativeSelect>
5858
+ ```
5859
+
5860
+ `SelectField`, `Select` and the other fields never shrank to the selected option; a long
5861
+ selected label ends in an ellipsis and does not widen its column.
5862
+
5815
5863
  ### A `Combobox` clear button is not found, its list sits 3px from the field, or `ComboboxInput` rejects `size={n}`
5816
5864
 
5817
5865
  **When:** after upgrading, `[data-slot="combobox-clear"]` finds nothing, a
@@ -7,7 +7,10 @@
7
7
  @import "./scene.css";
8
8
 
9
9
  @layer components {
10
- /* The wash: two soft colour pools under the scene. */
10
+ /* The wash: one even, soft gradient over the whole layer, top to bottom, no
11
+ * pool in a corner. It sits in the backdrop layer under the content column, so
12
+ * it never repaints the sidebar or the app bar, and the page ground
13
+ * (--ground) shows through it. */
11
14
  :is(
12
15
  [data-background="shapes"],
13
16
  [data-background="confetti-grid"],
@@ -18,17 +21,15 @@
18
21
  ) > [data-layer="wash"] {
19
22
  position: absolute;
20
23
  inset: 0;
21
- background:
22
- radial-gradient(
23
- ellipse 75% 65% at 30% 20%,
24
- color-mix(in oklab, var(--nxgt-bg-c1) var(--nxgt-bg-a1), transparent),
25
- transparent 72%
24
+ background: linear-gradient(
25
+ 180deg in oklab,
26
+ color-mix(
27
+ in oklab,
28
+ var(--nxgt-bg-c1) calc(var(--nxgt-bg-a1) * 1.75),
29
+ transparent
26
30
  ),
27
- radial-gradient(
28
- ellipse 60% 60% at 85% 90%,
29
- color-mix(in oklab, var(--nxgt-bg-c3) var(--nxgt-bg-a1), transparent),
30
- transparent 70%
31
- );
31
+ color-mix(in oklab, var(--nxgt-bg-c3) var(--nxgt-bg-a1), transparent)
32
+ );
32
33
  }
33
34
 
34
35
  /* The scene clips the float, which scales it past the frame. */
@@ -23,20 +23,19 @@
23
23
  @import "./icons-tint.css";
24
24
 
25
25
  @layer components {
26
+ /* The wash: one even, soft gradient over the layer (see css/motifs.css). */
26
27
  [data-background="icons"] > [data-layer="wash"] {
27
28
  position: absolute;
28
29
  inset: 0;
29
- background:
30
- radial-gradient(
31
- ellipse 75% 65% at 22% 18%,
32
- color-mix(in oklab, var(--nxgt-bg-c1) var(--nxgt-bg-a1), transparent),
33
- transparent 72%
30
+ background: linear-gradient(
31
+ 180deg in oklab,
32
+ color-mix(
33
+ in oklab,
34
+ var(--nxgt-bg-c1) calc(var(--nxgt-bg-a1) * 1.75),
35
+ transparent
34
36
  ),
35
- radial-gradient(
36
- ellipse 60% 60% at 86% 90%,
37
- color-mix(in oklab, var(--nxgt-bg-c3) var(--nxgt-bg-a1), transparent),
38
- transparent 70%
39
- );
37
+ color-mix(in oklab, var(--nxgt-bg-c3) var(--nxgt-bg-a1), transparent)
38
+ );
40
39
  }
41
40
 
42
41
  :is([data-background="icons"], [data-background="shapes"]) > [data-scene] {
@@ -5,6 +5,11 @@
5
5
  --radius: 0.625rem;
6
6
  --background: oklch(1 0 0);
7
7
  --foreground: oklch(0.227 0.017 290);
8
+ /* The page ground under ActivityLayout (`bg-ground`): the primary at 7 % over the
9
+ page, so the cards (--card, white) stand apart from it. Set here, not on
10
+ `body`, so a zone that sets --primary or --background gets its own. A page
11
+ keeps the flat look with `--ground: var(--background)`. */
12
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
8
13
  --card: oklch(1 0 0);
9
14
  --card-foreground: oklch(0.227 0.017 290);
10
15
  --strix: oklch(45.91% 0.1864 310.75);
@@ -99,6 +104,13 @@
99
104
  [data-theme="dark"] {
100
105
  --background: oklch(0.15 0.026 273);
101
106
  --foreground: oklch(0.943 0.012 291.3);
107
+ /* Darker than --background so the cards (--card) stand apart: the page 55 %
108
+ toward black, the primary at 6 % over it. */
109
+ --ground: color-mix(
110
+ in oklab,
111
+ var(--primary) 6%,
112
+ color-mix(in oklab, var(--background) 55%, black)
113
+ );
102
114
  --card: oklch(0.19 0.019 289.4);
103
115
  --card-foreground: oklch(0.943 0.012 291.3);
104
116
  --popover: oklch(0.19 0.019 289.4);
@@ -6,8 +6,8 @@
6
6
  * Plain CSS, no inline `style`, in `@layer components` like the rest: an app's
7
7
  * utilities still win. The layer itself (`data-slot="activity-layout-backdrop"`)
8
8
  * is in the content column, positioned by classes in activity-layout.tsx: the
9
- * frame's padding and gaps take the chrome fill, so the shapes show nowhere
10
- * else.
9
+ * frame's padding and gaps show the page ground (--ground), so the shapes show
10
+ * nowhere else.
11
11
  *
12
12
  * The chrome is lightly translucent and frosted: about 80% of the background
13
13
  * colour (--nxgt-backdrop-chrome-alpha, the app bar) or 87% (--nxgt-backdrop-nav-alpha,
@@ -34,7 +34,7 @@
34
34
  display: none;
35
35
  }
36
36
 
37
- /* The gutter mask without a backdrop (activity-layout.tsx) has the app bar's
37
+ /* The gutter mask without a backdrop (activity-layout.tsx) has the page ground's
38
38
  * translucent fill, which the page's top gutter never had: it fades in over
39
39
  * the first 8px of scroll, so at scroll top nothing changed. A browser
40
40
  * without scroll-driven animations shows it from the start. */
@@ -60,19 +60,6 @@
60
60
  background-image: none;
61
61
  }
62
62
 
63
- /* scroll="document": the frame's chrome fill leaves its top gutter to the
64
- * gutter mask (activity-layout.tsx), a fixed strip with the same fill that
65
- * hides the scrolled page above the sticky app bar. Painting both would
66
- * stack two translucent fills there. */
67
- [data-slot="activity-layout"][data-backdrop][data-scroll="document"]
68
- [data-slot="activity-layout-frame"] {
69
- background:
70
- linear-gradient(
71
- var(--nxgt-backdrop-fill-chrome),
72
- var(--nxgt-backdrop-fill-chrome)
73
- )
74
- bottom / 100% calc(100% - var(--nxgt-backdrop-top)) no-repeat;
75
- }
76
63
  [data-slot="activity-layout"][data-backdrop] > [data-layer] {
77
64
  display: none;
78
65
  }
package/lib/styles.css CHANGED
@@ -52,6 +52,7 @@
52
52
  --color-paper: --alpha(var(--primary) / 0.5%);
53
53
  --color-strix: var(--strix);
54
54
  --color-background: var(--background);
55
+ --color-ground: var(--ground);
55
56
  --color-background-paper: --alpha(var(--primary) / 5%);
56
57
  --color-background-light: --alpha(var(--background) / 30%);
57
58
  --color-foreground: var(--foreground);
@@ -1,12 +1,13 @@
1
1
  /* Theme "ambre", generated.
2
2
  * Seeds: primary oklch(0.52 0.13 48), secondary oklch(0.5 0.09 95), tertiary oklch(0.5 0.14 350), neutral hue 65, tint 0.85.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  * hue-near-status: The primary's hue 48 is 14° from warning (62): they may read alike. Keep an icon and a word with every status.
5
5
  */
6
6
  [data-nxgt-theme="ambre"] {
7
7
  --radius: 0.875rem;
8
8
  --background: oklch(1 0 0);
9
9
  --foreground: oklch(0.227 0.0145 65);
10
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
10
11
  --card: oklch(1 0 0);
11
12
  --card-foreground: oklch(0.227 0.0145 65);
12
13
  --popover: oklch(1 0 0);
@@ -74,6 +75,7 @@
74
75
  [data-nxgt-theme="ambre"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="ambre"] [data-nxgt-theme]:not([data-nxgt-theme="ambre"]), [data-nxgt-theme="ambre"] [data-nxgt-theme]:not([data-nxgt-theme="ambre"]) *) {
75
76
  --background: oklch(0.15 0.026 273);
76
77
  --foreground: oklch(0.943 0.0102 65);
78
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
77
79
  --card: oklch(0.19 0.0161 65);
78
80
  --card-foreground: oklch(0.943 0.0102 65);
79
81
  --popover: oklch(0.19 0.0161 65);
@@ -1,11 +1,12 @@
1
1
  /* Theme "ardoise", generated.
2
2
  * Seeds: primary oklch(0.45 0.065 252), secondary oklch(0.48 0.05 215), tertiary oklch(0.48 0.1 290), neutral hue 250, tint 0.7.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  */
5
5
  [data-nxgt-theme="ardoise"] {
6
6
  --radius: 0.375rem;
7
7
  --background: oklch(1 0 0);
8
8
  --foreground: oklch(0.227 0.0119 250);
9
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
9
10
  --card: oklch(1 0 0);
10
11
  --card-foreground: oklch(0.227 0.0119 250);
11
12
  --popover: oklch(1 0 0);
@@ -73,6 +74,7 @@
73
74
  [data-nxgt-theme="ardoise"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="ardoise"] [data-nxgt-theme]:not([data-nxgt-theme="ardoise"]), [data-nxgt-theme="ardoise"] [data-nxgt-theme]:not([data-nxgt-theme="ardoise"]) *) {
74
75
  --background: oklch(0.15 0.026 273);
75
76
  --foreground: oklch(0.943 0.0084 250);
77
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
76
78
  --card: oklch(0.19 0.0133 250);
77
79
  --card-foreground: oklch(0.943 0.0084 250);
78
80
  --popover: oklch(0.19 0.0133 250);
@@ -1,6 +1,6 @@
1
1
  /* Theme "bleumono", generated.
2
2
  * Seeds: primary oklch(0.46 0.13 255), secondary oklch(0.55 0.06 255), tertiary oklch(0.38 0.17 255), neutral hue 255, tint 1.1.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  * lightness-moved: secondary: lightness 0.550 to 0.520 for AA.
5
5
  * chroma-lowered: tertiary: chroma 0.170 to 0.125 (lowered to fit sRGB or AA).
6
6
  * hue-near-status: The primary's hue 255 is 0° from info (254.624): they may read alike. Keep an icon and a word with every status.
@@ -9,6 +9,7 @@
9
9
  --radius: 0.5rem;
10
10
  --background: oklch(1 0 0);
11
11
  --foreground: oklch(0.227 0.0187 255);
12
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
12
13
  --card: oklch(1 0 0);
13
14
  --card-foreground: oklch(0.227 0.0187 255);
14
15
  --popover: oklch(1 0 0);
@@ -76,6 +77,7 @@
76
77
  [data-nxgt-theme="bleumono"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="bleumono"] [data-nxgt-theme]:not([data-nxgt-theme="bleumono"]), [data-nxgt-theme="bleumono"] [data-nxgt-theme]:not([data-nxgt-theme="bleumono"]) *) {
77
78
  --background: oklch(0.15 0.026 273);
78
79
  --foreground: oklch(0.943 0.0132 255);
80
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
79
81
  --card: oklch(0.19 0.0209 255);
80
82
  --card-foreground: oklch(0.943 0.0132 255);
81
83
  --popover: oklch(0.19 0.0209 255);
@@ -1,6 +1,6 @@
1
1
  /* Theme "bluemoon", generated.
2
2
  * Seeds: primary oklch(0.45 0.12 265), secondary oklch(0.55 0.02 250), tertiary oklch(0.62 0.08 290), neutral hue 265, tint 1.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  * lightness-moved: secondary: lightness 0.550 to 0.520 for AA.
5
5
  * lightness-moved: tertiary: lightness 0.620 to 0.563 for AA.
6
6
  * hue-near-status: The primary's hue 265 is 10° from info (254.624): they may read alike. Keep an icon and a word with every status.
@@ -9,6 +9,7 @@
9
9
  --radius: 0.75rem;
10
10
  --background: oklch(1 0 0);
11
11
  --foreground: oklch(0.227 0.017 265);
12
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
12
13
  --card: oklch(1 0 0);
13
14
  --card-foreground: oklch(0.227 0.017 265);
14
15
  --popover: oklch(1 0 0);
@@ -76,6 +77,7 @@
76
77
  [data-nxgt-theme="bluemoon"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="bluemoon"] [data-nxgt-theme]:not([data-nxgt-theme="bluemoon"]), [data-nxgt-theme="bluemoon"] [data-nxgt-theme]:not([data-nxgt-theme="bluemoon"]) *) {
77
78
  --background: oklch(0.15 0.026 273);
78
79
  --foreground: oklch(0.943 0.012 265);
80
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
79
81
  --card: oklch(0.19 0.019 265);
80
82
  --card-foreground: oklch(0.943 0.012 265);
81
83
  --popover: oklch(0.19 0.019 265);
@@ -1,6 +1,6 @@
1
1
  /* Theme "corail", generated.
2
2
  * Seeds: primary oklch(0.58 0.17 35), secondary oklch(0.52 0.1 70), tertiary oklch(0.5 0.1 200), neutral hue 30, tint 0.8.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  * lightness-moved: primary: lightness 0.580 to 0.575 for AA.
5
5
  * chroma-lowered: tertiary: chroma 0.100 to 0.085 (lowered to fit sRGB or AA).
6
6
  * hue-near-status: The primary's hue 35 is 8° from error (27.325): they may read alike. Keep an icon and a word with every status.
@@ -9,6 +9,7 @@
9
9
  --radius: 1rem;
10
10
  --background: oklch(1 0 0);
11
11
  --foreground: oklch(0.227 0.0136 30);
12
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
12
13
  --card: oklch(1 0 0);
13
14
  --card-foreground: oklch(0.227 0.0136 30);
14
15
  --popover: oklch(1 0 0);
@@ -76,6 +77,7 @@
76
77
  [data-nxgt-theme="corail"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="corail"] [data-nxgt-theme]:not([data-nxgt-theme="corail"]), [data-nxgt-theme="corail"] [data-nxgt-theme]:not([data-nxgt-theme="corail"]) *) {
77
78
  --background: oklch(0.15 0.026 273);
78
79
  --foreground: oklch(0.943 0.0096 30);
80
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
79
81
  --card: oklch(0.19 0.0152 30);
80
82
  --card-foreground: oklch(0.943 0.0096 30);
81
83
  --popover: oklch(0.19 0.0152 30);
@@ -1,11 +1,12 @@
1
1
  /* Theme "foret", generated.
2
2
  * Seeds: primary oklch(0.48 0.1 152), secondary oklch(0.5 0.08 118), tertiary oklch(0.5 0.1 55), neutral hue 140, tint 0.8.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  */
5
5
  [data-nxgt-theme="foret"] {
6
6
  --radius: 0.5rem;
7
7
  --background: oklch(1 0 0);
8
8
  --foreground: oklch(0.227 0.0136 140);
9
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
9
10
  --card: oklch(1 0 0);
10
11
  --card-foreground: oklch(0.227 0.0136 140);
11
12
  --popover: oklch(1 0 0);
@@ -73,6 +74,7 @@
73
74
  [data-nxgt-theme="foret"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="foret"] [data-nxgt-theme]:not([data-nxgt-theme="foret"]), [data-nxgt-theme="foret"] [data-nxgt-theme]:not([data-nxgt-theme="foret"]) *) {
74
75
  --background: oklch(0.15 0.026 273);
75
76
  --foreground: oklch(0.943 0.0096 140);
77
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
76
78
  --card: oklch(0.19 0.0152 140);
77
79
  --card-foreground: oklch(0.943 0.0096 140);
78
80
  --popover: oklch(0.19 0.0152 140);
@@ -1,11 +1,12 @@
1
1
  /* Theme "lavande", generated.
2
2
  * Seeds: primary oklch(46% 0.1135 276.35), secondary oklch(48% 0.1135 245.65), tertiary oklch(45.91% 0.1864 310.75), neutral hue 292, tint 1.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  */
5
5
  [data-nxgt-theme="lavande"] {
6
6
  --radius: 0.625rem;
7
7
  --background: oklch(1 0 0);
8
8
  --foreground: oklch(0.227 0.017 290);
9
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
9
10
  --card: oklch(1 0 0);
10
11
  --card-foreground: oklch(0.227 0.017 290);
11
12
  --popover: oklch(1 0 0);
@@ -73,6 +74,7 @@
73
74
  [data-nxgt-theme="lavande"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="lavande"] [data-nxgt-theme]:not([data-nxgt-theme="lavande"]), [data-nxgt-theme="lavande"] [data-nxgt-theme]:not([data-nxgt-theme="lavande"]) *) {
74
75
  --background: oklch(0.15 0.026 273);
75
76
  --foreground: oklch(0.943 0.012 291.3);
77
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
76
78
  --card: oklch(0.19 0.019 289.4);
77
79
  --card-foreground: oklch(0.943 0.012 291.3);
78
80
  --popover: oklch(0.19 0.019 289.4);
@@ -1,6 +1,6 @@
1
1
  /* Theme "menthe", generated.
2
2
  * Seeds: primary oklch(0.5 0.105 168), secondary oklch(0.5 0.09 205), tertiary oklch(0.52 0.11 120), neutral hue 170, tint 0.8.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  * chroma-lowered: primary: chroma 0.105 to 0.101 (lowered to fit sRGB or AA).
5
5
  * chroma-lowered: secondary: chroma 0.090 to 0.085 (lowered to fit sRGB or AA).
6
6
  * hue-near-status: The primary's hue 168 is 17° from success (184.704): they may read alike. Keep an icon and a word with every status.
@@ -9,6 +9,7 @@
9
9
  --radius: 1rem;
10
10
  --background: oklch(1 0 0);
11
11
  --foreground: oklch(0.227 0.0136 170);
12
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
12
13
  --card: oklch(1 0 0);
13
14
  --card-foreground: oklch(0.227 0.0136 170);
14
15
  --popover: oklch(1 0 0);
@@ -76,6 +77,7 @@
76
77
  [data-nxgt-theme="menthe"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="menthe"] [data-nxgt-theme]:not([data-nxgt-theme="menthe"]), [data-nxgt-theme="menthe"] [data-nxgt-theme]:not([data-nxgt-theme="menthe"]) *) {
77
78
  --background: oklch(0.15 0.026 273);
78
79
  --foreground: oklch(0.943 0.0096 170);
80
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
79
81
  --card: oklch(0.19 0.0152 170);
80
82
  --card-foreground: oklch(0.943 0.0096 170);
81
83
  --popover: oklch(0.19 0.0152 170);
@@ -1,6 +1,6 @@
1
1
  /* Theme "ocean", generated.
2
2
  * Seeds: primary oklch(0.5 0.12 228), secondary oklch(0.52 0.09 192), tertiary oklch(0.5 0.13 268), neutral hue 230, tint 0.9.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  * chroma-lowered: primary: chroma 0.120 to 0.098 (lowered to fit sRGB or AA).
5
5
  * lightness-moved: secondary: lightness 0.520 to 0.505 for AA.
6
6
  * chroma-lowered: secondary: chroma 0.090 to 0.087 (lowered to fit sRGB or AA).
@@ -9,6 +9,7 @@
9
9
  --radius: 0.75rem;
10
10
  --background: oklch(1 0 0);
11
11
  --foreground: oklch(0.227 0.0153 230);
12
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
12
13
  --card: oklch(1 0 0);
13
14
  --card-foreground: oklch(0.227 0.0153 230);
14
15
  --popover: oklch(1 0 0);
@@ -76,6 +77,7 @@
76
77
  [data-nxgt-theme="ocean"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="ocean"] [data-nxgt-theme]:not([data-nxgt-theme="ocean"]), [data-nxgt-theme="ocean"] [data-nxgt-theme]:not([data-nxgt-theme="ocean"]) *) {
77
78
  --background: oklch(0.15 0.026 273);
78
79
  --foreground: oklch(0.943 0.0108 230);
80
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
79
81
  --card: oklch(0.19 0.0171 230);
80
82
  --card-foreground: oklch(0.943 0.0108 230);
81
83
  --popover: oklch(0.19 0.0171 230);
@@ -1,12 +1,13 @@
1
1
  /* Theme "pink", generated.
2
2
  * Seeds: primary oklch(0.55 0.2 345), secondary oklch(0.5 0.14 320), tertiary oklch(0.5 0.1 200), neutral hue 345, tint 0.7.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  * chroma-lowered: tertiary: chroma 0.100 to 0.085 (lowered to fit sRGB or AA).
5
5
  */
6
6
  [data-nxgt-theme="pink"] {
7
7
  --radius: 1.25rem;
8
8
  --background: oklch(1 0 0);
9
9
  --foreground: oklch(0.227 0.0119 345);
10
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
10
11
  --card: oklch(1 0 0);
11
12
  --card-foreground: oklch(0.227 0.0119 345);
12
13
  --popover: oklch(1 0 0);
@@ -74,6 +75,7 @@
74
75
  [data-nxgt-theme="pink"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="pink"] [data-nxgt-theme]:not([data-nxgt-theme="pink"]), [data-nxgt-theme="pink"] [data-nxgt-theme]:not([data-nxgt-theme="pink"]) *) {
75
76
  --background: oklch(0.15 0.026 273);
76
77
  --foreground: oklch(0.943 0.0084 345);
78
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
77
79
  --card: oklch(0.19 0.0133 345);
78
80
  --card-foreground: oklch(0.943 0.0084 345);
79
81
  --popover: oklch(0.19 0.0133 345);
@@ -1,11 +1,12 @@
1
1
  /* Theme "prune", generated.
2
2
  * Seeds: primary oklch(0.42 0.15 330), secondary oklch(0.5 0.1 355), tertiary oklch(0.55 0.1 85), neutral hue 330, tint 1.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  */
5
5
  [data-nxgt-theme="prune"] {
6
6
  --radius: 0.5rem;
7
7
  --background: oklch(1 0 0);
8
8
  --foreground: oklch(0.227 0.017 330);
9
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
9
10
  --card: oklch(1 0 0);
10
11
  --card-foreground: oklch(0.227 0.017 330);
11
12
  --popover: oklch(1 0 0);
@@ -73,6 +74,7 @@
73
74
  [data-nxgt-theme="prune"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="prune"] [data-nxgt-theme]:not([data-nxgt-theme="prune"]), [data-nxgt-theme="prune"] [data-nxgt-theme]:not([data-nxgt-theme="prune"]) *) {
74
75
  --background: oklch(0.15 0.026 273);
75
76
  --foreground: oklch(0.943 0.012 330);
77
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
76
78
  --card: oklch(0.19 0.019 330);
77
79
  --card-foreground: oklch(0.943 0.012 330);
78
80
  --popover: oklch(0.19 0.019 330);
@@ -1,11 +1,12 @@
1
1
  /* Theme "sable", generated.
2
2
  * Seeds: primary oklch(0.5 0.06 70), secondary oklch(0.5 0.05 45), tertiary oklch(0.5 0.07 150), neutral hue 75, tint 0.5.
3
- * Contrast: 61 pairs, 0 failing.
3
+ * Contrast: 65 pairs, 0 failing.
4
4
  */
5
5
  [data-nxgt-theme="sable"] {
6
6
  --radius: 0.5rem;
7
7
  --background: oklch(1 0 0);
8
8
  --foreground: oklch(0.227 0.0085 75);
9
+ --ground: color-mix(in oklab, var(--primary) 7%, var(--background));
9
10
  --card: oklch(1 0 0);
10
11
  --card-foreground: oklch(0.227 0.0085 75);
11
12
  --popover: oklch(1 0 0);
@@ -73,6 +74,7 @@
73
74
  [data-nxgt-theme="sable"] :is(.dark, [data-theme="dark"]):not([data-nxgt-theme="sable"] [data-nxgt-theme]:not([data-nxgt-theme="sable"]), [data-nxgt-theme="sable"] [data-nxgt-theme]:not([data-nxgt-theme="sable"]) *) {
74
75
  --background: oklch(0.15 0.026 273);
75
76
  --foreground: oklch(0.943 0.006 75);
77
+ --ground: color-mix(in oklab, var(--primary) 6%, color-mix(in oklab, var(--background) 55%, black));
76
78
  --card: oklch(0.19 0.0095 75);
77
79
  --card-foreground: oklch(0.943 0.006 75);
78
80
  --popover: oklch(0.19 0.0095 75);