@multiplatform.one/theme 8.2.2 → 8.4.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 (187) hide show
  1. package/dist/cjs/index.gnome.cjs +4 -1
  2. package/dist/cjs/index.gnome.native.js +3 -0
  3. package/dist/cjs/index.gnome.native.js.map +1 -1
  4. package/dist/cjs/menuRow.cjs +1 -1
  5. package/dist/cjs/menuRow.native.js +1 -1
  6. package/dist/cjs/theme/accentInk.cjs +6 -2
  7. package/dist/cjs/theme/accentInk.native.js +6 -2
  8. package/dist/cjs/theme/accentInk.native.js.map +1 -1
  9. package/dist/cjs/theme/chartPalette.cjs +3 -3
  10. package/dist/cjs/theme/chartPalette.native.js +5 -4
  11. package/dist/cjs/theme/chartPalette.native.js.map +1 -1
  12. package/dist/cjs/theme/colorRules.cjs +5 -0
  13. package/dist/cjs/theme/colorRules.native.js +6 -0
  14. package/dist/cjs/theme/colorRules.native.js.map +1 -1
  15. package/dist/cjs/theme/controlTiers.cjs +9 -5
  16. package/dist/cjs/theme/controlTiers.native.js +10 -5
  17. package/dist/cjs/theme/controlTiers.native.js.map +1 -1
  18. package/dist/cjs/theme/createThemes.cjs +212 -8
  19. package/dist/cjs/theme/createThemes.native.js +397 -12
  20. package/dist/cjs/theme/createThemes.native.js.map +1 -1
  21. package/dist/cjs/theme/defaults/builderOptions.cjs +9 -4
  22. package/dist/cjs/theme/defaults/builderOptions.native.js +9 -4
  23. package/dist/cjs/theme/defaults/builderOptions.native.js.map +1 -1
  24. package/dist/cjs/theme/fillContrast.cjs +4 -1
  25. package/dist/cjs/theme/fillContrast.native.js +4 -1
  26. package/dist/cjs/theme/fillContrast.native.js.map +1 -1
  27. package/dist/cjs/theme/index.cjs +1 -0
  28. package/dist/cjs/theme/index.native.js +1 -0
  29. package/dist/cjs/theme/index.native.js.map +1 -1
  30. package/dist/cjs/theme/nativeSchemePreference.cjs +2 -1
  31. package/dist/cjs/theme/nativeSchemePreference.native.js +2 -1
  32. package/dist/cjs/theme/nativeSchemePreference.native.js.map +1 -1
  33. package/dist/cjs/theme/nativeTheme.native.js.map +1 -1
  34. package/dist/cjs/theme/overlaySurfaces.cjs +2 -2
  35. package/dist/cjs/theme/overlaySurfaces.native.js +2 -2
  36. package/dist/cjs/theme/overlaySurfaces.native.js.map +1 -1
  37. package/dist/cjs/theme/readableColor.cjs +20 -9
  38. package/dist/cjs/theme/readableColor.native.js +20 -9
  39. package/dist/cjs/theme/readableColor.native.js.map +1 -1
  40. package/dist/cjs/theme/reducedMotion.cjs +49 -0
  41. package/dist/cjs/theme/reducedMotion.native.js +81 -0
  42. package/dist/cjs/theme/reducedMotion.native.js.map +1 -0
  43. package/dist/cjs/theme/resolveKnobs.cjs +4 -1
  44. package/dist/cjs/theme/resolveKnobs.native.js +4 -1
  45. package/dist/cjs/theme/resolveKnobs.native.js.map +1 -1
  46. package/dist/cjs/theme/tokenNumber.cjs +34 -0
  47. package/dist/cjs/theme/tokenNumber.native.js +39 -0
  48. package/dist/cjs/theme/tokenNumber.native.js.map +1 -0
  49. package/dist/cjs/theme/useResolvedKnobs.cjs +2 -22
  50. package/dist/cjs/theme/useResolvedKnobs.native.js +2 -30
  51. package/dist/cjs/theme/useResolvedKnobs.native.js.map +1 -1
  52. package/dist/esm/index.gnome.mjs +3 -2
  53. package/dist/esm/index.gnome.mjs.map +1 -1
  54. package/dist/esm/index.gnome.native.js +3 -2
  55. package/dist/esm/index.gnome.native.js.map +1 -1
  56. package/dist/esm/menuRow.mjs +1 -1
  57. package/dist/esm/menuRow.native.js +1 -1
  58. package/dist/esm/theme/accentInk.mjs +6 -3
  59. package/dist/esm/theme/accentInk.mjs.map +1 -1
  60. package/dist/esm/theme/accentInk.native.js +6 -3
  61. package/dist/esm/theme/accentInk.native.js.map +1 -1
  62. package/dist/esm/theme/chartPalette.mjs +3 -3
  63. package/dist/esm/theme/chartPalette.mjs.map +1 -1
  64. package/dist/esm/theme/chartPalette.native.js +5 -4
  65. package/dist/esm/theme/chartPalette.native.js.map +1 -1
  66. package/dist/esm/theme/colorRules.mjs +5 -1
  67. package/dist/esm/theme/colorRules.mjs.map +1 -1
  68. package/dist/esm/theme/colorRules.native.js +6 -1
  69. package/dist/esm/theme/colorRules.native.js.map +1 -1
  70. package/dist/esm/theme/controlTiers.mjs +9 -6
  71. package/dist/esm/theme/controlTiers.mjs.map +1 -1
  72. package/dist/esm/theme/controlTiers.native.js +10 -6
  73. package/dist/esm/theme/controlTiers.native.js.map +1 -1
  74. package/dist/esm/theme/createThemes.mjs +215 -12
  75. package/dist/esm/theme/createThemes.mjs.map +1 -1
  76. package/dist/esm/theme/createThemes.native.js +400 -16
  77. package/dist/esm/theme/createThemes.native.js.map +1 -1
  78. package/dist/esm/theme/defaults/builderOptions.mjs +10 -6
  79. package/dist/esm/theme/defaults/builderOptions.mjs.map +1 -1
  80. package/dist/esm/theme/defaults/builderOptions.native.js +10 -6
  81. package/dist/esm/theme/defaults/builderOptions.native.js.map +1 -1
  82. package/dist/esm/theme/fillContrast.mjs +5 -2
  83. package/dist/esm/theme/fillContrast.mjs.map +1 -1
  84. package/dist/esm/theme/fillContrast.native.js +5 -2
  85. package/dist/esm/theme/fillContrast.native.js.map +1 -1
  86. package/dist/esm/theme/index.mjs +1 -0
  87. package/dist/esm/theme/index.mjs.map +1 -1
  88. package/dist/esm/theme/index.native.js +1 -0
  89. package/dist/esm/theme/index.native.js.map +1 -1
  90. package/dist/esm/theme/nativeSchemePreference.mjs +2 -1
  91. package/dist/esm/theme/nativeSchemePreference.mjs.map +1 -1
  92. package/dist/esm/theme/nativeSchemePreference.native.js +2 -1
  93. package/dist/esm/theme/nativeSchemePreference.native.js.map +1 -1
  94. package/dist/esm/theme/nativeTheme.mjs.map +1 -1
  95. package/dist/esm/theme/nativeTheme.native.js.map +1 -1
  96. package/dist/esm/theme/overlaySurfaces.mjs +2 -2
  97. package/dist/esm/theme/overlaySurfaces.native.js +2 -2
  98. package/dist/esm/theme/readableColor.mjs +20 -9
  99. package/dist/esm/theme/readableColor.mjs.map +1 -1
  100. package/dist/esm/theme/readableColor.native.js +20 -9
  101. package/dist/esm/theme/readableColor.native.js.map +1 -1
  102. package/dist/esm/theme/reducedMotion.mjs +24 -0
  103. package/dist/esm/theme/reducedMotion.mjs.map +1 -0
  104. package/dist/esm/theme/reducedMotion.native.js +53 -0
  105. package/dist/esm/theme/reducedMotion.native.js.map +1 -0
  106. package/dist/esm/theme/resolveKnobs.mjs +4 -1
  107. package/dist/esm/theme/resolveKnobs.mjs.map +1 -1
  108. package/dist/esm/theme/resolveKnobs.native.js +4 -1
  109. package/dist/esm/theme/resolveKnobs.native.js.map +1 -1
  110. package/dist/esm/theme/tokenNumber.mjs +9 -0
  111. package/dist/esm/theme/tokenNumber.mjs.map +1 -0
  112. package/dist/esm/theme/tokenNumber.native.js +11 -0
  113. package/dist/esm/theme/tokenNumber.native.js.map +1 -0
  114. package/dist/esm/theme/useResolvedKnobs.mjs +2 -22
  115. package/dist/esm/theme/useResolvedKnobs.mjs.map +1 -1
  116. package/dist/esm/theme/useResolvedKnobs.native.js +2 -30
  117. package/dist/esm/theme/useResolvedKnobs.native.js.map +1 -1
  118. package/package.json +5 -5
  119. package/src/figma/figmaTokens.spec.ts +2 -1
  120. package/src/index.gnome.ts +2 -0
  121. package/src/menuRow.palette.spec.ts +20 -7
  122. package/src/menuRow.spec.ts +2 -2
  123. package/src/menuRow.ts +3 -3
  124. package/src/theme/accentInk.ts +8 -2
  125. package/src/theme/accentOnSurface.spec.tsx +6 -1
  126. package/src/theme/chartPalette.spec.ts +2 -2
  127. package/src/theme/chartPalette.ts +9 -9
  128. package/src/theme/colorRules.ts +13 -0
  129. package/src/theme/controlEdges.spec.ts +114 -0
  130. package/src/theme/controlTiers.ts +18 -9
  131. package/src/theme/createDefaultThemeConfig.spec.ts +135 -12
  132. package/src/theme/createThemes.ts +363 -24
  133. package/src/theme/defaults/builderOptions.ts +25 -8
  134. package/src/theme/defaults/secondaryInk.spec.ts +10 -5
  135. package/src/theme/fillContrast.spec.ts +8 -2
  136. package/src/theme/fillContrast.ts +10 -2
  137. package/src/theme/houseGround.spec.ts +1 -1
  138. package/src/theme/index.ts +1 -0
  139. package/src/theme/nativeSchemePreference.ts +2 -1
  140. package/src/theme/nativeTheme.tsx +1 -1
  141. package/src/theme/overlaySurfaces.tsx +2 -2
  142. package/src/theme/readableColor.ts +23 -11
  143. package/src/theme/recipes.ts +1 -0
  144. package/src/theme/reducedMotion.native.spec.ts +28 -0
  145. package/src/theme/reducedMotion.native.ts +36 -0
  146. package/src/theme/reducedMotion.ts +27 -0
  147. package/src/theme/resolveKnobs.spec.ts +4 -4
  148. package/src/theme/resolveKnobs.ts +6 -4
  149. package/src/theme/selectionFill.spec.ts +58 -0
  150. package/src/theme/sheetGrabber.spec.ts +4 -0
  151. package/src/theme/switchThumb.spec.ts +13 -1
  152. package/src/theme/themeKeyRegistry.spec.ts +26 -0
  153. package/src/theme/tokenNumber.spec.tsx +47 -0
  154. package/src/theme/tokenNumber.ts +18 -0
  155. package/src/theme/useResolvedKnobs.ts +2 -27
  156. package/types/index.gnome.d.ts +2 -1
  157. package/types/index.gnome.d.ts.map +1 -1
  158. package/types/menuRow.d.ts +5 -5
  159. package/types/theme/accentInk.d.ts +1 -0
  160. package/types/theme/accentInk.d.ts.map +1 -1
  161. package/types/theme/chartPalette.d.ts +2 -2
  162. package/types/theme/colorRules.d.ts +9 -0
  163. package/types/theme/colorRules.d.ts.map +1 -1
  164. package/types/theme/controlTiers.d.ts +11 -5
  165. package/types/theme/controlTiers.d.ts.map +1 -1
  166. package/types/theme/createThemes.d.ts +21 -12
  167. package/types/theme/createThemes.d.ts.map +1 -1
  168. package/types/theme/defaults/builderOptions.d.ts +9 -1
  169. package/types/theme/defaults/builderOptions.d.ts.map +1 -1
  170. package/types/theme/fillContrast.d.ts.map +1 -1
  171. package/types/theme/index.d.ts +1 -0
  172. package/types/theme/index.d.ts.map +1 -1
  173. package/types/theme/nativeSchemePreference.d.ts.map +1 -1
  174. package/types/theme/nativeTheme.d.ts +1 -1
  175. package/types/theme/nativeTheme.d.ts.map +1 -1
  176. package/types/theme/overlaySurfaces.d.ts +2 -2
  177. package/types/theme/readableColor.d.ts.map +1 -1
  178. package/types/theme/recipes.d.ts +3 -0
  179. package/types/theme/recipes.d.ts.map +1 -1
  180. package/types/theme/reducedMotion.d.ts +3 -0
  181. package/types/theme/reducedMotion.d.ts.map +1 -0
  182. package/types/theme/reducedMotion.native.d.ts +3 -0
  183. package/types/theme/reducedMotion.native.d.ts.map +1 -0
  184. package/types/theme/resolveKnobs.d.ts.map +1 -1
  185. package/types/theme/tokenNumber.d.ts +10 -0
  186. package/types/theme/tokenNumber.d.ts.map +1 -0
  187. package/types/theme/useResolvedKnobs.d.ts.map +1 -1
