react-native-terra-ui 0.7.2 → 0.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 +34 -0
- package/README.md +1 -1
- package/lib/module/components/avatar/Avatar.js +20 -20
- package/lib/module/components/avatar/Avatar.js.map +1 -1
- package/lib/module/components/button/Button.js +11 -11
- package/lib/module/components/button/Button.js.map +1 -1
- package/lib/module/components/chip/Chip.js +32 -32
- package/lib/module/components/chip/Chip.js.map +1 -1
- package/lib/module/components/empty-state/EmptyState.js +3 -3
- package/lib/module/components/empty-state/EmptyState.js.map +1 -1
- package/lib/module/components/header/variants/LargeTitleHeader/index.js +30 -32
- package/lib/module/components/header/variants/LargeTitleHeader/index.js.map +1 -1
- package/lib/module/components/header/variants/TitleHeader/index.js +26 -18
- package/lib/module/components/header/variants/TitleHeader/index.js.map +1 -1
- package/lib/module/components/icon/Icon.js +3 -3
- package/lib/module/components/page-indicator/hooks/use-page-indicator-colors.js +2 -2
- package/lib/module/components/screen/Screen.js +63 -34
- package/lib/module/components/screen/Screen.js.map +1 -1
- package/lib/module/components/screen/ScreenContext.js +28 -9
- package/lib/module/components/screen/ScreenContext.js.map +1 -1
- package/lib/module/components/screen/ScreenFlatList.js +4 -162
- package/lib/module/components/screen/ScreenFlatList.js.map +1 -1
- package/lib/module/components/screen/ScreenList.js +81 -97
- package/lib/module/components/screen/ScreenList.js.map +1 -1
- package/lib/module/components/screen/ScreenScrollView.js +64 -115
- package/lib/module/components/screen/ScreenScrollView.js.map +1 -1
- package/lib/module/components/screen/hooks/use-screen-ref.js +18 -0
- package/lib/module/components/screen/hooks/use-screen-ref.js.map +1 -0
- package/lib/module/components/screen/hooks/use-screen-scroll-handler.js +19 -0
- package/lib/module/components/screen/hooks/use-screen-scroll-handler.js.map +1 -0
- package/lib/module/components/screen/index.js.map +1 -1
- package/lib/module/components/screen/parts/ScreenFrame.js +47 -0
- package/lib/module/components/screen/parts/ScreenFrame.js.map +1 -0
- package/lib/module/components/screen/parts/ScreenHeaderAppearance.js +43 -0
- package/lib/module/components/screen/parts/ScreenHeaderAppearance.js.map +1 -0
- package/lib/module/components/screen/parts/ScreenPlaceholder.js +11 -13
- package/lib/module/components/screen/parts/ScreenPlaceholder.js.map +1 -1
- package/lib/module/components/screen/parts/ScreenSafeArea.android.js +27 -0
- package/lib/module/components/screen/parts/ScreenSafeArea.android.js.map +1 -0
- package/lib/module/components/screen/parts/ScreenSafeArea.js +26 -0
- package/lib/module/components/screen/parts/ScreenSafeArea.js.map +1 -0
- package/lib/module/components/screen/utils.js +18 -9
- package/lib/module/components/screen/utils.js.map +1 -1
- package/lib/module/components/spinner/Spinner.js +2 -2
- package/lib/module/components/text/Text.js +1 -1
- package/lib/module/components/toast/Toast.js +13 -13
- package/lib/module/components/toast/Toast.js.map +1 -1
- package/lib/module/components/toolbar/Toolbar.js +2 -2
- package/lib/module/context/ThemeProvider.js +22 -39
- package/lib/module/context/ThemeProvider.js.map +1 -1
- package/lib/module/context/index.js +1 -1
- package/lib/module/context/index.js.map +1 -1
- package/lib/module/theme/breakpoints.js +1 -1
- package/lib/module/theme/define-config.js +21 -0
- package/lib/module/theme/define-config.js.map +1 -0
- package/lib/module/theme/diagnostics.js +13 -0
- package/lib/module/theme/diagnostics.js.map +1 -0
- package/lib/module/theme/errors.js +15 -0
- package/lib/module/theme/errors.js.map +1 -0
- package/lib/module/theme/index.js +7 -1
- package/lib/module/theme/index.js.map +1 -1
- package/lib/module/theme/legacy-tokens.js +119 -0
- package/lib/module/theme/legacy-tokens.js.map +1 -0
- package/lib/module/theme/registry.js +122 -130
- package/lib/module/theme/registry.js.map +1 -1
- package/lib/module/theme/resolve-config.js +346 -0
- package/lib/module/theme/resolve-config.js.map +1 -0
- package/lib/module/theme/runtime.js +57 -12
- package/lib/module/theme/runtime.js.map +1 -1
- package/lib/module/theme/screen-margin.js +6 -14
- package/lib/module/theme/screen-margin.js.map +1 -1
- package/lib/module/theme/screen-padding.js +17 -0
- package/lib/module/theme/screen-padding.js.map +1 -0
- package/lib/module/theme/selection-store.js +75 -0
- package/lib/module/theme/selection-store.js.map +1 -0
- package/lib/module/theme/theme.js +81 -36
- package/lib/module/theme/theme.js.map +1 -1
- package/lib/module/theme/tokens/canonical-color-keys.js +102 -0
- package/lib/module/theme/tokens/canonical-color-keys.js.map +1 -0
- package/lib/module/theme/tokens/dark.js +72 -88
- package/lib/module/theme/tokens/dark.js.map +1 -1
- package/lib/module/theme/tokens/light.js +69 -83
- package/lib/module/theme/tokens/light.js.map +1 -1
- package/lib/module/theme/tokens/primitives.js +14 -14
- package/lib/module/theme/tokens/primitives.js.map +1 -1
- package/lib/module/theme/tokens/validate.js +238 -0
- package/lib/module/theme/tokens/validate.js.map +1 -0
- package/lib/module/theme/unistyles-adapter.js +77 -0
- package/lib/module/theme/unistyles-adapter.js.map +1 -0
- package/lib/module/utils/accent-generator.js +476 -0
- package/lib/module/utils/accent-generator.js.map +1 -0
- package/lib/module/utils/accent-utils.js +52 -35
- package/lib/module/utils/accent-utils.js.map +1 -1
- package/lib/module/utils/color-utils.js +224 -7
- package/lib/module/utils/color-utils.js.map +1 -1
- package/lib/module/utils/deep-merge.js +1 -1
- package/lib/module/utils/deep-merge.js.map +1 -1
- package/lib/module/utils/resolve-theme-color.js +2 -2
- package/lib/typescript/src/components/chip/types.d.ts +1 -1
- package/lib/typescript/src/components/empty-state/EmptyState.d.ts +1 -1
- package/lib/typescript/src/components/empty-state/EmptyState.d.ts.map +1 -1
- package/lib/typescript/src/components/header/variants/LargeTitleHeader/index.d.ts +6 -5
- 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 +11 -5
- package/lib/typescript/src/components/header/variants/TitleHeader/index.d.ts.map +1 -1
- package/lib/typescript/src/components/icon/Icon.d.ts +2 -2
- package/lib/typescript/src/components/screen/Screen.d.ts +45 -16
- package/lib/typescript/src/components/screen/Screen.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/ScreenContext.d.ts +42 -26
- package/lib/typescript/src/components/screen/ScreenContext.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/ScreenFlatList.d.ts +5 -46
- package/lib/typescript/src/components/screen/ScreenFlatList.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/ScreenList.d.ts +62 -50
- package/lib/typescript/src/components/screen/ScreenList.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/ScreenScrollView.d.ts +18 -58
- package/lib/typescript/src/components/screen/ScreenScrollView.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/hooks/use-screen-ref.d.ts +5 -0
- package/lib/typescript/src/components/screen/hooks/use-screen-ref.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/hooks/use-screen-scroll-handler.d.ts +53 -0
- package/lib/typescript/src/components/screen/hooks/use-screen-scroll-handler.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/index.d.ts +2 -2
- package/lib/typescript/src/components/screen/index.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/parts/ScreenFrame.d.ts +6 -0
- package/lib/typescript/src/components/screen/parts/ScreenFrame.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/parts/ScreenHeaderAppearance.d.ts +21 -0
- package/lib/typescript/src/components/screen/parts/ScreenHeaderAppearance.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/parts/ScreenPlaceholder.d.ts +6 -8
- package/lib/typescript/src/components/screen/parts/ScreenPlaceholder.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/parts/ScreenSafeArea.android.d.ts +7 -0
- package/lib/typescript/src/components/screen/parts/ScreenSafeArea.android.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/parts/ScreenSafeArea.d.ts +6 -0
- package/lib/typescript/src/components/screen/parts/ScreenSafeArea.d.ts.map +1 -0
- package/lib/typescript/src/components/screen/types.d.ts +27 -32
- package/lib/typescript/src/components/screen/types.d.ts.map +1 -1
- package/lib/typescript/src/components/screen/utils.d.ts +9 -8
- package/lib/typescript/src/components/screen/utils.d.ts.map +1 -1
- package/lib/typescript/src/components/text/Text.d.ts +1 -1
- package/lib/typescript/src/components/text/Text.d.ts.map +1 -1
- package/lib/typescript/src/components/toolbar/Toolbar.d.ts +2 -2
- package/lib/typescript/src/context/ThemeProvider.d.ts +29 -12
- package/lib/typescript/src/context/ThemeProvider.d.ts.map +1 -1
- package/lib/typescript/src/context/index.d.ts +1 -1
- package/lib/typescript/src/context/index.d.ts.map +1 -1
- package/lib/typescript/src/theme/breakpoints.d.ts +1 -1
- package/lib/typescript/src/theme/define-config.d.ts +23 -0
- package/lib/typescript/src/theme/define-config.d.ts.map +1 -0
- package/lib/typescript/src/theme/diagnostics.d.ts +4 -0
- package/lib/typescript/src/theme/diagnostics.d.ts.map +1 -0
- package/lib/typescript/src/theme/errors.d.ts +10 -0
- package/lib/typescript/src/theme/errors.d.ts.map +1 -0
- package/lib/typescript/src/theme/index.d.ts +10 -2
- package/lib/typescript/src/theme/index.d.ts.map +1 -1
- package/lib/typescript/src/theme/legacy-tokens.d.ts +187 -0
- package/lib/typescript/src/theme/legacy-tokens.d.ts.map +1 -0
- package/lib/typescript/src/theme/registry.d.ts +12 -17
- package/lib/typescript/src/theme/registry.d.ts.map +1 -1
- package/lib/typescript/src/theme/resolve-config.d.ts +99 -0
- package/lib/typescript/src/theme/resolve-config.d.ts.map +1 -0
- package/lib/typescript/src/theme/runtime.d.ts +25 -4
- package/lib/typescript/src/theme/runtime.d.ts.map +1 -1
- package/lib/typescript/src/theme/screen-margin.d.ts +6 -14
- package/lib/typescript/src/theme/screen-margin.d.ts.map +1 -1
- package/lib/typescript/src/theme/screen-padding.d.ts +15 -0
- package/lib/typescript/src/theme/screen-padding.d.ts.map +1 -0
- package/lib/typescript/src/theme/selection-store.d.ts +41 -0
- package/lib/typescript/src/theme/selection-store.d.ts.map +1 -0
- package/lib/typescript/src/theme/theme.d.ts +54 -1
- package/lib/typescript/src/theme/theme.d.ts.map +1 -1
- package/lib/typescript/src/theme/tokens/canonical-color-keys.d.ts +95 -0
- package/lib/typescript/src/theme/tokens/canonical-color-keys.d.ts.map +1 -0
- package/lib/typescript/src/theme/tokens/dark.d.ts +56 -63
- package/lib/typescript/src/theme/tokens/dark.d.ts.map +1 -1
- package/lib/typescript/src/theme/tokens/light.d.ts +56 -71
- package/lib/typescript/src/theme/tokens/light.d.ts.map +1 -1
- package/lib/typescript/src/theme/tokens/primitives.d.ts +11 -10
- package/lib/typescript/src/theme/tokens/primitives.d.ts.map +1 -1
- package/lib/typescript/src/theme/tokens/validate.d.ts +34 -0
- package/lib/typescript/src/theme/tokens/validate.d.ts.map +1 -0
- package/lib/typescript/src/theme/types.d.ts +166 -86
- package/lib/typescript/src/theme/types.d.ts.map +1 -1
- package/lib/typescript/src/theme/unistyles-adapter.d.ts +33 -0
- package/lib/typescript/src/theme/unistyles-adapter.d.ts.map +1 -0
- package/lib/typescript/src/utils/accent-generator.d.ts +103 -0
- package/lib/typescript/src/utils/accent-generator.d.ts.map +1 -0
- package/lib/typescript/src/utils/accent-utils.d.ts +15 -2
- package/lib/typescript/src/utils/accent-utils.d.ts.map +1 -1
- package/lib/typescript/src/utils/color-utils.d.ts +59 -2
- package/lib/typescript/src/utils/color-utils.d.ts.map +1 -1
- package/lib/typescript/src/utils/deep-merge.d.ts +1 -0
- package/lib/typescript/src/utils/deep-merge.d.ts.map +1 -1
- package/lib/typescript/src/utils/resolve-theme-color.d.ts +2 -2
- package/package.json +1 -1
- package/src/components/avatar/Avatar.tsx +20 -20
- package/src/components/button/Button.tsx +11 -11
- package/src/components/chip/Chip.tsx +32 -32
- package/src/components/chip/types.ts +1 -1
- package/src/components/empty-state/EmptyState.tsx +4 -4
- package/src/components/header/variants/LargeTitleHeader/index.tsx +31 -30
- package/src/components/header/variants/TitleHeader/index.tsx +33 -22
- package/src/components/icon/Icon.tsx +4 -4
- package/src/components/page-indicator/hooks/use-page-indicator-colors.ts +2 -2
- package/src/components/screen/Screen.tsx +89 -43
- package/src/components/screen/ScreenContext.tsx +48 -28
- package/src/components/screen/ScreenFlatList.tsx +5 -191
- package/src/components/screen/ScreenList.tsx +197 -175
- package/src/components/screen/ScreenScrollView.tsx +92 -167
- package/src/components/screen/hooks/use-screen-ref.ts +24 -0
- package/src/components/screen/hooks/use-screen-scroll-handler.ts +31 -0
- package/src/components/screen/index.ts +8 -2
- package/src/components/screen/parts/ScreenFrame.tsx +49 -0
- package/src/components/screen/parts/ScreenHeaderAppearance.tsx +52 -0
- package/src/components/screen/parts/ScreenPlaceholder.tsx +16 -16
- package/src/components/screen/parts/ScreenSafeArea.android.tsx +22 -0
- package/src/components/screen/parts/ScreenSafeArea.tsx +20 -0
- package/src/components/screen/types.ts +29 -32
- package/src/components/screen/utils.ts +24 -11
- package/src/components/spinner/Spinner.tsx +2 -2
- package/src/components/text/Text.tsx +2 -2
- package/src/components/toast/Toast.tsx +13 -13
- package/src/components/toolbar/Toolbar.tsx +4 -4
- package/src/context/ThemeProvider.tsx +47 -51
- package/src/context/index.ts +1 -1
- package/src/theme/breakpoints.ts +1 -1
- package/src/theme/define-config.ts +27 -0
- package/src/theme/diagnostics.ts +11 -0
- package/src/theme/errors.ts +14 -0
- package/src/theme/index.ts +40 -1
- package/src/theme/legacy-tokens.ts +227 -0
- package/src/theme/registry.ts +119 -137
- package/src/theme/resolve-config.ts +406 -0
- package/src/theme/runtime.ts +52 -14
- package/src/theme/screen-margin.ts +6 -25
- package/src/theme/screen-padding.ts +26 -0
- package/src/theme/selection-store.ts +76 -0
- package/src/theme/theme.ts +104 -39
- package/src/theme/tokens/canonical-color-keys.ts +107 -0
- package/src/theme/tokens/dark.ts +91 -98
- package/src/theme/tokens/light.ts +88 -93
- package/src/theme/tokens/primitives.ts +14 -14
- package/src/theme/tokens/validate.ts +271 -0
- package/src/theme/types.ts +184 -95
- package/src/theme/unistyles-adapter.ts +75 -0
- package/src/utils/accent-generator.ts +530 -0
- package/src/utils/accent-utils.ts +66 -39
- package/src/utils/color-utils.ts +225 -8
- package/src/utils/deep-merge.ts +1 -1
- package/src/utils/resolve-theme-color.ts +2 -2
- package/lib/module/components/screen/parts/BottomSafeArea.js +0 -62
- package/lib/module/components/screen/parts/BottomSafeArea.js.map +0 -1
- package/lib/typescript/src/components/screen/parts/BottomSafeArea.d.ts +0 -30
- package/lib/typescript/src/components/screen/parts/BottomSafeArea.d.ts.map +0 -1
- package/src/components/screen/parts/BottomSafeArea.tsx +0 -59
|
@@ -1,105 +1,100 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Light
|
|
3
|
-
*
|
|
4
|
-
* Convention: [category].[context].[property?].[variant].[state]
|
|
5
|
-
* - property is omitted when the context implies it (surface → bg, text → fg, border → border-color)
|
|
6
|
-
* - property is required when a context carries multiple attributes (action, status)
|
|
7
|
-
*
|
|
8
|
-
* Values use {palette.key} reference notation, resolved against primitives at
|
|
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
|
|
12
|
-
* palette step matches exactly.
|
|
13
|
-
*
|
|
14
|
-
* GENERATED-STYLE SOURCE: intended to be replaced by the Figma / design-sync export.
|
|
2
|
+
* Light semantic colors. See docs/design-tokens.md for naming and references.
|
|
3
|
+
* Generated-style source; naming and contrast updates await the next design-sync export.
|
|
15
4
|
*/
|
|
16
5
|
export const light = {
|
|
17
|
-
//
|
|
18
|
-
"color.
|
|
19
|
-
|
|
20
|
-
// ── color: shadow (used as elevation.*.shadowColor) ───────────────────────
|
|
21
|
-
"color.shadow": "#1b1b1b",
|
|
22
|
-
|
|
23
|
-
// ── color: surfaces (bg implied — no property segment) ──────────────────
|
|
6
|
+
// Surfaces
|
|
7
|
+
"color.surface.canvas": "#fbfbfb",
|
|
24
8
|
"color.surface.default": "{palette.white}",
|
|
25
9
|
"color.surface.raised": "{palette.white}",
|
|
26
10
|
"color.surface.sunken": "#ececee",
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"color.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"color.text.default": "{palette.neutral.950}",
|
|
33
|
-
"color.text.muted": "#4b5060",
|
|
34
|
-
"color.text.subtle": "#6b7280",
|
|
11
|
+
|
|
12
|
+
// Text
|
|
13
|
+
"color.text.primary": "{palette.neutral.950}",
|
|
14
|
+
"color.text.secondary": "#4b5060",
|
|
15
|
+
"color.text.tertiary": "#626978",
|
|
35
16
|
"color.text.disabled": "#9ca3af",
|
|
36
17
|
"color.text.inverse": "{palette.white}",
|
|
37
|
-
"color.text.link": "{palette.blue.
|
|
38
|
-
"color.text.accent": "{palette.emerald.600}",
|
|
39
|
-
"color.text.on-accent": "{palette.white}",
|
|
40
|
-
"color.text.on-accent-subtle": "{palette.emerald.700}",
|
|
18
|
+
"color.text.link": "{palette.blue.700}",
|
|
41
19
|
|
|
42
|
-
//
|
|
20
|
+
// Borders and focus
|
|
43
21
|
"color.border.subtle": "#ebebed",
|
|
44
22
|
"color.border.default": "{palette.neutral.200}",
|
|
45
|
-
"color.border.strong": "
|
|
46
|
-
"color.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"color.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"color.
|
|
54
|
-
"color.
|
|
55
|
-
|
|
56
|
-
"color.
|
|
57
|
-
"color.
|
|
58
|
-
"color.
|
|
59
|
-
"color.
|
|
60
|
-
"color.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"color.
|
|
66
|
-
"color.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"color.
|
|
70
|
-
"color.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"color.
|
|
75
|
-
"color.
|
|
76
|
-
"color.
|
|
77
|
-
"color.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
"color.
|
|
81
|
-
|
|
82
|
-
"color.
|
|
83
|
-
"color.
|
|
84
|
-
"color.
|
|
85
|
-
|
|
86
|
-
"color.
|
|
87
|
-
"color.
|
|
88
|
-
"color.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
"color.
|
|
92
|
-
|
|
93
|
-
"color.
|
|
94
|
-
"color.
|
|
95
|
-
"color.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
"color.
|
|
99
|
-
"color.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
"color.
|
|
103
|
-
|
|
104
|
-
"color.
|
|
23
|
+
"color.border.strong": "{palette.neutral.500}",
|
|
24
|
+
"color.focus.ring": "{palette.blue.500}",
|
|
25
|
+
|
|
26
|
+
// Effects
|
|
27
|
+
"color.backdrop": "rgba(9, 9, 11, 0.48)",
|
|
28
|
+
"color.shadow": "#1b1b1b",
|
|
29
|
+
|
|
30
|
+
// Accent
|
|
31
|
+
"color.accent.text": "{palette.emerald.800}",
|
|
32
|
+
"color.accent.border": "{palette.emerald.700}",
|
|
33
|
+
|
|
34
|
+
"color.accent.solid.bg": "{palette.emerald.800}",
|
|
35
|
+
"color.accent.solid.bg.hover": "{palette.emerald.900}",
|
|
36
|
+
"color.accent.solid.bg.pressed": "{palette.emerald.950}",
|
|
37
|
+
"color.accent.solid.bg.disabled": "{palette.slate.200}",
|
|
38
|
+
"color.accent.solid.fg": "{palette.white}",
|
|
39
|
+
|
|
40
|
+
"color.accent.soft.bg": "{palette.emerald.100}",
|
|
41
|
+
"color.accent.soft.bg.hover": "{palette.emerald.200}",
|
|
42
|
+
"color.accent.soft.bg.pressed": "{palette.emerald.300}",
|
|
43
|
+
"color.accent.soft.bg.disabled": "{palette.slate.100}",
|
|
44
|
+
"color.accent.soft.fg": "{palette.emerald.800}",
|
|
45
|
+
|
|
46
|
+
// Neutral
|
|
47
|
+
"color.neutral.solid.bg": "{palette.neutral.200}",
|
|
48
|
+
"color.neutral.solid.fg": "{palette.neutral.900}",
|
|
49
|
+
|
|
50
|
+
// Translucent fills keep soft controls distinct from surrounding surfaces.
|
|
51
|
+
"color.neutral.soft.bg": "{palette.neutral.400}/15",
|
|
52
|
+
"color.neutral.soft.bg.hover": "{palette.neutral.400}/25",
|
|
53
|
+
"color.neutral.soft.bg.pressed": "{palette.neutral.400}/35",
|
|
54
|
+
"color.neutral.soft.bg.disabled": "{palette.slate.100}",
|
|
55
|
+
"color.neutral.soft.fg": "{palette.neutral.700}",
|
|
56
|
+
|
|
57
|
+
// Success
|
|
58
|
+
"color.success.text": "{palette.emerald.700}",
|
|
59
|
+
|
|
60
|
+
"color.success.solid.bg": "{palette.green.500}",
|
|
61
|
+
"color.success.solid.fg": "{palette.slate.950}",
|
|
62
|
+
"color.success.solid.border": "{palette.green.300}",
|
|
63
|
+
|
|
64
|
+
"color.success.soft.bg": "{palette.green.100}",
|
|
65
|
+
"color.success.soft.fg": "{palette.emerald.700}",
|
|
66
|
+
"color.success.soft.border": "{palette.green.300}",
|
|
67
|
+
|
|
68
|
+
// Warning — Atlassian Orange800 text, Orange300 solid, Orange100 soft.
|
|
69
|
+
"color.warning.text": "#9e4c00",
|
|
70
|
+
|
|
71
|
+
"color.warning.solid.bg": "#fbc828",
|
|
72
|
+
"color.warning.solid.fg": "#292a2e",
|
|
73
|
+
"color.warning.solid.border": "#e06c00",
|
|
74
|
+
|
|
75
|
+
"color.warning.soft.bg": "#fff5db",
|
|
76
|
+
"color.warning.soft.fg": "#9e4c00",
|
|
77
|
+
"color.warning.soft.border": "#e06c00",
|
|
78
|
+
|
|
79
|
+
// Danger
|
|
80
|
+
"color.danger.text": "{palette.rose.700}",
|
|
81
|
+
|
|
82
|
+
"color.danger.solid.bg": "{palette.red.400}",
|
|
83
|
+
"color.danger.solid.fg": "{palette.slate.950}",
|
|
84
|
+
"color.danger.solid.border": "{palette.red.300}",
|
|
85
|
+
|
|
86
|
+
"color.danger.soft.bg": "{palette.red.100}",
|
|
87
|
+
"color.danger.soft.fg": "{palette.rose.700}",
|
|
88
|
+
"color.danger.soft.border": "{palette.red.300}",
|
|
89
|
+
|
|
90
|
+
// Info
|
|
91
|
+
"color.info.text": "{palette.sky.700}",
|
|
92
|
+
|
|
93
|
+
"color.info.solid.bg": "{palette.sky.500}",
|
|
94
|
+
"color.info.solid.fg": "{palette.slate.950}",
|
|
95
|
+
"color.info.solid.border": "{palette.sky.300}",
|
|
96
|
+
|
|
97
|
+
"color.info.soft.bg": "{palette.sky.100}",
|
|
98
|
+
"color.info.soft.fg": "{palette.sky.700}",
|
|
99
|
+
"color.info.soft.border": "{palette.sky.300}",
|
|
105
100
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Scheme-agnostic primitive tokens — flat, dotted-key data.
|
|
3
3
|
*
|
|
4
|
+
* Naming migration: screen padding keys updated ahead of the next design-sync export.
|
|
4
5
|
* GENERATED-STYLE SOURCE: this file is plain data (no imports, no types).
|
|
5
6
|
* It is intended to be replaced by the Figma design-system export. Keys use a
|
|
6
7
|
* fully-flat `a.b.c` path; the runtime theme is rebuilt from these via
|
|
@@ -451,26 +452,25 @@ export const primitives = {
|
|
|
451
452
|
"typography.variants.caption.letterSpacing": 0.2,
|
|
452
453
|
"typography.variants.caption.maxFontSizeMultiplier": 1.4,
|
|
453
454
|
|
|
454
|
-
// ──
|
|
455
|
+
// ── component opacity multipliers ─────────────────────────────────────────────────
|
|
455
456
|
"opacity.disabled": 0.45,
|
|
456
457
|
"opacity.pressed": 0.85,
|
|
457
458
|
|
|
458
459
|
// ── screen-level layout ───────────────────────────────────────────────────
|
|
459
|
-
// `
|
|
460
|
+
// `padding.x`/`padding.y` both scale up with the viewport breakpoint (see
|
|
460
461
|
// `theme/breakpoints.ts`).
|
|
461
|
-
"layout.screen.
|
|
462
|
-
"layout.screen.
|
|
463
|
-
"layout.screen.
|
|
464
|
-
"layout.screen.
|
|
465
|
-
"layout.screen.
|
|
466
|
-
"layout.screen.
|
|
467
|
-
"layout.screen.
|
|
468
|
-
"layout.screen.
|
|
469
|
-
"layout.screen.
|
|
470
|
-
"layout.screen.
|
|
462
|
+
"layout.screen.padding.x.xs": 16,
|
|
463
|
+
"layout.screen.padding.x.sm": 16,
|
|
464
|
+
"layout.screen.padding.x.md": 24,
|
|
465
|
+
"layout.screen.padding.x.lg": 32,
|
|
466
|
+
"layout.screen.padding.x.xl": 48,
|
|
467
|
+
"layout.screen.padding.y.xs": 16,
|
|
468
|
+
"layout.screen.padding.y.sm": 16,
|
|
469
|
+
"layout.screen.padding.y.md": 24,
|
|
470
|
+
"layout.screen.padding.y.lg": 24,
|
|
471
|
+
"layout.screen.padding.y.xl": 24,
|
|
471
472
|
|
|
472
473
|
// ── header layout ─────────────────────────────────────────────────────────
|
|
473
|
-
// Header bar height (compact nav bar / collapsed large-title bar).
|
|
474
|
-
// to the 4dp spacing grid (= spacing.14) and a standard app-bar height.
|
|
474
|
+
// Header bar height in dp (compact nav bar / collapsed large-title bar).
|
|
475
475
|
"layout.header.height": 54,
|
|
476
476
|
};
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw scheme-data validator.
|
|
3
|
+
*
|
|
4
|
+
* `light.ts` / `dark.ts` are untyped, Figma-style data that `theme.ts` casts
|
|
5
|
+
* into `ThemeColor`. This module checks that data against the real schema so
|
|
6
|
+
* an authoring mistake fails a test with the offending key and value instead
|
|
7
|
+
* of reaching a component as an unresolved `{palette.x}` string.
|
|
8
|
+
*
|
|
9
|
+
* Pure: imports only the token data and the legacy alias list. Safe to run at
|
|
10
|
+
* build/test time; not part of the runtime theme pipeline.
|
|
11
|
+
*/
|
|
12
|
+
import { legacyColorAliases } from "#theme/legacy-tokens";
|
|
13
|
+
import type { Scheme } from "#theme/types";
|
|
14
|
+
import { CANONICAL_COLOR_KEYS } from "./canonical-color-keys";
|
|
15
|
+
import { dark } from "./dark";
|
|
16
|
+
import { light } from "./light";
|
|
17
|
+
import { primitives } from "./primitives";
|
|
18
|
+
|
|
19
|
+
/** Where an issue was found: one of the scheme files, or the shared primitives. */
|
|
20
|
+
export type SchemeTokenSource = Scheme | "primitives";
|
|
21
|
+
|
|
22
|
+
export interface SchemeTokenIssue {
|
|
23
|
+
source: SchemeTokenSource;
|
|
24
|
+
/** The authored key (e.g. `color.text.primary`), as written in the file. */
|
|
25
|
+
key: string;
|
|
26
|
+
/** The authored value, verbatim. */
|
|
27
|
+
value: unknown;
|
|
28
|
+
message: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The three raw token maps. Defaults to the real data; tests pass fixtures. */
|
|
32
|
+
export interface SchemeTokenData {
|
|
33
|
+
light: Record<string, unknown>;
|
|
34
|
+
dark: Record<string, unknown>;
|
|
35
|
+
primitives: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class SchemeTokenValidationError extends Error {
|
|
39
|
+
readonly issues: readonly SchemeTokenIssue[];
|
|
40
|
+
|
|
41
|
+
constructor(issues: readonly SchemeTokenIssue[]) {
|
|
42
|
+
super(
|
|
43
|
+
`Invalid scheme token data (${issues.length} issue${issues.length === 1 ? "" : "s"}):\n${issues
|
|
44
|
+
.map(formatIssue)
|
|
45
|
+
.join("\n")}`
|
|
46
|
+
);
|
|
47
|
+
this.name = "SchemeTokenValidationError";
|
|
48
|
+
this.issues = issues;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function formatIssue(issue: SchemeTokenIssue): string {
|
|
53
|
+
return ` [${issue.source}] ${issue.key} = ${JSON.stringify(issue.value)} — ${issue.message}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const COLOR_PREFIX = "color.";
|
|
57
|
+
const PALETTE_PREFIX = "palette.";
|
|
58
|
+
|
|
59
|
+
// Mirrors theme.ts: `{palette.key}` and `{palette.key}/NN`.
|
|
60
|
+
const REF_PATTERN = /^\{([\w.]+)\}$/;
|
|
61
|
+
const ALPHA_REF_PATTERN = /^\{([\w.]+)\}\/(\d{1,3})$/;
|
|
62
|
+
// Palette primitives must be plain `#rrggbb` so the alpha suffix can be appended.
|
|
63
|
+
const HEX6_PATTERN = /^#[0-9a-f]{6}$/i;
|
|
64
|
+
// Literal colour values accepted in authored scheme data. Anything else is a
|
|
65
|
+
// typo or an unsupported notation that would pass through `resolveRefs`
|
|
66
|
+
// unchanged and reach a component.
|
|
67
|
+
const LITERAL_PATTERNS = [
|
|
68
|
+
/^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i,
|
|
69
|
+
/^rgba?\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*(?:,\s*(?:0|1|0?\.\d+)\s*)?\)$/,
|
|
70
|
+
/^hsla?\(\s*\d{1,3}(?:\.\d+)?\s*,\s*\d{1,3}%\s*,\s*\d{1,3}%\s*(?:,\s*(?:0|1|0?\.\d+)\s*)?\)$/,
|
|
71
|
+
/^transparent$/,
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
const legacyAliasNames = new Set(Object.keys(legacyColorAliases));
|
|
75
|
+
|
|
76
|
+
function checkKeySet(source: Scheme, data: Record<string, unknown>, issues: SchemeTokenIssue[]): void {
|
|
77
|
+
const authored = new Set(Object.keys(data));
|
|
78
|
+
for (const canonical of CANONICAL_COLOR_KEYS) {
|
|
79
|
+
const key = `${COLOR_PREFIX}${canonical}`;
|
|
80
|
+
if (!authored.has(key)) {
|
|
81
|
+
issues.push({ source, key, value: undefined, message: "required canonical colour key is missing" });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (const key of authored) {
|
|
85
|
+
if (!key.startsWith(COLOR_PREFIX)) {
|
|
86
|
+
issues.push({
|
|
87
|
+
source,
|
|
88
|
+
key,
|
|
89
|
+
value: data[key],
|
|
90
|
+
message: `scheme files may only author \`${COLOR_PREFIX}*\` keys`,
|
|
91
|
+
});
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const name = key.slice(COLOR_PREFIX.length);
|
|
95
|
+
if (legacyAliasNames.has(name)) {
|
|
96
|
+
issues.push({
|
|
97
|
+
source,
|
|
98
|
+
key,
|
|
99
|
+
value: data[key],
|
|
100
|
+
message: `deprecated alias of \`${legacyColorAliases[name as keyof typeof legacyColorAliases]}\`; aliases belong at the public boundary, not in authored data`,
|
|
101
|
+
});
|
|
102
|
+
} else if (!(CANONICAL_COLOR_KEYS as readonly string[]).includes(name)) {
|
|
103
|
+
issues.push({ source, key, value: data[key], message: "not a canonical colour key" });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function checkReference(
|
|
109
|
+
source: Scheme,
|
|
110
|
+
key: string,
|
|
111
|
+
value: string,
|
|
112
|
+
refKey: string,
|
|
113
|
+
prims: Record<string, unknown>,
|
|
114
|
+
issues: SchemeTokenIssue[]
|
|
115
|
+
): boolean {
|
|
116
|
+
if (!refKey.startsWith(PALETTE_PREFIX)) {
|
|
117
|
+
issues.push({
|
|
118
|
+
source,
|
|
119
|
+
key,
|
|
120
|
+
value,
|
|
121
|
+
message: `references \`${refKey}\`, which is not a \`palette.*\` primitive`,
|
|
122
|
+
});
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const resolved = prims[refKey];
|
|
126
|
+
if (resolved === undefined) {
|
|
127
|
+
issues.push({
|
|
128
|
+
source,
|
|
129
|
+
key,
|
|
130
|
+
value,
|
|
131
|
+
message: `references \`${refKey}\`, which does not exist in primitives`,
|
|
132
|
+
});
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
if (typeof resolved !== "string" || !HEX6_PATTERN.test(resolved)) {
|
|
136
|
+
issues.push({
|
|
137
|
+
source,
|
|
138
|
+
key,
|
|
139
|
+
value,
|
|
140
|
+
message: `references \`${refKey}\` = ${JSON.stringify(resolved)}, which is not a \`#rrggbb\` hex`,
|
|
141
|
+
});
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function checkValues(
|
|
148
|
+
source: Scheme,
|
|
149
|
+
data: Record<string, unknown>,
|
|
150
|
+
prims: Record<string, unknown>,
|
|
151
|
+
issues: SchemeTokenIssue[]
|
|
152
|
+
): void {
|
|
153
|
+
for (const [key, value] of Object.entries(data)) {
|
|
154
|
+
// Non-colour keys are already rejected by the key-set check.
|
|
155
|
+
if (!key.startsWith(COLOR_PREFIX)) continue;
|
|
156
|
+
if (typeof value !== "string") {
|
|
157
|
+
issues.push({ source, key, value, message: `expected a string, got ${typeof value}` });
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const alphaMatch = value.match(ALPHA_REF_PATTERN);
|
|
162
|
+
if (alphaMatch) {
|
|
163
|
+
const refKey = alphaMatch[1] as string;
|
|
164
|
+
const percent = Number(alphaMatch[2]);
|
|
165
|
+
if (checkReference(source, key, value, refKey, prims, issues) && (percent < 0 || percent > 100)) {
|
|
166
|
+
issues.push({ source, key, value, message: `alpha percentage ${percent} is outside 0–100` });
|
|
167
|
+
}
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const refMatch = value.match(REF_PATTERN);
|
|
172
|
+
if (refMatch) {
|
|
173
|
+
checkReference(source, key, value, refMatch[1] as string, prims, issues);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (value.includes("{") || value.includes("}")) {
|
|
178
|
+
issues.push({
|
|
179
|
+
source,
|
|
180
|
+
key,
|
|
181
|
+
value,
|
|
182
|
+
message: "malformed palette reference; expected `{palette.key}` or `{palette.key}/NN`",
|
|
183
|
+
});
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (value.includes("/")) {
|
|
188
|
+
issues.push({
|
|
189
|
+
source,
|
|
190
|
+
key,
|
|
191
|
+
value,
|
|
192
|
+
message: "`/NN` alpha suffix is only supported on `{palette.key}` references, not literals",
|
|
193
|
+
});
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (!LITERAL_PATTERNS.some((pattern) => pattern.test(value))) {
|
|
198
|
+
issues.push({
|
|
199
|
+
source,
|
|
200
|
+
key,
|
|
201
|
+
value,
|
|
202
|
+
message: "not an accepted colour value (hex, rgb[a](), hsl[a](), transparent, or palette reference)",
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function checkKeyOrder(
|
|
209
|
+
lightData: Record<string, unknown>,
|
|
210
|
+
darkData: Record<string, unknown>,
|
|
211
|
+
issues: SchemeTokenIssue[]
|
|
212
|
+
) {
|
|
213
|
+
const lightKeys = Object.keys(lightData);
|
|
214
|
+
const darkKeys = Object.keys(darkData);
|
|
215
|
+
// Only meaningful when both files author the same set; missing/extra keys
|
|
216
|
+
// are already reported by the key-set check.
|
|
217
|
+
if (lightKeys.length !== darkKeys.length || !lightKeys.every((key) => key in darkData)) return;
|
|
218
|
+
for (let index = 0; index < lightKeys.length; index += 1) {
|
|
219
|
+
if (lightKeys[index] !== darkKeys[index]) {
|
|
220
|
+
issues.push({
|
|
221
|
+
source: "dark",
|
|
222
|
+
key: darkKeys[index] as string,
|
|
223
|
+
value: lightKeys[index],
|
|
224
|
+
message: `key order differs from light at position ${index}: light authors \`${lightKeys[index]}\` here`,
|
|
225
|
+
});
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function checkPalette(prims: Record<string, unknown>, issues: SchemeTokenIssue[]): void {
|
|
232
|
+
for (const [key, value] of Object.entries(prims)) {
|
|
233
|
+
if (!key.startsWith(PALETTE_PREFIX)) continue;
|
|
234
|
+
if (typeof value !== "string" || !HEX6_PATTERN.test(value)) {
|
|
235
|
+
issues.push({ source: "primitives", key, value, message: "palette primitives must be `#rrggbb` hex" });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Collects every problem in the raw scheme data. Returns `[]` for valid data.
|
|
242
|
+
* Pass a partial {@link SchemeTokenData} to validate fixtures; omitted maps
|
|
243
|
+
* default to the real token files.
|
|
244
|
+
*/
|
|
245
|
+
export function collectSchemeTokenIssues(data: Partial<SchemeTokenData> = {}): SchemeTokenIssue[] {
|
|
246
|
+
const lightData = data.light ?? light;
|
|
247
|
+
const darkData = data.dark ?? dark;
|
|
248
|
+
const prims = data.primitives ?? primitives;
|
|
249
|
+
const issues: SchemeTokenIssue[] = [];
|
|
250
|
+
|
|
251
|
+
checkPalette(prims, issues);
|
|
252
|
+
for (const [source, scheme] of [
|
|
253
|
+
["light", lightData],
|
|
254
|
+
["dark", darkData],
|
|
255
|
+
] as const) {
|
|
256
|
+
checkKeySet(source, scheme, issues);
|
|
257
|
+
checkValues(source, scheme, prims, issues);
|
|
258
|
+
}
|
|
259
|
+
checkKeyOrder(lightData, darkData, issues);
|
|
260
|
+
|
|
261
|
+
return issues;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Throws a {@link SchemeTokenValidationError} listing every issue (source,
|
|
266
|
+
* key, value, message) when the raw scheme data is invalid.
|
|
267
|
+
*/
|
|
268
|
+
export function validateSchemeTokens(data: Partial<SchemeTokenData> = {}): void {
|
|
269
|
+
const issues = collectSchemeTokenIssues(data);
|
|
270
|
+
if (issues.length > 0) throw new SchemeTokenValidationError(issues);
|
|
271
|
+
}
|