@multiplatform.one/theme 7.89.0 → 7.90.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 (46) hide show
  1. package/dist/cjs/figma/figmaTokens.cjs +4 -3
  2. package/dist/cjs/figma/figmaTokens.native.js +4 -3
  3. package/dist/cjs/figma/figmaTokens.native.js.map +1 -1
  4. package/dist/cjs/theme/createThemes.cjs +56 -1
  5. package/dist/cjs/theme/createThemes.native.js +97 -1
  6. package/dist/cjs/theme/createThemes.native.js.map +1 -1
  7. package/dist/cjs/theme/presetPreview.cjs +1 -1
  8. package/dist/cjs/theme/presetPreview.native.js +1 -1
  9. package/dist/cjs/theme/presets.cjs +1 -2
  10. package/dist/cjs/theme/presets.native.js +1 -2
  11. package/dist/cjs/theme/presets.native.js.map +1 -1
  12. package/dist/esm/figma/figmaTokens.mjs +4 -3
  13. package/dist/esm/figma/figmaTokens.mjs.map +1 -1
  14. package/dist/esm/figma/figmaTokens.native.js +4 -3
  15. package/dist/esm/figma/figmaTokens.native.js.map +1 -1
  16. package/dist/esm/theme/createThemes.mjs +56 -1
  17. package/dist/esm/theme/createThemes.mjs.map +1 -1
  18. package/dist/esm/theme/createThemes.native.js +97 -1
  19. package/dist/esm/theme/createThemes.native.js.map +1 -1
  20. package/dist/esm/theme/presetPreview.mjs +1 -1
  21. package/dist/esm/theme/presetPreview.native.js +1 -1
  22. package/dist/esm/theme/presets.mjs +1 -2
  23. package/dist/esm/theme/presets.mjs.map +1 -1
  24. package/dist/esm/theme/presets.native.js +1 -2
  25. package/dist/esm/theme/presets.native.js.map +1 -1
  26. package/package.json +5 -5
  27. package/src/expo.spec.ts +4 -4
  28. package/src/figma/figmaTokens.spec.ts +12 -8
  29. package/src/figma/figmaTokens.ts +4 -3
  30. package/src/menuRow.palette.spec.ts +1 -1
  31. package/src/theme/accentButtonLabel.spec.ts +1 -1
  32. package/src/theme/accentFloor.spec.ts +7 -27
  33. package/src/theme/colorRules.spec.ts +4 -3
  34. package/src/theme/colorThemeAccent.spec.ts +2 -1
  35. package/src/theme/createThemes.ts +76 -10
  36. package/src/theme/hairlineToken.spec.ts +2 -2
  37. package/src/theme/houseGround.spec.ts +99 -0
  38. package/src/theme/oneThemeEngine.spec.ts +5 -3
  39. package/src/theme/presetPreview.ts +1 -1
  40. package/src/theme/presets.ts +9 -8
  41. package/src/theme/selectedState.spec.ts +16 -9
  42. package/src/theme/semanticEntryText.spec.ts +6 -3
  43. package/types/figma/figmaTokens.d.ts.map +1 -1
  44. package/types/theme/createThemes.d.ts.map +1 -1
  45. package/types/theme/presets.d.ts +8 -6
  46. package/types/theme/presets.d.ts.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/theme",
3
- "version": "7.89.0",
3
+ "version": "7.90.0",
4
4
  "description": "Tamagui theme system for multiplatform.one",
5
5
  "keywords": [
6
6
  "multiplatform",
@@ -115,8 +115,8 @@
115
115
  "access": "public"
116
116
  },
117
117
  "dependencies": {
118
- "@multiplatform.one/platform": "^7.89.0",
119
- "@multiplatform.one/store": "^7.89.0",
118
+ "@multiplatform.one/platform": "^7.90.0",
119
+ "@multiplatform.one/store": "^7.90.0",
120
120
  "@tamagui/animations-react-native": "2.7.6",
121
121
  "@tamagui/colors": "2.7.6",
122
122
  "@tamagui/config": "2.7.6",
@@ -132,8 +132,8 @@
132
132
  },