@@ -36,6 +36,7 @@ import { createTamagui } from "tamagui";
36
36
  import { boldPreset, densePreset, heroPreset, roomyPreset } from "./presets";
37
37
  import { createThemesBuilder, type GetThemeProps } from "./createThemes";
38
38
  import { defaultBaseTheme, defaultAccentTheme } from "./defaults";
39
+ import { darkHairlineContrast } from "./defaults/builderOptions";
39
40
  import { setSizeRecipeInputs } from "./sizeRecipes";
40
41
  import { resolveThemeThroughParents } from "./dedupeInherited";
41
42
 
@@ -157,8 +158,9 @@ describe("createDefaultThemeConfig — builderOptions.getTheme composition (DF-0
157
158
  for (const scheme of ["light", "dark"] as const) {
158
159
  const theme = themes[scheme];
159
160
  expect(normalizeToHex(theme.outlineColor)).toBeTruthy();
160
- // LC-152: textMuted is the secondary ink, $color9 in light, $color10 in dark.
161
- expect(theme.textMuted).toBe(theme[scheme === "light" ? "color9" : "color10"]);
161
+ // LC-152: textMuted is the secondary ink, $color9 in light and, on the
162
+ // dark $color4 card (FZ-8400), $color11 in dark.
163
+ expect(theme.textMuted).toBe(theme[scheme === "light" ? "color9" : "color11"]);
162
164
  }
163
165
  expect(config.recipeFamilies?.control.boxVariants.$4.height).toBe(40);
164
166
  });
