@nxgt/material 3.7.5 → 3.8.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.
- package/CHANGELOG.md +56 -0
- package/README.md +39 -6
- package/bin/nxgt-theme.js +6 -0
- package/dist/{async-slice-o_fpqeGX.js → async-slice-DDjaJY_F.js} +2 -2
- package/dist/background--Bf_EbFR.js +159 -0
- package/dist/backgrounds/backgrounds.css +2 -0
- package/dist/backgrounds/css-react/moon.css +97 -0
- package/dist/backgrounds.js +3 -139
- package/dist/browser-only-DQ94lWF8.js +18 -0
- package/dist/bubble-input-B7BVd9fX.js +237 -0
- package/dist/{button--cF4gY14.js → button-DbfdITBB.js} +51 -57
- package/dist/charts.js +3 -3
- package/dist/{chip-D1B1dL77.js → chip-DpySRqCy.js} +2 -2
- package/dist/{client-only.utils-lQ7GqP8w.js → client-only.utils-3nHNzCki.js} +1 -1
- package/dist/{code-editor-0CdGwKDg.js → code-editor-BiA14xua.js} +7 -7
- package/dist/code-editor.js +6 -6
- package/dist/{code-language-items-CGARRbVm.js → code-language-items-C_dJ6GVs.js} +2 -2
- package/dist/components/theme-tokens.css +34 -35
- package/dist/components/tones/app-tones.css +2 -1
- package/dist/components/tones/containers.css +4 -1
- package/dist/components/tones/index.css +2 -0
- package/dist/components/tones/surface.css +1 -0
- package/dist/components/tones/tokens.css +8 -3
- package/dist/components/tones/zone-paint.css +15 -0
- package/dist/components/ui/feedback/toast/toast-tokens.css +1 -0
- package/dist/components/ui/layout/app-shell/activity-backdrop.css +26 -0
- package/dist/components/ui/layout/sidebar/sidebar-tokens.css +5 -2
- package/dist/components/ui/media/media-player/nxgt-media-player.css +7 -32
- package/dist/components/ui/primitives/field-box/field-box-tokens.css +5 -2
- package/dist/{components-CDrQCOsU.js → components-DNUYg8QM.js} +18625 -18532
- package/dist/components.js +24 -22
- package/dist/{dialog-DdJ1C4BR.js → dialog-CkIYpJXk.js} +55 -53
- package/dist/dist-B7RjY7SL.js +158 -0
- package/dist/dist-C4wtXCjf.js +593 -0
- package/dist/dist-DVRQkaTK.js +111 -0
- package/dist/dist-lmHmz_bu.js +419 -0
- package/dist/dnd.js +1 -1
- package/dist/dropdown-menu-BC5Tbhb9.js +908 -0
- package/dist/editor.js +527 -527
- package/dist/empty-state-s2CSjKXJ.js +126 -0
- package/dist/{escape-owner-B8k7DvFa.js → escape-owner-CripBce_.js} +2 -1
- package/dist/{field-blur-DFUazxsL.js → field-blur-DPLsMufs.js} +1 -1
- package/dist/{field-blur-context-Dw9ZAgBr.js → field-blur-context-1ZwJgsHE.js} +2 -2
- package/dist/has-text-content-Ds2dkHX_.js +10 -0
- package/dist/hooks.js +35 -33
- package/dist/{hover-card-D5iHS9q1.js → hover-card-Cox-tPDz.js} +41 -39
- package/dist/{i18n-provider-C6SBK_nO.js → i18n-provider-C6HhBw34.js} +1 -1
- package/dist/i18n.js +6 -6
- package/dist/{icon-badge-Bb5-73XP.js → icon-badge-q3Ve8gra.js} +3 -3
- package/dist/{icon-button-5A6Mrj6w.js → icon-button-DJcWpIhu.js} +2 -1
- package/dist/{in-dialog-AiwTD3DK.js → in-dialog-Vwkyp-M5.js} +6 -5
- package/dist/lib/backgrounds/background/available.d.ts +3 -3
- package/dist/lib/backgrounds/background/background.d.ts +7 -3
- package/dist/lib/backgrounds/background/types.d.ts +7 -1
- package/dist/lib/backgrounds/index.d.ts +1 -1
- package/dist/lib/components/ui/layout/account-menu/account-menu-avatar.d.ts +1 -1
- package/dist/lib/components/ui/layout/app-shell/activity-chrome.d.ts +17 -0
- package/dist/lib/components/ui/layout/app-shell/activity-layout.d.ts +6 -4
- package/dist/lib/components/ui/layout/app-shell/backdrop-layer.d.ts +11 -0
- package/dist/lib/components/ui/layout/app-shell/keep-shapes-inside.d.ts +17 -0
- package/dist/lib/components/ui/layout/app-shell/theme-backdrop.d.ts +6 -0
- package/dist/lib/components/ui/layout/app-shell/use-activity-backdrop.d.ts +18 -0
- package/dist/lib/components/ui/layout/app-shell/use-keep-shapes-inside.d.ts +9 -0
- package/dist/lib/hooks/resolve-theme.d.ts +46 -1
- package/dist/lib/hooks/theme-store.d.ts +35 -4
- package/dist/lib/hooks/use-theme.d.ts +20 -4
- package/dist/lib/i18n/resources/en/en.d.ts +4 -0
- package/dist/lib/i18n/resources/en/material.json.d.ts +4 -0
- package/dist/lib/i18n/resources/fr/fr.d.ts +4 -0
- package/dist/lib/i18n/resources/fr/material.json.d.ts +4 -0
- package/dist/lib/i18n/resources/resources.d.ts +8 -0
- package/dist/lib/i18n/translator.d.ts +1 -1
- package/dist/lib/theme-picker/index.d.ts +7 -0
- package/dist/lib/theme-picker/partials/mini-background.d.ts +10 -0
- package/dist/lib/theme-picker/partials/mode-control.d.ts +5 -0
- package/dist/lib/theme-picker/partials/theme-tile.d.ts +12 -0
- package/dist/lib/theme-picker/theme-label.d.ts +7 -0
- package/dist/lib/theme-picker/theme-picker.d.ts +25 -0
- package/dist/lib/themes/index.d.ts +14 -0
- package/dist/lib/themes/nxgt-theme-provider.d.ts +29 -0
- package/dist/lib/themes/nxgt-theme.d.ts +22 -0
- package/dist/lib/themes/theme-context.d.ts +28 -0
- package/dist/lib/themes/theme-value.d.ts +5 -0
- package/dist/lib/vite/index.d.ts +1 -1
- package/dist/lib.js +3 -3
- package/dist/main.js +43 -39
- package/dist/map.js +8 -8
- package/dist/material.css +1 -1
- package/dist/nxgt-theme-CgSb9Obl.js +37 -0
- package/dist/pdf-reader.js +1 -1
- package/dist/print.js +2 -2
- package/dist/{public-SsiazLEv.js → public-Ce30uvp0.js} +591 -587
- package/dist/read-storage-C2J90bNm.js +10 -0
- package/dist/{rich-code-block-CwNwQs5z.js → rich-code-block-C2Fp_FDU.js} +5 -5
- package/dist/{sortable-provider-BvD98s8Y.js → sortable-provider-pVaEZzty.js} +3 -3
- package/dist/{spinner-CtGCPza-.js → spinner-CsHcmcpF.js} +2 -2
- package/dist/{stored-language-Bb7yX5uE.js → stored-language-BeIKw3-K.js} +15 -15
- package/dist/styles.css +8 -1
- package/dist/theme-context-BagPvRcz.js +16 -0
- package/dist/theme-picker.js +118 -0
- package/dist/theme-store-CSl51uNH.js +91 -0
- package/dist/theme-toggle-C8os82b4.js +48 -0
- package/dist/themes.js +42 -0
- package/dist/toggle-group-j8zaxEg1.js +69 -0
- package/dist/{toolbar-items-DsDDD5AY.js → toolbar-items-CqHvlTU8.js} +443 -589
- package/dist/tooltip-rhbqNmr3.js +1064 -0
- package/dist/{translate-material-Bsjc4Tow.js → translate-material-CGZljjp1.js} +2 -2
- package/dist/{translator-or2y0JJB.js → translator-DCYO4Ij3.js} +3 -3
- package/dist/{use-background-activity-B8jLHNop.js → use-background-activity-KxQgelFF.js} +1 -1
- package/dist/{use-chat-composer-DZ01a16D.js → use-chat-composer-CDrgWGMM.js} +4684 -4886
- package/dist/{use-heading-spy-ByOQNnFZ.js → use-heading-spy-DXo6IOX9.js} +52 -121
- package/dist/{use-material-translation-hLQzOjF0.js → use-material-translation-DkxcLbLM.js} +2 -2
- package/dist/use-slice-reducer-BGkeGtML.js +42 -0
- package/dist/use-theme-Cd-aiDJo.js +31 -0
- package/docs/README.md +2 -1
- package/docs/components/foundations.md +39 -0
- package/docs/components/navigation-and-layout.md +3 -3
- package/docs/getting-started.md +1 -1
- package/docs/guides/app-shell.md +41 -6
- package/docs/guides/backgrounds.md +43 -7
- package/docs/guides/i18n.md +1 -1
- package/docs/guides/themes.md +103 -0
- package/docs/guides/theming.md +288 -84
- package/docs/guides/vite-plugin.md +26 -0
- package/docs/previews/backgrounds-background-from-theme.webp +0 -0
- package/docs/previews/backgrounds-geometry-more.webp +0 -0
- package/docs/previews/backgrounds-geometry.webp +0 -0
- package/docs/previews/backgrounds-illustrated-scenes.webp +0 -0
- package/docs/previews/backgrounds-light-more.webp +0 -0
- package/docs/previews/backgrounds-light.webp +0 -0
- package/docs/previews/backgrounds-material-more.webp +0 -0
- package/docs/previews/backgrounds-matrix.webp +0 -0
- package/docs/previews/backgrounds-moon.webp +0 -0
- package/docs/previews/backgrounds-motif-shapes.webp +0 -0
- package/docs/previews/backgrounds-motifs.webp +0 -0
- package/docs/previews/foundations-themes-themepicker.webp +0 -0
- package/docs/roadmap.md +25 -0
- package/docs/troubleshooting.md +35 -7
- package/lib/backgrounds/backgrounds.css +2 -0
- package/lib/backgrounds/css-react/moon.css +97 -0
- package/lib/components/theme-tokens.css +34 -35
- package/lib/components/tones/app-tones.css +2 -1
- package/lib/components/tones/containers.css +4 -1
- package/lib/components/tones/index.css +2 -0
- package/lib/components/tones/surface.css +1 -0
- package/lib/components/tones/tokens.css +8 -3
- package/lib/components/tones/zone-paint.css +15 -0
- package/lib/components/ui/feedback/toast/toast-tokens.css +1 -0
- package/lib/components/ui/layout/app-shell/activity-backdrop.css +26 -0
- package/lib/components/ui/layout/sidebar/sidebar-tokens.css +5 -2
- package/lib/components/ui/media/media-player/nxgt-media-player.css +7 -32
- package/lib/components/ui/primitives/field-box/field-box-tokens.css +5 -2
- package/lib/styles.css +8 -1
- package/lib/theme-picker/theme-picker-list.css +29 -0
- package/lib/theme-picker/theme-picker.css +192 -0
- package/lib/theme-picker/theme-tile-background.css +77 -0
- package/lib/theme-picker/theme-tile-textures-night.css +63 -0
- package/lib/theme-picker/theme-tile-textures.css +153 -0
- package/lib/themes/ambre.css +134 -0
- package/lib/themes/ardoise.css +133 -0
- package/lib/themes/bleumono.css +136 -0
- package/lib/themes/bluemoon.css +136 -0
- package/lib/themes/corail.css +136 -0
- package/lib/themes/foret.css +133 -0
- package/lib/themes/lavande.css +133 -0
- package/lib/themes/menthe.css +136 -0
- package/lib/themes/ocean.css +136 -0
- package/lib/themes/pink.css +134 -0
- package/lib/themes/prune.css +133 -0
- package/lib/themes/sable.css +133 -0
- package/lib/themes/slate.css +133 -0
- package/lib/themes/teal.css +137 -0
- package/package.json +30 -2
- package/dist/dropdown-menu-DWtgUVW7.js +0 -1490
- package/dist/empty-state-CRWLQ1sM.js +0 -191
- package/dist/tooltip-tmFoTU_d.js +0 -1582
- package/dist/use-slice-reducer-0r5dXnJe.js +0 -58
|
Binary file
|
package/docs/roadmap.md
CHANGED
|
@@ -287,6 +287,31 @@ version they shipped in, and planned entries may name the major they target.
|
|
|
287
287
|
|
|
288
288
|
## Shipped
|
|
289
289
|
|
|
290
|
+
- **Themes** (in the next prerelease) — 14 ready-made themes (Lavande, the
|
|
291
|
+
default, then Océan, Forêt, Ambre, Ardoise, Corail, Menthe, Prune, Sable,
|
|
292
|
+
Slate, Pink, Bleu mono, Blue moon and Teal) as stylesheets,
|
|
293
|
+
`@import "@nxgt/material/themes/<name>.css"` after `styles.css`, each with
|
|
294
|
+
light and dark and each also usable on a single element: `[data-nxgt-theme]`
|
|
295
|
+
makes a zone that paints its own text. `NxgtThemeProvider`, `NxgtTheme` and
|
|
296
|
+
`useThemeContext` in `@nxgt/material/themes` hold the registry and the
|
|
297
|
+
persisted choice; `useTheme()` gains `themeName` and `setThemeName`, shared
|
|
298
|
+
across components and tabs and hydration-safe. `Background` and
|
|
299
|
+
`ActivityLayout` take the theme's background, and `ThemePicker`
|
|
300
|
+
(`@nxgt/material/theme-picker`, with its opt-in `theme-picker.css`) is a
|
|
301
|
+
radiogroup of theme tiles beside the light / dark / system control. Define
|
|
302
|
+
your own with `defineTheme()` from one to three seed colours: the Vite
|
|
303
|
+
plugin's `themes` option (or the `nxgt-theme` command) writes the CSS and
|
|
304
|
+
typings and adds the boot script. The page is white in light and a shared
|
|
305
|
+
night in dark for every theme (`neutrals: 'tinted'` brings back a tinted
|
|
306
|
+
page). `Background` also draws a `moon` preset.
|
|
307
|
+
Four behaviour changes: a wrapper that overrides `--color-*` no longer
|
|
308
|
+
recolours utilities (set `--primary`, or use a theme), `ActivityLayout`
|
|
309
|
+
`backdrop={false}` now draws a plain page, `class="dark"`, `data-theme="dark"`
|
|
310
|
+
or a token such as `--primary:` on a sub-element now recolours the utilities
|
|
311
|
+
below it, and the default page is white in light and a shared night in dark
|
|
312
|
+
(see above). React only; the Vue port is on the Vue roadmap.
|
|
313
|
+
([Theming](guides/theming.md#themes), [Themes for your app](guides/themes.md))
|
|
314
|
+
|
|
290
315
|
- **44 `Background` presets, and 22 motif shapes** — `Background` from
|
|
291
316
|
`@nxgt/material/backgrounds` draws six light presets (`rays`, `halo`,
|
|
292
317
|
`plasma`, `glass`, `ripples`, `blobs`), six geometry presets (`hexagons`,
|
package/docs/troubleshooting.md
CHANGED
|
@@ -28,6 +28,7 @@ words in your error.
|
|
|
28
28
|
- [Components render unstyled, with no error](#components-render-unstyled-with-no-error)
|
|
29
29
|
- [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
30
|
- [The light and dark neutrals turned violet after upgrading to 3.6](#the-light-and-dark-neutrals-turned-violet-after-upgrading-to-36)
|
|
31
|
+
- [A theme's colours do not show](#a-themes-colours-do-not-show)
|
|
31
32
|
- [Math renders in the system fonts](#math-renders-in-the-system-fonts)
|
|
32
33
|
- [`<Icon>` renders nothing](#icon-renders-nothing)
|
|
33
34
|
- [An accessibility audit reports low contrast on a badge, a button, a toast or a menu entry](#an-accessibility-audit-reports-low-contrast-on-a-badge-a-button-a-toast-or-a-menu-entry)
|
|
@@ -722,6 +723,28 @@ first three, on an older version, add the ones you use after it:
|
|
|
722
723
|
`CodeBlock`'s theme and the other components' CSS have no file you can
|
|
723
724
|
import before 2.2.0: upgrade.
|
|
724
725
|
|
|
726
|
+
### A theme's colours do not show
|
|
727
|
+
|
|
728
|
+
**When:** `data-nxgt-theme="ocean"` is set, `themes/ocean.css` is imported, and the page still looks like the default (Lavande).
|
|
729
|
+
**Why:** the theme's block has the same specificity as `:root`, so it wins by source order only. Imported before `styles.css`, it loses. A theme file that is not imported at all does nothing either.
|
|
730
|
+
**Fix:**
|
|
731
|
+
|
|
732
|
+
```css
|
|
733
|
+
@import "@nxgt/material/styles.css";
|
|
734
|
+
@import "@nxgt/material/themes/ocean.css"; /* after styles.css */
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
### ThemePicker tiles look unstyled
|
|
738
|
+
|
|
739
|
+
**When:** `ThemePicker` renders, but its tiles are plain buttons with no swatches or mini background.
|
|
740
|
+
**Why:** the picker's stylesheet is opt-in and not part of `styles.css`, so an app that does not import it ships nothing for it.
|
|
741
|
+
**Fix:**
|
|
742
|
+
|
|
743
|
+
```css
|
|
744
|
+
@import "@nxgt/material/styles.css";
|
|
745
|
+
@import "@nxgt/material/theme-picker.css"; /* after styles.css */
|
|
746
|
+
```
|
|
747
|
+
|
|
725
748
|
### Math renders in the system fonts
|
|
726
749
|
|
|
727
750
|
**When:** a formula in `Markdown` (or `ChatMarkdown`) shows in a serif or
|
|
@@ -933,10 +956,10 @@ class instead: the tone already colours the text:
|
|
|
933
956
|
<p className="text-sm text-error-text">Enter a valid email</p>
|
|
934
957
|
```
|
|
935
958
|
|
|
936
|
-
Setting
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
959
|
+
Setting only `--error` on an element below the root (a `style` on a section)
|
|
960
|
+
does not move `text-error-text`: the derived token is computed on the root.
|
|
961
|
+
Set `--error-text` on that element too, put the override on the root, or use a
|
|
962
|
+
theme zone, which re-declares the derived tokens.
|
|
940
963
|
|
|
941
964
|
### An accessibility audit reports low contrast on primary text in the dark theme
|
|
942
965
|
|
|
@@ -959,7 +982,7 @@ fills, borders and rings:
|
|
|
959
982
|
|
|
960
983
|
An app that overrides `--primary` under `:root` and `.dark, [data-theme="dark"]`
|
|
961
984
|
gets `--primary-text` for free; set `--primary-text` after it to choose another
|
|
962
|
-
colour. On an element below the root, set `--
|
|
985
|
+
colour. On an element below the root, set `--primary-text` too.
|
|
963
986
|
|
|
964
987
|
The same goes for a primary mark that is not text: a bar, a dot, a selected or
|
|
965
988
|
focused border, a ring or a spinner arc. In dark, `--primary` is only 2.1 to
|
|
@@ -1319,6 +1342,11 @@ blobs, or when the page loads a copy of `styles.css` older than 3.5.
|
|
|
1319
1342
|
**Fix:** import `Background` from `@nxgt/material/backgrounds`, import
|
|
1320
1343
|
`@nxgt/material/backgrounds.css` once, and keep `@nxgt/material` current.
|
|
1321
1344
|
|
|
1345
|
+
The same holds for a theme's background (no `backdrop` given, under a theme
|
|
1346
|
+
other than Lavande): without `backgrounds.css` it has no look. And
|
|
1347
|
+
`backdrop={false}` no longer keeps the gradient: it draws a plain page, so leave
|
|
1348
|
+
`backdrop` out to get the gradient back.
|
|
1349
|
+
|
|
1322
1350
|
```tsx
|
|
1323
1351
|
import { Background } from '@nxgt/material/backgrounds';
|
|
1324
1352
|
import '@nxgt/material/backgrounds.css';
|
|
@@ -6782,13 +6810,13 @@ How the presets work is in the [Backgrounds guide](guides/backgrounds.md).
|
|
|
6782
6810
|
### `Background: preset "<id>" is not available in this library yet; drawing "gradient".`
|
|
6783
6811
|
|
|
6784
6812
|
**When:** in development (not when `NODE_ENV` is `production`), the first time a `Background` from `@nxgt/material/backgrounds` gets a `preset` that this library does not draw yet, or a typo from JavaScript. It is printed once per id.
|
|
6785
|
-
**Why:** `BACKGROUND_PRESETS` lists the
|
|
6813
|
+
**Why:** `BACKGROUND_PRESETS` lists the 45 presets; this library draws the ones in `AVAILABLE_BACKGROUND_PRESETS`. Any other id draws the gradient.
|
|
6786
6814
|
**Fix:** use an available preset:
|
|
6787
6815
|
|
|
6788
6816
|
```ts
|
|
6789
6817
|
import { AVAILABLE_BACKGROUND_PRESETS } from '@nxgt/material/backgrounds';
|
|
6790
6818
|
|
|
6791
|
-
console.log(AVAILABLE_BACKGROUND_PRESETS); // all
|
|
6819
|
+
console.log(AVAILABLE_BACKGROUND_PRESETS); // all 45 ids: 'gradient', 'grain', 'mesh', 'aurora', …, 'sport', 'moon'
|
|
6792
6820
|
```
|
|
6793
6821
|
|
|
6794
6822
|
### A preset `Background` looks bare, with no error
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* The `moon` preset: a thin crescent in a wide halo among a few stars. The
|
|
2
|
+
* scene drawn by core's `buildBackgroundScene` carries the geometry (the
|
|
3
|
+
* halo's gradient stops are `s3`, the crescent `k2`, the stars `k1` and
|
|
4
|
+
* `k2`); this file gives it a faint wash, the strength each intensity sets,
|
|
5
|
+
* and a silver moon in dark. Motion (opt-in, `animated`): the stars twinkle,
|
|
6
|
+
* 8 s a leg; the delay of each (`l1..l4`) is a class, so the markup holds no
|
|
7
|
+
* inline style. React only: nothing in the shared `css/` folder. */
|
|
8
|
+
@import "../css/scene.css";
|
|
9
|
+
|
|
10
|
+
@layer components {
|
|
11
|
+
[data-background="moon"] > [data-layer="wash"] {
|
|
12
|
+
position: absolute;
|
|
13
|
+
inset: 0;
|
|
14
|
+
background:
|
|
15
|
+
radial-gradient(
|
|
16
|
+
ellipse 70% 60% at 82% 14%,
|
|
17
|
+
color-mix(in oklab, var(--nxgt-bg-c3) var(--nxgt-bg-a1), transparent),
|
|
18
|
+
transparent 72%
|
|
19
|
+
),
|
|
20
|
+
radial-gradient(
|
|
21
|
+
ellipse 60% 55% at 12% 92%,
|
|
22
|
+
color-mix(in oklab, var(--nxgt-bg-c1) var(--nxgt-bg-a1), transparent),
|
|
23
|
+
transparent 70%
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
[data-background="moon"] > [data-scene] {
|
|
28
|
+
overflow: hidden;
|
|
29
|
+
container: nxgt-moon / inline-size;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* The scene is written for 0.8 at the default strength: subtle 0.47,
|
|
33
|
+
* vivid the full 1. The root class makes it (0,4,0), above the motif rule (0,3,0). */
|
|
34
|
+
[data-background="moon"] > [data-scene] > .mn :is(.mo, .mh) {
|
|
35
|
+
opacity: calc(var(--nxgt-bg-op) / 0.9);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* The scene has no viewBox (lengths are pixels, positions shares of the
|
|
39
|
+
* container): the moon and the stars draw past their own origin. */
|
|
40
|
+
[data-background="moon"] > [data-scene] .pt {
|
|
41
|
+
overflow: visible;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* A narrow container: half the size, so the moon stays whole in the top right corner. */
|
|
45
|
+
@container nxgt-moon (max-width: 640px) {
|
|
46
|
+
[data-background="moon"] > [data-scene] .mg .md {
|
|
47
|
+
transform: scale(0.5);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* In light the scene is multiplied into the page and the crescent is
|
|
52
|
+
* lighter still: a faint watermark. */
|
|
53
|
+
[data-background="moon"] > [data-scene] {
|
|
54
|
+
mix-blend-mode: multiply;
|
|
55
|
+
}
|
|
56
|
+
[data-background="moon"] > [data-scene] .md {
|
|
57
|
+
opacity: 0.55;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* In dark it adds nothing but light, and the moon is silver, lighter than the lifted tone. */
|
|
61
|
+
:is(.dark, [data-theme="dark"]) [data-background="moon"] > [data-scene],
|
|
62
|
+
[data-background="moon"]:is(.dark, [data-theme="dark"]) > [data-scene] {
|
|
63
|
+
mix-blend-mode: normal;
|
|
64
|
+
}
|
|
65
|
+
:is(.dark, [data-theme="dark"]) [data-background="moon"] > [data-scene] .md,
|
|
66
|
+
[data-background="moon"]:is(.dark, [data-theme="dark"]) > [data-scene] .md {
|
|
67
|
+
color: color-mix(in oklab, var(--nxgt-bg-c2) 30%, white);
|
|
68
|
+
opacity: 0.78;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
73
|
+
@keyframes nxgt-bg-moon-twinkle {
|
|
74
|
+
to {
|
|
75
|
+
opacity: 0.3;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@layer components {
|
|
80
|
+
[data-background="moon"][data-animated] > [data-scene] .tw {
|
|
81
|
+
animation: nxgt-bg-moon-twinkle 8s ease-in-out infinite alternate
|
|
82
|
+
var(--nxgt-bg-play, running);
|
|
83
|
+
}
|
|
84
|
+
[data-background="moon"][data-animated] > [data-scene] .l1 {
|
|
85
|
+
animation-delay: 0s;
|
|
86
|
+
}
|
|
87
|
+
[data-background="moon"][data-animated] > [data-scene] .l2 {
|
|
88
|
+
animation-delay: -2s;
|
|
89
|
+
}
|
|
90
|
+
[data-background="moon"][data-animated] > [data-scene] .l3 {
|
|
91
|
+
animation-delay: -4s;
|
|
92
|
+
}
|
|
93
|
+
[data-background="moon"][data-animated] > [data-scene] .l4 {
|
|
94
|
+
animation-delay: -6s;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* after importing the stylesheet, under the same selectors. */
|
|
4
4
|
:root {
|
|
5
5
|
--radius: 0.625rem;
|
|
6
|
-
--background: oklch(0
|
|
6
|
+
--background: oklch(1 0 0);
|
|
7
7
|
--foreground: oklch(0.227 0.017 290);
|
|
8
8
|
--card: oklch(1 0 0);
|
|
9
9
|
--card-foreground: oklch(0.227 0.017 290);
|
|
@@ -13,9 +13,8 @@
|
|
|
13
13
|
--primary: oklch(46% 0.1135 276.35);
|
|
14
14
|
--primary-foreground: oklch(0.984 0.003 247.858);
|
|
15
15
|
/* Primary drawn as text or an icon on a normal surface (`text-primary-text`):
|
|
16
|
-
the colour mixed 4 % toward black in light, which keeps it 7.
|
|
17
|
-
the
|
|
18
|
-
page); the dark theme lifts it. */
|
|
16
|
+
the colour mixed 4 % toward black in light, which keeps it 7.9:1 on
|
|
17
|
+
the white page and on a Card (the colour itself gives 7.3:1); the dark theme lifts it. */
|
|
19
18
|
--primary-text: color-mix(in oklab, var(--primary) 96%, black);
|
|
20
19
|
/* Primary drawn as a non-text mark (WCAG 1.4.11, 3:1): an indicator bar or dot,
|
|
21
20
|
a selected or focused border, a ring, a spinner arc, a progress fill
|
|
@@ -23,7 +22,7 @@
|
|
|
23
22
|
the dark theme lifts it. */
|
|
24
23
|
--primary-indicator: var(--primary);
|
|
25
24
|
/* --secondary, --success and --info are 0.02 darker than before: on the
|
|
26
|
-
violet page tint (--background, 97.3 %) their own 15 % tonal tint gave the
|
|
25
|
+
former violet page tint (--background, 97.3 %) their own 15 % tonal tint gave the
|
|
27
26
|
text 4.3 to 4.5:1; now 4.7:1 or more on the page and on a Card. */
|
|
28
27
|
--secondary: oklch(48% 0.1135 245.65);
|
|
29
28
|
--secondary-foreground: oklch(0.984 0.003 247.858);
|
|
@@ -58,8 +57,8 @@
|
|
|
58
57
|
--destructive: var(--error);
|
|
59
58
|
--border: oklch(0.912 0.016 293.7);
|
|
60
59
|
--input: oklch(0.912 0.016 293.7);
|
|
61
|
-
/* The focus indicator (WCAG 1.4.11, 3:1): 3.
|
|
62
|
-
--card, 3.
|
|
60
|
+
/* The focus indicator (WCAG 1.4.11, 3:1): 3.68:1 on --background, 3.68:1 on
|
|
61
|
+
--card, 3.22:1 on --muted. */
|
|
63
62
|
--ring: oklch(0.62 0.04 291);
|
|
64
63
|
--chart-1: oklch(0.646 0.222 41.116);
|
|
65
64
|
--chart-2: oklch(0.6 0.118 184.704);
|
|
@@ -98,41 +97,41 @@
|
|
|
98
97
|
|
|
99
98
|
.dark,
|
|
100
99
|
[data-theme="dark"] {
|
|
101
|
-
--background: oklch(0.
|
|
100
|
+
--background: oklch(0.15 0.026 273);
|
|
102
101
|
--foreground: oklch(0.943 0.012 291.3);
|
|
103
|
-
--card: oklch(0.
|
|
102
|
+
--card: oklch(0.19 0.019 289.4);
|
|
104
103
|
--card-foreground: oklch(0.943 0.012 291.3);
|
|
105
|
-
--popover: oklch(0.
|
|
104
|
+
--popover: oklch(0.19 0.019 289.4);
|
|
106
105
|
--popover-foreground: oklch(0.943 0.012 291.3);
|
|
107
106
|
--primary: oklch(46% 0.1135 276.35);
|
|
108
107
|
--primary-foreground: oklch(0.995 0.002 291.3);
|
|
109
108
|
/* Mixed 60 % toward white (the tonal Button labels' recipe): readable as text
|
|
110
109
|
on --background and --card. */
|
|
111
110
|
--primary-text: color-mix(in oklab, var(--primary) 40%, white);
|
|
112
|
-
/* --primary itself is 2.
|
|
113
|
-
--muted. Mixed 25 % toward white: 4.
|
|
111
|
+
/* --primary itself is 2.7:1 on --background, 2.5:1 on --card and 2.3:1 on
|
|
112
|
+
--muted. Mixed 25 % toward white: 4.8:1, 4.5:1 and 4.2:1. */
|
|
114
113
|
--primary-indicator: color-mix(in oklab, var(--primary) 75%, white);
|
|
115
|
-
/* Brighter than the light one: it is read as text on the dark surfaces (6.
|
|
116
|
-
on --background,
|
|
114
|
+
/* Brighter than the light one: it is read as text on the dark surfaces (6.8:1
|
|
115
|
+
on --background, 6.4:1 on --card; 5.1:1 on its own 15 % tonal tint over a
|
|
117
116
|
Card). A filled secondary surface mixes it toward --background (the opaque
|
|
118
|
-
70 % mix) to keep 5.
|
|
117
|
+
70 % mix) to keep 5.4:1 under its near-white text (4.9:1 over a Card). */
|
|
119
118
|
--secondary: oklch(0.675 0.1135 245.65);
|
|
120
119
|
--secondary-foreground: oklch(0.995 0.002 291.3);
|
|
121
|
-
--muted: oklch(0.
|
|
120
|
+
--muted: oklch(0.228 0.022 290);
|
|
122
121
|
--muted-foreground: oklch(0.725 0.03 292.2);
|
|
123
|
-
/* 3.
|
|
122
|
+
/* 3.7:1 on --background, 3.5:1 on --card; the fill 3.3:1 on the track. */
|
|
124
123
|
--track: oklch(0.53 0.03 290);
|
|
125
124
|
--track-fill: oklch(0.85 0.09 276.35);
|
|
126
125
|
--tooltip: oklch(0.925 0.012 291.3);
|
|
127
126
|
--tooltip-foreground: oklch(0.446 0.043 291);
|
|
128
|
-
--accent: oklch(0.
|
|
127
|
+
--accent: oklch(0.25 0.022 290);
|
|
129
128
|
--accent-foreground: oklch(0.943 0.012 291.3);
|
|
130
129
|
--error: oklch(0.577 0.245 27.325);
|
|
131
130
|
--error-foreground: oklch(0.995 0.002 291.3);
|
|
132
131
|
/* --error stays the fill under near-white text; as text it would give only
|
|
133
|
-
|
|
134
|
-
and 5.
|
|
135
|
-
popover;
|
|
132
|
+
4.0:1 on --background and 3.8:1 on --card. Lightened (76 % --error), 6.25
|
|
133
|
+
and 5.9:1, and 5.2:1 on a focused error menu item (bg-error/20 over the
|
|
134
|
+
popover; the former 80 % missed 4.5:1 once rendered). */
|
|
136
135
|
--error-text: color-mix(in oklab, var(--error) 76%, white);
|
|
137
136
|
/* The light brights: on the dark surfaces they read as text and as the
|
|
138
137
|
badge's 60% tint, which keeps its contrast under near-white text (success
|
|
@@ -141,15 +140,15 @@
|
|
|
141
140
|
--success-foreground: oklch(0.995 0.002 291.3);
|
|
142
141
|
--info: oklch(0.707 0.165 254.624);
|
|
143
142
|
--info-foreground: oklch(0.995 0.002 291.3);
|
|
144
|
-
/* Amber too, as text:
|
|
145
|
-
5.
|
|
146
|
-
|
|
143
|
+
/* Amber too, as text: 7.2:1 on --background and 6.7:1 on --card, 6.4:1 and
|
|
144
|
+
5.9:1 on its 10% tint; the badge's 60% fill under near-white text is
|
|
145
|
+
6.1:1 on a page and 5.8:1 on a Card. */
|
|
147
146
|
--warning: oklch(0.7 0.15 70);
|
|
148
147
|
--warning-foreground: oklch(0.995 0.002 291.3);
|
|
149
148
|
--destructive: oklch(0.704 0.191 22.216);
|
|
150
|
-
--border: oklch(0.
|
|
151
|
-
--input: oklch(0.
|
|
152
|
-
/*
|
|
149
|
+
--border: oklch(0.259 0.025 291.4);
|
|
150
|
+
--input: oklch(0.298 0.027 291.4);
|
|
151
|
+
/* 4.05:1 on --background, 3.80:1 on --card, 3.50:1 on --muted. */
|
|
153
152
|
--ring: oklch(0.551 0.03 290);
|
|
154
153
|
--chart-1: oklch(0.488 0.243 264.376);
|
|
155
154
|
--chart-2: oklch(0.696 0.17 162.48);
|
|
@@ -158,8 +157,8 @@
|
|
|
158
157
|
--chart-5: oklch(0.645 0.246 16.439);
|
|
159
158
|
/* The soft palette on the dark card: mid-tone fills (L 0.49, the sand a
|
|
160
159
|
warmer 0.5 0.1 75), light inks of the same hues. Ink on the card:
|
|
161
|
-
1
|
|
162
|
-
more. Ink on its own fill (the outline): 1 3.13:1, 2 3.
|
|
160
|
+
1 9.27:1, 2 10.38, 3 11.20, 4 8.82, 5 8.85; at the 0.85 dim 6.66:1 or
|
|
161
|
+
more. Ink on its own fill (the outline): 1 3.13:1, 2 3.38, 3 3.69,
|
|
163
162
|
4 3.11, 5 3.13. Every pair at least 54 degrees and ΔEOK 0.109 apart. */
|
|
164
163
|
--chart-soft-1: oklch(0.49 0.08 255);
|
|
165
164
|
--chart-soft-1-ink: oklch(0.78 0.1 255);
|
|
@@ -171,13 +170,13 @@
|
|
|
171
170
|
--chart-soft-4-ink: oklch(0.78 0.13 310);
|
|
172
171
|
--chart-soft-5: oklch(0.49 0.09 25);
|
|
173
172
|
--chart-soft-5-ink: oklch(0.78 0.11 25);
|
|
174
|
-
--sidebar: oklch(0.
|
|
173
|
+
--sidebar: oklch(0.19 0.019 289.4);
|
|
175
174
|
--sidebar-foreground: oklch(0.943 0.012 291.3);
|
|
176
175
|
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
177
176
|
--sidebar-primary-foreground: oklch(0.995 0.002 291.3);
|
|
178
|
-
--sidebar-accent: oklch(0.
|
|
177
|
+
--sidebar-accent: oklch(0.228 0.022 290);
|
|
179
178
|
--sidebar-accent-foreground: oklch(0.943 0.012 291.3);
|
|
180
|
-
--sidebar-border: oklch(0.
|
|
179
|
+
--sidebar-border: oklch(0.259 0.025 291.4);
|
|
181
180
|
--sidebar-ring: oklch(0.551 0.03 290);
|
|
182
181
|
}
|
|
183
182
|
|
|
@@ -188,10 +187,10 @@
|
|
|
188
187
|
--tertiary-foreground: oklch(0.984 0.003 247.858);
|
|
189
188
|
}
|
|
190
189
|
|
|
191
|
-
/* Dark: lifted like --secondary, as it is read as text (6.
|
|
192
|
-
5
|
|
190
|
+
/* Dark: lifted like --secondary, as it is read as text (6.9:1 on --background,
|
|
191
|
+
6.5:1 on --card); its foreground is the dark surface, 6.9:1 on the fill. */
|
|
193
192
|
.dark,
|
|
194
193
|
[data-theme="dark"] {
|
|
195
194
|
--tertiary: oklch(0.7 0.15 310.75);
|
|
196
|
-
--tertiary-foreground: oklch(0.
|
|
195
|
+
--tertiary-foreground: oklch(0.15 0.026 273);
|
|
197
196
|
}
|
|
@@ -58,7 +58,8 @@
|
|
|
58
58
|
/* White on a tone of relative luminance up to 0.179, black above: from
|
|
59
59
|
* there each is 4.5:1 or more (white needs 0.183 or less, black 0.175 or
|
|
60
60
|
* more). r, g and b are the tone's linear sRGB channels. */
|
|
61
|
-
:root
|
|
61
|
+
:root,
|
|
62
|
+
[data-nxgt-theme] {
|
|
62
63
|
--nxgt-tone-on-channel: clamp(
|
|
63
64
|
0,
|
|
64
65
|
(0.179 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) *
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* (the tone held at a container's lightness, set below where relative colour
|
|
16
16
|
* syntax works, the tone's text colour where it does not). */
|
|
17
17
|
:root,
|
|
18
|
+
[data-nxgt-theme],
|
|
18
19
|
.dark,
|
|
19
20
|
[data-theme="dark"] {
|
|
20
21
|
--primary-container: var(
|
|
@@ -131,7 +132,9 @@
|
|
|
131
132
|
* text colour above. */
|
|
132
133
|
@supports (color: oklch(from red clamp(0, l, 0.5) c h)) {
|
|
133
134
|
.dark,
|
|
134
|
-
[data-theme="dark"]
|
|
135
|
+
[data-theme="dark"],
|
|
136
|
+
:is(.dark, [data-theme="dark"]) [data-nxgt-theme],
|
|
137
|
+
[data-nxgt-theme]:is(.dark, [data-theme="dark"]) {
|
|
135
138
|
--nxgt-primary-container-base: oklch(
|
|
136
139
|
from var(--primary)
|
|
137
140
|
clamp(var(--nxgt-tone-container-min), l, var(--nxgt-tone-container-max))
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* surface.css the surface a channel container is mixed over
|
|
9
9
|
* channel.css --nxgt-tone* of a named tone, and its container and ring
|
|
10
10
|
* app-tones.css the derivation for an app's own tone
|
|
11
|
+
* zone-paint.css a theme zone paints its own text (and a forced mode its background)
|
|
11
12
|
*
|
|
12
13
|
* The sidebar's active tokens are in ui/layout/sidebar/sidebar-tokens.css.
|
|
13
14
|
*
|
|
@@ -34,3 +35,4 @@
|
|
|
34
35
|
@import "./surface.css";
|
|
35
36
|
@import "./channel.css";
|
|
36
37
|
@import "./app-tones.css";
|
|
38
|
+
@import "./zone-paint.css";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
:root
|
|
1
|
+
:root,
|
|
2
|
+
[data-nxgt-theme] {
|
|
2
3
|
/* Tints over the page. Hover, selected and strong are the alpha of the
|
|
3
4
|
* selection and hover surfaces; the container tint is the share of the tone
|
|
4
5
|
* in `--<tone>-container`. For apps: no rule of the library reads hover,
|
|
@@ -64,7 +65,9 @@
|
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
.dark,
|
|
67
|
-
[data-theme="dark"]
|
|
68
|
+
[data-theme="dark"],
|
|
69
|
+
:is(.dark, [data-theme="dark"]) [data-nxgt-theme],
|
|
70
|
+
[data-nxgt-theme]:is(.dark, [data-theme="dark"]) {
|
|
68
71
|
/* 24 % of the tone's text colour where the browser cannot derive the
|
|
69
72
|
* container's base (no relative colour syntax): the shares below hold its
|
|
70
73
|
* text at 4.5:1. */
|
|
@@ -111,7 +114,9 @@
|
|
|
111
114
|
* or more (the named tones' and an app tone's, on the page and on a card). */
|
|
112
115
|
@supports (color: oklch(from red clamp(0, l, 0.5) c h)) {
|
|
113
116
|
.dark,
|
|
114
|
-
[data-theme="dark"]
|
|
117
|
+
[data-theme="dark"],
|
|
118
|
+
:is(.dark, [data-theme="dark"]) [data-nxgt-theme],
|
|
119
|
+
[data-nxgt-theme]:is(.dark, [data-theme="dark"]) {
|
|
115
120
|
--nxgt-tint-container: 45%;
|
|
116
121
|
--nxgt-tint-status: 45%;
|
|
117
122
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/* A theme zone paints its own text: it sets the colour tokens below :root, so
|
|
2
|
+
* the colour it inherits would be the page's. A zone with a forced mode
|
|
3
|
+
* (`NxgtTheme mode`, `data-theme`) also paints its own background, since the
|
|
4
|
+
* page's would be the other mode's. `@layer base`, so a utility on the zone
|
|
5
|
+
* still wins. Lavande on <html> with no zone is untouched. React only (the
|
|
6
|
+
* zones are, until the Vue port). */
|
|
7
|
+
@layer base {
|
|
8
|
+
[data-nxgt-theme] {
|
|
9
|
+
color: var(--foreground);
|
|
10
|
+
}
|
|
11
|
+
[data-nxgt-theme][data-theme="dark"],
|
|
12
|
+
[data-nxgt-theme][data-theme="light"] {
|
|
13
|
+
background: var(--background);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -25,6 +25,15 @@
|
|
|
25
25
|
* fallback is their usual surface, through `--nxgt-backdrop-fill-*`: a utility
|
|
26
26
|
* class outranks any rule in a layer, so a rule here could not set them. */
|
|
27
27
|
@layer components {
|
|
28
|
+
/* `backdrop={false}`, or a theme with no background: a plain page, no
|
|
29
|
+
* gradient and no blobs. The chrome keeps its usual fills. */
|
|
30
|
+
[data-slot="activity-layout"][data-plain] {
|
|
31
|
+
background-image: none;
|
|
32
|
+
}
|
|
33
|
+
[data-slot="activity-layout"][data-plain] > [data-layer] {
|
|
34
|
+
display: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
28
37
|
/* The gutter mask without a backdrop (activity-layout.tsx) has the app bar's
|
|
29
38
|
* translucent fill, which the page's top gutter never had: it fades in over
|
|
30
39
|
* the first 8px of scroll, so at scroll top nothing changed. A browser
|
|
@@ -68,6 +77,23 @@
|
|
|
68
77
|
display: none;
|
|
69
78
|
}
|
|
70
79
|
|
|
80
|
+
/* The theme's backdrop keeps its shapes whole (use-keep-shapes-inside.ts):
|
|
81
|
+
* the scene waits for the first pass, then a shape that would cross the
|
|
82
|
+
* layer's edge or reach the header band is hidden, never cut. */
|
|
83
|
+
[data-keep-inside]:not([data-checked]) .mo,
|
|
84
|
+
[data-slot="activity-layout-backdrop"]
|
|
85
|
+
[data-background]:not([data-checked])
|
|
86
|
+
.mo {
|
|
87
|
+
visibility: hidden;
|
|
88
|
+
}
|
|
89
|
+
[data-keep-inside] .mo > [data-outside],
|
|
90
|
+
[data-slot="activity-layout-backdrop"]
|
|
91
|
+
[data-background]
|
|
92
|
+
.mo
|
|
93
|
+
> [data-outside] {
|
|
94
|
+
visibility: hidden;
|
|
95
|
+
}
|
|
96
|
+
|
|
71
97
|
/* A preset fills the layer: the layer's size, not `100lvw x 100lvh`, which
|
|
72
98
|
* counts the scrollbar and a phone's toolbar. */
|
|
73
99
|
[data-slot="activity-layout-backdrop"] > [data-background] {
|
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
.dark,
|
|
21
|
-
[data-theme="dark"]
|
|
21
|
+
[data-theme="dark"],
|
|
22
|
+
:is(.dark, [data-theme="dark"]) [data-nxgt-theme],
|
|
23
|
+
[data-nxgt-theme]:is(.dark, [data-theme="dark"]) {
|
|
22
24
|
/* The dark theme's primary is too dark to read on its surfaces (2.5:1), so
|
|
23
25
|
* the rail's label is a saturated lavender of its hue (5.3:1: lightness
|
|
24
26
|
* 0.72, chroma 0.15) on a denser pill (30 %, 35 % hovered). Light keeps the
|
|
@@ -32,7 +34,8 @@
|
|
|
32
34
|
* it is primary, as set on :root (2.5:1 in dark rather than the inherited
|
|
33
35
|
* muted text). */
|
|
34
36
|
@supports not (color: oklch(from red l c h)) {
|
|
35
|
-
:root
|
|
37
|
+
:root,
|
|
38
|
+
[data-nxgt-theme] {
|
|
36
39
|
--sidebar-active-foreground: var(--primary);
|
|
37
40
|
}
|
|
38
41
|
}
|
|
@@ -69,42 +69,17 @@
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
/* The glass drawer reads the dark theme whatever the page's. `.dark` on it
|
|
72
|
-
* redefines `--background` and friends
|
|
73
|
-
*
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
--
|
|
79
|
-
--color-card-foreground: var(--card-foreground);
|
|
80
|
-
--color-popover: var(--popover);
|
|
81
|
-
--color-popover-foreground: var(--popover-foreground);
|
|
82
|
-
--color-secondary: var(--secondary);
|
|
83
|
-
--color-secondary-foreground: var(--secondary-foreground);
|
|
84
|
-
--color-destructive: var(--destructive);
|
|
85
|
-
--color-error: var(--error);
|
|
86
|
-
--color-error-foreground: var(--error-foreground);
|
|
87
|
-
--color-error-text: var(--error-text);
|
|
88
|
-
--color-success: var(--success);
|
|
89
|
-
--color-success-foreground: var(--success-foreground);
|
|
90
|
-
--color-primary: var(--primary);
|
|
91
|
-
--color-primary-foreground: var(--primary-foreground);
|
|
92
|
-
--color-primary-text: var(--primary-text);
|
|
93
|
-
--color-muted: var(--muted);
|
|
94
|
-
--color-muted-foreground: color-mix(
|
|
72
|
+
* redefines `--background` and friends; the utilities read `var(--token)`
|
|
73
|
+
* where they sit (`@theme inline`), so only the one token the dark theme does
|
|
74
|
+
* not give the glass, the muted text, is derived here. `.dark` in the selector
|
|
75
|
+
* outranks the dark tokens' own `.dark` rule, which sets `--muted-foreground`. */
|
|
76
|
+
.dark[data-slot="media-panel-drawer"],
|
|
77
|
+
.dark[data-slot="media-lightbox"] {
|
|
78
|
+
--muted-foreground: color-mix(
|
|
95
79
|
in oklab,
|
|
96
80
|
var(--foreground) 82%,
|
|
97
81
|
var(--background)
|
|
98
82
|
);
|
|
99
|
-
--color-accent: var(--accent);
|
|
100
|
-
--color-accent-foreground: var(--accent-foreground);
|
|
101
|
-
--color-border: var(--border);
|
|
102
|
-
--color-input: var(--input);
|
|
103
|
-
--color-ring: var(--ring);
|
|
104
|
-
--color-track: var(--track);
|
|
105
|
-
--color-track-fill: var(--track-fill);
|
|
106
|
-
--color-tooltip: var(--tooltip);
|
|
107
|
-
--color-tooltip-foreground: var(--tooltip-foreground);
|
|
108
83
|
}
|
|
109
84
|
|
|
110
85
|
/* The fullscreen drawer takes the end 24rem of a wide player (a bottom sheet
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* so a filled field still reads apart from an empty one on the near-black
|
|
9
9
|
* page (≥ 1.10:1 between the two, ≥ 1.15:1 against the page;
|
|
10
10
|
* Guides/Accessibility/Field contrast measures both). */
|
|
11
|
-
:root
|
|
11
|
+
:root,
|
|
12
|
+
[data-nxgt-theme] {
|
|
12
13
|
--nxgt-field-bg: color-mix(in oklab, var(--foreground) 2%, var(--background));
|
|
13
14
|
--nxgt-field-bg-hover: color-mix(
|
|
14
15
|
in oklab,
|
|
@@ -60,7 +61,9 @@
|
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
.dark,
|
|
63
|
-
[data-theme="dark"]
|
|
64
|
+
[data-theme="dark"],
|
|
65
|
+
:is(.dark, [data-theme="dark"]) [data-nxgt-theme],
|
|
66
|
+
[data-nxgt-theme]:is(.dark, [data-theme="dark"]) {
|
|
64
67
|
--nxgt-option-ring: color-mix(in oklab, var(--primary-text) 50%, transparent);
|
|
65
68
|
--nxgt-option-muted: color-mix(
|
|
66
69
|
in oklab,
|
package/lib/styles.css
CHANGED
|
@@ -36,7 +36,12 @@
|
|
|
36
36
|
--radius-field-inner: var(--nxgt-field-inner-radius);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
/* Colours and radius are inline: a utility reads `var(--primary)` where it is
|
|
40
|
+
* used, not a `--color-primary` computed once on :root, so a zone
|
|
41
|
+
* (`[data-nxgt-theme]`, a `.dark` wrapper) that sets `--primary` below :root
|
|
42
|
+
* reaches `bg-primary`. Tailwind still emits the `--color-*` a page uses, as
|
|
43
|
+
* before, for app CSS that reads `var(--color-primary)`. */
|
|
44
|
+
@theme inline {
|
|
40
45
|
--radius-sm: calc(var(--radius) - 4px);
|
|
41
46
|
--radius-md: calc(var(--radius) - 2px);
|
|
42
47
|
--radius-lg: var(--radius);
|
|
@@ -102,7 +107,9 @@
|
|
|
102
107
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
103
108
|
--color-sidebar-border: var(--sidebar-border);
|
|
104
109
|
--color-sidebar-ring: var(--sidebar-ring);
|
|
110
|
+
}
|
|
105
111
|
|
|
112
|
+
@theme {
|
|
106
113
|
--ease-spatial-fast: var(--nxgt-motion-spatial-fast);
|
|
107
114
|
--ease-spatial-default: var(--nxgt-motion-spatial-default);
|
|
108
115
|
--ease-spatial-slow: var(--nxgt-motion-spatial-slow);
|