@chipmobilesdk/rn-theme 1.2.0 → 1.3.0
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 +111 -0
- package/README.md +3 -1
- package/lib/commonjs/color/categorical.js +35 -0
- package/lib/commonjs/color/categorical.js.map +1 -0
- package/lib/commonjs/color/contrast.js +199 -0
- package/lib/commonjs/color/contrast.js.map +1 -0
- package/lib/commonjs/color/parse.js +110 -0
- package/lib/commonjs/color/parse.js.map +1 -0
- package/lib/commonjs/color/roles.js +235 -0
- package/lib/commonjs/color/roles.js.map +1 -0
- package/lib/commonjs/index.js +94 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/integration/navigationTheme.js +43 -0
- package/lib/commonjs/integration/navigationTheme.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/presets/byTone.js +28 -0
- package/lib/commonjs/presets/byTone.js.map +1 -0
- package/lib/commonjs/presets/layout.js +67 -0
- package/lib/commonjs/presets/layout.js.map +1 -0
- package/lib/commonjs/presets/themePresets.js +115 -0
- package/lib/commonjs/presets/themePresets.js.map +1 -0
- package/lib/commonjs/theme/buildThemes.js +211 -0
- package/lib/commonjs/theme/buildThemes.js.map +1 -0
- package/lib/commonjs/theme/errors.js +49 -0
- package/lib/commonjs/theme/errors.js.map +1 -0
- package/lib/commonjs/theme/overrides.js +125 -0
- package/lib/commonjs/theme/overrides.js.map +1 -0
- package/lib/commonjs/theme/validateThemeConfig.js +157 -0
- package/lib/commonjs/theme/validateThemeConfig.js.map +1 -0
- package/lib/commonjs/tokens/defaults.js +132 -0
- package/lib/commonjs/tokens/defaults.js.map +1 -0
- package/lib/commonjs/tokens/typography.js +136 -0
- package/lib/commonjs/tokens/typography.js.map +1 -0
- package/lib/commonjs/types/brand.js +2 -0
- package/lib/commonjs/types/brand.js.map +1 -0
- package/lib/commonjs/types/colors.js +2 -0
- package/lib/commonjs/types/colors.js.map +1 -0
- package/lib/commonjs/types/index.js +2 -0
- package/lib/commonjs/types/index.js.map +1 -0
- package/lib/commonjs/types/theme.js +6 -0
- package/lib/commonjs/types/theme.js.map +1 -0
- package/lib/commonjs/types/tokens.js +2 -0
- package/lib/commonjs/types/tokens.js.map +1 -0
- package/lib/commonjs/types/typography.js +2 -0
- package/lib/commonjs/types/typography.js.map +1 -0
- package/lib/commonjs/unistyles/createUnistylesConfig.js +113 -0
- package/lib/commonjs/unistyles/createUnistylesConfig.js.map +1 -0
- package/lib/commonjs/unistyles/themeMode.js +39 -0
- package/lib/commonjs/unistyles/themeMode.js.map +1 -0
- package/lib/commonjs/vendor/mcu/LICENSE +191 -0
- package/lib/commonjs/vendor/mcu/hct/cam16.js +362 -0
- package/lib/commonjs/vendor/mcu/hct/cam16.js.map +1 -0
- package/lib/commonjs/vendor/mcu/hct/hct.js +183 -0
- package/lib/commonjs/vendor/mcu/hct/hct.js.map +1 -0
- package/lib/commonjs/vendor/mcu/hct/hct_solver.js +401 -0
- package/lib/commonjs/vendor/mcu/hct/hct_solver.js.map +1 -0
- package/lib/commonjs/vendor/mcu/hct/viewing_conditions.js +116 -0
- package/lib/commonjs/vendor/mcu/hct/viewing_conditions.js.map +1 -0
- package/lib/commonjs/vendor/mcu/index.js +27 -0
- package/lib/commonjs/vendor/mcu/index.js.map +1 -0
- package/lib/commonjs/vendor/mcu/palettes/tonal_palette.js +177 -0
- package/lib/commonjs/vendor/mcu/palettes/tonal_palette.js.map +1 -0
- package/lib/commonjs/vendor/mcu/utils/color_utils.js +298 -0
- package/lib/commonjs/vendor/mcu/utils/color_utils.js.map +1 -0
- package/lib/commonjs/vendor/mcu/utils/math_utils.js +158 -0
- package/lib/commonjs/vendor/mcu/utils/math_utils.js.map +1 -0
- package/lib/module/color/categorical.js +31 -0
- package/lib/module/color/categorical.js.map +1 -0
- package/lib/module/color/contrast.js +194 -0
- package/lib/module/color/contrast.js.map +1 -0
- package/lib/module/color/parse.js +101 -0
- package/lib/module/color/parse.js.map +1 -0
- package/lib/module/color/roles.js +229 -0
- package/lib/module/color/roles.js.map +1 -0
- package/lib/module/index.js +23 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/integration/navigationTheme.js +39 -0
- package/lib/module/integration/navigationTheme.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/presets/byTone.js +24 -0
- package/lib/module/presets/byTone.js.map +1 -0
- package/lib/module/presets/layout.js +63 -0
- package/lib/module/presets/layout.js.map +1 -0
- package/lib/module/presets/themePresets.js +110 -0
- package/lib/module/presets/themePresets.js.map +1 -0
- package/lib/module/theme/buildThemes.js +208 -0
- package/lib/module/theme/buildThemes.js.map +1 -0
- package/lib/module/theme/errors.js +43 -0
- package/lib/module/theme/errors.js.map +1 -0
- package/lib/module/theme/overrides.js +119 -0
- package/lib/module/theme/overrides.js.map +1 -0
- package/lib/module/theme/validateThemeConfig.js +152 -0
- package/lib/module/theme/validateThemeConfig.js.map +1 -0
- package/lib/module/tokens/defaults.js +120 -0
- package/lib/module/tokens/defaults.js.map +1 -0
- package/lib/module/tokens/typography.js +129 -0
- package/lib/module/tokens/typography.js.map +1 -0
- package/lib/module/types/brand.js +2 -0
- package/lib/module/types/brand.js.map +1 -0
- package/lib/module/types/colors.js +2 -0
- package/lib/module/types/colors.js.map +1 -0
- package/lib/module/types/index.js +2 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/module/types/theme.js +4 -0
- package/lib/module/types/theme.js.map +1 -0
- package/lib/module/types/tokens.js +2 -0
- package/lib/module/types/tokens.js.map +1 -0
- package/lib/module/types/typography.js +2 -0
- package/lib/module/types/typography.js.map +1 -0
- package/lib/module/unistyles/createUnistylesConfig.js +109 -0
- package/lib/module/unistyles/createUnistylesConfig.js.map +1 -0
- package/lib/module/unistyles/themeMode.js +36 -0
- package/lib/module/unistyles/themeMode.js.map +1 -0
- package/lib/module/vendor/mcu/LICENSE +191 -0
- package/lib/module/vendor/mcu/hct/cam16.js +356 -0
- package/lib/module/vendor/mcu/hct/cam16.js.map +1 -0
- package/lib/module/vendor/mcu/hct/hct.js +178 -0
- package/lib/module/vendor/mcu/hct/hct.js.map +1 -0
- package/lib/module/vendor/mcu/hct/hct_solver.js +396 -0
- package/lib/module/vendor/mcu/hct/hct_solver.js.map +1 -0
- package/lib/module/vendor/mcu/hct/viewing_conditions.js +110 -0
- package/lib/module/vendor/mcu/hct/viewing_conditions.js.map +1 -0
- package/lib/module/vendor/mcu/index.js +8 -0
- package/lib/module/vendor/mcu/index.js.map +1 -0
- package/lib/module/vendor/mcu/palettes/tonal_palette.js +172 -0
- package/lib/module/vendor/mcu/palettes/tonal_palette.js.map +1 -0
- package/lib/module/vendor/mcu/utils/color_utils.js +277 -0
- package/lib/module/vendor/mcu/utils/color_utils.js.map +1 -0
- package/lib/module/vendor/mcu/utils/math_utils.js +146 -0
- package/lib/module/vendor/mcu/utils/math_utils.js.map +1 -0
- package/lib/typescript/commonjs/color/categorical.d.ts +7 -0
- package/lib/typescript/commonjs/color/categorical.d.ts.map +1 -0
- package/lib/typescript/commonjs/color/contrast.d.ts +26 -0
- package/lib/typescript/commonjs/color/contrast.d.ts.map +1 -0
- package/lib/typescript/commonjs/color/parse.d.ts +25 -0
- package/lib/typescript/commonjs/color/parse.d.ts.map +1 -0
- package/lib/typescript/commonjs/color/roles.d.ts +26 -0
- package/lib/typescript/commonjs/color/roles.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +18 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/integration/navigationTheme.d.ts +30 -0
- package/lib/typescript/commonjs/integration/navigationTheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/presets/byTone.d.ts +19 -0
- package/lib/typescript/commonjs/presets/byTone.d.ts.map +1 -0
- package/lib/typescript/commonjs/presets/layout.d.ts +63 -0
- package/lib/typescript/commonjs/presets/layout.d.ts.map +1 -0
- package/lib/typescript/commonjs/presets/themePresets.d.ts +11 -0
- package/lib/typescript/commonjs/presets/themePresets.d.ts.map +1 -0
- package/lib/typescript/commonjs/theme/buildThemes.d.ts +18 -0
- package/lib/typescript/commonjs/theme/buildThemes.d.ts.map +1 -0
- package/lib/typescript/commonjs/theme/errors.d.ts +23 -0
- package/lib/typescript/commonjs/theme/errors.d.ts.map +1 -0
- package/lib/typescript/commonjs/theme/overrides.d.ts +11 -0
- package/lib/typescript/commonjs/theme/overrides.d.ts.map +1 -0
- package/lib/typescript/commonjs/theme/validateThemeConfig.d.ts +6 -0
- package/lib/typescript/commonjs/theme/validateThemeConfig.d.ts.map +1 -0
- package/lib/typescript/commonjs/tokens/defaults.d.ts +23 -0
- package/lib/typescript/commonjs/tokens/defaults.d.ts.map +1 -0
- package/lib/typescript/commonjs/tokens/typography.d.ts +14 -0
- package/lib/typescript/commonjs/tokens/typography.d.ts.map +1 -0
- package/lib/typescript/commonjs/types/brand.d.ts +21 -0
- package/lib/typescript/commonjs/types/brand.d.ts.map +1 -0
- package/lib/typescript/commonjs/types/colors.d.ts +76 -0
- package/lib/typescript/commonjs/types/colors.d.ts.map +1 -0
- package/lib/typescript/commonjs/types/index.d.ts +6 -0
- package/lib/typescript/commonjs/types/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/types/theme.d.ts +140 -0
- package/lib/typescript/commonjs/types/theme.d.ts.map +1 -0
- package/lib/typescript/commonjs/types/tokens.d.ts +79 -0
- package/lib/typescript/commonjs/types/tokens.d.ts.map +1 -0
- package/lib/typescript/commonjs/types/typography.d.ts +53 -0
- package/lib/typescript/commonjs/types/typography.d.ts.map +1 -0
- package/lib/typescript/commonjs/unistyles/createUnistylesConfig.d.ts +52 -0
- package/lib/typescript/commonjs/unistyles/createUnistylesConfig.d.ts.map +1 -0
- package/lib/typescript/commonjs/unistyles/themeMode.d.ts +13 -0
- package/lib/typescript/commonjs/unistyles/themeMode.d.ts.map +1 -0
- package/lib/typescript/commonjs/vendor/mcu/hct/cam16.d.ts +132 -0
- package/lib/typescript/commonjs/vendor/mcu/hct/cam16.d.ts.map +1 -0
- package/lib/typescript/commonjs/vendor/mcu/hct/hct.d.ts +93 -0
- package/lib/typescript/commonjs/vendor/mcu/hct/hct.d.ts.map +1 -0
- package/lib/typescript/commonjs/vendor/mcu/hct/hct_solver.d.ts +147 -0
- package/lib/typescript/commonjs/vendor/mcu/hct/hct_solver.d.ts.map +1 -0
- package/lib/typescript/commonjs/vendor/mcu/hct/viewing_conditions.d.ts +75 -0
- package/lib/typescript/commonjs/vendor/mcu/hct/viewing_conditions.d.ts.map +1 -0
- package/lib/typescript/commonjs/vendor/mcu/index.d.ts +4 -0
- package/lib/typescript/commonjs/vendor/mcu/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/vendor/mcu/palettes/tonal_palette.d.ts +56 -0
- package/lib/typescript/commonjs/vendor/mcu/palettes/tonal_palette.d.ts.map +1 -0
- package/lib/typescript/commonjs/vendor/mcu/utils/color_utils.d.ts +129 -0
- package/lib/typescript/commonjs/vendor/mcu/utils/color_utils.d.ts.map +1 -0
- package/lib/typescript/commonjs/vendor/mcu/utils/math_utils.d.ts +83 -0
- package/lib/typescript/commonjs/vendor/mcu/utils/math_utils.d.ts.map +1 -0
- package/lib/typescript/module/color/categorical.d.ts +7 -0
- package/lib/typescript/module/color/categorical.d.ts.map +1 -0
- package/lib/typescript/module/color/contrast.d.ts +26 -0
- package/lib/typescript/module/color/contrast.d.ts.map +1 -0
- package/lib/typescript/module/color/parse.d.ts +25 -0
- package/lib/typescript/module/color/parse.d.ts.map +1 -0
- package/lib/typescript/module/color/roles.d.ts +26 -0
- package/lib/typescript/module/color/roles.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +18 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/integration/navigationTheme.d.ts +30 -0
- package/lib/typescript/module/integration/navigationTheme.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/presets/byTone.d.ts +19 -0
- package/lib/typescript/module/presets/byTone.d.ts.map +1 -0
- package/lib/typescript/module/presets/layout.d.ts +63 -0
- package/lib/typescript/module/presets/layout.d.ts.map +1 -0
- package/lib/typescript/module/presets/themePresets.d.ts +11 -0
- package/lib/typescript/module/presets/themePresets.d.ts.map +1 -0
- package/lib/typescript/module/theme/buildThemes.d.ts +18 -0
- package/lib/typescript/module/theme/buildThemes.d.ts.map +1 -0
- package/lib/typescript/module/theme/errors.d.ts +23 -0
- package/lib/typescript/module/theme/errors.d.ts.map +1 -0
- package/lib/typescript/module/theme/overrides.d.ts +11 -0
- package/lib/typescript/module/theme/overrides.d.ts.map +1 -0
- package/lib/typescript/module/theme/validateThemeConfig.d.ts +6 -0
- package/lib/typescript/module/theme/validateThemeConfig.d.ts.map +1 -0
- package/lib/typescript/module/tokens/defaults.d.ts +23 -0
- package/lib/typescript/module/tokens/defaults.d.ts.map +1 -0
- package/lib/typescript/module/tokens/typography.d.ts +14 -0
- package/lib/typescript/module/tokens/typography.d.ts.map +1 -0
- package/lib/typescript/module/types/brand.d.ts +21 -0
- package/lib/typescript/module/types/brand.d.ts.map +1 -0
- package/lib/typescript/module/types/colors.d.ts +76 -0
- package/lib/typescript/module/types/colors.d.ts.map +1 -0
- package/lib/typescript/module/types/index.d.ts +6 -0
- package/lib/typescript/module/types/index.d.ts.map +1 -0
- package/lib/typescript/module/types/theme.d.ts +140 -0
- package/lib/typescript/module/types/theme.d.ts.map +1 -0
- package/lib/typescript/module/types/tokens.d.ts +79 -0
- package/lib/typescript/module/types/tokens.d.ts.map +1 -0
- package/lib/typescript/module/types/typography.d.ts +53 -0
- package/lib/typescript/module/types/typography.d.ts.map +1 -0
- package/lib/typescript/module/unistyles/createUnistylesConfig.d.ts +52 -0
- package/lib/typescript/module/unistyles/createUnistylesConfig.d.ts.map +1 -0
- package/lib/typescript/module/unistyles/themeMode.d.ts +13 -0
- package/lib/typescript/module/unistyles/themeMode.d.ts.map +1 -0
- package/lib/typescript/module/vendor/mcu/hct/cam16.d.ts +132 -0
- package/lib/typescript/module/vendor/mcu/hct/cam16.d.ts.map +1 -0
- package/lib/typescript/module/vendor/mcu/hct/hct.d.ts +93 -0
- package/lib/typescript/module/vendor/mcu/hct/hct.d.ts.map +1 -0
- package/lib/typescript/module/vendor/mcu/hct/hct_solver.d.ts +147 -0
- package/lib/typescript/module/vendor/mcu/hct/hct_solver.d.ts.map +1 -0
- package/lib/typescript/module/vendor/mcu/hct/viewing_conditions.d.ts +75 -0
- package/lib/typescript/module/vendor/mcu/hct/viewing_conditions.d.ts.map +1 -0
- package/lib/typescript/module/vendor/mcu/index.d.ts +4 -0
- package/lib/typescript/module/vendor/mcu/index.d.ts.map +1 -0
- package/lib/typescript/module/vendor/mcu/palettes/tonal_palette.d.ts +56 -0
- package/lib/typescript/module/vendor/mcu/palettes/tonal_palette.d.ts.map +1 -0
- package/lib/typescript/module/vendor/mcu/utils/color_utils.d.ts +129 -0
- package/lib/typescript/module/vendor/mcu/utils/color_utils.d.ts.map +1 -0
- package/lib/typescript/module/vendor/mcu/utils/math_utils.d.ts +83 -0
- package/lib/typescript/module/vendor/mcu/utils/math_utils.d.ts.map +1 -0
- package/package.json +40 -16
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildThemes = buildThemes;
|
|
7
|
+
var _rnCore = require("@chipmobilesdk/rn-core");
|
|
8
|
+
var _categorical = require("../color/categorical.js");
|
|
9
|
+
var _contrast = require("../color/contrast.js");
|
|
10
|
+
var _roles = require("../color/roles.js");
|
|
11
|
+
var _themePresets = require("../presets/themePresets.js");
|
|
12
|
+
var _defaults = require("../tokens/defaults.js");
|
|
13
|
+
var _typography = require("../tokens/typography.js");
|
|
14
|
+
var _errors = require("./errors.js");
|
|
15
|
+
var _overrides = require("./overrides.js");
|
|
16
|
+
var _validateThemeConfig = require("./validateThemeConfig.js");
|
|
17
|
+
/** Read only when no `hairlineWidth` is given, so building themes needs no React Native. */
|
|
18
|
+
const reactNative = (0, _rnCore.lazyPeer)('react-native', () => {
|
|
19
|
+
// Inside `try`, so Metro bundles an app that leaves this optional peer out.
|
|
20
|
+
try {
|
|
21
|
+
return require('react-native');
|
|
22
|
+
} catch (cause) {
|
|
23
|
+
throw cause;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
function deviceHairlineWidth() {
|
|
27
|
+
const result = reactNative.get();
|
|
28
|
+
return (result.ok ? result.module.StyleSheet?.hairlineWidth : undefined) ?? 1;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The standard tone names an app's own tone may not take over (THM-03). */
|
|
32
|
+
const STANDARD_TONES = new Set(['neutral', 'primary', 'info', 'success', 'warning', 'error']);
|
|
33
|
+
function cloneFonts(font) {
|
|
34
|
+
const copy = {};
|
|
35
|
+
for (const [weight, token] of Object.entries(font)) {
|
|
36
|
+
copy[weight] = {
|
|
37
|
+
...token
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return copy;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Every top-level group an override may name, and nothing else.
|
|
45
|
+
*
|
|
46
|
+
* An override naming a group that does not exist — `radii` for `radius`,
|
|
47
|
+
* `colors` for `color` — used to be dropped without a word, so the override
|
|
48
|
+
* simply had no effect (THM-01). The list is derived from what was generated
|
|
49
|
+
* rather than written out by hand, so a new token group cannot be forgotten
|
|
50
|
+
* (THM-06).
|
|
51
|
+
*/
|
|
52
|
+
function assertKnownOverrideGroups(overrides, known, path) {
|
|
53
|
+
if (!(0, _overrides.isPlainObject)(overrides)) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const allowed = new Set(known);
|
|
57
|
+
for (const key of Object.keys(overrides)) {
|
|
58
|
+
if (overrides[key] === undefined || allowed.has(key)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
throw new _errors.ThemeConfigError(`${path}.${key}`, 'does not exist on the theme. Add new tokens through `extend`.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function buildOne(source, fonts, overrides, hairlineWidth) {
|
|
65
|
+
const {
|
|
66
|
+
name,
|
|
67
|
+
scheme,
|
|
68
|
+
config,
|
|
69
|
+
palettes
|
|
70
|
+
} = source;
|
|
71
|
+
const path = `overrides.${name}`;
|
|
72
|
+
const generatedColor = (0, _roles.buildColorRoles)(palettes, scheme);
|
|
73
|
+
|
|
74
|
+
// Colour is merged first, because what follows is derived from it: an
|
|
75
|
+
// override of `color.shadow` or `color.onSurface` used to leave `shadow` and
|
|
76
|
+
// `tone.neutral` built from the generated value, so a theme that pinned a
|
|
77
|
+
// colour disagreed with itself (THM-02).
|
|
78
|
+
const color = (0, _overrides.mergeOverrides)(generatedColor, (0, _overrides.pick)(overrides, ['color'])?.color, `${path}.color`);
|
|
79
|
+
const tokenGroups = {
|
|
80
|
+
color,
|
|
81
|
+
typography: (0, _typography.buildTypography)(config.typography, fonts.font, fonts.family),
|
|
82
|
+
font: cloneFonts(fonts.font),
|
|
83
|
+
fontWeight: (0, _typography.buildFontWeight)(),
|
|
84
|
+
spacing: (0, _defaults.buildSpacing)(),
|
|
85
|
+
radius: (0, _defaults.buildRadius)(),
|
|
86
|
+
borderWidth: (0, _defaults.buildBorderWidth)(hairlineWidth),
|
|
87
|
+
size: (0, _defaults.buildSize)(),
|
|
88
|
+
opacity: (0, _defaults.buildOpacity)(),
|
|
89
|
+
motion: (0, _defaults.buildMotion)(),
|
|
90
|
+
shadow: (0, _defaults.buildShadows)(color.shadow),
|
|
91
|
+
zIndex: (0, _defaults.buildZIndex)(),
|
|
92
|
+
maxFontScale: config.typography?.maxFontScale ?? _defaults.DEFAULT_MAX_FONT_SCALE,
|
|
93
|
+
categorical: (0, _categorical.buildCategorical)(config.brandColors.primary, scheme)
|
|
94
|
+
};
|
|
95
|
+
const tokenKeys = Object.keys(tokenGroups);
|
|
96
|
+
const tokens = (0, _overrides.mergeOverrides)(tokenGroups, (0, _overrides.pick)(overrides, tokenKeys), path);
|
|
97
|
+
const tone = (0, _overrides.mergeOverrides)(
|
|
98
|
+
// From the merged colour, so `tone.neutral` follows an override of
|
|
99
|
+
// `color.onSurface` as the text presets already did.
|
|
100
|
+
(0, _roles.buildTones)(palettes, tokens.color, scheme), (0, _overrides.pick)(overrides, ['tone'])?.tone, `${path}.tone`);
|
|
101
|
+
const presets = (0, _overrides.mergeOverrides)((0, _themePresets.buildPresets)(tokens), (0, _overrides.pick)(overrides, _themePresets.PRESET_KEYS), path);
|
|
102
|
+
const base = {
|
|
103
|
+
...tokens,
|
|
104
|
+
tone,
|
|
105
|
+
...presets
|
|
106
|
+
};
|
|
107
|
+
if (!config.extend) {
|
|
108
|
+
assertKnownOverrideGroups(overrides, [...tokenKeys, 'tone', ..._themePresets.PRESET_KEYS], path);
|
|
109
|
+
return base;
|
|
110
|
+
}
|
|
111
|
+
const extension = config.extend({
|
|
112
|
+
name,
|
|
113
|
+
scheme,
|
|
114
|
+
theme: base
|
|
115
|
+
});
|
|
116
|
+
for (const key of Object.keys(extension)) {
|
|
117
|
+
if (key in base) {
|
|
118
|
+
// `extend` returning `{ spacing: … }` replaced the whole spacing scale
|
|
119
|
+
// with whatever it held, unvalidated (THM-03).
|
|
120
|
+
throw new _errors.ThemeConfigError(`extend.${key}`, 'is already a theme group. Give the extension token a name of its own.');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
assertKnownOverrideGroups(overrides, [...tokenKeys, 'tone', ..._themePresets.PRESET_KEYS, ...Object.keys(extension)], path);
|
|
124
|
+
const extensionOverrides = (0, _overrides.pick)(overrides, Object.keys(extension));
|
|
125
|
+
return {
|
|
126
|
+
...base,
|
|
127
|
+
...(0, _overrides.mergeOverrides)(extension, extensionOverrides, path)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function checkContrast(name, theme, strict) {
|
|
131
|
+
if (!__DEV__ && !strict) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const failures = (0, _contrast.auditTheme)(theme);
|
|
135
|
+
if (failures.length === 0) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (strict) {
|
|
139
|
+
throw new _errors.ThemeContrastError(name, failures);
|
|
140
|
+
}
|
|
141
|
+
channel.emit('contrast', 'warn', {
|
|
142
|
+
theme: name,
|
|
143
|
+
failures: failures.length
|
|
144
|
+
});
|
|
145
|
+
console.warn(`[rn-theme] Theme "${name}" breaks contrast guarantees after overrides:\n${(0, _errors.describeFailures)(failures)}`);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** Contrast warnings also reach the app's SDK sinks (`installSdkSink`, CORE-08). */
|
|
149
|
+
const channel = (0, _rnCore.createDiagnosticChannel)('rn-theme');
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Builds every theme from brand config — pure, with no Unistyles dependency
|
|
153
|
+
* (spec AC-9.4). `createUnistylesConfig` wraps this; call it directly to feed
|
|
154
|
+
* tokens to other libraries or tests.
|
|
155
|
+
*/
|
|
156
|
+
function buildThemes(config, options) {
|
|
157
|
+
(0, _validateThemeConfig.validateThemeConfig)(config);
|
|
158
|
+
const loose = config;
|
|
159
|
+
// rn-core's one platform source (CORE-09); off-device, fonts resolve as on Android.
|
|
160
|
+
const platform = options?.platform ?? ((0, _rnCore.currentPlatform)() === 'ios' ? 'ios' : 'android');
|
|
161
|
+
const hairlineWidth = options?.hairlineWidth ?? deviceHairlineWidth();
|
|
162
|
+
const fonts = (0, _typography.buildFonts)(loose.typography, platform);
|
|
163
|
+
const basePalettes = (0, _roles.buildPalettes)(loose);
|
|
164
|
+
const sources = [{
|
|
165
|
+
name: 'light',
|
|
166
|
+
scheme: 'light',
|
|
167
|
+
config: loose,
|
|
168
|
+
palettes: basePalettes
|
|
169
|
+
}, {
|
|
170
|
+
name: 'dark',
|
|
171
|
+
scheme: 'dark',
|
|
172
|
+
config: loose,
|
|
173
|
+
palettes: basePalettes
|
|
174
|
+
}, ...Object.entries(loose.themes ?? {}).map(([name, named]) => {
|
|
175
|
+
const tones = {
|
|
176
|
+
...loose.tones,
|
|
177
|
+
...named.tones
|
|
178
|
+
};
|
|
179
|
+
for (const tone of Object.keys(tones)) {
|
|
180
|
+
if (STANDARD_TONES.has(tone)) {
|
|
181
|
+
// A custom tone named `primary` silently replaced the standard
|
|
182
|
+
// one, contrast guarantees and all (THM-03).
|
|
183
|
+
throw new _errors.ThemeConfigError(`themes.${name}.tones.${tone}`, 'is a standard tone. Override it through `overrides` instead.');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const namedConfig = {
|
|
187
|
+
...loose,
|
|
188
|
+
brandColors: named.brandColors ?? loose.brandColors,
|
|
189
|
+
seeds: {
|
|
190
|
+
...loose.seeds,
|
|
191
|
+
...named.seeds
|
|
192
|
+
},
|
|
193
|
+
tones
|
|
194
|
+
};
|
|
195
|
+
return {
|
|
196
|
+
name,
|
|
197
|
+
scheme: named.scheme,
|
|
198
|
+
config: namedConfig,
|
|
199
|
+
palettes: (0, _roles.buildPalettes)(namedConfig)
|
|
200
|
+
};
|
|
201
|
+
})];
|
|
202
|
+
const themes = {};
|
|
203
|
+
for (const source of sources) {
|
|
204
|
+
const overrides = loose.overrides?.[source.name];
|
|
205
|
+
const theme = buildOne(source, fonts, overrides, hairlineWidth);
|
|
206
|
+
checkContrast(source.name, theme, loose.strict === true);
|
|
207
|
+
themes[source.name] = theme;
|
|
208
|
+
}
|
|
209
|
+
return themes;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=buildThemes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_rnCore","require","_categorical","_contrast","_roles","_themePresets","_defaults","_typography","_errors","_overrides","_validateThemeConfig","reactNative","lazyPeer","cause","deviceHairlineWidth","result","get","ok","module","StyleSheet","hairlineWidth","undefined","STANDARD_TONES","Set","cloneFonts","font","copy","weight","token","Object","entries","assertKnownOverrideGroups","overrides","known","path","isPlainObject","allowed","key","keys","has","ThemeConfigError","buildOne","source","fonts","name","scheme","config","palettes","generatedColor","buildColorRoles","color","mergeOverrides","pick","tokenGroups","typography","buildTypography","family","fontWeight","buildFontWeight","spacing","buildSpacing","radius","buildRadius","borderWidth","buildBorderWidth","size","buildSize","opacity","buildOpacity","motion","buildMotion","shadow","buildShadows","zIndex","buildZIndex","maxFontScale","DEFAULT_MAX_FONT_SCALE","categorical","buildCategorical","brandColors","primary","tokenKeys","tokens","tone","buildTones","presets","buildPresets","PRESET_KEYS","base","extend","extension","theme","extensionOverrides","checkContrast","strict","__DEV__","failures","auditTheme","length","ThemeContrastError","channel","emit","console","warn","describeFailures","createDiagnosticChannel","buildThemes","options","validateThemeConfig","loose","platform","currentPlatform","buildFonts","basePalettes","buildPalettes","sources","themes","map","named","tones","namedConfig","seeds"],"sourceRoot":"../../../src","sources":["theme/buildThemes.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ThemeContrastError = exports.ThemeConfigError = void 0;
|
|
7
|
+
exports.describeFailures = describeFailures;
|
|
8
|
+
var _rnCore = require("@chipmobilesdk/rn-core");
|
|
9
|
+
/**
|
|
10
|
+
* The package's error codes (THM-09): `invalid_config` for a config or override
|
|
11
|
+
* the package rejects, `contrast` for a theme that breaks a contrast guarantee.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Invalid configuration or override; `path` names the offending field. An
|
|
16
|
+
* `SdkError` (`@chipmobilesdk/rn-core`) with `pkg: 'rn-theme'`.
|
|
17
|
+
*/
|
|
18
|
+
class ThemeConfigError extends _rnCore.SdkError {
|
|
19
|
+
constructor(path, message) {
|
|
20
|
+
super('rn-theme', 'invalid_config', {
|
|
21
|
+
message: `${path}: ${message}`
|
|
22
|
+
});
|
|
23
|
+
this.name = 'ThemeConfigError';
|
|
24
|
+
this.path = path;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Thrown in `strict` mode when a theme breaks a contrast guarantee. */
|
|
29
|
+
exports.ThemeConfigError = ThemeConfigError;
|
|
30
|
+
class ThemeContrastError extends _rnCore.SdkError {
|
|
31
|
+
constructor(themeName, failures) {
|
|
32
|
+
super('rn-theme', 'contrast', {
|
|
33
|
+
message: `Theme "${themeName}" breaks contrast guarantees:\n${describeFailures(failures)}`
|
|
34
|
+
});
|
|
35
|
+
this.name = 'ThemeContrastError';
|
|
36
|
+
this.themeName = themeName;
|
|
37
|
+
this.failures = failures;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.ThemeContrastError = ThemeContrastError;
|
|
41
|
+
function describeFailures(failures) {
|
|
42
|
+
return failures.map(({
|
|
43
|
+
foreground,
|
|
44
|
+
background,
|
|
45
|
+
ratio,
|
|
46
|
+
target
|
|
47
|
+
}) => ` ${foreground} on ${background}: ${ratio}:1 (needs ${target}:1)`).join('\n');
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_rnCore","require","ThemeConfigError","SdkError","constructor","path","message","name","exports","ThemeContrastError","themeName","failures","describeFailures","map","foreground","background","ratio","target","join"],"sourceRoot":"../../../src","sources":["theme/errors.ts"],"mappings":";;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAIA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACO,MAAMC,gBAAgB,SAASC,gBAAQ,CAAiB;EAG9DC,WAAWA,CAACC,IAAY,EAAEC,OAAe,EAAE;IAC1C,KAAK,CAAC,UAAU,EAAE,gBAAgB,EAAE;MAAEA,OAAO,EAAE,GAAGD,IAAI,KAAKC,OAAO;IAAG,CAAC,CAAC;IACvE,IAAI,CAACC,IAAI,GAAG,kBAAkB;IAC9B,IAAI,CAACF,IAAI,GAAGA,IAAI;EACjB;AACD;;AAEA;AAAAG,OAAA,CAAAN,gBAAA,GAAAA,gBAAA;AACO,MAAMO,kBAAkB,SAASN,gBAAQ,CAAiB;EAIhEC,WAAWA,CAACM,SAAiB,EAAEC,QAA2B,EAAE;IAC3D,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE;MAC7BL,OAAO,EAAE,UAAUI,SAAS,kCAAkCE,gBAAgB,CAACD,QAAQ,CAAC;IACzF,CAAC,CAAC;IACF,IAAI,CAACJ,IAAI,GAAG,oBAAoB;IAChC,IAAI,CAACG,SAAS,GAAGA,SAAS;IAC1B,IAAI,CAACC,QAAQ,GAAGA,QAAQ;EACzB;AACD;AAACH,OAAA,CAAAC,kBAAA,GAAAA,kBAAA;AAEM,SAASG,gBAAgBA,CAACD,QAA2B,EAAU;EACrE,OAAOA,QAAQ,CACbE,GAAG,CACH,CAAC;IAAEC,UAAU;IAAEC,UAAU;IAAEC,KAAK;IAAEC;EAAO,CAAC,KACzC,KAAKH,UAAU,OAAOC,UAAU,KAAKC,KAAK,aAAaC,MAAM,KAC/D,CAAC,CACAC,IAAI,CAAC,IAAI,CAAC;AACb","ignoreList":[]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isPlainObject = isPlainObject;
|
|
7
|
+
exports.mergeOverrides = mergeOverrides;
|
|
8
|
+
exports.pick = pick;
|
|
9
|
+
var _parse = require("../color/parse.js");
|
|
10
|
+
var _errors = require("./errors.js");
|
|
11
|
+
function isPlainObject(value) {
|
|
12
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Optional style keys an override may add although the generated token omits them. */
|
|
16
|
+
const OPTIONAL_NUMBER_KEYS = new Set(['letterSpacing']);
|
|
17
|
+
|
|
18
|
+
/** Groups whose every leaf is a colour. */
|
|
19
|
+
const COLOR_GROUPS = new Set(['color', 'tone', 'categorical']);
|
|
20
|
+
function isColorPath(segments) {
|
|
21
|
+
const leaf = segments.at(-1) ?? '';
|
|
22
|
+
return COLOR_GROUPS.has(segments[0]) || leaf === 'color' || leaf.endsWith('Color');
|
|
23
|
+
}
|
|
24
|
+
function assertFiniteNumber(value, path) {
|
|
25
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
26
|
+
throw new _errors.ThemeConfigError(path, 'must be a finite number.');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function validateLeaf(value, base, segments, path) {
|
|
30
|
+
if (typeof base === 'number') {
|
|
31
|
+
assertFiniteNumber(value, path);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (typeof base !== 'string') {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (typeof value !== 'string') {
|
|
38
|
+
throw new _errors.ThemeConfigError(path, 'must be a string.');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// A string that is a colour today (e.g. an `extend` token) must stay one.
|
|
42
|
+
if ((isColorPath(segments) || (0, _parse.isValidColor)(base)) && !(0, _parse.isValidColor)(value)) {
|
|
43
|
+
throw new _errors.ThemeConfigError(path, `"${value}" is not a supported colour.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function mergeArray({
|
|
47
|
+
value,
|
|
48
|
+
baseValue,
|
|
49
|
+
path,
|
|
50
|
+
segments
|
|
51
|
+
}) {
|
|
52
|
+
if (!Array.isArray(value)) {
|
|
53
|
+
throw new _errors.ThemeConfigError(path, 'must be an array.');
|
|
54
|
+
}
|
|
55
|
+
const sample = Array.isArray(baseValue) ? baseValue[0] : undefined;
|
|
56
|
+
value.forEach((item, index) => validateLeaf(item, sample, segments, `${path}.${index}`));
|
|
57
|
+
return [...value];
|
|
58
|
+
}
|
|
59
|
+
function mergeEntry(entry) {
|
|
60
|
+
const {
|
|
61
|
+
value,
|
|
62
|
+
baseValue,
|
|
63
|
+
path,
|
|
64
|
+
segments
|
|
65
|
+
} = entry;
|
|
66
|
+
if (Array.isArray(baseValue)) {
|
|
67
|
+
return mergeArray(entry);
|
|
68
|
+
}
|
|
69
|
+
if (isPlainObject(baseValue)) {
|
|
70
|
+
return mergeOverrides(baseValue, value, path, segments);
|
|
71
|
+
}
|
|
72
|
+
validateLeaf(value, baseValue, segments, path);
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Merges `overrides` into a fresh copy of `base`, validating as it goes:
|
|
78
|
+
* keys must exist in `base`, colours must parse, numbers must be finite.
|
|
79
|
+
* Arrays are replaced whole. `base` itself is never mutated.
|
|
80
|
+
*/
|
|
81
|
+
function mergeOverrides(base, overrides, path, segments = []) {
|
|
82
|
+
if (overrides == null) {
|
|
83
|
+
return base;
|
|
84
|
+
}
|
|
85
|
+
if (!isPlainObject(overrides) || !isPlainObject(base)) {
|
|
86
|
+
throw new _errors.ThemeConfigError(path, 'must be an object.');
|
|
87
|
+
}
|
|
88
|
+
const result = {
|
|
89
|
+
...base
|
|
90
|
+
};
|
|
91
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
92
|
+
const entry = {
|
|
93
|
+
key,
|
|
94
|
+
value,
|
|
95
|
+
baseValue: base[key],
|
|
96
|
+
path: `${path}.${key}`,
|
|
97
|
+
segments: [...segments, key]
|
|
98
|
+
};
|
|
99
|
+
if (value === undefined) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (key in base) {
|
|
103
|
+
result[key] = mergeEntry(entry);
|
|
104
|
+
} else if (OPTIONAL_NUMBER_KEYS.has(key)) {
|
|
105
|
+
assertFiniteNumber(value, entry.path);
|
|
106
|
+
result[key] = value;
|
|
107
|
+
} else {
|
|
108
|
+
throw new _errors.ThemeConfigError(entry.path, 'does not exist on the theme. Add new tokens through `extend`.');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
function pick(source, keys) {
|
|
114
|
+
if (!isPlainObject(source)) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const picked = {};
|
|
118
|
+
for (const key of keys) {
|
|
119
|
+
if (key in source) {
|
|
120
|
+
picked[key] = source[key];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return picked;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_parse","require","_errors","isPlainObject","value","Array","isArray","OPTIONAL_NUMBER_KEYS","Set","COLOR_GROUPS","isColorPath","segments","leaf","at","has","endsWith","assertFiniteNumber","path","Number","isFinite","ThemeConfigError","validateLeaf","base","isValidColor","mergeArray","baseValue","sample","undefined","forEach","item","index","mergeEntry","entry","mergeOverrides","overrides","result","key","Object","entries","pick","source","keys","picked"],"sourceRoot":"../../../src","sources":["theme/overrides.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.themeNamesOf = themeNamesOf;
|
|
7
|
+
exports.validateThemeConfig = validateThemeConfig;
|
|
8
|
+
var _parse = require("../color/parse.js");
|
|
9
|
+
var _errors = require("./errors.js");
|
|
10
|
+
var _overrides = require("./overrides.js");
|
|
11
|
+
const BRAND_KEYS = ['primary', 'secondary', 'tertiary'];
|
|
12
|
+
const SEED_KEYS = ['neutral', 'error', 'success', 'warning', 'info'];
|
|
13
|
+
const FONT_WEIGHT_NAMES = ['regular', 'medium', 'semibold', 'bold', 'heavy'];
|
|
14
|
+
const SCHEMES = new Set(['light', 'dark']);
|
|
15
|
+
const RESERVED_THEME_NAMES = new Set(['light', 'dark']);
|
|
16
|
+
function assertObject(value, path) {
|
|
17
|
+
if (!(0, _overrides.isPlainObject)(value)) {
|
|
18
|
+
throw new _errors.ThemeConfigError(path, 'must be an object.');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function assertOpaqueColor(value, path) {
|
|
22
|
+
if (!(0, _parse.isOpaqueColor)(value)) {
|
|
23
|
+
throw new _errors.ThemeConfigError(path, `must be an opaque colour (#RGB, #RRGGBB or rgb()), received ${JSON.stringify(value)}.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function assertNonEmptyString(value, path) {
|
|
27
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
28
|
+
throw new _errors.ThemeConfigError(path, 'must be a non-empty string.');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function assertPositiveNumber(value, path) {
|
|
32
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
|
|
33
|
+
throw new _errors.ThemeConfigError(path, 'must be a positive finite number.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** The tones this package builds, which an app's own tone may not take over. */
|
|
38
|
+
const STANDARD_TONE_NAMES = new Set(['neutral', 'primary', 'info', 'success', 'warning', 'error']);
|
|
39
|
+
function validateCustomTones(value, path) {
|
|
40
|
+
if (value == null) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
assertObject(value, path);
|
|
44
|
+
for (const name of Object.keys(value)) {
|
|
45
|
+
if (STANDARD_TONE_NAMES.has(name)) {
|
|
46
|
+
throw new _errors.ThemeConfigError(`${path}.${name}`, 'is a standard tone; customise it through `overrides.<theme>.tone` instead.');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
validateColorRecord(value, path);
|
|
50
|
+
}
|
|
51
|
+
function validateColorRecord(value, path, keys) {
|
|
52
|
+
if (value == null) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
assertObject(value, path);
|
|
56
|
+
for (const [key, color] of Object.entries(value)) {
|
|
57
|
+
if (keys && !keys.includes(key)) {
|
|
58
|
+
throw new _errors.ThemeConfigError(`${path}.${key}`, `is not one of ${keys.join(', ')}.`);
|
|
59
|
+
}
|
|
60
|
+
if (color !== undefined) {
|
|
61
|
+
assertOpaqueColor(color, `${path}.${key}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function validateBrandColors(value, path) {
|
|
66
|
+
assertObject(value, path);
|
|
67
|
+
for (const key of BRAND_KEYS) {
|
|
68
|
+
assertOpaqueColor(value[key], `${path}.${key}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function validateFontMap(value, path) {
|
|
72
|
+
if (value == null) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
assertObject(value, path);
|
|
76
|
+
for (const [weight, family] of Object.entries(value)) {
|
|
77
|
+
if (!FONT_WEIGHT_NAMES.includes(weight)) {
|
|
78
|
+
throw new _errors.ThemeConfigError(`${path}.${weight}`, `is not one of ${FONT_WEIGHT_NAMES.join(', ')}.`);
|
|
79
|
+
}
|
|
80
|
+
assertNonEmptyString(family, `${path}.${weight}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function validateTypography(value) {
|
|
84
|
+
if (value == null) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
assertObject(value, 'typography');
|
|
88
|
+
if (value.fontFamily != null) {
|
|
89
|
+
assertNonEmptyString(value.fontFamily, 'typography.fontFamily');
|
|
90
|
+
}
|
|
91
|
+
for (const key of ['baseFontSize', 'fontScale', 'maxFontScale']) {
|
|
92
|
+
if (value[key] != null) {
|
|
93
|
+
assertPositiveNumber(value[key], `typography.${key}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (value.fonts != null) {
|
|
97
|
+
assertObject(value.fonts, 'typography.fonts');
|
|
98
|
+
if (value.fonts.family != null) {
|
|
99
|
+
assertNonEmptyString(value.fonts.family, 'typography.fonts.family');
|
|
100
|
+
}
|
|
101
|
+
validateFontMap(value.fonts.ios, 'typography.fonts.ios');
|
|
102
|
+
validateFontMap(value.fonts.android, 'typography.fonts.android');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function validateNamedThemes(value) {
|
|
106
|
+
if (value == null) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
assertObject(value, 'themes');
|
|
110
|
+
for (const [name, theme] of Object.entries(value)) {
|
|
111
|
+
const path = `themes.${name}`;
|
|
112
|
+
if (RESERVED_THEME_NAMES.has(name)) {
|
|
113
|
+
throw new _errors.ThemeConfigError(path, 'light and dark are built in; customise them with overrides.');
|
|
114
|
+
}
|
|
115
|
+
assertObject(theme, path);
|
|
116
|
+
if (!SCHEMES.has(theme.scheme)) {
|
|
117
|
+
throw new _errors.ThemeConfigError(`${path}.scheme`, "must be 'light' or 'dark'.");
|
|
118
|
+
}
|
|
119
|
+
if (theme.brandColors != null) {
|
|
120
|
+
validateBrandColors(theme.brandColors, `${path}.brandColors`);
|
|
121
|
+
}
|
|
122
|
+
validateColorRecord(theme.seeds, `${path}.seeds`, SEED_KEYS);
|
|
123
|
+
validateCustomTones(theme.tones, `${path}.tones`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function validateOverrideThemes(value, themeNames) {
|
|
127
|
+
if (value == null) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
assertObject(value, 'overrides');
|
|
131
|
+
for (const name of Object.keys(value)) {
|
|
132
|
+
if (!themeNames.includes(name)) {
|
|
133
|
+
throw new _errors.ThemeConfigError(`overrides.${name}`, `is not a theme (${themeNames.join(', ')}).`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Validates the config shape; override values are validated while merging. */
|
|
139
|
+
function validateThemeConfig(config) {
|
|
140
|
+
assertObject(config, 'config');
|
|
141
|
+
validateBrandColors(config.brandColors, 'brandColors');
|
|
142
|
+
validateColorRecord(config.seeds, 'seeds', SEED_KEYS);
|
|
143
|
+
validateCustomTones(config.tones, 'tones');
|
|
144
|
+
validateTypography(config.typography);
|
|
145
|
+
validateNamedThemes(config.themes);
|
|
146
|
+
if (config.extend != null && typeof config.extend !== 'function') {
|
|
147
|
+
throw new _errors.ThemeConfigError('extend', 'must be a function.');
|
|
148
|
+
}
|
|
149
|
+
if (config.strict != null && typeof config.strict !== 'boolean') {
|
|
150
|
+
throw new _errors.ThemeConfigError('strict', 'must be a boolean.');
|
|
151
|
+
}
|
|
152
|
+
validateOverrideThemes(config.overrides, themeNamesOf(config));
|
|
153
|
+
}
|
|
154
|
+
function themeNamesOf(config) {
|
|
155
|
+
return ['light', 'dark', ...Object.keys(config.themes ?? {})];
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=validateThemeConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_parse","require","_errors","_overrides","BRAND_KEYS","SEED_KEYS","FONT_WEIGHT_NAMES","SCHEMES","Set","RESERVED_THEME_NAMES","assertObject","value","path","isPlainObject","ThemeConfigError","assertOpaqueColor","isOpaqueColor","JSON","stringify","assertNonEmptyString","trim","length","assertPositiveNumber","Number","isFinite","STANDARD_TONE_NAMES","validateCustomTones","name","Object","keys","has","validateColorRecord","key","color","entries","includes","join","undefined","validateBrandColors","validateFontMap","weight","family","validateTypography","fontFamily","fonts","ios","android","validateNamedThemes","theme","scheme","brandColors","seeds","tones","validateOverrideThemes","themeNames","validateThemeConfig","config","typography","themes","extend","strict","overrides","themeNamesOf"],"sourceRoot":"../../../src","sources":["theme/validateThemeConfig.ts"],"mappings":"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","ignoreList":[]}
|