@@ -333,9 +335,10 @@ describe("the v5 theme matrix", () => {
333
335
  const themes = config.tamagui.themes as unknown as RawThemes;
334
336
 
335
337
  // LC-151 SURFACE-LADDER: the grouped step. Light lifts cards, list items
336
- // and fields to white on the grey page; dark keeps them one step lighter
337
- // than the page (the LC-85 pair). The grouped step is light surface1 itself,
338
- // so it costs no CSS; tracks move to surface2 to stay off a white card.
338
+ // and fields to white on the grey page; dark drops the page to $color1 and
339
+ // lifts them to $color4, iOS's grouped step (FZ-8400). The grouped step is
340
+ // surface1 itself, so it costs no CSS; tracks move to surface2 to stay off
341
+ // a white card.
339
342
  it("puts cards, list items and fields on the grouped step", () => {
340
343
  for (const component of [
341
344
  "Card",
@@ -349,7 +352,7 @@ describe("the v5 theme matrix", () => {
349
352
  expect(themes[`light_${component}`].background, `light_${component}`).toBe(
350
353
  themes.light.color1,
351
354
  );
352
- expect(themes[`dark_${component}`].background, `dark_${component}`).toBe(themes.dark.color3);
355
+ expect(themes[`dark_${component}`].background, `dark_${component}`).toBe(themes.dark.color4);
353
356
  expect(themes[`light_${component}`].backgroundPress, `light_${component} press`).toBe(
354
357
  themes.light.color3,
355
358
  );
@@ -364,6 +367,123 @@ describe("the v5 theme matrix", () => {
364
367
  expect(themes.light_orange_Card.background).toBe(themes.light_orange.color1);
365
368
  });
366
369
 
370
+ const edgeSurfaces = ["_Card", "_ListItem", "_Input", "_TextArea", "_SelectTrigger"];
371
+
372
+ // FZ-9281 / LC-148: iOS's dark opaqueSeparator #38383A over its grouped cell
373
+ // #1C1C1E is 1.454:1. Every dark ramp theme's hairline clears that against
374
+ // the page and against the grouped surface (a Card) it divides.
375
+ it("lifts every dark hairline off the page and the card by iOS's separator step", () => {
376
+ const iosSeparatorStep = contrastRatio(
377
+ relativeLuminance("#38383a"),
378
+ relativeLuminance("#1c1c1e"),
379
+ );
380
+ expect(darkHairlineContrast).toBeCloseTo(iosSeparatorStep, 2);
381
+ const hex = (value: unknown) =>
382
+ normalizeToHex(String(typeof value === "string" ? value : (value as { val?: string })?.val))!;
383
+ const contrastOf = (a: unknown, b: unknown) =>
384
+ contrastRatio(relativeLuminance(hex(a)), relativeLuminance(hex(b)));
385
+ const names = Object.keys(themes).filter((name) => /^dark(_[a-z]+)?$/.test(name));
386
+ expect(names.length).toBeGreaterThan(8);
387
+ const luminanceOf = (value: unknown) => relativeLuminance(hex(value));
388
+ for (const name of names) {
389
+ if (name === "dark_active" || name === "dark_accent") continue;
390
+ const page = resolveThemeThroughParents(themes, name);
391
+ for (const surface of ["", ...edgeSurfaces]) {
392
+ const theme = resolveThemeThroughParents(themes, `${name}${surface}`);
393
+ const label = `${name}${surface}`;
394
+ const grounds = surface ? [page.background, theme.background] : [page.background];
395
+ for (const ground of grounds) {
396
+ expect(
397
+ contrastOf(theme.borderColorHairline, ground),
398
+ `${label} hairline on ${ground === page.background ? "page" : "surface"}`,
399
+ ).toBeGreaterThanOrEqual(iosSeparatorStep);
400
+ }
401
+ for (const ground of grounds) {
402
+ expect(
403
+ contrastOf(theme.borderColor, ground),
404
+ `${label} medium edge on ${ground === page.background ? "page" : "surface"}`,
405
+ ).toBeGreaterThanOrEqual(iosSeparatorStep);
406
+ }
407
+ expect(luminanceOf(theme.borderColor), `${label} medium above hairline`).toBeGreaterThan(
408
+ luminanceOf(theme.borderColorHairline),
409
+ );
410
+ }
411
+ }
412
+ });
413
+
414
+ it("keeps every light edge where it was (FZ-9281 is dark only)", () => {
415
+ const value = (raw: unknown) =>
416
+ String(typeof raw === "string" ? raw : (raw as { val?: string })?.val);
417
+ const edges = Object.keys(themes)
418
+ .filter((name) => /^light(_[a-z]+)?$/.test(name))
419
+ .sort()
420
+ .flatMap((name) =>
421
+ ["", ...edgeSurfaces].map((surface) => {
422
+ const theme = resolveThemeThroughParents(themes, `${name}${surface}`);
423
+ return `${name}${surface} ${value(theme.borderColorHairline)} ${value(theme.borderColor)}`;
424
+ }),
425
+ );
426
+ expect(edges.join("\n")).toMatchSnapshot();
427
+ });
428
+
429
+ // FZ-8400: iOS's grouped step is secondarySystemGroupedBackground #1C1C1E
430
+ // on systemGroupedBackground #000000, 1.23:1. Every preset's dark page and
431
+ // its inset group (a Card) clear it, the group's own small edge reads off
432
+ // its fill, and a Button and an overlay still step off the card.
433
+ it("steps dark grouped surfaces off the page by at least iOS's grouped step", () => {
434
+ const iosGroupedStep = contrastRatio(
435
+ relativeLuminance("#1c1c1e"),
436
+ relativeLuminance("#000000"),
437
+ );
438
+ const contrastOf = (a: string, b: string) =>
439
+ contrastRatio(relativeLuminance(normalizeToHex(a)!), relativeLuminance(normalizeToHex(b)!));
440
+ const read = (name: string) => resolveThemeThroughParents(themes, name);
441
+ // The neutral ramp, the built-in presets' hues and the app presets' hues.
442
+ const presetHues = [boldPreset, heroPreset, densePreset, roomyPreset].map((p) => p.theme);
443
+ for (const hue of new Set([
444
+ "",
445
+ ...presetHues,
446
+ "blue",
447
+ "gray",
448
+ "purple",
449
+ "green",
450
+ "orange",
451
+ "pink",
452
+ ])) {
453
+ const at = (suffix: string) => read(["dark", hue, suffix].filter(Boolean).join("_"));
454
+ const page = at("");
455
+ const card = at("Card");
456
+ const label = hue || "neutral";
457
+ expect(
458
+ contrastOf(card.background, page.background),
459
+ `${label} card on page`,
460
+ ).toBeGreaterThanOrEqual(iosGroupedStep);
461
+ expect(
462
+ relativeLuminance(normalizeToHex(at("Button").background)!),
463
+ `${label} button over card`,
464
+ ).toBeGreaterThan(relativeLuminance(normalizeToHex(card.background)!));
465
+ // LC-05 selection fills inside the group never land on its own fill,
466
+ // and on the page they stay the ramp steps they replaced.
467
+ for (const key of ["selectFill", "selectPress"]) {
468
+ expect(contrastOf(card[key], card.background), `${label} ${key} on card`).toBeGreaterThan(
469
+ 1.1,
470
+ );
471
+ }
472
+ expect(page.selectFill, `${label} page selectFill`).toBe(page.color4);
473
+ expect(page.selectPress, `${label} page selectPress`).toBe(page.color5);
474
+ }
475
+ for (const scheme of ["light", "dark"] as const) {
476
+ for (const name of [scheme, `${scheme}_blue`, `${scheme}_gray`]) {
477
+ const page = themes[name];
478
+ expect([page.selectFill, page.selectPress], name).toEqual([page.color4, page.color5]);
479
+ }
480
+ }
481
+ expect(read("light_Card").selectFill).toBe(themes.light.color4);
482
+ // Light keeps the grey page and the white grouped step.
483
+ expect(themes.light.background).toBe(themes.light.color2);
484
+ expect(themes.light_Card.background).toBe(themes.light.color1);
485
+ });
486
+
367
487
  it("binds the v5 shadow3 alpha in both schemes", () => {
368
488
  for (const [scheme, alphas] of [
369
489
  ["light", [0.04, 0.08, 0.12, 0.22, 0.33, 0.44]],
@@ -377,9 +497,9 @@ describe("the v5 theme matrix", () => {
377
497
  });
378
498
 
379
499
  it("uses v5 surface templates for pages and components", () => {
380
- for (const scheme of ["light", "dark"] as const) {
381
- expect(themes[scheme].background).toBe(themes[scheme].color2);
382
- }
500
+ expect(themes.light.background).toBe(themes.light.color2);
501
+ // FZ-8400: the dark page is the ramp's darkest step, iOS's black ground.
502
+ expect(themes.dark.background).toBe(themes.dark.color1);
383
503
  const button = themes.light_Button;
384
504
  expect(relativeLuminance(normalizeToHex(button.backgroundHover)!)).toBeGreaterThan(
385
505
  relativeLuminance(normalizeToHex(button.background)!),
@@ -415,10 +535,13 @@ describe("the v5 theme matrix", () => {
415
535
  builderOptions: { componentThemes: { Custom: { template: "surface1" } } },
416
536
  }).tamagui.themes as unknown as RawThemes;
417
537
  for (const scheme of ["light", "dark"] as const) {
418
- expect(custom[`${scheme}_brand`].background).toBe(custom[`${scheme}_brand`].color2);
419
- // surface1 is the LC-151 grouped step: white in light, one step up in dark.
538
+ // The page is $color2 in light and $color1 in dark (LC-151, FZ-8400).
539
+ expect(custom[`${scheme}_brand`].background).toBe(
540
+ custom[`${scheme}_brand`][scheme === "light" ? "color2" : "color1"],
541
+ );
542
+ // surface1 is the LC-151 grouped step: white in light, $color4 in dark.
420
543
  expect(custom[`${scheme}_Custom`].background).toBe(
421
- custom[scheme][scheme === "light" ? "color1" : "color3"],
544
+ custom[scheme][scheme === "light" ? "color1" : "color4"],
422
545
  );
423
546
  expect(custom).not.toHaveProperty(`${scheme}_Button`);
424
547
  }