@chipmobilesdk/rn-theme 1.1.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 +124 -1
- package/README.md +17 -12
- 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
- package/src/color/roles.ts +3 -1
- package/src/theme/buildThemes.ts +84 -26
- package/src/theme/validateThemeConfig.ts +28 -2
- package/src/tokens/defaults.ts +14 -8
- package/src/unistyles/createUnistylesConfig.ts +4 -1
- package/src/vendor/mcu/index.ts +1 -1
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { createDiagnosticChannel } from '@chipmobilesdk/rn-core';
|
|
4
|
+
import { currentPlatform, lazyPeer } from '@chipmobilesdk/rn-core';
|
|
5
|
+
import { buildCategorical } from "../color/categorical.js";
|
|
6
|
+
import { auditTheme } from "../color/contrast.js";
|
|
7
|
+
import { buildColorRoles, buildPalettes, buildTones } from "../color/roles.js";
|
|
8
|
+
import { buildPresets, PRESET_KEYS } from "../presets/themePresets.js";
|
|
9
|
+
import { buildBorderWidth, buildMotion, buildOpacity, buildRadius, buildShadows, buildSize, buildSpacing, buildZIndex, DEFAULT_MAX_FONT_SCALE } from "../tokens/defaults.js";
|
|
10
|
+
import { buildFonts, buildFontWeight, buildTypography } from "../tokens/typography.js";
|
|
11
|
+
import { describeFailures, ThemeConfigError, ThemeContrastError } from "./errors.js";
|
|
12
|
+
import { isPlainObject, mergeOverrides, pick } from "./overrides.js";
|
|
13
|
+
import { validateThemeConfig } from "./validateThemeConfig.js";
|
|
14
|
+
/** Read only when no `hairlineWidth` is given, so building themes needs no React Native. */
|
|
15
|
+
const reactNative = lazyPeer('react-native', () => {
|
|
16
|
+
// Inside `try`, so Metro bundles an app that leaves this optional peer out.
|
|
17
|
+
try {
|
|
18
|
+
return require('react-native');
|
|
19
|
+
} catch (cause) {
|
|
20
|
+
throw cause;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
function deviceHairlineWidth() {
|
|
24
|
+
const result = reactNative.get();
|
|
25
|
+
return (result.ok ? result.module.StyleSheet?.hairlineWidth : undefined) ?? 1;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** The standard tone names an app's own tone may not take over (THM-03). */
|
|
29
|
+
const STANDARD_TONES = new Set(['neutral', 'primary', 'info', 'success', 'warning', 'error']);
|
|
30
|
+
function cloneFonts(font) {
|
|
31
|
+
const copy = {};
|
|
32
|
+
for (const [weight, token] of Object.entries(font)) {
|
|
33
|
+
copy[weight] = {
|
|
34
|
+
...token
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return copy;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Every top-level group an override may name, and nothing else.
|
|
42
|
+
*
|
|
43
|
+
* An override naming a group that does not exist — `radii` for `radius`,
|
|
44
|
+
* `colors` for `color` — used to be dropped without a word, so the override
|
|
45
|
+
* simply had no effect (THM-01). The list is derived from what was generated
|
|
46
|
+
* rather than written out by hand, so a new token group cannot be forgotten
|
|
47
|
+
* (THM-06).
|
|
48
|
+
*/
|
|
49
|
+
function assertKnownOverrideGroups(overrides, known, path) {
|
|
50
|
+
if (!isPlainObject(overrides)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const allowed = new Set(known);
|
|
54
|
+
for (const key of Object.keys(overrides)) {
|
|
55
|
+
if (overrides[key] === undefined || allowed.has(key)) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
throw new ThemeConfigError(`${path}.${key}`, 'does not exist on the theme. Add new tokens through `extend`.');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function buildOne(source, fonts, overrides, hairlineWidth) {
|
|
62
|
+
const {
|
|
63
|
+
name,
|
|
64
|
+
scheme,
|
|
65
|
+
config,
|
|
66
|
+
palettes
|
|
67
|
+
} = source;
|
|
68
|
+
const path = `overrides.${name}`;
|
|
69
|
+
const generatedColor = buildColorRoles(palettes, scheme);
|
|
70
|
+
|
|
71
|
+
// Colour is merged first, because what follows is derived from it: an
|
|
72
|
+
// override of `color.shadow` or `color.onSurface` used to leave `shadow` and
|
|
73
|
+
// `tone.neutral` built from the generated value, so a theme that pinned a
|
|
74
|
+
// colour disagreed with itself (THM-02).
|
|
75
|
+
const color = mergeOverrides(generatedColor, pick(overrides, ['color'])?.color, `${path}.color`);
|
|
76
|
+
const tokenGroups = {
|
|
77
|
+
color,
|
|
78
|
+
typography: buildTypography(config.typography, fonts.font, fonts.family),
|
|
79
|
+
font: cloneFonts(fonts.font),
|
|
80
|
+
fontWeight: buildFontWeight(),
|
|
81
|
+
spacing: buildSpacing(),
|
|
82
|
+
radius: buildRadius(),
|
|
83
|
+
borderWidth: buildBorderWidth(hairlineWidth),
|
|
84
|
+
size: buildSize(),
|
|
85
|
+
opacity: buildOpacity(),
|
|
86
|
+
motion: buildMotion(),
|
|
87
|
+
shadow: buildShadows(color.shadow),
|
|
88
|
+
zIndex: buildZIndex(),
|
|
89
|
+
maxFontScale: config.typography?.maxFontScale ?? DEFAULT_MAX_FONT_SCALE,
|
|
90
|
+
categorical: buildCategorical(config.brandColors.primary, scheme)
|
|
91
|
+
};
|
|
92
|
+
const tokenKeys = Object.keys(tokenGroups);
|
|
93
|
+
const tokens = mergeOverrides(tokenGroups, pick(overrides, tokenKeys), path);
|
|
94
|
+
const tone = mergeOverrides(
|
|
95
|
+
// From the merged colour, so `tone.neutral` follows an override of
|
|
96
|
+
// `color.onSurface` as the text presets already did.
|
|
97
|
+
buildTones(palettes, tokens.color, scheme), pick(overrides, ['tone'])?.tone, `${path}.tone`);
|
|
98
|
+
const presets = mergeOverrides(buildPresets(tokens), pick(overrides, PRESET_KEYS), path);
|
|
99
|
+
const base = {
|
|
100
|
+
...tokens,
|
|
101
|
+
tone,
|
|
102
|
+
...presets
|
|
103
|
+
};
|
|
104
|
+
if (!config.extend) {
|
|
105
|
+
assertKnownOverrideGroups(overrides, [...tokenKeys, 'tone', ...PRESET_KEYS], path);
|
|
106
|
+
return base;
|
|
107
|
+
}
|
|
108
|
+
const extension = config.extend({
|
|
109
|
+
name,
|
|
110
|
+
scheme,
|
|
111
|
+
theme: base
|
|
112
|
+
});
|
|
113
|
+
for (const key of Object.keys(extension)) {
|
|
114
|
+
if (key in base) {
|
|
115
|
+
// `extend` returning `{ spacing: … }` replaced the whole spacing scale
|
|
116
|
+
// with whatever it held, unvalidated (THM-03).
|
|
117
|
+
throw new ThemeConfigError(`extend.${key}`, 'is already a theme group. Give the extension token a name of its own.');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
assertKnownOverrideGroups(overrides, [...tokenKeys, 'tone', ...PRESET_KEYS, ...Object.keys(extension)], path);
|
|
121
|
+
const extensionOverrides = pick(overrides, Object.keys(extension));
|
|
122
|
+
return {
|
|
123
|
+
...base,
|
|
124
|
+
...mergeOverrides(extension, extensionOverrides, path)
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function checkContrast(name, theme, strict) {
|
|
128
|
+
if (!__DEV__ && !strict) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const failures = auditTheme(theme);
|
|
132
|
+
if (failures.length === 0) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (strict) {
|
|
136
|
+
throw new ThemeContrastError(name, failures);
|
|
137
|
+
}
|
|
138
|
+
channel.emit('contrast', 'warn', {
|
|
139
|
+
theme: name,
|
|
140
|
+
failures: failures.length
|
|
141
|
+
});
|
|
142
|
+
console.warn(`[rn-theme] Theme "${name}" breaks contrast guarantees after overrides:\n${describeFailures(failures)}`);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Contrast warnings also reach the app's SDK sinks (`installSdkSink`, CORE-08). */
|
|
146
|
+
const channel = createDiagnosticChannel('rn-theme');
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Builds every theme from brand config — pure, with no Unistyles dependency
|
|
150
|
+
* (spec AC-9.4). `createUnistylesConfig` wraps this; call it directly to feed
|
|
151
|
+
* tokens to other libraries or tests.
|
|
152
|
+
*/
|
|
153
|
+
export function buildThemes(config, options) {
|
|
154
|
+
validateThemeConfig(config);
|
|
155
|
+
const loose = config;
|
|
156
|
+
// rn-core's one platform source (CORE-09); off-device, fonts resolve as on Android.
|
|
157
|
+
const platform = options?.platform ?? (currentPlatform() === 'ios' ? 'ios' : 'android');
|
|
158
|
+
const hairlineWidth = options?.hairlineWidth ?? deviceHairlineWidth();
|
|
159
|
+
const fonts = buildFonts(loose.typography, platform);
|
|
160
|
+
const basePalettes = buildPalettes(loose);
|
|
161
|
+
const sources = [{
|
|
162
|
+
name: 'light',
|
|
163
|
+
scheme: 'light',
|
|
164
|
+
config: loose,
|
|
165
|
+
palettes: basePalettes
|
|
166
|
+
}, {
|
|
167
|
+
name: 'dark',
|
|
168
|
+
scheme: 'dark',
|
|
169
|
+
config: loose,
|
|
170
|
+
palettes: basePalettes
|
|
171
|
+
}, ...Object.entries(loose.themes ?? {}).map(([name, named]) => {
|
|
172
|
+
const tones = {
|
|
173
|
+
...loose.tones,
|
|
174
|
+
...named.tones
|
|
175
|
+
};
|
|
176
|
+
for (const tone of Object.keys(tones)) {
|
|
177
|
+
if (STANDARD_TONES.has(tone)) {
|
|
178
|
+
// A custom tone named `primary` silently replaced the standard
|
|
179
|
+
// one, contrast guarantees and all (THM-03).
|
|
180
|
+
throw new ThemeConfigError(`themes.${name}.tones.${tone}`, 'is a standard tone. Override it through `overrides` instead.');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const namedConfig = {
|
|
184
|
+
...loose,
|
|
185
|
+
brandColors: named.brandColors ?? loose.brandColors,
|
|
186
|
+
seeds: {
|
|
187
|
+
...loose.seeds,
|
|
188
|
+
...named.seeds
|
|
189
|
+
},
|
|
190
|
+
tones
|
|
191
|
+
};
|
|
192
|
+
return {
|
|
193
|
+
name,
|
|
194
|
+
scheme: named.scheme,
|
|
195
|
+
config: namedConfig,
|
|
196
|
+
palettes: buildPalettes(namedConfig)
|
|
197
|
+
};
|
|
198
|
+
})];
|
|
199
|
+
const themes = {};
|
|
200
|
+
for (const source of sources) {
|
|
201
|
+
const overrides = loose.overrides?.[source.name];
|
|
202
|
+
const theme = buildOne(source, fonts, overrides, hairlineWidth);
|
|
203
|
+
checkContrast(source.name, theme, loose.strict === true);
|
|
204
|
+
themes[source.name] = theme;
|
|
205
|
+
}
|
|
206
|
+
return themes;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=buildThemes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createDiagnosticChannel","currentPlatform","lazyPeer","buildCategorical","auditTheme","buildColorRoles","buildPalettes","buildTones","buildPresets","PRESET_KEYS","buildBorderWidth","buildMotion","buildOpacity","buildRadius","buildShadows","buildSize","buildSpacing","buildZIndex","DEFAULT_MAX_FONT_SCALE","buildFonts","buildFontWeight","buildTypography","describeFailures","ThemeConfigError","ThemeContrastError","isPlainObject","mergeOverrides","pick","validateThemeConfig","reactNative","require","cause","deviceHairlineWidth","result","get","ok","module","StyleSheet","hairlineWidth","undefined","STANDARD_TONES","Set","cloneFonts","font","copy","weight","token","Object","entries","assertKnownOverrideGroups","overrides","known","path","allowed","key","keys","has","buildOne","source","fonts","name","scheme","config","palettes","generatedColor","color","tokenGroups","typography","family","fontWeight","spacing","radius","borderWidth","size","opacity","motion","shadow","zIndex","maxFontScale","categorical","brandColors","primary","tokenKeys","tokens","tone","presets","base","extend","extension","theme","extensionOverrides","checkContrast","strict","__DEV__","failures","length","channel","emit","console","warn","buildThemes","options","loose","platform","basePalettes","sources","themes","map","named","tones","namedConfig","seeds"],"sourceRoot":"../../../src","sources":["theme/buildThemes.ts"],"mappings":";;AAAA,SAASA,uBAAuB,QAAQ,wBAAwB;AAEhE,SAASC,eAAe,EAAEC,QAAQ,QAAQ,wBAAwB;AAClE,SAASC,gBAAgB,QAAQ,yBAAsB;AACvD,SAASC,UAAU,QAAQ,sBAAmB;AAC9C,SAASC,eAAe,EAAEC,aAAa,EAAEC,UAAU,QAAQ,mBAAgB;AAC3E,SAASC,YAAY,EAAEC,WAAW,QAAQ,4BAAyB;AACnE,SACCC,gBAAgB,EAChBC,WAAW,EACXC,YAAY,EACZC,WAAW,EACXC,YAAY,EACZC,SAAS,EACTC,YAAY,EACZC,WAAW,EACXC,sBAAsB,QAChB,uBAAoB;AAC3B,SAASC,UAAU,EAAEC,eAAe,EAAEC,eAAe,QAAuB,yBAAsB;AAWlG,SAASC,gBAAgB,EAAEC,gBAAgB,EAAEC,kBAAkB,QAAQ,aAAU;AACjF,SAASC,aAAa,EAAEC,cAAc,EAAEC,IAAI,QAAQ,gBAAa;AACjE,SAASC,mBAAmB,QAAQ,0BAAuB;AAY3D;AACA,MAAMC,WAAW,GAAG3B,QAAQ,CAAC,cAAc,EAAE,MAAM;EAClD;EACA,IAAI;IACH,OAAO4B,OAAO,CAAC,cAAc,CAAC;EAC/B,CAAC,CAAC,OAAOC,KAAK,EAAE;IACf,MAAMA,KAAK;EACZ;AACD,CAAC,CAAC;AAEF,SAASC,mBAAmBA,CAAA,EAAW;EACtC,MAAMC,MAAM,GAAGJ,WAAW,CAACK,GAAG,CAAC,CAAC;EAChC,OAAO,CAACD,MAAM,CAACE,EAAE,GAAGF,MAAM,CAACG,MAAM,CAACC,UAAU,EAAEC,aAAa,GAAGC,SAAS,KAAK,CAAC;AAC9E;;AAEA;AACA,MAAMC,cAAmC,GAAG,IAAIC,GAAG,CAAC,CACnD,SAAS,EACT,SAAS,EACT,MAAM,EACN,SAAS,EACT,SAAS,EACT,OAAO,CACP,CAAC;AAUF,SAASC,UAAUA,CAACC,IAAuC,EAAqC;EAC/F,MAAMC,IAAI,GAAG,CAAC,CAAsC;EAEpD,KAAK,MAAM,CAACC,MAAM,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACL,IAAI,CAAC,EAAwC;IACzFC,IAAI,CAACC,MAAM,CAAC,GAAG;MAAE,GAAGC;IAAM,CAAC;EAC5B;EAEA,OAAOF,IAAI;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASK,yBAAyBA,CACjCC,SAAkB,EAClBC,KAAuB,EACvBC,IAAY,EACL;EACP,IAAI,CAAC3B,aAAa,CAACyB,SAAS,CAAC,EAAE;IAC9B;EACD;EACA,MAAMG,OAAO,GAAG,IAAIZ,GAAG,CAACU,KAAK,CAAC;EAC9B,KAAK,MAAMG,GAAG,IAAIP,MAAM,CAACQ,IAAI,CAACL,SAAS,CAAC,EAAE;IACzC,IAAIA,SAAS,CAACI,GAAG,CAAC,KAAKf,SAAS,IAAIc,OAAO,CAACG,GAAG,CAACF,GAAG,CAAC,EAAE;MACrD;IACD;IACA,MAAM,IAAI/B,gBAAgB,CACzB,GAAG6B,IAAI,IAAIE,GAAG,EAAE,EAChB,+DACD,CAAC;EACF;AACD;AAEA,SAASG,QAAQA,CAChBC,MAAmB,EACnBC,KAAoC,EACpCT,SAAkB,EAClBZ,aAAqB,EACZ;EACT,MAAM;IAAEsB,IAAI;IAAEC,MAAM;IAAEC,MAAM;IAAEC;EAAS,CAAC,GAAGL,MAAM;EACjD,MAAMN,IAAI,GAAG,aAAaQ,IAAI,EAAE;EAChC,MAAMI,cAAc,GAAG3D,eAAe,CAAC0D,QAAQ,EAAEF,MAAM,CAAC;;EAExD;EACA;EACA;EACA;EACA,MAAMI,KAAK,GAAGvC,cAAc,CAACsC,cAAc,EAAErC,IAAI,CAACuB,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,EAAEe,KAAK,EAAE,GAAGb,IAAI,QAAQ,CAAC;EAEhG,MAAMc,WAAW,GAAG;IACnBD,KAAK;IACLE,UAAU,EAAE9C,eAAe,CAACyC,MAAM,CAACK,UAAU,EAAER,KAAK,CAAChB,IAAI,EAAEgB,KAAK,CAACS,MAAM,CAAC;IACxEzB,IAAI,EAAED,UAAU,CAACiB,KAAK,CAAChB,IAAI,CAAC;IAC5B0B,UAAU,EAAEjD,eAAe,CAAC,CAAC;IAC7BkD,OAAO,EAAEtD,YAAY,CAAC,CAAC;IACvBuD,MAAM,EAAE1D,WAAW,CAAC,CAAC;IACrB2D,WAAW,EAAE9D,gBAAgB,CAAC4B,aAAa,CAAC;IAC5CmC,IAAI,EAAE1D,SAAS,CAAC,CAAC;IACjB2D,OAAO,EAAE9D,YAAY,CAAC,CAAC;IACvB+D,MAAM,EAAEhE,WAAW,CAAC,CAAC;IACrBiE,MAAM,EAAE9D,YAAY,CAACmD,KAAK,CAACW,MAAM,CAAC;IAClCC,MAAM,EAAE5D,WAAW,CAAC,CAAC;IACrB6D,YAAY,EAAEhB,MAAM,CAACK,UAAU,EAAEW,YAAY,IAAI5D,sBAAsB;IACvE6D,WAAW,EAAE5E,gBAAgB,CAAC2D,MAAM,CAACkB,WAAW,CAACC,OAAO,EAAEpB,MAAM;EACjE,CAA0E;EAE1E,MAAMqB,SAAS,GAAGnC,MAAM,CAACQ,IAAI,CAACW,WAAW,CAAC;EAC1C,MAAMiB,MAAM,GAAGzD,cAAc,CAACwC,WAAW,EAAEvC,IAAI,CAACuB,SAAS,EAAEgC,SAAS,CAAC,EAAE9B,IAAI,CAAC;EAC5E,MAAMgC,IAAI,GAAG1D,cAAc;EAC1B;EACA;EACAnB,UAAU,CAASwD,QAAQ,EAAEoB,MAAM,CAAClB,KAAK,EAAEJ,MAAM,CAAC,EAClDlC,IAAI,CAACuB,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,EAAEkC,IAAI,EAC/B,GAAGhC,IAAI,OACR,CAAC;EACD,MAAMiC,OAAO,GAAG3D,cAAc,CAAClB,YAAY,CAAC2E,MAAM,CAAC,EAAExD,IAAI,CAACuB,SAAS,EAAEzC,WAAW,CAAC,EAAE2C,IAAI,CAAC;EACxF,MAAMkC,IAAI,GAAG;IAAE,GAAGH,MAAM;IAAEC,IAAI;IAAE,GAAGC;EAAQ,CAA6B;EAExE,IAAI,CAACvB,MAAM,CAACyB,MAAM,EAAE;IACnBtC,yBAAyB,CAACC,SAAS,EAAE,CAAC,GAAGgC,SAAS,EAAE,MAAM,EAAE,GAAGzE,WAAW,CAAC,EAAE2C,IAAI,CAAC;IAClF,OAAOkC,IAAI;EACZ;EAEA,MAAME,SAAS,GAAG1B,MAAM,CAACyB,MAAM,CAAC;IAAE3B,IAAI;IAAEC,MAAM;IAAE4B,KAAK,EAAEH;EAAK,CAAC,CAAC;EAC9D,KAAK,MAAMhC,GAAG,IAAIP,MAAM,CAACQ,IAAI,CAACiC,SAAS,CAAC,EAAE;IACzC,IAAIlC,GAAG,IAAIgC,IAAI,EAAE;MAChB;MACA;MACA,MAAM,IAAI/D,gBAAgB,CACzB,UAAU+B,GAAG,EAAE,EACf,uEACD,CAAC;IACF;EACD;EACAL,yBAAyB,CACxBC,SAAS,EACT,CAAC,GAAGgC,SAAS,EAAE,MAAM,EAAE,GAAGzE,WAAW,EAAE,GAAGsC,MAAM,CAACQ,IAAI,CAACiC,SAAS,CAAC,CAAC,EACjEpC,IACD,CAAC;EACD,MAAMsC,kBAAkB,GAAG/D,IAAI,CAACuB,SAAS,EAAEH,MAAM,CAACQ,IAAI,CAACiC,SAAS,CAAC,CAAC;EAElE,OAAO;IAAE,GAAGF,IAAI;IAAE,GAAG5D,cAAc,CAAC8D,SAAS,EAAEE,kBAAkB,EAAEtC,IAAI;EAAE,CAAC;AAC3E;AAEA,SAASuC,aAAaA,CAAC/B,IAAY,EAAE6B,KAAa,EAAEG,MAAe,EAAQ;EAC1E,IAAI,CAACC,OAAO,IAAI,CAACD,MAAM,EAAE;IACxB;EACD;EAEA,MAAME,QAAQ,GAAG1F,UAAU,CAACqF,KAAK,CAAC;EAElC,IAAIK,QAAQ,CAACC,MAAM,KAAK,CAAC,EAAE;IAC1B;EACD;EAEA,IAAIH,MAAM,EAAE;IACX,MAAM,IAAIpE,kBAAkB,CAACoC,IAAI,EAAEkC,QAAQ,CAAC;EAC7C;EAEAE,OAAO,CAACC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;IAAER,KAAK,EAAE7B,IAAI;IAAEkC,QAAQ,EAAEA,QAAQ,CAACC;EAAO,CAAC,CAAC;EAC5EG,OAAO,CAACC,IAAI,CACX,qBAAqBvC,IAAI,kDAAkDtC,gBAAgB,CAACwE,QAAQ,CAAC,EACtG,CAAC;AACF;;AAEA;AACA,MAAME,OAAO,GAAGhG,uBAAuB,CAAa,UAAU,CAAC;;AAE/D;AACA;AACA;AACA;AACA;AACA,OAAO,SAASoG,WAAWA,CAK1BtC,MAAuC,EACvCuC,OAA4B,EACC;EAC7BzE,mBAAmB,CAACkC,MAAM,CAAC;EAE3B,MAAMwC,KAAK,GAAGxC,MAAwD;EACtE;EACA,MAAMyC,QAAQ,GAAGF,OAAO,EAAEE,QAAQ,KAAKtG,eAAe,CAAC,CAAC,KAAK,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;EACvF,MAAMqC,aAAa,GAAG+D,OAAO,EAAE/D,aAAa,IAAIN,mBAAmB,CAAC,CAAC;EACrE,MAAM2B,KAAK,GAAGxC,UAAU,CAACmF,KAAK,CAACnC,UAAU,EAAEoC,QAAQ,CAAC;EACpD,MAAMC,YAAY,GAAGlG,aAAa,CAACgG,KAAK,CAAC;EACzC,MAAMG,OAAsB,GAAG,CAC9B;IAAE7C,IAAI,EAAE,OAAO;IAAEC,MAAM,EAAE,OAAO;IAAEC,MAAM,EAAEwC,KAAK;IAAEvC,QAAQ,EAAEyC;EAAa,CAAC,EACzE;IAAE5C,IAAI,EAAE,MAAM;IAAEC,MAAM,EAAE,MAAM;IAAEC,MAAM,EAAEwC,KAAK;IAAEvC,QAAQ,EAAEyC;EAAa,CAAC,EACvE,GAAGzD,MAAM,CAACC,OAAO,CAACsD,KAAK,CAACI,MAAM,IAAI,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC/C,IAAI,EAAEgD,KAAK,CAAC,KAAK;IAC5D,MAAMC,KAAK,GAAG;MAAE,GAAGP,KAAK,CAACO,KAAK;MAAE,GAAGD,KAAK,CAACC;IAAM,CAA2B;IAC1E,KAAK,MAAMzB,IAAI,IAAIrC,MAAM,CAACQ,IAAI,CAACsD,KAAK,CAAC,EAAE;MACtC,IAAIrE,cAAc,CAACgB,GAAG,CAAC4B,IAAI,CAAC,EAAE;QAC7B;QACA;QACA,MAAM,IAAI7D,gBAAgB,CACzB,UAAUqC,IAAI,UAAUwB,IAAI,EAAE,EAC9B,8DACD,CAAC;MACF;IACD;IACA,MAAM0B,WAAW,GAAG;MACnB,GAAGR,KAAK;MACRtB,WAAW,EAAE4B,KAAK,CAAC5B,WAAW,IAAIsB,KAAK,CAACtB,WAAW;MACnD+B,KAAK,EAAE;QAAE,GAAGT,KAAK,CAACS,KAAK;QAAE,GAAGH,KAAK,CAACG;MAAM,CAAC;MACzCF;IACD,CAAC;IAED,OAAO;MACNjD,IAAI;MACJC,MAAM,EAAE+C,KAAK,CAAC/C,MAAM;MACpBC,MAAM,EAAEgD,WAAW;MACnB/C,QAAQ,EAAEzD,aAAa,CAACwG,WAAW;IACpC,CAAC;EACF,CAAC,CAAC,CACF;EACD,MAAMJ,MAA8B,GAAG,CAAC,CAAC;EAEzC,KAAK,MAAMhD,MAAM,IAAI+C,OAAO,EAAE;IAC7B,MAAMvD,SAAS,GAAIoD,KAAK,CAACpD,SAAS,GAA2CQ,MAAM,CAACE,IAAI,CAAC;IACzF,MAAM6B,KAAK,GAAGhC,QAAQ,CAACC,MAAM,EAAEC,KAAK,EAAET,SAAS,EAAEZ,aAAa,CAAC;IAE/DqD,aAAa,CAACjC,MAAM,CAACE,IAAI,EAAE6B,KAAK,EAAEa,KAAK,CAACV,MAAM,KAAK,IAAI,CAAC;IACxDc,MAAM,CAAChD,MAAM,CAACE,IAAI,CAAC,GAAG6B,KAAK;EAC5B;EAEA,OAAOiB,MAAM;AACd","ignoreList":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { SdkError } from '@chipmobilesdk/rn-core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The package's error codes (THM-09): `invalid_config` for a config or override
|
|
7
|
+
* the package rejects, `contrast` for a theme that breaks a contrast guarantee.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Invalid configuration or override; `path` names the offending field. An
|
|
12
|
+
* `SdkError` (`@chipmobilesdk/rn-core`) with `pkg: 'rn-theme'`.
|
|
13
|
+
*/
|
|
14
|
+
export class ThemeConfigError extends SdkError {
|
|
15
|
+
constructor(path, message) {
|
|
16
|
+
super('rn-theme', 'invalid_config', {
|
|
17
|
+
message: `${path}: ${message}`
|
|
18
|
+
});
|
|
19
|
+
this.name = 'ThemeConfigError';
|
|
20
|
+
this.path = path;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Thrown in `strict` mode when a theme breaks a contrast guarantee. */
|
|
25
|
+
export class ThemeContrastError extends SdkError {
|
|
26
|
+
constructor(themeName, failures) {
|
|
27
|
+
super('rn-theme', 'contrast', {
|
|
28
|
+
message: `Theme "${themeName}" breaks contrast guarantees:\n${describeFailures(failures)}`
|
|
29
|
+
});
|
|
30
|
+
this.name = 'ThemeContrastError';
|
|
31
|
+
this.themeName = themeName;
|
|
32
|
+
this.failures = failures;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function describeFailures(failures) {
|
|
36
|
+
return failures.map(({
|
|
37
|
+
foreground,
|
|
38
|
+
background,
|
|
39
|
+
ratio,
|
|
40
|
+
target
|
|
41
|
+
}) => ` ${foreground} on ${background}: ${ratio}:1 (needs ${target}:1)`).join('\n');
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["SdkError","ThemeConfigError","constructor","path","message","name","ThemeContrastError","themeName","failures","describeFailures","map","foreground","background","ratio","target","join"],"sourceRoot":"../../../src","sources":["theme/errors.ts"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,wBAAwB;;AAIjD;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,SAASD,QAAQ,CAAiB;EAG9DE,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;AACA,OAAO,MAAMG,kBAAkB,SAASN,QAAQ,CAAiB;EAIhEE,WAAWA,CAACK,SAAiB,EAAEC,QAA2B,EAAE;IAC3D,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE;MAC7BJ,OAAO,EAAE,UAAUG,SAAS,kCAAkCE,gBAAgB,CAACD,QAAQ,CAAC;IACzF,CAAC,CAAC;IACF,IAAI,CAACH,IAAI,GAAG,oBAAoB;IAChC,IAAI,CAACE,SAAS,GAAGA,SAAS;IAC1B,IAAI,CAACC,QAAQ,GAAGA,QAAQ;EACzB;AACD;AAEA,OAAO,SAASC,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,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { isValidColor } from "../color/parse.js";
|
|
4
|
+
import { ThemeConfigError } from "./errors.js";
|
|
5
|
+
export function isPlainObject(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** Optional style keys an override may add although the generated token omits them. */
|
|
10
|
+
const OPTIONAL_NUMBER_KEYS = new Set(['letterSpacing']);
|
|
11
|
+
|
|
12
|
+
/** Groups whose every leaf is a colour. */
|
|
13
|
+
const COLOR_GROUPS = new Set(['color', 'tone', 'categorical']);
|
|
14
|
+
function isColorPath(segments) {
|
|
15
|
+
const leaf = segments.at(-1) ?? '';
|
|
16
|
+
return COLOR_GROUPS.has(segments[0]) || leaf === 'color' || leaf.endsWith('Color');
|
|
17
|
+
}
|
|
18
|
+
function assertFiniteNumber(value, path) {
|
|
19
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
20
|
+
throw new ThemeConfigError(path, 'must be a finite number.');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function validateLeaf(value, base, segments, path) {
|
|
24
|
+
if (typeof base === 'number') {
|
|
25
|
+
assertFiniteNumber(value, path);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (typeof base !== 'string') {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (typeof value !== 'string') {
|
|
32
|
+
throw new ThemeConfigError(path, 'must be a string.');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// A string that is a colour today (e.g. an `extend` token) must stay one.
|
|
36
|
+
if ((isColorPath(segments) || isValidColor(base)) && !isValidColor(value)) {
|
|
37
|
+
throw new ThemeConfigError(path, `"${value}" is not a supported colour.`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function mergeArray({
|
|
41
|
+
value,
|
|
42
|
+
baseValue,
|
|
43
|
+
path,
|
|
44
|
+
segments
|
|
45
|
+
}) {
|
|
46
|
+
if (!Array.isArray(value)) {
|
|
47
|
+
throw new ThemeConfigError(path, 'must be an array.');
|
|
48
|
+
}
|
|
49
|
+
const sample = Array.isArray(baseValue) ? baseValue[0] : undefined;
|
|
50
|
+
value.forEach((item, index) => validateLeaf(item, sample, segments, `${path}.${index}`));
|
|
51
|
+
return [...value];
|
|
52
|
+
}
|
|
53
|
+
function mergeEntry(entry) {
|
|
54
|
+
const {
|
|
55
|
+
value,
|
|
56
|
+
baseValue,
|
|
57
|
+
path,
|
|
58
|
+
segments
|
|
59
|
+
} = entry;
|
|
60
|
+
if (Array.isArray(baseValue)) {
|
|
61
|
+
return mergeArray(entry);
|
|
62
|
+
}
|
|
63
|
+
if (isPlainObject(baseValue)) {
|
|
64
|
+
return mergeOverrides(baseValue, value, path, segments);
|
|
65
|
+
}
|
|
66
|
+
validateLeaf(value, baseValue, segments, path);
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Merges `overrides` into a fresh copy of `base`, validating as it goes:
|
|
72
|
+
* keys must exist in `base`, colours must parse, numbers must be finite.
|
|
73
|
+
* Arrays are replaced whole. `base` itself is never mutated.
|
|
74
|
+
*/
|
|
75
|
+
export function mergeOverrides(base, overrides, path, segments = []) {
|
|
76
|
+
if (overrides == null) {
|
|
77
|
+
return base;
|
|
78
|
+
}
|
|
79
|
+
if (!isPlainObject(overrides) || !isPlainObject(base)) {
|
|
80
|
+
throw new ThemeConfigError(path, 'must be an object.');
|
|
81
|
+
}
|
|
82
|
+
const result = {
|
|
83
|
+
...base
|
|
84
|
+
};
|
|
85
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
86
|
+
const entry = {
|
|
87
|
+
key,
|
|
88
|
+
value,
|
|
89
|
+
baseValue: base[key],
|
|
90
|
+
path: `${path}.${key}`,
|
|
91
|
+
segments: [...segments, key]
|
|
92
|
+
};
|
|
93
|
+
if (value === undefined) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (key in base) {
|
|
97
|
+
result[key] = mergeEntry(entry);
|
|
98
|
+
} else if (OPTIONAL_NUMBER_KEYS.has(key)) {
|
|
99
|
+
assertFiniteNumber(value, entry.path);
|
|
100
|
+
result[key] = value;
|
|
101
|
+
} else {
|
|
102
|
+
throw new ThemeConfigError(entry.path, 'does not exist on the theme. Add new tokens through `extend`.');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
export function pick(source, keys) {
|
|
108
|
+
if (!isPlainObject(source)) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
const picked = {};
|
|
112
|
+
for (const key of keys) {
|
|
113
|
+
if (key in source) {
|
|
114
|
+
picked[key] = source[key];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return picked;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isValidColor","ThemeConfigError","isPlainObject","value","Array","isArray","OPTIONAL_NUMBER_KEYS","Set","COLOR_GROUPS","isColorPath","segments","leaf","at","has","endsWith","assertFiniteNumber","path","Number","isFinite","validateLeaf","base","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,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { isOpaqueColor } from "../color/parse.js";
|
|
4
|
+
import { ThemeConfigError } from "./errors.js";
|
|
5
|
+
import { isPlainObject } from "./overrides.js";
|
|
6
|
+
const BRAND_KEYS = ['primary', 'secondary', 'tertiary'];
|
|
7
|
+
const SEED_KEYS = ['neutral', 'error', 'success', 'warning', 'info'];
|
|
8
|
+
const FONT_WEIGHT_NAMES = ['regular', 'medium', 'semibold', 'bold', 'heavy'];
|
|
9
|
+
const SCHEMES = new Set(['light', 'dark']);
|
|
10
|
+
const RESERVED_THEME_NAMES = new Set(['light', 'dark']);
|
|
11
|
+
function assertObject(value, path) {
|
|
12
|
+
if (!isPlainObject(value)) {
|
|
13
|
+
throw new ThemeConfigError(path, 'must be an object.');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function assertOpaqueColor(value, path) {
|
|
17
|
+
if (!isOpaqueColor(value)) {
|
|
18
|
+
throw new ThemeConfigError(path, `must be an opaque colour (#RGB, #RRGGBB or rgb()), received ${JSON.stringify(value)}.`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function assertNonEmptyString(value, path) {
|
|
22
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
23
|
+
throw new ThemeConfigError(path, 'must be a non-empty string.');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function assertPositiveNumber(value, path) {
|
|
27
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
|
|
28
|
+
throw new ThemeConfigError(path, 'must be a positive finite number.');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** The tones this package builds, which an app's own tone may not take over. */
|
|
33
|
+
const STANDARD_TONE_NAMES = new Set(['neutral', 'primary', 'info', 'success', 'warning', 'error']);
|
|
34
|
+
function validateCustomTones(value, path) {
|
|
35
|
+
if (value == null) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
assertObject(value, path);
|
|
39
|
+
for (const name of Object.keys(value)) {
|
|
40
|
+
if (STANDARD_TONE_NAMES.has(name)) {
|
|
41
|
+
throw new ThemeConfigError(`${path}.${name}`, 'is a standard tone; customise it through `overrides.<theme>.tone` instead.');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
validateColorRecord(value, path);
|
|
45
|
+
}
|
|
46
|
+
function validateColorRecord(value, path, keys) {
|
|
47
|
+
if (value == null) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
assertObject(value, path);
|
|
51
|
+
for (const [key, color] of Object.entries(value)) {
|
|
52
|
+
if (keys && !keys.includes(key)) {
|
|
53
|
+
throw new ThemeConfigError(`${path}.${key}`, `is not one of ${keys.join(', ')}.`);
|
|
54
|
+
}
|
|
55
|
+
if (color !== undefined) {
|
|
56
|
+
assertOpaqueColor(color, `${path}.${key}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function validateBrandColors(value, path) {
|
|
61
|
+
assertObject(value, path);
|
|
62
|
+
for (const key of BRAND_KEYS) {
|
|
63
|
+
assertOpaqueColor(value[key], `${path}.${key}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function validateFontMap(value, path) {
|
|
67
|
+
if (value == null) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
assertObject(value, path);
|
|
71
|
+
for (const [weight, family] of Object.entries(value)) {
|
|
72
|
+
if (!FONT_WEIGHT_NAMES.includes(weight)) {
|
|
73
|
+
throw new ThemeConfigError(`${path}.${weight}`, `is not one of ${FONT_WEIGHT_NAMES.join(', ')}.`);
|
|
74
|
+
}
|
|
75
|
+
assertNonEmptyString(family, `${path}.${weight}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function validateTypography(value) {
|
|
79
|
+
if (value == null) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
assertObject(value, 'typography');
|
|
83
|
+
if (value.fontFamily != null) {
|
|
84
|
+
assertNonEmptyString(value.fontFamily, 'typography.fontFamily');
|
|
85
|
+
}
|
|
86
|
+
for (const key of ['baseFontSize', 'fontScale', 'maxFontScale']) {
|
|
87
|
+
if (value[key] != null) {
|
|
88
|
+
assertPositiveNumber(value[key], `typography.${key}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (value.fonts != null) {
|
|
92
|
+
assertObject(value.fonts, 'typography.fonts');
|
|
93
|
+
if (value.fonts.family != null) {
|
|
94
|
+
assertNonEmptyString(value.fonts.family, 'typography.fonts.family');
|
|
95
|
+
}
|
|
96
|
+
validateFontMap(value.fonts.ios, 'typography.fonts.ios');
|
|
97
|
+
validateFontMap(value.fonts.android, 'typography.fonts.android');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function validateNamedThemes(value) {
|
|
101
|
+
if (value == null) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
assertObject(value, 'themes');
|
|
105
|
+
for (const [name, theme] of Object.entries(value)) {
|
|
106
|
+
const path = `themes.${name}`;
|
|
107
|
+
if (RESERVED_THEME_NAMES.has(name)) {
|
|
108
|
+
throw new ThemeConfigError(path, 'light and dark are built in; customise them with overrides.');
|
|
109
|
+
}
|
|
110
|
+
assertObject(theme, path);
|
|
111
|
+
if (!SCHEMES.has(theme.scheme)) {
|
|
112
|
+
throw new ThemeConfigError(`${path}.scheme`, "must be 'light' or 'dark'.");
|
|
113
|
+
}
|
|
114
|
+
if (theme.brandColors != null) {
|
|
115
|
+
validateBrandColors(theme.brandColors, `${path}.brandColors`);
|
|
116
|
+
}
|
|
117
|
+
validateColorRecord(theme.seeds, `${path}.seeds`, SEED_KEYS);
|
|
118
|
+
validateCustomTones(theme.tones, `${path}.tones`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function validateOverrideThemes(value, themeNames) {
|
|
122
|
+
if (value == null) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
assertObject(value, 'overrides');
|
|
126
|
+
for (const name of Object.keys(value)) {
|
|
127
|
+
if (!themeNames.includes(name)) {
|
|
128
|
+
throw new ThemeConfigError(`overrides.${name}`, `is not a theme (${themeNames.join(', ')}).`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Validates the config shape; override values are validated while merging. */
|
|
134
|
+
export function validateThemeConfig(config) {
|
|
135
|
+
assertObject(config, 'config');
|
|
136
|
+
validateBrandColors(config.brandColors, 'brandColors');
|
|
137
|
+
validateColorRecord(config.seeds, 'seeds', SEED_KEYS);
|
|
138
|
+
validateCustomTones(config.tones, 'tones');
|
|
139
|
+
validateTypography(config.typography);
|
|
140
|
+
validateNamedThemes(config.themes);
|
|
141
|
+
if (config.extend != null && typeof config.extend !== 'function') {
|
|
142
|
+
throw new ThemeConfigError('extend', 'must be a function.');
|
|
143
|
+
}
|
|
144
|
+
if (config.strict != null && typeof config.strict !== 'boolean') {
|
|
145
|
+
throw new ThemeConfigError('strict', 'must be a boolean.');
|
|
146
|
+
}
|
|
147
|
+
validateOverrideThemes(config.overrides, themeNamesOf(config));
|
|
148
|
+
}
|
|
149
|
+
export function themeNamesOf(config) {
|
|
150
|
+
return ['light', 'dark', ...Object.keys(config.themes ?? {})];
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=validateThemeConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isOpaqueColor","ThemeConfigError","isPlainObject","BRAND_KEYS","SEED_KEYS","FONT_WEIGHT_NAMES","SCHEMES","Set","RESERVED_THEME_NAMES","assertObject","value","path","assertOpaqueColor","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":[]}
|