react-native-terra-ui 0.1.1 → 0.2.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 +96 -0
- package/lib/module/components/avatar/Avatar.js +118 -35
- package/lib/module/components/avatar/Avatar.js.map +1 -1
- package/lib/module/components/box/Box.js +15 -2
- package/lib/module/components/box/Box.js.map +1 -1
- package/lib/module/components/box/utils.js +4 -1
- package/lib/module/components/box/utils.js.map +1 -1
- package/lib/module/components/button/Button.js +7 -14
- package/lib/module/components/button/Button.js.map +1 -1
- package/lib/module/components/chip/Chip.js +372 -0
- package/lib/module/components/chip/Chip.js.map +1 -0
- package/lib/module/components/chip/index.js +4 -0
- package/lib/module/components/chip/index.js.map +1 -0
- package/lib/module/components/chip/types.js +2 -0
- package/lib/module/components/chip/types.js.map +1 -0
- package/lib/module/components/chip/utils.js +36 -0
- package/lib/module/components/chip/utils.js.map +1 -0
- package/lib/module/components/empty-state/EmptyState.js +200 -0
- package/lib/module/components/empty-state/EmptyState.js.map +1 -0
- package/lib/module/components/empty-state/index.js +4 -0
- package/lib/module/components/empty-state/index.js.map +1 -0
- package/lib/module/components/empty-state/types.js +2 -0
- package/lib/module/components/empty-state/types.js.map +1 -0
- package/lib/module/components/header/header-buttons.js +31 -36
- package/lib/module/components/header/header-buttons.js.map +1 -1
- package/lib/module/components/header/index.js +1 -1
- package/lib/module/components/header/index.js.map +1 -1
- package/lib/module/components/header/parts/HeaderGradientOverlay.js +38 -0
- package/lib/module/components/header/parts/HeaderGradientOverlay.js.map +1 -0
- package/lib/module/components/header/variants/LargeTitleHeader/index.js +69 -99
- package/lib/module/components/header/variants/LargeTitleHeader/index.js.map +1 -1
- package/lib/module/components/header/variants/TitleHeader/index.js +32 -63
- package/lib/module/components/header/variants/TitleHeader/index.js.map +1 -1
- package/lib/module/components/icon/Icon.js +20 -8
- package/lib/module/components/icon/Icon.js.map +1 -1
- package/lib/module/components/image/Image.js +54 -0
- package/lib/module/components/image/Image.js.map +1 -0
- package/lib/module/components/image/index.js +4 -0
- package/lib/module/components/image/index.js.map +1 -0
- package/lib/module/components/image/types.js +4 -0
- package/lib/module/components/image/types.js.map +1 -0
- package/lib/module/components/index.js +4 -0
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/components/portal/Portal.js +42 -0
- package/lib/module/components/portal/Portal.js.map +1 -0
- package/lib/module/components/portal/PortalContext.js +1 -16
- package/lib/module/components/portal/PortalContext.js.map +1 -1
- package/lib/module/components/portal/PortalHost.js +16 -14
- package/lib/module/components/portal/PortalHost.js.map +1 -1
- package/lib/module/components/portal/PortalProvider.js +51 -19
- package/lib/module/components/portal/PortalProvider.js.map +1 -1
- package/lib/module/components/portal/index.js +1 -1
- package/lib/module/components/portal/index.js.map +1 -1
- package/lib/module/components/screen/Screen.js +25 -28
- package/lib/module/components/screen/Screen.js.map +1 -1
- package/lib/module/components/screen/ScreenContext.js +7 -5
- package/lib/module/components/screen/ScreenContext.js.map +1 -1
- package/lib/module/components/screen/ScreenFlashList.js +144 -0
- package/lib/module/components/screen/ScreenFlashList.js.map +1 -0
- package/lib/module/components/screen/ScreenFlatList.js +88 -27
- package/lib/module/components/screen/ScreenFlatList.js.map +1 -1
- package/lib/module/components/screen/ScreenScrollView.js +101 -34
- package/lib/module/components/screen/ScreenScrollView.js.map +1 -1
- package/lib/module/components/screen/index.js +1 -0
- package/lib/module/components/screen/index.js.map +1 -1
- package/lib/module/components/screen/parts/BottomSafeArea.js +62 -0
- package/lib/module/components/screen/parts/BottomSafeArea.js.map +1 -0
- package/lib/module/components/screen/parts/ScreenPlaceholder.js +50 -0
- package/lib/module/components/screen/parts/ScreenPlaceholder.js.map +1 -0
- package/lib/module/components/screen/types.js +4 -0
- package/lib/module/components/screen/types.js.map +1 -0
- package/lib/module/components/screen/utils.js +12 -9
- package/lib/module/components/screen/utils.js.map +1 -1
- package/lib/module/components/surface/Surface.js +16 -9
- package/lib/module/components/surface/Surface.js.map +1 -1
- package/lib/module/components/text/Text.js +23 -5
- package/lib/module/components/text/Text.js.map +1 -1
- package/lib/module/components/toast/Toast.js +8 -8
- package/lib/module/components/toast/Toast.js.map +1 -1
- package/lib/module/components/toolbar/Toolbar.js +268 -0
- package/lib/module/components/toolbar/Toolbar.js.map +1 -0
- package/lib/module/components/toolbar/index.js +4 -0
- package/lib/module/components/toolbar/index.js.map +1 -0
- package/lib/module/context/ThemeProvider.js +5 -2
- package/lib/module/context/ThemeProvider.js.map +1 -1
- package/lib/module/{components/icon/utils.js → theme/defaults/icons.js} +1 -1
- package/lib/module/theme/defaults/icons.js.map +1 -0
- package/lib/module/theme/defaults/image.js +30 -0
- package/lib/module/theme/defaults/image.js.map +1 -0
- package/lib/module/theme/index.js +1 -1
- package/lib/module/theme/{configure.js → registry.js} +21 -28
- package/lib/module/theme/registry.js.map +1 -0
- package/lib/module/theme/runtime.js +1 -1
- package/lib/module/theme/theme.js +91 -10
- package/lib/module/theme/theme.js.map +1 -1
- package/lib/module/theme/tokens/dark.js +59 -68
- package/lib/module/theme/tokens/dark.js.map +1 -1
- package/lib/module/theme/tokens/light.js +49 -67
- package/lib/module/theme/tokens/light.js.map +1 -1
- package/lib/module/theme/tokens/primitives.js +241 -20
- package/lib/module/theme/tokens/primitives.js.map +1 -1
- package/lib/module/utils/accent-utils.js +4 -4
- package/lib/module/utils/accent-utils.js.map +1 -1
- package/lib/typescript/src/components/avatar/Avatar.d.ts.map +1 -1
- package/lib/typescript/src/components/avatar/types.d.ts +4 -4
- package/lib/typescript/src/components/avatar/types.d.ts.map +1 -1
- package/lib/typescript/src/components/box/Box.d.ts.map +1 -1
- package/lib/typescript/src/components/box/utils.d.ts +6 -1
- package/lib/typescript/src/components/box/utils.d.ts.map +1 -1
- package/lib/typescript/src/components/button/Button.d.ts +1 -1
- package/lib/typescript/src/components/button/Button.d.ts.map +1 -1
- package/lib/typescript/src/components/chip/Chip.d.ts +24 -0
- package/lib/typescript/src/components/chip/Chip.d.ts.map +1 -0
- package/lib/typescript/src/components/chip/index.d.ts +4 -0
- package/lib/typescript/src/components/chip/index.d.ts.map +1 -0
- package/lib/typescript/src/components/chip/types.d.ts +8 -0
- package/lib/typescript/src/components/chip/types.d.ts.map +1 -0
- package/lib/typescript/src/components/chip/utils.d.ts +8 -0
- package/lib/typescript/src/components/chip/utils.d.ts.map +1 -0
- package/lib/typescript/src/components/empty-state/EmptyState.d.ts +45 -0
- package/lib/typescript/src/components/empty-state/EmptyState.d.ts.map +1 -0
- package/lib/typescript/src/components/empty-state/index.d.ts +4 -0
- package/lib/typescript/src/components/empty-state/index.d.ts.map +1 -0
- package/lib/typescript/src/components/empty-state/types.d.ts +6 -0
- package/lib/typescript/src/components/empty-state/types.d.ts.map +1 -0
- package/lib/typescript/src/components/header/header-buttons.d.ts +27 -0
- package/lib/typescript/src/components/header/header-buttons.d.ts.map +1 -1
- package/lib/typescript/src/components/header/index.d.ts +1 -1
- package/lib/typescript/src/components/header/index.d.ts.map +1 -1
- package/lib/typescript/src/components/header/parts/HeaderGradientOverlay.d.ts +7 -0
- package/lib/typescript/src/components/header/parts/HeaderGradientOverlay.d.ts.map +1 -0
- package/lib/typescript/src/components/header/variants/LargeTitleHeader/index.d.ts +1 -1
- package/lib/typescript/src/components/header/variants/LargeTitleHeader/index.d.ts.map +1 -1
- package/lib/typescript/src/components/header/variants/TitleHeader/index.d.ts +18 -7
- package/lib/typescript/src/components/header/variants/TitleHeader/index.d.ts.map +1 -1
- package/lib/typescript/src/components/icon/Icon.d.ts.map +1 -1
- package/lib/typescript/src/components/image/Image.d.ts +16 -0
- package/lib/typescript/src/components/image/Image.d.ts.map +1 -0
- package/lib/typescript/src/components/image/index.d.ts +3 -0
- package/lib/typescript/src/components/image/index.d.ts.map +1 -0
- package/lib/typescript/src/components/image/types.d.ts +7 -0
- package/lib/typescript/src/components/image/types.d.ts.map +1 -0
- package/lib/typescript/src/components/index.d.ts +4 -0
- package/lib/typescript/src/components/index.d.ts.map +1 -1
- package/lib/typescript/src/components/portal/Portal.d.ts +26 -0
- package/lib/typescript/src/components/portal/Portal.d.ts.map +1 -0
- package/lib/typescript/src/components/portal/PortalContext.d.ts +11 -14
- package/lib/typescript/src/components/portal/PortalContext.d.ts.map +1 -1
- package/lib/typescript/src/components/portal/PortalHost.d.ts +9 -4
- package/lib/typescript/src/components/portal/PortalHost.d.ts.map +1 -1
- package/lib/typescript/src/components/portal/PortalProvider.d.ts +3 -3
- package/lib/typescript/src/components/portal/PortalProvider.d.ts.map +1 -1
- package/lib/typescript/src/components/portal/index.d.ts +4 -2
- package/lib/typescript/src/components/portal/index.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/Screen.d.ts +18 -13
- package/lib/typescript/src/components/screen/Screen.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/ScreenContext.d.ts +12 -9
- package/lib/typescript/src/components/screen/ScreenContext.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/ScreenFlashList.d.ts +43 -0
- package/lib/typescript/src/components/screen/ScreenFlashList.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/ScreenFlatList.d.ts +17 -7
- package/lib/typescript/src/components/screen/ScreenFlatList.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/ScreenScrollView.d.ts +51 -16
- package/lib/typescript/src/components/screen/ScreenScrollView.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/index.d.ts +3 -0
- package/lib/typescript/src/components/screen/index.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/parts/BottomSafeArea.d.ts +30 -0
- package/lib/typescript/src/components/screen/parts/BottomSafeArea.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/parts/ScreenPlaceholder.d.ts +22 -0
- package/lib/typescript/src/components/screen/parts/ScreenPlaceholder.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/types.d.ts +42 -0
- package/lib/typescript/src/components/screen/types.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/utils.d.ts +9 -9
- package/lib/typescript/src/components/screen/utils.d.ts.map +1 -1
- package/lib/typescript/src/components/surface/Surface.d.ts +7 -0
- package/lib/typescript/src/components/surface/Surface.d.ts.map +1 -1
- package/lib/typescript/src/components/text/Text.d.ts.map +1 -1
- package/lib/typescript/src/components/toolbar/Toolbar.d.ts +115 -0
- package/lib/typescript/src/components/toolbar/Toolbar.d.ts.map +1 -0
- package/lib/typescript/src/components/toolbar/index.d.ts +3 -0
- package/lib/typescript/src/components/toolbar/index.d.ts.map +1 -0
- package/lib/typescript/src/context/ThemeProvider.d.ts.map +1 -1
- package/lib/typescript/src/{components/icon/utils.d.ts → theme/defaults/icons.d.ts} +2 -2
- package/lib/typescript/src/theme/defaults/icons.d.ts.map +1 -0
- package/lib/typescript/src/theme/defaults/image.d.ts +4 -0
- package/lib/typescript/src/theme/defaults/image.d.ts.map +1 -0
- package/lib/typescript/src/theme/index.d.ts +1 -1
- package/lib/typescript/src/theme/index.d.ts.map +1 -1
- package/lib/typescript/src/theme/{configure.d.ts → registry.d.ts} +1 -1
- package/lib/typescript/src/theme/registry.d.ts.map +1 -0
- package/lib/typescript/src/theme/theme.d.ts +21 -1
- package/lib/typescript/src/theme/theme.d.ts.map +1 -1
- package/lib/typescript/src/theme/tokens/dark.d.ts +41 -64
- package/lib/typescript/src/theme/tokens/dark.d.ts.map +1 -1
- package/lib/typescript/src/theme/tokens/light.d.ts +44 -65
- package/lib/typescript/src/theme/tokens/light.d.ts.map +1 -1
- package/lib/typescript/src/theme/tokens/primitives.d.ts +228 -17
- package/lib/typescript/src/theme/tokens/primitives.d.ts.map +1 -1
- package/lib/typescript/src/theme/types.d.ts +65 -35
- package/lib/typescript/src/theme/types.d.ts.map +1 -1
- package/package.json +24 -12
- package/skills/terra-ui/SKILL.md +193 -0
- package/skills/terra-ui/references/recipes.md +198 -0
- package/skills/terra-ui/references/troubleshooting.md +112 -0
- package/src/components/avatar/Avatar.tsx +128 -38
- package/src/components/avatar/types.ts +5 -5
- package/src/components/box/Box.tsx +13 -1
- package/src/components/box/utils.ts +10 -0
- package/src/components/button/Button.tsx +7 -15
- package/src/components/chip/Chip.tsx +444 -0
- package/src/components/chip/index.ts +3 -0
- package/src/components/chip/types.ts +15 -0
- package/src/components/chip/utils.ts +34 -0
- package/src/components/empty-state/EmptyState.tsx +209 -0
- package/src/components/empty-state/index.ts +3 -0
- package/src/components/empty-state/types.ts +5 -0
- package/src/components/header/header-buttons.tsx +33 -45
- package/src/components/header/index.ts +2 -0
- package/src/components/header/parts/HeaderGradientOverlay.tsx +29 -0
- package/src/components/header/variants/LargeTitleHeader/index.tsx +68 -102
- package/src/components/header/variants/TitleHeader/index.tsx +47 -56
- package/src/components/icon/Icon.tsx +20 -15
- package/src/components/image/Image.tsx +48 -0
- package/src/components/image/index.ts +2 -0
- package/src/components/image/types.ts +7 -0
- package/src/components/index.ts +4 -0
- package/src/components/portal/Portal.tsx +55 -0
- package/src/components/portal/PortalContext.tsx +14 -22
- package/src/components/portal/PortalHost.tsx +17 -10
- package/src/components/portal/PortalProvider.tsx +58 -21
- package/src/components/portal/index.ts +4 -2
- package/src/components/screen/Screen.tsx +45 -59
- package/src/components/screen/ScreenContext.tsx +19 -12
- package/src/components/screen/ScreenFlashList.tsx +196 -0
- package/src/components/screen/ScreenFlatList.tsx +100 -39
- package/src/components/screen/ScreenScrollView.tsx +114 -53
- package/src/components/screen/index.ts +3 -0
- package/src/components/screen/parts/BottomSafeArea.tsx +60 -0
- package/src/components/screen/parts/ScreenPlaceholder.tsx +55 -0
- package/src/components/screen/types.ts +43 -0
- package/src/components/screen/utils.ts +29 -15
- package/src/components/surface/Surface.tsx +17 -20
- package/src/components/text/Text.tsx +23 -5
- package/src/components/toast/Toast.tsx +8 -8
- package/src/components/toolbar/Toolbar.tsx +353 -0
- package/src/components/toolbar/index.ts +6 -0
- package/src/context/ThemeProvider.tsx +5 -4
- package/src/{components/icon/utils.tsx → theme/defaults/icons.tsx} +1 -1
- package/src/theme/defaults/image.tsx +34 -0
- package/src/theme/index.ts +1 -1
- package/src/theme/{configure.ts → registry.ts} +19 -34
- package/src/theme/runtime.ts +1 -1
- package/src/theme/theme.ts +127 -13
- package/src/theme/tokens/dark.ts +60 -69
- package/src/theme/tokens/light.ts +50 -68
- package/src/theme/tokens/primitives.ts +248 -20
- package/src/theme/types.ts +67 -35
- package/src/utils/accent-utils.ts +4 -4
- package/lib/module/components/icon/utils.js.map +0 -1
- package/lib/module/theme/configure.js.map +0 -1
- package/lib/typescript/src/components/icon/utils.d.ts.map +0 -1
- package/lib/typescript/src/theme/configure.d.ts.map +0 -1
package/src/theme/theme.ts
CHANGED
|
@@ -4,7 +4,9 @@ import { dark } from './tokens/dark';
|
|
|
4
4
|
import { light } from './tokens/light';
|
|
5
5
|
import { primitives } from './tokens/primitives';
|
|
6
6
|
import type {
|
|
7
|
+
ElevationKey,
|
|
7
8
|
ElevationScale,
|
|
9
|
+
ElevationStyle,
|
|
8
10
|
LayoutTokens,
|
|
9
11
|
OpacityTokens,
|
|
10
12
|
RadiusKey,
|
|
@@ -14,9 +16,27 @@ import type {
|
|
|
14
16
|
Typography,
|
|
15
17
|
} from './types';
|
|
16
18
|
|
|
19
|
+
// Matches `{palette.key}/NN` — a palette reference with a trailing NN%
|
|
20
|
+
// opacity suffix (0-100), e.g. `{palette.amber.500}/15`.
|
|
21
|
+
const ALPHA_REF_PATTERN = /^\{([\w.]+)\}\/(\d{1,3})$/;
|
|
22
|
+
// Matches a bare `#rrggbb` hex color (the only shape palette primitives use).
|
|
23
|
+
const HEX6_PATTERN = /^#[0-9a-f]{6}$/i;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Converts a 0-100 percentage into a two-digit hex alpha byte, e.g. 15 -> '26'.
|
|
27
|
+
*/
|
|
28
|
+
function percentToHexAlpha(percent: number): string {
|
|
29
|
+
const byte = Math.round((percent / 100) * 255);
|
|
30
|
+
return byte.toString(16).padStart(2, '0');
|
|
31
|
+
}
|
|
32
|
+
|
|
17
33
|
/**
|
|
18
34
|
* Resolves {palette.key} reference notation against a source flat-token map.
|
|
19
|
-
*
|
|
35
|
+
* Also resolves {palette.key}/NN, which appends an NN% opacity alpha byte to
|
|
36
|
+
* the referenced hex color (the referenced value must be a plain #rrggbb hex
|
|
37
|
+
* - `/NN` is not supported on raw hex/rgba literals). Non-reference values
|
|
38
|
+
* pass through unchanged; a reference that can't be resolved this way is
|
|
39
|
+
* left as-is.
|
|
20
40
|
*/
|
|
21
41
|
function resolveRefs(
|
|
22
42
|
flat: Record<string, unknown>,
|
|
@@ -24,10 +44,28 @@ function resolveRefs(
|
|
|
24
44
|
): Record<string, unknown> {
|
|
25
45
|
const out: Record<string, unknown> = {};
|
|
26
46
|
for (const [k, v] of Object.entries(flat)) {
|
|
47
|
+
if (typeof v !== 'string') {
|
|
48
|
+
out[k] = v;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const alphaMatch = v.match(ALPHA_REF_PATTERN);
|
|
53
|
+
if (alphaMatch) {
|
|
54
|
+
// Both groups are guaranteed by ALPHA_REF_PATTERN when it matches;
|
|
55
|
+
// `noUncheckedIndexedAccess` just can't see that from a regex literal.
|
|
56
|
+
const refKey = alphaMatch[1] as string;
|
|
57
|
+
const percentStr = alphaMatch[2] as string;
|
|
58
|
+
const base = source[refKey];
|
|
59
|
+
const percent = Number(percentStr);
|
|
60
|
+
out[k] =
|
|
61
|
+
typeof base === 'string' && HEX6_PATTERN.test(base)
|
|
62
|
+
? `${base}${percentToHexAlpha(percent)}`
|
|
63
|
+
: v;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
|
|
27
67
|
out[k] =
|
|
28
|
-
|
|
29
|
-
? (source[v.slice(1, -1)] ?? v)
|
|
30
|
-
: v;
|
|
68
|
+
v.startsWith('{') && v.endsWith('}') ? (source[v.slice(1, -1)] ?? v) : v;
|
|
31
69
|
}
|
|
32
70
|
return out;
|
|
33
71
|
}
|
|
@@ -61,16 +99,19 @@ function flattenByCategory(
|
|
|
61
99
|
* Scheme-agnostic primitives, rebuilt once from the flat token data. Shared by
|
|
62
100
|
* both default themes (matching the previous behavior where spacing / radius /
|
|
63
101
|
* typography were singleton constants). `palette` is present at runtime for
|
|
64
|
-
* Figma parity but is not part of {@link TerraTheme}. Only the radius BASE
|
|
65
|
-
* authored here (`radius.base`); the full
|
|
66
|
-
* {@link buildRadiusScale}.
|
|
102
|
+
* Figma parity but is not part of {@link TerraTheme}. Only the radius BASE and
|
|
103
|
+
* spacing BASE are authored here (`radius.base`, `spacing.base`); the full
|
|
104
|
+
* scales are derived via {@link buildRadiusScale} / {@link buildSpacingScale}.
|
|
105
|
+
* `elevation` excludes `shadowColor`, which is layered on per-scheme from each
|
|
106
|
+
* theme's `color.shadow` token (see {@link withShadowColor}).
|
|
67
107
|
*/
|
|
68
108
|
const prim = unflatten<{
|
|
69
|
-
spacing:
|
|
109
|
+
spacing: { base: number };
|
|
70
110
|
radius: { base: number };
|
|
71
111
|
typography: Typography;
|
|
72
112
|
opacity: OpacityTokens;
|
|
73
113
|
layout: LayoutTokens;
|
|
114
|
+
elevation: Record<ElevationKey, Omit<ElevationStyle, 'shadowColor'>>;
|
|
74
115
|
}>(primitives);
|
|
75
116
|
|
|
76
117
|
/**
|
|
@@ -82,6 +123,57 @@ const prim = unflatten<{
|
|
|
82
123
|
*/
|
|
83
124
|
export const DEFAULT_RADIUS_BASE = prim.radius.base;
|
|
84
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Every {@link SpacingKey} — its own numeric value IS the multiplier applied
|
|
128
|
+
* to the base unit (e.g. `'5'` → `5 × base`), so no separate multiplier table
|
|
129
|
+
* is needed the way {@link RADIUS_MULTIPLIERS} is for radius.
|
|
130
|
+
*/
|
|
131
|
+
export const SPACING_KEYS: SpacingKey[] = [
|
|
132
|
+
'0',
|
|
133
|
+
'1',
|
|
134
|
+
'2',
|
|
135
|
+
'3',
|
|
136
|
+
'4',
|
|
137
|
+
'5',
|
|
138
|
+
'6',
|
|
139
|
+
'7',
|
|
140
|
+
'8',
|
|
141
|
+
'9',
|
|
142
|
+
'10',
|
|
143
|
+
'12',
|
|
144
|
+
'14',
|
|
145
|
+
'16',
|
|
146
|
+
'20',
|
|
147
|
+
'24',
|
|
148
|
+
'32',
|
|
149
|
+
];
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Default spacing base unit (dp) — taken from the `spacing.base` primitive.
|
|
153
|
+
* The rest of the scale is derived from it (each step's value is its key
|
|
154
|
+
* multiplied by this base); override at runtime with
|
|
155
|
+
* `configureTerraUI({ shared: { spacing: { base } } })`, or change the
|
|
156
|
+
* `spacing.base` token.
|
|
157
|
+
*/
|
|
158
|
+
export const DEFAULT_SPACING_BASE = prim.spacing.base;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Builds the full spacing scale from a single base value. Each step's value is
|
|
162
|
+
* its key multiplied by `base` — no outliers needed, since `'0'` naturally
|
|
163
|
+
* resolves to `0` for any base.
|
|
164
|
+
*/
|
|
165
|
+
export function buildSpacingScale(
|
|
166
|
+
base: number = DEFAULT_SPACING_BASE
|
|
167
|
+
): Record<SpacingKey, number> {
|
|
168
|
+
const scale = {} as Record<SpacingKey, number>;
|
|
169
|
+
for (const key of SPACING_KEYS) {
|
|
170
|
+
scale[key] = Number(key) * base;
|
|
171
|
+
}
|
|
172
|
+
return scale;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const defaultSpacing = buildSpacingScale();
|
|
176
|
+
|
|
85
177
|
/**
|
|
86
178
|
* Per-token multipliers applied to the base radius (DaisyUI-style). `none` (0)
|
|
87
179
|
* and `full` (9999) are fixed and not scaled.
|
|
@@ -120,21 +212,43 @@ const defaultRadius = buildRadiusScale();
|
|
|
120
212
|
const lightByCategory = flattenByCategory(resolveRefs(light, primitives));
|
|
121
213
|
const darkByCategory = flattenByCategory(resolveRefs(dark, primitives));
|
|
122
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Fills in each elevation level's `shadowColor` from the theme's `color.shadow`
|
|
217
|
+
* token, rather than authoring it redundantly on every level in `light.ts` /
|
|
218
|
+
* `dark.ts`.
|
|
219
|
+
*/
|
|
220
|
+
function withShadowColor(
|
|
221
|
+
elevation: Record<ElevationKey, Omit<ElevationStyle, 'shadowColor'>>,
|
|
222
|
+
shadowColor: string
|
|
223
|
+
): ElevationScale {
|
|
224
|
+
const out = {} as ElevationScale;
|
|
225
|
+
for (const key of Object.keys(elevation) as ElevationKey[]) {
|
|
226
|
+
out[key] = { ...elevation[key], shadowColor };
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
230
|
+
|
|
123
231
|
// color: flat map — accessed as theme.color['action.bg.primary.hover']
|
|
124
|
-
// elevation:
|
|
232
|
+
// elevation: shared shape from primitives, shadowColor layered on per scheme
|
|
125
233
|
const lightTokens = {
|
|
126
234
|
color: lightByCategory.color as unknown as ThemeColor,
|
|
127
|
-
elevation:
|
|
235
|
+
elevation: withShadowColor(
|
|
236
|
+
prim.elevation,
|
|
237
|
+
(lightByCategory.color as unknown as ThemeColor).shadow
|
|
238
|
+
),
|
|
128
239
|
};
|
|
129
240
|
const darkTokens = {
|
|
130
241
|
color: darkByCategory.color as unknown as ThemeColor,
|
|
131
|
-
elevation:
|
|
242
|
+
elevation: withShadowColor(
|
|
243
|
+
prim.elevation,
|
|
244
|
+
(darkByCategory.color as unknown as ThemeColor).shadow
|
|
245
|
+
),
|
|
132
246
|
};
|
|
133
247
|
|
|
134
248
|
export const defaultLightTheme: TerraTheme = {
|
|
135
249
|
color: lightTokens.color,
|
|
136
250
|
elevation: lightTokens.elevation,
|
|
137
|
-
spacing:
|
|
251
|
+
spacing: defaultSpacing,
|
|
138
252
|
radius: defaultRadius,
|
|
139
253
|
typography: prim.typography,
|
|
140
254
|
opacity: prim.opacity,
|
|
@@ -144,7 +258,7 @@ export const defaultLightTheme: TerraTheme = {
|
|
|
144
258
|
export const defaultDarkTheme: TerraTheme = {
|
|
145
259
|
color: darkTokens.color,
|
|
146
260
|
elevation: darkTokens.elevation,
|
|
147
|
-
spacing:
|
|
261
|
+
spacing: defaultSpacing,
|
|
148
262
|
radius: defaultRadius,
|
|
149
263
|
typography: prim.typography,
|
|
150
264
|
opacity: prim.opacity,
|
package/src/theme/tokens/dark.ts
CHANGED
|
@@ -9,6 +9,9 @@ export const dark = {
|
|
|
9
9
|
// ── color: page background ────────────────────────────────────────────────
|
|
10
10
|
'color.background': '{palette.neutral.950}',
|
|
11
11
|
|
|
12
|
+
// ── color: shadow (used as elevation.*.shadowColor) ───────────────────────
|
|
13
|
+
'color.shadow': '#000000',
|
|
14
|
+
|
|
12
15
|
// ── color: surfaces (bg implied — no property segment) ──────────────────
|
|
13
16
|
'color.surface.default': '{palette.neutral.900}',
|
|
14
17
|
'color.surface.raised': '{palette.neutral.800}',
|
|
@@ -19,9 +22,14 @@ export const dark = {
|
|
|
19
22
|
|
|
20
23
|
// ── color: text / icons (fg implied — no property segment) ──────────────
|
|
21
24
|
'color.text.default': '{palette.neutral.50}',
|
|
22
|
-
'
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
// Off-ramp hexes (like light's) rather than neutral.400/500/600: the ramp
|
|
26
|
+
// steps are tuned for dark text on white, and reused as light text they land
|
|
27
|
+
// too dim. Set so `subtle` clears AA 4.5:1 on `surface.raised` — the lightest
|
|
28
|
+
// surface, so the worst case — which keeps the muted/subtle/disabled spacing
|
|
29
|
+
// proportional to light's.
|
|
30
|
+
'color.text.muted': '#b8b8be',
|
|
31
|
+
'color.text.subtle': '#8d8d96',
|
|
32
|
+
'color.text.disabled': '#606069',
|
|
25
33
|
'color.text.inverse': '{palette.neutral.950}',
|
|
26
34
|
'color.text.link': '{palette.blue.300}',
|
|
27
35
|
'color.text.accent': '{palette.emerald.400}',
|
|
@@ -42,76 +50,59 @@ export const dark = {
|
|
|
42
50
|
'color.action.bg.primary.disabled': '{palette.slate.700}',
|
|
43
51
|
'color.action.fg.primary': '{palette.slate.950}',
|
|
44
52
|
|
|
45
|
-
'color.action.bg.subtle': '{palette.emerald.950}',
|
|
46
|
-
'color.action.bg.subtle.hover': '{palette.emerald.900}',
|
|
47
|
-
'color.action.bg.subtle.active': '{palette.emerald.800}',
|
|
48
|
-
'color.action.bg.subtle.disabled': '{palette.neutral.900}',
|
|
49
|
-
'color.action.fg.subtle': '{palette.emerald.300}',
|
|
53
|
+
'color.action.bg.primary.subtle': '{palette.emerald.950}',
|
|
54
|
+
'color.action.bg.primary.subtle.hover': '{palette.emerald.900}',
|
|
55
|
+
'color.action.bg.primary.subtle.active': '{palette.emerald.800}',
|
|
56
|
+
'color.action.bg.primary.subtle.disabled': '{palette.neutral.900}',
|
|
57
|
+
'color.action.fg.primary.subtle': '{palette.emerald.300}',
|
|
50
58
|
|
|
51
|
-
'
|
|
52
|
-
'
|
|
53
|
-
|
|
54
|
-
'color.action.bg.
|
|
55
|
-
'color.action.fg.
|
|
59
|
+
// `secondary`'s resting fill/text — used by Avatar/Chip's `secondary` color
|
|
60
|
+
// and Button/Toast's neutral-emphasis look; sized for real separation
|
|
61
|
+
// against `color.background` (neutral.950).
|
|
62
|
+
'color.action.bg.secondary': '{palette.neutral.600}',
|
|
63
|
+
'color.action.fg.secondary': '{palette.neutral.50}',
|
|
64
|
+
// Translucent, like light's — and like the status schemes' `/30` fills above.
|
|
65
|
+
// As opaque neutral.800 this was exactly `surface.raised`, so a soft
|
|
66
|
+
// secondary Chip/Button vanished on a raised card (1.00:1), and its opaque
|
|
67
|
+
// neutral.700 hover was indistinguishable from the resting fill there. An
|
|
68
|
+
// overlay lightens whatever it sits on, so the fill separates on all three
|
|
69
|
+
// surfaces (1.49-1.59:1, matching the success/warning chips).
|
|
70
|
+
'color.action.bg.secondary.subtle': '{palette.neutral.400}/25',
|
|
71
|
+
'color.action.bg.secondary.subtle.hover': '{palette.neutral.400}/35',
|
|
72
|
+
'color.action.bg.secondary.subtle.active': '{palette.neutral.400}/45',
|
|
73
|
+
'color.action.bg.secondary.subtle.disabled': '{palette.neutral.900}',
|
|
74
|
+
'color.action.fg.secondary.subtle': '{palette.neutral.200}',
|
|
56
75
|
|
|
57
76
|
// ── color: status (bg + fg + border → property required) ────────────────
|
|
58
|
-
'color.status.
|
|
59
|
-
'color.status.
|
|
60
|
-
'color.status.
|
|
61
|
-
'color.status.
|
|
62
|
-
'color.status.
|
|
63
|
-
'color.status.
|
|
64
|
-
|
|
65
|
-
'color.status.bg.warning': '{palette.amber.400}',
|
|
66
|
-
'color.status.bg.warning.subtle': '{palette.amber.900}',
|
|
67
|
-
'color.status.border.warning': '{palette.amber.700}',
|
|
68
|
-
'color.status.border.warning.subtle': '{palette.amber.800}',
|
|
69
|
-
'color.status.fg.warning': '{palette.slate.950}',
|
|
70
|
-
'color.status.fg.warning.subtle': '{palette.amber.200}',
|
|
77
|
+
'color.status.success': '{palette.green.600}',
|
|
78
|
+
'color.status.success.bg': '{palette.green.600}',
|
|
79
|
+
'color.status.success.bg.subtle': '{palette.green.600}/30',
|
|
80
|
+
'color.status.success.border': '{palette.green.700}',
|
|
81
|
+
'color.status.success.border.subtle': '{palette.green.800}',
|
|
82
|
+
'color.status.success.fg': '{palette.white}',
|
|
83
|
+
'color.status.success.fg.subtle': '{palette.green.200}',
|
|
71
84
|
|
|
72
|
-
'color.status.
|
|
73
|
-
'color.status.bg
|
|
74
|
-
'color.status.
|
|
75
|
-
'color.status.border
|
|
76
|
-
'color.status.
|
|
77
|
-
'color.status.fg
|
|
85
|
+
'color.status.warning': '{palette.yellow.600}',
|
|
86
|
+
'color.status.warning.bg': '{palette.yellow.600}',
|
|
87
|
+
'color.status.warning.bg.subtle': '{palette.yellow.600}/30',
|
|
88
|
+
'color.status.warning.border': '{palette.yellow.700}',
|
|
89
|
+
'color.status.warning.border.subtle': '{palette.yellow.800}',
|
|
90
|
+
'color.status.warning.fg': '{palette.white}',
|
|
91
|
+
'color.status.warning.fg.subtle': '{palette.yellow.200}',
|
|
78
92
|
|
|
79
|
-
'color.status.
|
|
80
|
-
'color.status.bg
|
|
81
|
-
'color.status.
|
|
82
|
-
'color.status.border
|
|
83
|
-
'color.status.
|
|
84
|
-
'color.status.fg
|
|
93
|
+
'color.status.danger': '{palette.red.700}',
|
|
94
|
+
'color.status.danger.bg': '{palette.red.700}',
|
|
95
|
+
'color.status.danger.bg.subtle': '{palette.red.700}/30',
|
|
96
|
+
'color.status.danger.border': '{palette.red.800}',
|
|
97
|
+
'color.status.danger.border.subtle': '{palette.red.900}',
|
|
98
|
+
'color.status.danger.fg': '{palette.white}',
|
|
99
|
+
'color.status.danger.fg.subtle': '{palette.red.200}',
|
|
85
100
|
|
|
86
|
-
|
|
87
|
-
'
|
|
88
|
-
'
|
|
89
|
-
'
|
|
90
|
-
'
|
|
91
|
-
'
|
|
92
|
-
'
|
|
93
|
-
'elevation.sm.shadowColor': '#000000',
|
|
94
|
-
'elevation.sm.shadowOpacity': 0.3,
|
|
95
|
-
'elevation.sm.shadowRadius': 2,
|
|
96
|
-
'elevation.sm.shadowOffset.width': 0,
|
|
97
|
-
'elevation.sm.shadowOffset.height': 1,
|
|
98
|
-
'elevation.sm.elevation': 1,
|
|
99
|
-
'elevation.md.shadowColor': '#000000',
|
|
100
|
-
'elevation.md.shadowOpacity': 0.4,
|
|
101
|
-
'elevation.md.shadowRadius': 6,
|
|
102
|
-
'elevation.md.shadowOffset.width': 0,
|
|
103
|
-
'elevation.md.shadowOffset.height': 2,
|
|
104
|
-
'elevation.md.elevation': 3,
|
|
105
|
-
'elevation.lg.shadowColor': '#000000',
|
|
106
|
-
'elevation.lg.shadowOpacity': 0.5,
|
|
107
|
-
'elevation.lg.shadowRadius': 12,
|
|
108
|
-
'elevation.lg.shadowOffset.width': 0,
|
|
109
|
-
'elevation.lg.shadowOffset.height': 4,
|
|
110
|
-
'elevation.lg.elevation': 6,
|
|
111
|
-
'elevation.xl.shadowColor': '#000000',
|
|
112
|
-
'elevation.xl.shadowOpacity': 0.6,
|
|
113
|
-
'elevation.xl.shadowRadius': 24,
|
|
114
|
-
'elevation.xl.shadowOffset.width': 0,
|
|
115
|
-
'elevation.xl.shadowOffset.height': 8,
|
|
116
|
-
'elevation.xl.elevation': 12,
|
|
101
|
+
'color.status.info': '{palette.sky.500}',
|
|
102
|
+
'color.status.info.bg': '{palette.sky.500}',
|
|
103
|
+
'color.status.info.bg.subtle': '{palette.sky.950}',
|
|
104
|
+
'color.status.info.border': '{palette.sky.800}',
|
|
105
|
+
'color.status.info.border.subtle': '{palette.sky.900}',
|
|
106
|
+
'color.status.info.fg': '{palette.slate.950}',
|
|
107
|
+
'color.status.info.fg.subtle': '{palette.sky.200}',
|
|
117
108
|
};
|
|
@@ -6,14 +6,19 @@
|
|
|
6
6
|
* - property is required when a context carries multiple attributes (action, status)
|
|
7
7
|
*
|
|
8
8
|
* Values use {palette.key} reference notation, resolved against primitives at
|
|
9
|
-
* build time via resolveRefs() in theme.ts.
|
|
9
|
+
* build time via resolveRefs() in theme.ts. {palette.key}/NN resolves the
|
|
10
|
+
* referenced #rrggbb hex with an NN% opacity byte appended (e.g.
|
|
11
|
+
* {palette.amber.500}/15 -> '#fe9a0026'). Raw hex is used only where no
|
|
10
12
|
* palette step matches exactly.
|
|
11
13
|
*
|
|
12
14
|
* GENERATED-STYLE SOURCE: intended to be replaced by the Figma / design-sync export.
|
|
13
15
|
*/
|
|
14
16
|
export const light = {
|
|
15
17
|
// ── color: page background ────────────────────────────────────────────────
|
|
16
|
-
'color.background': '#
|
|
18
|
+
'color.background': '#fbfbfb',
|
|
19
|
+
|
|
20
|
+
// ── color: shadow (used as elevation.*.shadowColor) ───────────────────────
|
|
21
|
+
'color.shadow': '#000000',
|
|
17
22
|
|
|
18
23
|
// ── color: surfaces (bg implied — no property segment) ──────────────────
|
|
19
24
|
'color.surface.default': '{palette.white}',
|
|
@@ -48,76 +53,53 @@ export const light = {
|
|
|
48
53
|
'color.action.bg.primary.disabled': '{palette.slate.200}',
|
|
49
54
|
'color.action.fg.primary': '{palette.white}',
|
|
50
55
|
|
|
51
|
-
'color.action.bg.subtle': '{palette.emerald.100}',
|
|
52
|
-
'color.action.bg.subtle.hover': '{palette.emerald.200}',
|
|
53
|
-
'color.action.bg.subtle.active': '{palette.emerald.300}',
|
|
54
|
-
'color.action.bg.subtle.disabled': '{palette.slate.100}',
|
|
55
|
-
'color.action.fg.subtle': '{palette.emerald.700}',
|
|
56
|
+
'color.action.bg.primary.subtle': '{palette.emerald.100}',
|
|
57
|
+
'color.action.bg.primary.subtle.hover': '{palette.emerald.200}',
|
|
58
|
+
'color.action.bg.primary.subtle.active': '{palette.emerald.300}',
|
|
59
|
+
'color.action.bg.primary.subtle.disabled': '{palette.slate.100}',
|
|
60
|
+
'color.action.fg.primary.subtle': '{palette.emerald.700}',
|
|
56
61
|
|
|
57
|
-
'
|
|
58
|
-
'
|
|
59
|
-
|
|
60
|
-
'color.action.bg.
|
|
61
|
-
'color.action.fg.
|
|
62
|
+
// `secondary`'s resting fill/text — used by Avatar/Chip's `secondary` color
|
|
63
|
+
// and Button/Toast's neutral-emphasis look; sized for real separation
|
|
64
|
+
// against `color.background` (#f9f9fb), not just a tint.
|
|
65
|
+
'color.action.bg.secondary': '{palette.neutral.200}',
|
|
66
|
+
'color.action.fg.secondary': '{palette.neutral.900}',
|
|
67
|
+
'color.action.bg.secondary.subtle': '{palette.neutral.400}/15',
|
|
68
|
+
'color.action.bg.secondary.subtle.hover': '{palette.neutral.400}/25',
|
|
69
|
+
'color.action.bg.secondary.subtle.active': '{palette.neutral.400}/35',
|
|
70
|
+
'color.action.bg.secondary.subtle.disabled': '{palette.slate.100}',
|
|
71
|
+
'color.action.fg.secondary.subtle': '{palette.neutral.700}',
|
|
62
72
|
|
|
63
73
|
// ── color: status (bg + fg + border → property required) ────────────────
|
|
64
|
-
'color.status.
|
|
65
|
-
'color.status.
|
|
66
|
-
'color.status.
|
|
67
|
-
'color.status.
|
|
68
|
-
'color.status.
|
|
69
|
-
'color.status.
|
|
70
|
-
|
|
71
|
-
'color.status.bg.warning': '{palette.amber.500}',
|
|
72
|
-
'color.status.bg.warning.subtle': '{palette.amber.100}',
|
|
73
|
-
'color.status.border.warning': '{palette.amber.300}',
|
|
74
|
-
'color.status.border.warning.subtle': '{palette.amber.200}',
|
|
75
|
-
'color.status.fg.warning': '{palette.slate.950}',
|
|
76
|
-
'color.status.fg.warning.subtle': '{palette.amber.800}',
|
|
74
|
+
'color.status.success': '{palette.green.600}',
|
|
75
|
+
'color.status.success.bg': '{palette.green.600}',
|
|
76
|
+
'color.status.success.bg.subtle': '{palette.green.600}/20',
|
|
77
|
+
'color.status.success.border': '{palette.green.300}',
|
|
78
|
+
'color.status.success.border.subtle': '{palette.green.200}',
|
|
79
|
+
'color.status.success.fg': '{palette.white}',
|
|
80
|
+
'color.status.success.fg.subtle': '{palette.green.800}',
|
|
77
81
|
|
|
78
|
-
'color.status.
|
|
79
|
-
'color.status.bg
|
|
80
|
-
'color.status.
|
|
81
|
-
'color.status.border
|
|
82
|
-
'color.status.
|
|
83
|
-
'color.status.fg
|
|
82
|
+
'color.status.warning': '{palette.yellow.500}',
|
|
83
|
+
'color.status.warning.bg': '{palette.yellow.500}',
|
|
84
|
+
'color.status.warning.bg.subtle': '{palette.yellow.500}/20',
|
|
85
|
+
'color.status.warning.border': '{palette.yellow.300}',
|
|
86
|
+
'color.status.warning.border.subtle': '{palette.yellow.200}',
|
|
87
|
+
'color.status.warning.fg': '{palette.slate.950}',
|
|
88
|
+
'color.status.warning.fg.subtle': '{palette.yellow.800}',
|
|
84
89
|
|
|
85
|
-
'color.status.
|
|
86
|
-
'color.status.bg
|
|
87
|
-
'color.status.
|
|
88
|
-
'color.status.border
|
|
89
|
-
'color.status.
|
|
90
|
-
'color.status.fg
|
|
90
|
+
'color.status.danger': '{palette.red.400}',
|
|
91
|
+
'color.status.danger.bg': '{palette.red.400}',
|
|
92
|
+
'color.status.danger.bg.subtle': '{palette.red.500}/20',
|
|
93
|
+
'color.status.danger.border': '{palette.red.500}',
|
|
94
|
+
'color.status.danger.border.subtle': '{palette.red.200}',
|
|
95
|
+
'color.status.danger.fg': '{palette.white}',
|
|
96
|
+
'color.status.danger.fg.subtle': '{palette.red.800}',
|
|
91
97
|
|
|
92
|
-
|
|
93
|
-
'
|
|
94
|
-
'
|
|
95
|
-
'
|
|
96
|
-
'
|
|
97
|
-
'
|
|
98
|
-
'
|
|
99
|
-
'elevation.sm.shadowColor': '#000000',
|
|
100
|
-
'elevation.sm.shadowOpacity': 0.1,
|
|
101
|
-
'elevation.sm.shadowRadius': 3,
|
|
102
|
-
'elevation.sm.shadowOffset.width': 0,
|
|
103
|
-
'elevation.sm.shadowOffset.height': 1,
|
|
104
|
-
'elevation.sm.elevation': 1,
|
|
105
|
-
'elevation.md.shadowColor': '#000000',
|
|
106
|
-
'elevation.md.shadowOpacity': 0.12,
|
|
107
|
-
'elevation.md.shadowRadius': 8,
|
|
108
|
-
'elevation.md.shadowOffset.width': 0,
|
|
109
|
-
'elevation.md.shadowOffset.height': 2,
|
|
110
|
-
'elevation.md.elevation': 3,
|
|
111
|
-
'elevation.lg.shadowColor': '#000000',
|
|
112
|
-
'elevation.lg.shadowOpacity': 0.12,
|
|
113
|
-
'elevation.lg.shadowRadius': 12,
|
|
114
|
-
'elevation.lg.shadowOffset.width': 0,
|
|
115
|
-
'elevation.lg.shadowOffset.height': 4,
|
|
116
|
-
'elevation.lg.elevation': 6,
|
|
117
|
-
'elevation.xl.shadowColor': '#000000',
|
|
118
|
-
'elevation.xl.shadowOpacity': 0.16,
|
|
119
|
-
'elevation.xl.shadowRadius': 24,
|
|
120
|
-
'elevation.xl.shadowOffset.width': 0,
|
|
121
|
-
'elevation.xl.shadowOffset.height': 8,
|
|
122
|
-
'elevation.xl.elevation': 12,
|
|
98
|
+
'color.status.info': '{palette.sky.600}',
|
|
99
|
+
'color.status.info.bg': '{palette.sky.600}',
|
|
100
|
+
'color.status.info.bg.subtle': '{palette.sky.100}',
|
|
101
|
+
'color.status.info.border': '{palette.sky.300}',
|
|
102
|
+
'color.status.info.border.subtle': '{palette.sky.200}',
|
|
103
|
+
'color.status.info.fg': '{palette.white}',
|
|
104
|
+
'color.status.info.fg.subtle': '{palette.sky.800}',
|
|
123
105
|
};
|