133
133
  "devDependencies": {
134
134
  "@expo/prebuild-config": "55.0.18",
135
- "@multiplatform.one/config": "7.89.0",
136
- "@multiplatform.one/test-utils": "7.89.0",
135
+ "@multiplatform.one/config": "7.90.0",
136
+ "@multiplatform.one/test-utils": "7.90.0",
137
137
  "@tamagui/animations-css": "2.7.6",
138
138
  "@tamagui/animations-reanimated": "2.7.6",
139
139
  "@tamagui/build": "2.7.6",
package/src/expo.spec.ts CHANGED
@@ -65,8 +65,8 @@ describe("Expo theme colors", () => {
65
65
 
66
66
  it("rejects an unknown preset or missing scheme instead of baking in a fallback", () => {
67
67
  expect(() => createExpoThemeColors({ preset: "typo" })).toThrow(/preset.*typo/i);
68
- expect(() => createExpoThemeColors({ themes: { light_blue: { background: "#fff" } } })).toThrow(
69
- /dark_blue.*background/i,
68
+ expect(() => createExpoThemeColors({ themes: { light: { background: "#fff" } } })).toThrow(
69
+ /"dark".*background/i,
70
70
  );
71
71
  });
72
72
 
@@ -75,9 +75,9 @@ describe("Expo theme colors", () => {
75
75
  (background) => {
76
76
  expect(() =>
77
77
  createExpoThemeColors({
78
- themes: { light_blue: { background }, dark_blue: { background: "#000" } },
78
+ themes: { light: { background }, dark: { background: "#000" } },
79
79
  }),
80
- ).toThrow(/light_blue.*background/i);
80
+ ).toThrow(/"light".*background/i);
81
81
  },
82
82
  );
83
83
  });
@@ -3,7 +3,6 @@ import { generateScale } from "../theme/scale/generateScale";
3
3
  import { defaultScaleInputs } from "../theme/scale/scaleInputs";
4
4
  import { describe, expect, it } from "vitest";
5
5
  import { normalizeToHex } from "../theme/colorRules";
6
- import { defaultAccentTheme } from "../theme/defaults/accent";
7
6
  import { defaultBaseTheme } from "../theme/defaults/base";
8
7
  import { interTrackingPx } from "../theme/defaults/fonts";
9
8
  import { hairlineBorderWidth } from "../theme/hairline";
@@ -47,7 +46,7 @@ describe("buildFigmaTokens", () => {
47
46
  }
48
47
  });
49
48
 
50
- it("derives base/accent ramps from the canonical default palettes", () => {
49
+ it("derives the base ramp from the canonical default palette", () => {
51
50
  // The theme-builder rounds/normalizes palette values, so the export
52
51
  // reflects the BUILT runtime themes — every step must still be
53
52
  // colorimetrically the canonical source step.
@@ -59,12 +58,17 @@ describe("buildFigmaTokens", () => {
59
58
  expect(sameColor(built[i], source[i])).toBe(true);
60
59
  }
61
60
  }
62
- expect(
63
- sameColor(defaultAccentTheme.lightPalette[0], result.palette.themes.accent.light[0]),
64
- ).toBe(true);
65
- expect(
66
- sameColor(defaultAccentTheme.darkPalette[0], result.palette.themes.accent.dark[0]),
67
- ).toBe(true);
61
+ });
62
+
63
+ it("exports the house accent as the blue ramp on the neutral root (FZ-10073)", () => {
64
+ for (const scheme of ["light", "dark"] as const) {
65
+ const accent = result.palette.themes.accent[scheme];
66
+ const blue = Object.values(scheme === "light" ? Colors.blue : Colors.blueDark);
67
+ for (let i = 0; i < 12; i++) {
68
+ if (i === 10) continue;
69
+ expect(sameColor(accent[i], blue[i]), `${scheme} accent${i + 1}`).toBe(true);
70
+ }
71
+ }
68
72
  });
69
73
 
70
74
  it("derives intent ramps from @tamagui/colors (error=red, success=green, warning=yellow)", () => {
@@ -186,14 +186,15 @@ function unwrapTokenGroup(group: object | undefined): Record<string, number> {
186
186
  }
187
187
 
188
188
  function ramp(themes: BuiltThemes, themeName: string, scheme: "light" | "dark"): string[] {
189
- const key = themeName === "base" ? scheme : `${scheme}_${themeName}`;
189
+ const key = themeName === "base" || themeName === "accent" ? scheme : `${scheme}_${themeName}`;
190
+ const step = themeName === "accent" ? "accent" : "color";
190
191
  const theme = themes[key];
191
192
  if (!theme) throw new Error(`figmaTokens: built themes are missing "${key}"`);
192
193
  const steps: string[] = [];
193
194
  for (let i = 1; i <= 12; i++) {
194
- const value = theme[`color${i}`];
195
+ const value = theme[`${step}${i}`];
195
196
  if (typeof value !== "string") {
196
- throw new Error(`figmaTokens: theme "${key}" is missing color${i}`);
197
+ throw new Error(`figmaTokens: theme "${key}" is missing ${step}${i}`);
197
198
  }
198
199
  steps.push(value);
199
200
  }
@@ -45,7 +45,7 @@ describe("a checked menu row is a selection tint on its panel (FZ-8557)", () =>
45
45
  expect(contrastRatio(lum(check), lum(fill)), `${check} on ${fill}`).toBeGreaterThanOrEqual(
46
46
  3,
47
47
  );
48
- if (hue && hue !== "_gray") expect(check).toBe(token(theme!, "$accentColor"));
48
+ if (hue !== "_gray") expect(check).toBe(token(theme!, "$accentColor"));
49
49
  else expect(check).toBe(token(theme!, "$color"));
50
50
  });
51
51
  }
@@ -3,7 +3,7 @@
3
3
  * is `theme="accent"` on a `Button` frame, so it paints from whichever theme
4
4
  * Tamagui's name walk lands on: the scope's segments from longest to shortest,
5
5
  * `<base>_accent_Button` before `<base>_accent`. The house scope finds
6
- * `<scheme>_accent_Button` (template surface2), a hue scope its
6
+ * `<scheme>_accent_Button` (blue's solid, FZ-10073), a hue scope its
7
7
  * `<scheme>_<hue>_accent` solid, and an intent scope falls back to the
8
8
  * scheme's. Every scope a Button can render under (each scheme bare, every hue
9
9
  * and intent scope) must give its accent Button and its bare accent sub-theme a
@@ -1,4 +1,3 @@
1
- import { themes as stockThemes } from "@tamagui/themes/v5";
2
1
  import { describe, expect, it } from "vitest";
3
2
  import { contrastRatio, normalizeToHex, relativeLuminance } from "./colorRules";
4
3
  import { createThemesBuilder } from "./createThemes";
@@ -39,35 +38,16 @@ describe("MPO-448 / MPO-449: the built accent pair holds Axiom 12", () => {
39
38
  });
40
39
  }
41
40
 
42
- it("uses the nearest accent steps that hold the floors", () => {
41
+ it("takes the blue colour theme's fill and ramp at the house root, its ink held on the root (FZ-10073)", () => {
43
42
  for (const scheme of ["light", "dark"] as const) {
44
43
  const theme = themes[scheme];
45
44
  const steps = Array.from({ length: 12 }, (_, i) => theme[`accent${i + 1}`]);
46
- const luminance = (value: string) => relativeLuminance(hex(value));
47
- const nearest = (preferred: string, candidates: string[], holds: (step: string) => boolean) =>
48
- candidates
49
- .filter(holds)
50
- .sort(
51
- (a, b) =>
52
- Math.abs(luminance(a) - luminance(preferred)) -
53
- Math.abs(luminance(b) - luminance(preferred)),
54
- )[0];
55
- expect(theme.accentBackground).toBe(
56
- nearest(
57
- stockThemes[scheme].accentBackground,
58
- steps.slice(0, 10),
59
- (fill) =>
60
- Math.max(ratio(fill, theme.color1), ratio(fill, theme.color12)) >= 4.5 &&
61
- ratio(fill, theme.color1) >= 3,
62
- ),
63
- );
64
- expect(theme.accentColor).toBe(
65
- nearest(stockThemes[scheme].accentColor, steps, (ink) =>
66
- [theme.color1, theme.color2, theme.color3, theme.color4].every(
67
- (surface) => ratio(ink, surface) >= 4.5,
68
- ),
69
- ),
70
- );
45
+ expect(steps).toEqual(Array.from({ length: 12 }, (_, i) => theme[`blue${i + 1}`]));
46
+ expect(theme.accentBackground).toBe(themes[`${scheme}_blue`].accentBackground);
47
+ const grounds = [theme.color1, theme.color2, theme.color3, theme.color4];
48
+ if (grounds.every((ground) => ratio(steps[10], ground) >= 4.5))
49
+ expect(theme.accentColor).toBe(steps[10]);
50
+ else expect(steps.slice(0, 11)).not.toContain(theme.accentColor);
71
51
  }
72
52
  });
73
53
 
@@ -19,6 +19,7 @@ import { createThemesBuilder } from "./createThemes";
19
19
  import { defaultAccentTheme } from "./defaults/accent";
20
20
  import { defaultBaseTheme } from "./defaults/base";
21
21
  import { defaultBuilderOptions } from "./defaults/builderOptions";
22
+ import { houseAccentTheme } from "./defaults/house";
22
23
 
23
24
  describe("normalizeToHex", () => {
24
25
  it('normalizes "white" to #ffffff', () => {
@@ -421,12 +422,12 @@ describe("contrast floor on built themes (DG-A11Y-01 / DG-COL-01)", () => {
421
422
  });
422
423
 
423
424
  it("a pale accent page fails the contrast guard", () => {
424
- const palette = [...defaultAccentTheme.lightPalette];
425
- palette[1] = defaultAccentTheme.lightPalette[11];
425
+ const palette = [...houseAccentTheme.lightPalette];
426
+ palette[1] = houseAccentTheme.lightPalette[11];
426
427
  const broken = createThemesBuilder(
427
428
  defaultBaseTheme,
428
429
  {
429
- ...defaultAccentTheme,
430
+ ...houseAccentTheme,
430
431
  lightPalette: palette,
431
432
  },
432
433
  defaultBuilderOptions,
@@ -28,7 +28,8 @@ describe("FZ-7715: a colour theme owns its accent", () => {
28
28
  if (grounds.every((ground) => ratio(ramp[10], ground) >= 4.5))
29
29
  expect(scope.accentColor).toBe(ramp[10]);
30
30
  else expect(ramp.slice(0, 11)).not.toContain(scope.accentColor);
31
- expect(scope.accentBackground).not.toBe(themes[scheme].accentBackground);
31
+ if (hue === "blue") expect(themes[scheme].accentBackground).toBe(scope.accentBackground);
32
+ else expect(scope.accentBackground).not.toBe(themes[scheme].accentBackground);
32
33
  expect(ratio(scope.accentBackground, scope.color1)).toBeGreaterThanOrEqual(3);
33
34
  for (const surface of grounds) {
34
35
  expect(ratio(scope.accentColor, surface)).toBeGreaterThanOrEqual(4.5);
@@ -852,6 +852,70 @@ function holdColorThemeAccent(
852
852
  return out;
853
853
  }
854
854
 
855
+ const houseAccentKeys = [
856
+ "accentBackground",
857
+ "accentColor",
858
+ "selectedBackground",
859
+ "selectedColor",
860
+ ] as const;
861
+
862
+ /**
863
+ * FZ-10073 (Clay, rv_4ef347aae208f200: "Neutral gray"). The house look is the
864
+ * scheme root: v5's grey page and white cards (LC-151) under Apple's system
865
+ * tint (LC-172). A root whose accent ramp is grey, the stock inverse, takes
866
+ * the blue colour theme's accent and keeps its neutral ground: the blue ramp
867
+ * as its accent steps, blue's fill and selected pair, accent ink held on the
868
+ * root's own surfaces, and blue's solid for `theme="accent"` and every
869
+ * `<scheme>_accent_<Component>` under it. Themes that carried the grey pair
870
+ * (the intents) follow the root. A consumer's own accent palette is left as
871
+ * it is.
872
+ */
873
+ function holdHouseAccent(
874
+ themes: Record<string, Record<string, string>>,
875
+ ): Record<string, Record<string, string>> {
876
+ const out: Record<string, Record<string, string>> = { ...themes };
877
+ for (const scheme of ["light", "dark"] as const) {
878
+ const base = themes[scheme];
879
+ const blue = themes[`${scheme}_blue`];
880
+ const solid = themes[`${scheme}_blue_accent`];
881
+ if (!base || !blue || !solid) continue;
882
+ const steps = Array.from({ length: 12 }, (_, index) => base[`accent${index + 1}`]);
883
+ if (!isAchromaticRamp(steps)) continue;
884
+ const ramp = Array.from({ length: 12 }, (_, index) => base[`blue${index + 1}`]);
885
+ const surfaces = [base.color1, base.color2, base.color3, base.color4].map(luminanceOf);
886
+ if (ramp.some((step) => !step) || surfaces.some((lum) => lum === null)) continue;
887
+ const holdsInk = (lum: number) =>
888
+ surfaces.every((surface) => contrastRatio(lum, surface as number) >= aaTextContrastRatio);
889
+ const accent: Record<(typeof houseAccentKeys)[number], string> = {
890
+ accentBackground: blue.accentBackground,
891
+ accentColor:
892
+ walkToHoldingInk(ramp[10], ramp[11], holdsInk) ??
893
+ nearestHoldingStep(ramp[10], ramp, holdsInk),
894
+ selectedBackground: blue.selectedBackground,
895
+ selectedColor: blue.selectedColor,
896
+ };
897
+ const accentSteps = Object.fromEntries(ramp.map((step, index) => [`accent${index + 1}`, step]));
898
+ for (const [name, theme] of Object.entries(themes)) {
899
+ if (name === scheme) {
900
+ out[name] = { ...theme, ...accent, ...accentSteps };
901
+ continue;
902
+ }
903
+ const [, scope] = name.split("_");
904
+ if (!name.startsWith(`${scheme}_`) || (childrenHues as readonly string[]).includes(scope))
905
+ continue;
906
+ if (scope === "accent") {
907
+ out[name] = { ...solid };
908
+ continue;
909
+ }
910
+ const followed = houseAccentKeys.filter((key) => key in theme && theme[key] === base[key]);
911
+ if (followed.length > 0) {
912
+ out[name] = { ...theme, ...Object.fromEntries(followed.map((key) => [key, accent[key]])) };
913
+ }
914
+ }
915
+ }
916
+ return out;
917
+ }
918
+
855
919
  const defaultLightShadows: Shadows = {
856
920
  shadow1: "rgba(0,0,0,0.04)",
857
921
  shadow2: "rgba(0,0,0,0.08)",
@@ -883,8 +947,8 @@ const childrenHues = [
883
947
 
884
948
  /**
885
949
  * FZ-7944 round 2, LC-71: the keyboard ring is the accent, never a white or
886
- * black neutral. A hue scope rings in its own accent ink. The roots, whose
887
- * house accent is the neutral inverse, ring in the blue scope's ink, the
950
+ * black neutral. A hue scope rings in its own accent ink. The roots ring in
951
+ * their own accent ink, or in the blue scope's when theirs is grey, the
888
952
  * default accent on Apple platforms. Solid accent sub-themes keep the on-fill
889
953
  * ring they paint for content inside the fill.
890
954
  */
@@ -1002,14 +1066,16 @@ export function createThemesBuilder(
1002
1066
  const themes = withIdentityInk(
1003
1067
  withAccentOnSurface(
1004
1068
  holdFocusRingAccent(
1005
- holdColorThemeAccent(
1006
- holdSwitchTrack(
1007
- holdSyntaxFloor(
1008
- holdNamedInkFloor(
1009
- holdSelectedState(
1010
- holdAccentFloor(
1011
- holdSelectionSurface(
1012
- neutralizeSemanticEntryText(neutralizeTintText(initialTheme)),
1069
+ holdHouseAccent(
1070
+ holdColorThemeAccent(
1071
+ holdSwitchTrack(
1072
+ holdSyntaxFloor(
1073
+ holdNamedInkFloor(
1074
+ holdSelectedState(
1075
+ holdAccentFloor(
1076
+ holdSelectionSurface(
1077
+ neutralizeSemanticEntryText(neutralizeTintText(initialTheme)),
1078
+ ),
1013
1079
  ),
1014
1080
  ),
1015
1081
  ),
@@ -23,7 +23,7 @@ const themes = createDefaultThemeConfig({}).tamagui.themes as unknown as Record<
23
23
  Record<string, { val: string } | undefined>
24
24
  >;
25
25
  const rampThemes = Object.keys(themes).filter((name) =>
26
- /^(light|dark)(_(accent|blue|gray|green|orange|pink|purple|red|yellow|warning|error|success))?$/.test(
26
+ /^(light|dark)(_(blue|gray|green|orange|pink|purple|red|yellow|warning|error|success))?$/.test(
27
27
  name,
28
28
  ),
29
29
  );
@@ -106,7 +106,7 @@ describe("LC-148 HAIRLINE-TOKEN: borderWidth small is the theme's hairline", ()
106
106
  });
107
107
 
108
108
  it("every ramp theme defines $borderColorHairline one step fainter than $borderColor", () => {
109
- expect(rampThemes.length).toBeGreaterThanOrEqual(26);
109
+ expect(rampThemes.length).toBeGreaterThanOrEqual(24);
110
110
  for (const name of rampThemes) {
111
111
  const theme = themes[name]!;
112
112
  const ramp = Array.from({ length: 12 }, (_, i) => theme[`color${i + 1}`]?.val);
@@ -0,0 +1,99 @@
1
+ /**
2
+ * FZ-10073 (Clay, rv_4ef347aae208f200: "Neutral gray"). The house look stands
3
+ * on v5's neutral ramp in both schemes, the grey page and white cards of
4
+ * LC-151, and keeps Apple's system tint, MPO's blue, on its accents only:
5
+ * links, checks, selected radios and segments, focus (LC-172).
6
+ */
7
+ import { describe, expect, it } from "vitest";
8
+ import { chromaOf } from "./accentInk";
9
+ import { normalizeToHex } from "./colorRules";
10
+ import { createDefaultThemeConfig } from "./createDefaultThemeConfig";
11
+ import { resolveAllThemes } from "./dedupeInherited";
12
+ import { defaultPreset, densePreset, heroPreset, roomyPreset, storefrontPreset } from "./presets";
13
+
14
+ const resolved = resolveAllThemes(
15
+ createDefaultThemeConfig().tamagui.themes as unknown as Record<string, Record<string, unknown>>,
16
+ ) as Record<string, Record<string, unknown> | undefined>;
17
+
18
+ const housePresets = {
19
+ default: defaultPreset,
20
+ hero: heroPreset,
21
+ dense: densePreset,
22
+ roomy: roomyPreset,
23
+ storefront: storefrontPreset,
24
+ };
25
+
26
+ const page = { light: "#f7f7f7", dark: "#141414" } as const;
27
+
28
+ const groundKeys = [
29
+ "background",
30
+ "color1",
31
+ "color2",
32
+ "color3",
33
+ "color4",
34
+ "borderColor",
35
+ "borderColorHairline",
36
+ "boundaryColor",
37
+ ];
38
+ const surfaces = ["Card", "ListItem", "Input", "SelectTrigger", "Button"];
39
+ const accentKeys = [
40
+ "accentBackground",
41
+ "accentColor",
42
+ "selectedBackground",
43
+ "selectedColor",
44
+ "outlineColor",
45
+ "accentOnSurface",
46
+ "identityInk",
47
+ ];
48
+
49
+ function hex(theme: string, key: string): string {
50
+ const raw = resolved[theme]?.[key];
51
+ const value = typeof raw === "object" && raw !== null ? (raw as { val?: unknown }).val : raw;
52
+ const parsed = typeof value === "string" ? normalizeToHex(value) : null;
53
+ if (!parsed) throw new Error(`${theme} has no opaque ${key}: ${String(value)}`);
54
+ return parsed;
55
+ }
56
+
57
+ function hue(color: string): number {
58
+ const [r, g, b] = [1, 3, 5].map((offset) => Number.parseInt(color.slice(offset, offset + 2), 16));
59
+ const max = Math.max(r, g, b);
60
+ const delta = max - Math.min(r, g, b);
61
+ if (delta === 0) return Number.NaN;
62
+ const sector =
63
+ max === r ? ((g - b) / delta) % 6 : max === g ? (b - r) / delta + 2 : (r - g) / delta + 4;
64
+ return (sector * 60 + 360) % 360;
65
+ }
66
+
67
+ const isBlue = (color: string) => chromaOf(color) >= 0.1 && hue(color) >= 195 && hue(color) <= 225;
68
+
69
+ describe("FZ-10073: the house ground is neutral grey and its accents are blue", () => {
70
+ for (const scheme of ["light", "dark"] as const) {
71
+ for (const [name, preset] of Object.entries(housePresets)) {
72
+ const scope = preset.theme ? `${scheme}_${preset.theme}` : scheme;
73
+
74
+ it(`${scheme} ${name}: the page is v5's ${page[scheme]} and every surface sits on the neutral ramp`, () => {
75
+ expect(hex(scope, "background")).toBe(page[scheme]);
76
+ for (const theme of [scope, ...surfaces.map((component) => `${scope}_${component}`)]) {
77
+ for (const key of groundKeys) {
78
+ if (resolved[theme]?.[key] === undefined) continue;
79
+ expect(chromaOf(hex(theme, key)), `${theme} ${key}`).toBeLessThan(0.02);
80
+ }
81
+ }
82
+ });
83
+
84
+ it(`${scheme} ${name}: links, checks, selection, focus and the filled control stay blue`, () => {
85
+ for (const key of accentKeys) {
86
+ expect(isBlue(hex(scope, key)), `${scope} ${key} ${hex(scope, key)}`).toBe(true);
87
+ }
88
+ const solid = `${scope}_accent`;
89
+ expect(isBlue(hex(solid, "background")), `${solid} ${hex(solid, "background")}`).toBe(true);
90
+ });
91
+
92
+ it(`${scheme} ${name}: a disabled Tint inherits a ground that is none of the preset's tints`, () => {
93
+ for (const tint of preset.tints) {
94
+ expect(hex(`${scheme}_${tint}`, "background"), tint).not.toBe(hex(scope, "background"));
95
+ }
96
+ });
97
+ }
98
+ }
99
+ });
@@ -175,8 +175,8 @@ describe("LC-160 console and storefront presets", () => {
175
175
  expect(consolePreset.scale).toEqual(v5ScaleInputs);
176
176
  });
177
177
 
178
- it("storefront: v5's scale, HIG blue fills, no decorative tints", () => {
179
- expect(storefrontPreset.theme).toBe("blue");
178
+ it("storefront: v5's scale, HIG blue fills on the neutral root, no decorative tints", () => {
179
+ expect(storefrontPreset.theme).toBe("");
180
180
  expect(storefrontPreset.scale).toEqual(v5ScaleInputs);
181
181
  expect(storefrontPreset.tints).toEqual([]);
182
182
  expect(storefrontPreset.knobs).toEqual(defaultPreset.knobs);
@@ -186,7 +186,9 @@ describe("LC-160 console and storefront presets", () => {
186
186
  const themes = createDefaultThemeConfig().tamagui.themes as unknown as Themes;
187
187
  for (const scheme of ["light", "dark"]) {
188
188
  expect(themes).toHaveProperty(`${scheme}_${consolePreset.theme}`);
189
- expect(themes).toHaveProperty(`${scheme}_${storefrontPreset.theme}`);
189
+ expect(themes).toHaveProperty(
190
+ storefrontPreset.theme ? `${scheme}_${storefrontPreset.theme}` : scheme,
191
+ );
190
192
  }
191
193
  });
192
194
  });
@@ -27,6 +27,6 @@ export function getPresetPreviewColors(
27
27
  background: read("background"),
28
28
  border: read("borderColor"),
29
29
  ink: read("color12"),
30
- accent: read(hue && themes[`${scheme}_${hue}`] ? "color9" : "color12"),
30
+ accent: read(hue && themes[`${scheme}_${hue}`] ? "color9" : "accent9"),
31
31
  };
32
32
  }
@@ -4,13 +4,14 @@ import type { Preset } from "./preset.types";
4
4
  import { defaultScaleInputs, v5ScaleInputs } from "./scale/scaleInputs";
5
5
 
6
6
  /**
7
- * The house look. Its accent is Apple's system tint, MPO's `blue` scope, held
8
- * by the engine to a white label that clears APCA Lc 60: the neutral inverse
9
- * painted black fills in light and white in dark (LC-172), and every filled
10
- * or selected control takes its colour from the theme's accent.
7
+ * The house look. Its accent is Apple's system tint, MPO's blue on the
8
+ * neutral root, held by the engine to a white label that clears APCA Lc 60:
9
+ * the neutral inverse painted black fills in light and white in dark
10
+ * (LC-172), and every filled or selected control takes its colour from the
11
+ * theme's accent.
11
12
  */
12
13
  export const defaultPreset: Preset = {
13
- theme: "blue" as ThemeName,
14
+ theme: "" as ThemeName,
14
15
  knobs: {
15
16
  fillStyle: "filled",
16
17
  borderRadius: "medium",
@@ -126,12 +127,12 @@ export const consolePreset: Preset = {
126
127
  * The SHC storefront's look (LC-160, FZ-7970): Tamagui v5's own scale
127
128
  * (44 px controls, 15 px body) and no decorative hue tints, so nested regions
128
129
  * stay on the neutral ramp. The SHC storefront has no accent of its own and a
129
- * grey fill breaks LC-172, so its fills take Apple's system tint, MPO's `blue`
130
- * scope, held by the engine to a white label that clears APCA Lc 60.
130
+ * grey fill breaks LC-172, so its fills take Apple's system tint, MPO's blue
131
+ * on the neutral root, held by the engine to a white label that clears APCA
132
+ * Lc 60.
131
133
  */
132
134
  export const storefrontPreset: Preset = {
133
135
  ...defaultPreset,
134
- theme: "blue" as ThemeName,
135
136
  tints: [],
136
137
  scale: v5ScaleInputs,
137
138
  };
@@ -68,10 +68,14 @@ describe("LC-131 SELECTED-STATE: one selected recipe in the theme", () => {
68
68
  expect(accent).toContain(paint(scheme, scheme, "$selectedColor"));
69
69
  });
70
70
 
71
- it(`${scheme}: the tint sits off the page and off the neutral selection surface`, () => {
71
+ it(`${scheme}: the house root selects in the blue colour theme's pair, off the page (FZ-10073)`, () => {
72
72
  const tint = paint(scheme, scheme, "$selectedBackground");
73
+ expect(tint).toBe(paint(scheme, `${scheme}_blue`, "$selectedBackground"));
74
+ expect(paint(scheme, scheme, "$selectedColor")).toBe(
75
+ paint(scheme, `${scheme}_blue`, "$selectedColor"),
76
+ );
73
77
  expect(ratio(tint, paint(scheme, scheme, "$color1"))).toBeGreaterThanOrEqual(1.1);
74
- expect(ratio(tint, paint(scheme, scheme, "$color4"))).toBeGreaterThanOrEqual(1.1);
78
+ expect(ratio(tint, paint(scheme, scheme, "$background"))).toBeGreaterThanOrEqual(1.1);
75
79
  });
76
80
 
77
81
  it(`${scheme}: a colour theme selects in its own hue, not the house grey (FZ-7713)`, () => {
@@ -83,7 +87,7 @@ describe("LC-131 SELECTED-STATE: one selected recipe in the theme", () => {
83
87
  );
84
88
  const tint = paint(scheme, name, "$selectedBackground");
85
89
  expect(ramp, name).toContain(tint);
86
- expect(tint, name).not.toBe(house);
90
+ if (colour !== "blue") expect(tint, name).not.toBe(house);
87
91
  expect(ratio(tint, paint(scheme, name, "$color1")), name).toBeGreaterThanOrEqual(1.1);
88
92
  expect(ratio(tint, paint(scheme, name, "$color4")), name).toBeGreaterThanOrEqual(1.1);
89
93
  }
@@ -105,7 +109,9 @@ describe("LC-131 SELECTED-STATE: one selected recipe in the theme", () => {
105
109
  cells.push(`${presetName}/${name}`);
106
110
  }
107
111
  }
108
- expect(cells).toHaveLength(Object.keys(presets).length * 10);
112
+ expect(cells).toHaveLength(
113
+ Object.values(presets).reduce((count, preset) => count + (preset.theme ? 10 : 9), 0),
114
+ );
109
115
  });
110
116
  }
111
117
 
@@ -127,10 +133,11 @@ describe("LC-131 SELECTED-STATE: one selected recipe in the theme", () => {
127
133
 
128
134
  for (const scheme of ["light", "dark"] as const) {
129
135
  it(`${scheme}: a grey accent selects with the ramp's strongest ink on a tint 1.25:1 off $color4, never a mid-grey that reads disabled (FZ-8158)`, () => {
130
- const accent = Array.from({ length: 12 }, (_, i) => paint(scheme, scheme, `accent${i + 1}`));
131
- const tint = paint(scheme, scheme, "$selectedBackground");
132
- const ink = paint(scheme, scheme, "$selectedColor");
133
- expect(ratio(tint, paint(scheme, scheme, "$color4"))).toBeGreaterThanOrEqual(1.25);
136
+ const gray = `${scheme}_gray`;
137
+ const accent = Array.from({ length: 12 }, (_, i) => paint(scheme, scheme, `gray${i + 1}`));
138
+ const tint = paint(scheme, gray, "$selectedBackground");
139
+ const ink = paint(scheme, gray, "$selectedColor");
140
+ expect(ratio(tint, paint(scheme, gray, "$color4"))).toBeGreaterThanOrEqual(1.25);
134
141
  const strongest = Math.max(...accent.map((step) => ratio(step, tint)));
135
142
  expect(ratio(ink, tint)).toBe(strongest);
136
143
  expect(ratio(ink, tint)).toBeGreaterThanOrEqual(7);
@@ -149,7 +156,7 @@ describe("LC-05 ONE-EMPHASIS: the selected row separates from its page", () => {
149
156
  }
150
157
  });
151
158
 
152
- it("repaints the list row and card under the house blue page", () => {
159
+ it("repaints the list row and card under the blue colour theme's page", () => {
153
160
  const scope = paint("light", "light_blue", "$color4");
154
161
  for (const child of ["light_blue_ListItem", "light_blue_Card"])
155
162
  expect(paint("light", child, "$color4"), child).toBe(scope);
@@ -13,6 +13,7 @@ vi.mock("./animations/index", () => ({ animations: {} }));
13
13
 
14
14
  import { createDefaultThemeConfig } from "./createDefaultThemeConfig";
15
15
  import { createThemesBuilder } from "./createThemes";
16
+ import { resolveThemeThroughParents } from "./dedupeInherited";
16
17
  import { defaultAccentTheme } from "./defaults/accent";
17
18
  import { defaultBaseTheme } from "./defaults/base";
18
19
  import { defaultBuilderOptions } from "./defaults/builderOptions";
@@ -62,10 +63,10 @@ describe("entered text under a semantic intent", () => {
62
63
 
63
64
  describe("the default subset keeps the field error tint", () => {
64
65
  const defaultTints = ["accent", "active", "alt1", "alt2", "error", "success", "warning"];
65
- const full = createDefaultThemeConfig().tamagui.themes as Record<string, unknown>;
66
+ const full = createDefaultThemeConfig().tamagui.themes as Record<string, Record<string, unknown>>;
66
67
  const subset = createDefaultThemeConfig({
67
68
  subset: { components: ["Button", "Input", "TextArea"], tints: defaultTints },
68
- }).tamagui.themes as Record<string, unknown>;
69
+ }).tamagui.themes as Record<string, Record<string, unknown>>;
69
70
 
70
71
  it("builds every theme a field enters in its error state, identical to the full config", () => {
71
72
  for (const scheme of schemes) {
@@ -76,7 +77,9 @@ describe("the default subset keeps the field error tint", () => {
76
77
  `${scheme}_error_Button`,
77
78
  ]) {
78
79
  expect(subset, name).toHaveProperty(name);
79
- expect(subset[name]).toEqual(full[name]);
80
+ expect(resolveThemeThroughParents(subset, name)).toEqual(
81
+ resolveThemeThroughParents(full, name),
82
+ );
80
83
  }
81
84
  expect(full).toHaveProperty(`${scheme}_red`);
82
85
  expect(subset).not.toHaveProperty(`${scheme}_red`);
@@ -1 +1 @@
1
- {"version":3,"file":"figmaTokens.d.ts","sourceRoot":"","sources":["../../src/figma/figmaTokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"figmaTokens.d.ts","sourceRoot":"","sources":["../../src/figma/figmaTokens.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createThemes.d.ts","sourceRoot":"","sources":["../../src/theme/createThemes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createThemes.d.ts","sourceRoot":"","sources":["../../src/theme/createThemes.ts"],"names":[],"mappings":"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"}