Skip to content

Commit ac6116d

Browse files
authored
Do not define a default color-scheme on Provider if one is defined at the page level (#6897)
1 parent c8d4985 commit ac6116d

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

packages/@react-spectrum/s2/src/Provider.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import type {ColorScheme, Router} from '@react-types/provider';
1414
import {colorScheme, UnsafeStyles} from './style-utils' with {type: 'macro'};
1515
import {createContext, JSX, ReactNode, useContext} from 'react';
16+
import {generateDefaultColorSchemeStyles} from './page.macro' with {type: 'macro'};
1617
import {I18nProvider, RouterProvider, useLocale} from 'react-aria-components';
1718
import {mergeStyles} from '../style/runtime';
1819
import {style} from '../style/spectrum-theme' with {type: 'macro'};
@@ -52,7 +53,7 @@ export const ColorSchemeContext = createContext<ColorScheme | 'light dark' | nul
5253
export function Provider(props: ProviderProps) {
5354
let result = <ProviderInner {...props} />;
5455
let parentColorScheme = useContext(ColorSchemeContext);
55-
let colorScheme = props.colorScheme || parentColorScheme || 'light dark';
56+
let colorScheme = props.colorScheme || parentColorScheme;
5657
if (colorScheme !== parentColorScheme) {
5758
result = <ColorSchemeContext.Provider value={colorScheme}>{result}</ColorSchemeContext.Provider>;
5859
}
@@ -68,6 +69,8 @@ export function Provider(props: ProviderProps) {
6869
return result;
6970
}
7071

72+
generateDefaultColorSchemeStyles();
73+
7174
let providerStyles = style({
7275
...colorScheme(),
7376
'--s2-container-bg': {
@@ -80,7 +83,14 @@ let providerStyles = style({
8083
}
8184
}
8285
},
83-
backgroundColor: '--s2-container-bg'
86+
backgroundColor: {
87+
// Don't set a background unless one is requested.
88+
background: {
89+
base: '--s2-container-bg',
90+
'layer-1': '--s2-container-bg',
91+
'layer-2': '--s2-container-bg'
92+
}
93+
}
8494
});
8595

8696
function ProviderInner(props: ProviderProps) {

packages/@react-spectrum/s2/src/page.macro.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,27 @@ export function generatePageStyles(this: MacroContext | void) {
4949
});
5050
}
5151
}
52+
53+
// This generates a low specificity rule to define default values for
54+
// --lightningcss-light and --lightningcss-dark. This is used when rendering
55+
// a <Provider> without setting a colorScheme prop, and when page.css is not present.
56+
// It is equivalent to setting `color-scheme: light dark`, but without overriding
57+
// the browser default for content outside the provider.
58+
export function generateDefaultColorSchemeStyles(this: MacroContext | void) {
59+
if (this && typeof this.addAsset === 'function') {
60+
this.addAsset({
61+
type: 'css',
62+
content: `@layer _.a {
63+
:where(html) {
64+
--lightningcss-light: initial;
65+
--lightningcss-dark: ;
66+
67+
@media (prefers-color-scheme: dark) {
68+
--lightningcss-light: ;
69+
--lightningcss-dark: initial;
70+
}
71+
}
72+
}`
73+
});
74+
}
75+
}

packages/@react-spectrum/s2/src/style-utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ export const fieldInput = () => ({
131131

132132
export const colorScheme = () => ({
133133
colorScheme: {
134+
// Default to page color scheme if none is defined.
135+
default: '[var(--lightningcss-light, light) var(--lightningcss-dark, dark)]',
134136
colorScheme: {
135137
'light dark': 'light dark',
136138
light: 'light',

0 commit comments

Comments
 (0)