@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.
Files changed (257) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/README.md +3 -1
  3. package/lib/commonjs/color/categorical.js +35 -0
  4. package/lib/commonjs/color/categorical.js.map +1 -0
  5. package/lib/commonjs/color/contrast.js +199 -0
  6. package/lib/commonjs/color/contrast.js.map +1 -0
  7. package/lib/commonjs/color/parse.js +110 -0
  8. package/lib/commonjs/color/parse.js.map +1 -0
  9. package/lib/commonjs/color/roles.js +235 -0
  10. package/lib/commonjs/color/roles.js.map +1 -0
  11. package/lib/commonjs/index.js +94 -0
  12. package/lib/commonjs/index.js.map +1 -0
  13. package/lib/commonjs/integration/navigationTheme.js +43 -0
  14. package/lib/commonjs/integration/navigationTheme.js.map +1 -0
  15. package/lib/commonjs/package.json +1 -0
  16. package/lib/commonjs/presets/byTone.js +28 -0
  17. package/lib/commonjs/presets/byTone.js.map +1 -0
  18. package/lib/commonjs/presets/layout.js +67 -0
  19. package/lib/commonjs/presets/layout.js.map +1 -0
  20. package/lib/commonjs/presets/themePresets.js +115 -0
  21. package/lib/commonjs/presets/themePresets.js.map +1 -0
  22. package/lib/commonjs/theme/buildThemes.js +211 -0
  23. package/lib/commonjs/theme/buildThemes.js.map +1 -0
  24. package/lib/commonjs/theme/errors.js +49 -0
  25. package/lib/commonjs/theme/errors.js.map +1 -0
  26. package/lib/commonjs/theme/overrides.js +125 -0
  27. package/lib/commonjs/theme/overrides.js.map +1 -0
  28. package/lib/commonjs/theme/validateThemeConfig.js +157 -0
  29. package/lib/commonjs/theme/validateThemeConfig.js.map +1 -0
  30. package/lib/commonjs/tokens/defaults.js +132 -0
  31. package/lib/commonjs/tokens/defaults.js.map +1 -0
  32. package/lib/commonjs/tokens/typography.js +136 -0
  33. package/lib/commonjs/tokens/typography.js.map +1 -0
  34. package/lib/commonjs/types/brand.js +2 -0
  35. package/lib/commonjs/types/brand.js.map +1 -0
  36. package/lib/commonjs/types/colors.js +2 -0
  37. package/lib/commonjs/types/colors.js.map +1 -0
  38. package/lib/commonjs/types/index.js +2 -0
  39. package/lib/commonjs/types/index.js.map +1 -0
  40. package/lib/commonjs/types/theme.js +6 -0
  41. package/lib/commonjs/types/theme.js.map +1 -0
  42. package/lib/commonjs/types/tokens.js +2 -0
  43. package/lib/commonjs/types/tokens.js.map +1 -0
  44. package/lib/commonjs/types/typography.js +2 -0
  45. package/lib/commonjs/types/typography.js.map +1 -0
  46. package/lib/commonjs/unistyles/createUnistylesConfig.js +113 -0
  47. package/lib/commonjs/unistyles/createUnistylesConfig.js.map +1 -0
  48. package/lib/commonjs/unistyles/themeMode.js +39 -0
  49. package/lib/commonjs/unistyles/themeMode.js.map +1 -0
  50. package/lib/commonjs/vendor/mcu/LICENSE +191 -0
  51. package/lib/commonjs/vendor/mcu/hct/cam16.js +362 -0
  52. package/lib/commonjs/vendor/mcu/hct/cam16.js.map +1 -0
  53. package/lib/commonjs/vendor/mcu/hct/hct.js +183 -0
  54. package/lib/commonjs/vendor/mcu/hct/hct.js.map +1 -0
  55. package/lib/commonjs/vendor/mcu/hct/hct_solver.js +401 -0
  56. package/lib/commonjs/vendor/mcu/hct/hct_solver.js.map +1 -0
  57. package/lib/commonjs/vendor/mcu/hct/viewing_conditions.js +116 -0
  58. package/lib/commonjs/vendor/mcu/hct/viewing_conditions.js.map +1 -0
  59. package/lib/commonjs/vendor/mcu/index.js +27 -0
  60. package/lib/commonjs/vendor/mcu/index.js.map +1 -0
  61. package/lib/commonjs/vendor/mcu/palettes/tonal_palette.js +177 -0
  62. package/lib/commonjs/vendor/mcu/palettes/tonal_palette.js.map +1 -0
  63. package/lib/commonjs/vendor/mcu/utils/color_utils.js +298 -0
  64. package/lib/commonjs/vendor/mcu/utils/color_utils.js.map +1 -0
  65. package/lib/commonjs/vendor/mcu/utils/math_utils.js +158 -0
  66. package/lib/commonjs/vendor/mcu/utils/math_utils.js.map +1 -0
  67. package/lib/module/color/categorical.js +31 -0
  68. package/lib/module/color/categorical.js.map +1 -0
  69. package/lib/module/color/contrast.js +194 -0
  70. package/lib/module/color/contrast.js.map +1 -0
  71. package/lib/module/color/parse.js +101 -0
  72. package/lib/module/color/parse.js.map +1 -0
  73. package/lib/module/color/roles.js +229 -0
  74. package/lib/module/color/roles.js.map +1 -0
  75. package/lib/module/index.js +23 -0
  76. package/lib/module/index.js.map +1 -0
  77. package/lib/module/integration/navigationTheme.js +39 -0
  78. package/lib/module/integration/navigationTheme.js.map +1 -0
  79. package/lib/module/package.json +1 -0
  80. package/lib/module/presets/byTone.js +24 -0
  81. package/lib/module/presets/byTone.js.map +1 -0
  82. package/lib/module/presets/layout.js +63 -0
  83. package/lib/module/presets/layout.js.map +1 -0
  84. package/lib/module/presets/themePresets.js +110 -0
  85. package/lib/module/presets/themePresets.js.map +1 -0
  86. package/lib/module/theme/buildThemes.js +208 -0
  87. package/lib/module/theme/buildThemes.js.map +1 -0
  88. package/lib/module/theme/errors.js +43 -0
  89. package/lib/module/theme/errors.js.map +1 -0
  90. package/lib/module/theme/overrides.js +119 -0
  91. package/lib/module/theme/overrides.js.map +1 -0
  92. package/lib/module/theme/validateThemeConfig.js +152 -0
  93. package/lib/module/theme/validateThemeConfig.js.map +1 -0
  94. package/lib/module/tokens/defaults.js +120 -0
  95. package/lib/module/tokens/defaults.js.map +1 -0
  96. package/lib/module/tokens/typography.js +129 -0
  97. package/lib/module/tokens/typography.js.map +1 -0
  98. package/lib/module/types/brand.js +2 -0
  99. package/lib/module/types/brand.js.map +1 -0
  100. package/lib/module/types/colors.js +2 -0
  101. package/lib/module/types/colors.js.map +1 -0
  102. package/lib/module/types/index.js +2 -0
  103. package/lib/module/types/index.js.map +1 -0
  104. package/lib/module/types/theme.js +4 -0
  105. package/lib/module/types/theme.js.map +1 -0
  106. package/lib/module/types/tokens.js +2 -0
  107. package/lib/module/types/tokens.js.map +1 -0
  108. package/lib/module/types/typography.js +2 -0
  109. package/lib/module/types/typography.js.map +1 -0
  110. package/lib/module/unistyles/createUnistylesConfig.js +109 -0
  111. package/lib/module/unistyles/createUnistylesConfig.js.map +1 -0
  112. package/lib/module/unistyles/themeMode.js +36 -0
  113. package/lib/module/unistyles/themeMode.js.map +1 -0
  114. package/lib/module/vendor/mcu/LICENSE +191 -0
  115. package/lib/module/vendor/mcu/hct/cam16.js +356 -0
  116. package/lib/module/vendor/mcu/hct/cam16.js.map +1 -0
  117. package/lib/module/vendor/mcu/hct/hct.js +178 -0
  118. package/lib/module/vendor/mcu/hct/hct.js.map +1 -0
  119. package/lib/module/vendor/mcu/hct/hct_solver.js +396 -0
  120. package/lib/module/vendor/mcu/hct/hct_solver.js.map +1 -0
  121. package/lib/module/vendor/mcu/hct/viewing_conditions.js +110 -0
  122. package/lib/module/vendor/mcu/hct/viewing_conditions.js.map +1 -0
  123. package/lib/module/vendor/mcu/index.js +8 -0
  124. package/lib/module/vendor/mcu/index.js.map +1 -0
  125. package/lib/module/vendor/mcu/palettes/tonal_palette.js +172 -0
  126. package/lib/module/vendor/mcu/palettes/tonal_palette.js.map +1 -0
  127. package/lib/module/vendor/mcu/utils/color_utils.js +277 -0
  128. package/lib/module/vendor/mcu/utils/color_utils.js.map +1 -0
  129. package/lib/module/vendor/mcu/utils/math_utils.js +146 -0
  130. package/lib/module/vendor/mcu/utils/math_utils.js.map +1 -0
  131. package/lib/typescript/commonjs/color/categorical.d.ts +7 -0
  132. package/lib/typescript/commonjs/color/categorical.d.ts.map +1 -0
  133. package/lib/typescript/commonjs/color/contrast.d.ts +26 -0
  134. package/lib/typescript/commonjs/color/contrast.d.ts.map +1 -0
  135. package/lib/typescript/commonjs/color/parse.d.ts +25 -0
  136. package/lib/typescript/commonjs/color/parse.d.ts.map +1 -0
  137. package/lib/typescript/commonjs/color/roles.d.ts +26 -0
  138. package/lib/typescript/commonjs/color/roles.d.ts.map +1 -0
  139. package/lib/typescript/commonjs/index.d.ts +18 -0
  140. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  141. package/lib/typescript/commonjs/integration/navigationTheme.d.ts +30 -0
  142. package/lib/typescript/commonjs/integration/navigationTheme.d.ts.map +1 -0
  143. package/lib/typescript/commonjs/package.json +1 -0
  144. package/lib/typescript/commonjs/presets/byTone.d.ts +19 -0
  145. package/lib/typescript/commonjs/presets/byTone.d.ts.map +1 -0
  146. package/lib/typescript/commonjs/presets/layout.d.ts +63 -0
  147. package/lib/typescript/commonjs/presets/layout.d.ts.map +1 -0
  148. package/lib/typescript/commonjs/presets/themePresets.d.ts +11 -0
  149. package/lib/typescript/commonjs/presets/themePresets.d.ts.map +1 -0
  150. package/lib/typescript/commonjs/theme/buildThemes.d.ts +18 -0
  151. package/lib/typescript/commonjs/theme/buildThemes.d.ts.map +1 -0
  152. package/lib/typescript/commonjs/theme/errors.d.ts +23 -0
  153. package/lib/typescript/commonjs/theme/errors.d.ts.map +1 -0
  154. package/lib/typescript/commonjs/theme/overrides.d.ts +11 -0
  155. package/lib/typescript/commonjs/theme/overrides.d.ts.map +1 -0
  156. package/lib/typescript/commonjs/theme/validateThemeConfig.d.ts +6 -0
  157. package/lib/typescript/commonjs/theme/validateThemeConfig.d.ts.map +1 -0
  158. package/lib/typescript/commonjs/tokens/defaults.d.ts +23 -0
  159. package/lib/typescript/commonjs/tokens/defaults.d.ts.map +1 -0
  160. package/lib/typescript/commonjs/tokens/typography.d.ts +14 -0
  161. package/lib/typescript/commonjs/tokens/typography.d.ts.map +1 -0
  162. package/lib/typescript/commonjs/types/brand.d.ts +21 -0
  163. package/lib/typescript/commonjs/types/brand.d.ts.map +1 -0
  164. package/lib/typescript/commonjs/types/colors.d.ts +76 -0
  165. package/lib/typescript/commonjs/types/colors.d.ts.map +1 -0
  166. package/lib/typescript/commonjs/types/index.d.ts +6 -0
  167. package/lib/typescript/commonjs/types/index.d.ts.map +1 -0
  168. package/lib/typescript/commonjs/types/theme.d.ts +140 -0
  169. package/lib/typescript/commonjs/types/theme.d.ts.map +1 -0
  170. package/lib/typescript/commonjs/types/tokens.d.ts +79 -0
  171. package/lib/typescript/commonjs/types/tokens.d.ts.map +1 -0
  172. package/lib/typescript/commonjs/types/typography.d.ts +53 -0
  173. package/lib/typescript/commonjs/types/typography.d.ts.map +1 -0
  174. package/lib/typescript/commonjs/unistyles/createUnistylesConfig.d.ts +52 -0
  175. package/lib/typescript/commonjs/unistyles/createUnistylesConfig.d.ts.map +1 -0
  176. package/lib/typescript/commonjs/unistyles/themeMode.d.ts +13 -0
  177. package/lib/typescript/commonjs/unistyles/themeMode.d.ts.map +1 -0
  178. package/lib/typescript/commonjs/vendor/mcu/hct/cam16.d.ts +132 -0
  179. package/lib/typescript/commonjs/vendor/mcu/hct/cam16.d.ts.map +1 -0
  180. package/lib/typescript/commonjs/vendor/mcu/hct/hct.d.ts +93 -0
  181. package/lib/typescript/commonjs/vendor/mcu/hct/hct.d.ts.map +1 -0
  182. package/lib/typescript/commonjs/vendor/mcu/hct/hct_solver.d.ts +147 -0
  183. package/lib/typescript/commonjs/vendor/mcu/hct/hct_solver.d.ts.map +1 -0
  184. package/lib/typescript/commonjs/vendor/mcu/hct/viewing_conditions.d.ts +75 -0
  185. package/lib/typescript/commonjs/vendor/mcu/hct/viewing_conditions.d.ts.map +1 -0
  186. package/lib/typescript/commonjs/vendor/mcu/index.d.ts +4 -0
  187. package/lib/typescript/commonjs/vendor/mcu/index.d.ts.map +1 -0
  188. package/lib/typescript/commonjs/vendor/mcu/palettes/tonal_palette.d.ts +56 -0
  189. package/lib/typescript/commonjs/vendor/mcu/palettes/tonal_palette.d.ts.map +1 -0
  190. package/lib/typescript/commonjs/vendor/mcu/utils/color_utils.d.ts +129 -0
  191. package/lib/typescript/commonjs/vendor/mcu/utils/color_utils.d.ts.map +1 -0
  192. package/lib/typescript/commonjs/vendor/mcu/utils/math_utils.d.ts +83 -0
  193. package/lib/typescript/commonjs/vendor/mcu/utils/math_utils.d.ts.map +1 -0
  194. package/lib/typescript/module/color/categorical.d.ts +7 -0
  195. package/lib/typescript/module/color/categorical.d.ts.map +1 -0
  196. package/lib/typescript/module/color/contrast.d.ts +26 -0
  197. package/lib/typescript/module/color/contrast.d.ts.map +1 -0
  198. package/lib/typescript/module/color/parse.d.ts +25 -0
  199. package/lib/typescript/module/color/parse.d.ts.map +1 -0
  200. package/lib/typescript/module/color/roles.d.ts +26 -0
  201. package/lib/typescript/module/color/roles.d.ts.map +1 -0
  202. package/lib/typescript/module/index.d.ts +18 -0
  203. package/lib/typescript/module/index.d.ts.map +1 -0
  204. package/lib/typescript/module/integration/navigationTheme.d.ts +30 -0
  205. package/lib/typescript/module/integration/navigationTheme.d.ts.map +1 -0
  206. package/lib/typescript/module/package.json +1 -0
  207. package/lib/typescript/module/presets/byTone.d.ts +19 -0
  208. package/lib/typescript/module/presets/byTone.d.ts.map +1 -0
  209. package/lib/typescript/module/presets/layout.d.ts +63 -0
  210. package/lib/typescript/module/presets/layout.d.ts.map +1 -0
  211. package/lib/typescript/module/presets/themePresets.d.ts +11 -0
  212. package/lib/typescript/module/presets/themePresets.d.ts.map +1 -0
  213. package/lib/typescript/module/theme/buildThemes.d.ts +18 -0
  214. package/lib/typescript/module/theme/buildThemes.d.ts.map +1 -0
  215. package/lib/typescript/module/theme/errors.d.ts +23 -0
  216. package/lib/typescript/module/theme/errors.d.ts.map +1 -0
  217. package/lib/typescript/module/theme/overrides.d.ts +11 -0
  218. package/lib/typescript/module/theme/overrides.d.ts.map +1 -0
  219. package/lib/typescript/module/theme/validateThemeConfig.d.ts +6 -0
  220. package/lib/typescript/module/theme/validateThemeConfig.d.ts.map +1 -0
  221. package/lib/typescript/module/tokens/defaults.d.ts +23 -0
  222. package/lib/typescript/module/tokens/defaults.d.ts.map +1 -0
  223. package/lib/typescript/module/tokens/typography.d.ts +14 -0
  224. package/lib/typescript/module/tokens/typography.d.ts.map +1 -0
  225. package/lib/typescript/module/types/brand.d.ts +21 -0
  226. package/lib/typescript/module/types/brand.d.ts.map +1 -0
  227. package/lib/typescript/module/types/colors.d.ts +76 -0
  228. package/lib/typescript/module/types/colors.d.ts.map +1 -0
  229. package/lib/typescript/module/types/index.d.ts +6 -0
  230. package/lib/typescript/module/types/index.d.ts.map +1 -0
  231. package/lib/typescript/module/types/theme.d.ts +140 -0
  232. package/lib/typescript/module/types/theme.d.ts.map +1 -0
  233. package/lib/typescript/module/types/tokens.d.ts +79 -0
  234. package/lib/typescript/module/types/tokens.d.ts.map +1 -0
  235. package/lib/typescript/module/types/typography.d.ts +53 -0
  236. package/lib/typescript/module/types/typography.d.ts.map +1 -0
  237. package/lib/typescript/module/unistyles/createUnistylesConfig.d.ts +52 -0
  238. package/lib/typescript/module/unistyles/createUnistylesConfig.d.ts.map +1 -0
  239. package/lib/typescript/module/unistyles/themeMode.d.ts +13 -0
  240. package/lib/typescript/module/unistyles/themeMode.d.ts.map +1 -0
  241. package/lib/typescript/module/vendor/mcu/hct/cam16.d.ts +132 -0
  242. package/lib/typescript/module/vendor/mcu/hct/cam16.d.ts.map +1 -0
  243. package/lib/typescript/module/vendor/mcu/hct/hct.d.ts +93 -0
  244. package/lib/typescript/module/vendor/mcu/hct/hct.d.ts.map +1 -0
  245. package/lib/typescript/module/vendor/mcu/hct/hct_solver.d.ts +147 -0
  246. package/lib/typescript/module/vendor/mcu/hct/hct_solver.d.ts.map +1 -0
  247. package/lib/typescript/module/vendor/mcu/hct/viewing_conditions.d.ts +75 -0
  248. package/lib/typescript/module/vendor/mcu/hct/viewing_conditions.d.ts.map +1 -0
  249. package/lib/typescript/module/vendor/mcu/index.d.ts +4 -0
  250. package/lib/typescript/module/vendor/mcu/index.d.ts.map +1 -0
  251. package/lib/typescript/module/vendor/mcu/palettes/tonal_palette.d.ts +56 -0
  252. package/lib/typescript/module/vendor/mcu/palettes/tonal_palette.d.ts.map +1 -0
  253. package/lib/typescript/module/vendor/mcu/utils/color_utils.d.ts +129 -0
  254. package/lib/typescript/module/vendor/mcu/utils/color_utils.d.ts.map +1 -0
  255. package/lib/typescript/module/vendor/mcu/utils/math_utils.d.ts +83 -0
  256. package/lib/typescript/module/vendor/mcu/utils/math_utils.d.ts.map +1 -0
  257. package/package.json +40 -16
@@ -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":"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","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":[]}