@multiplatform.one/theme 7.53.0 → 7.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/theme",
3
- "version": "7.53.0",
3
+ "version": "7.54.0",
4
4
  "description": "Tamagui theme system for multiplatform.one",
5
5
  "keywords": [
6
6
  "multiplatform",
@@ -72,8 +72,8 @@
72
72
  "access": "public"
73
73
  },
74
74
  "dependencies": {
75
- "@multiplatform.one/platform": "^7.53.0",
76
- "@multiplatform.one/store": "^7.53.0",
75
+ "@multiplatform.one/platform": "^7.54.0",
76
+ "@multiplatform.one/store": "^7.54.0",
77
77
  "@tamagui/animations-react-native": "2.7.6",
78
78
  "@tamagui/colors": "2.7.6",
79
79
  "@tamagui/config": "2.7.6",
@@ -89,8 +89,8 @@
89
89
  },
90
90
  "devDependencies": {
91
91
  "@expo/prebuild-config": "55.0.18",
92
- "@multiplatform.one/config": "7.53.0",
93
- "@multiplatform.one/test-utils": "7.53.0",
92
+ "@multiplatform.one/config": "7.54.0",
93
+ "@multiplatform.one/test-utils": "7.54.0",
94
94
  "@tamagui/animations-css": "2.7.6",
95
95
  "@tamagui/animations-reanimated": "2.7.6",
96
96
  "@tamagui/font-inter": "2.7.6",
@@ -285,6 +285,28 @@ describe("font weight provenance", () => {
285
285
  expect(measured()?.fontWeight?.offScale).toBe(true);
286
286
  expect(measured()?.violations.join(" ")).not.toContain(`${weight}px`);
287
287
  });
288
+ it.each([500, 700])("accepts the label role at %i on a form label (LC-152)", (weight) => {
289
+ const el = document.createElement("label");
290
+ el.id = "specimen";
291
+ el.style.fontWeight = String(weight);
292
+ document.body.replaceChildren(el);
293
+ for (const run of [audit, runConstraintAudit]) {
294
+ const entry = run().elements.find((item) => item.id === "specimen");
295
+ expect(entry?.fontWeight).toMatchObject({ value: weight, offScale: false });
296
+ expect(entry?.fontWeight?.knob).toBe("label role (LC-152)");
297
+ }
298
+ });
299
+ it.each([500, 600])("rejects %i outside a label and a heading", (weight) => {
300
+ specimen(`font-weight:${weight}`);
301
+ expect(measured()?.fontWeight?.offScale).toBe(true);
302
+ });
303
+ it("rejects a form label at a weight the label role never takes", () => {
304
+ const el = document.createElement("label");
305
+ el.id = "specimen";
306
+ el.style.fontWeight = "600";
307
+ document.body.replaceChildren(el);
308
+ expect(measured()?.fontWeight?.offScale).toBe(true);
309
+ });
288
310
  it("does not grant arbitrary elements heading weights", () => {
289
311
  specimen("font-weight:800");
290
312
  expect(measured()?.fontWeight?.offScale).toBe(true);
@@ -964,6 +964,9 @@ export function runConstraintAudit(rootSelector?: string): AuditReport {
964
964
  ),
965
965
  )) &&
966
966
  [600, 700, 800].includes(fw);
967
+ // LC-152 TEXT-ROLES: a form label is the label role, 500 (700 under the
968
+ // bold fontWeight knob), not body copy at a stray weight.
969
+ const configuredLabel = el.tagName === "LABEL" && [500, 700].includes(fw);
967
970
  const expected =
968
971
  weightKnob !== null && ["regular", "bold"].includes(weightKnob)
969
972
  ? _FONT_WEIGHT_KNOB[weightKnob]
@@ -971,13 +974,15 @@ export function runConstraintAudit(rootSelector?: string): AuditReport {
971
974
  const offScale =
972
975
  weightKnob !== null
973
976
  ? expected === undefined || fw !== expected
974
- : !_VALID_FONT_WEIGHT.has(fw) && !configuredHeading;
977
+ : !_VALID_FONT_WEIGHT.has(fw) && !configuredHeading && !configuredLabel;
975
978
  const knob =
976
979
  weightKnob !== null
977
980
  ? `fontWeight:${weightKnob}`
978
981
  : configuredHeading
979
982
  ? "configured heading (@tamagui/config/v5)"
980
- : _reverseFontWeight(fw);
983
+ : configuredLabel
984
+ ? "label role (LC-152)"
985
+ : _reverseFontWeight(fw);
981
986
  entry.fontWeight = { value: fw, unit: "", knob, offScale };
982
987
  if (offScale)
983
988
  entry.violations.push(
@@ -101,7 +101,8 @@ describe("buildFigmaTokens", () => {
101
101
  // the correction landing, and what this pins is that it landed —
102
102
  // borderColor back off color5, the background states no longer forced.
103
103
  expect(result.semantic.borderColor?.alias).toBe("color4");
104
- expect(result.semantic.textMuted?.alias).toBe("color11");
104
+ // LC-152: the secondary ink is a different ramp step per scheme, so no one alias.
105
+ expect(result.semantic.textMuted?.alias).toBeNull();
105
106
  expect(result.semantic.placeholderColor?.alias).toBe("color9");
106
107
  expect(result.semantic.surfaceMuted?.alias).toBe("color10");
107
108
  expect(result.semantic.borderStrong?.alias).toBe("color7");
@@ -115,8 +116,13 @@ describe("buildFigmaTokens", () => {
115
116
  });
116
117
 
117
118
  it("derives textAccent knob tiers as text-low/medium/high", () => {
118
- expect(result.semantic["text-low"]?.alias).toBe("color11");
119
- expect(result.semantic["text-medium"]?.alias).toBe("color11");
119
+ // LC-152: low and medium are the scheme-aware secondary ink, a different
120
+ // ramp step per scheme ($color9 light, $color10 dark), so no one alias.
121
+ for (const tier of ["text-low", "text-medium"]) {
122
+ expect(result.semantic[tier]?.alias, tier).toBeNull();
123
+ expect(result.semantic[tier]?.light, tier).toBe(result.semantic.textMuted?.light);
124
+ expect(result.semantic[tier]?.dark, tier).toBe(result.semantic.textMuted?.dark);
125
+ }
120
126
  expect(result.semantic["text-high"]?.alias).toBe("color12");
121
127
  });
122
128
 
@@ -90,8 +90,8 @@ describe("createDefaultThemeConfig — builderOptions.getTheme composition (DF-0
90
90
  }
91
91
 
92
92
  it("consumer keys win over the default derivation per key", () => {
93
- // Default getTheme anchors textMuted at color11; the consumer moves it
94
- // to color10 — composition must keep the consumer's choice.
93
+ // Default getTheme picks textMuted as the secondary ink ($color9 in light);
94
+ // the consumer moves it to color10, and composition keeps the consumer's choice.
95
95
  for (const scheme of ["light", "dark"] as const) {
96
96
  expect(themes[scheme].textMuted).toBe(themes[scheme].color10);
97
97
  }
@@ -156,7 +156,8 @@ describe("createDefaultThemeConfig — builderOptions.getTheme composition (DF-0
156
156
  for (const scheme of ["light", "dark"] as const) {
157
157
  const theme = themes[scheme];
158
158
  expect(normalizeToHex(theme.outlineColor)).toBeTruthy();
159
- expect(theme.textMuted).toBe(theme.color11);
159
+ // LC-152: textMuted is the secondary ink, $color9 in light, $color10 in dark.
160
+ expect(theme.textMuted).toBe(theme[scheme === "light" ? "color9" : "color10"]);
160
161
  }
161
162
  expect(config.recipeFamilies?.control.boxVariants.$4.height).toBe(40);
162
163
  });
@@ -13,6 +13,7 @@ import {
13
13
  pickReadableForeground,
14
14
  relativeLuminance,
15
15
  } from "./colorRules";
16
+ import { pickSecondaryInk } from "./defaults/builderOptions";
16
17
  import { themeRampHues } from "./ramps";
17
18
 
18
19
  /**
@@ -229,6 +230,11 @@ function neutralizeTintText(
229
230
  for (const key of tintNeutralTextKeys) {
230
231
  if (key in patched && base[key] != null) patched[key] = base[key];
231
232
  }
233
+ // LC-152: the secondary ink is neutral too, the most muted neutral step
234
+ // that clears 7:1 on this tint's own surfaces. The hue's step, picked on
235
+ // its palette, measured 4:1 on light tints; the scheme's own pick, 6.6:1
236
+ // on dark_blue.
237
+ if ("textMuted" in patched) patched.textMuted = pickSecondaryInk(patched, base);
232
238
  out[name] = patched;
233
239
  }
234
240
  return out;
@@ -78,6 +78,41 @@ function pickHairlineBorderColor(
78
78
  return undefined;
79
79
  }
80
80
 
81
+ /**
82
+ * LC-152 TEXT-ROLES: the secondary text ink. Labels, captions and meta are
83
+ * 12-13px, so the floor is 7:1 (AAA) on the page and on every card tier,
84
+ * and the pick is the most muted ramp step that clears it. The stock v5 ramp
85
+ * is not symmetric: light $color11 is 14% lightness, two points off the
86
+ * primary ink, so one fixed step cannot read as secondary in both schemes.
87
+ * On the default ramp this lands on $color9 in light and $color10 in dark.
88
+ */
89
+ export const secondaryInkContrast = 7;
90
+
91
+ /**
92
+ * `ramp` supplies the candidate steps when they differ from the theme whose
93
+ * surfaces the ink sits on: a tint picks from its scheme's neutral ramp.
94
+ */
95
+ export function pickSecondaryInk(
96
+ theme: Record<string, string>,
97
+ ramp: Record<string, string> = theme,
98
+ ): string {
99
+ const fallback = ramp.color11 ?? ramp.color12 ?? "transparent";
100
+ const surfaces = [theme.background, theme.color1, theme.color2, theme.color3].map((raw) =>
101
+ normalizeToHex(raw ?? ""),
102
+ );
103
+ if (surfaces.some((hex) => !hex)) return fallback;
104
+ const luminances = surfaces.map((hex) => relativeLuminance(hex!));
105
+ for (const key of [8, 9, 10, 11]) {
106
+ const raw = ramp[`color${key}`];
107
+ const hex = raw ? normalizeToHex(raw) : null;
108
+ if (!raw || !hex) continue;
109
+ const luminance = relativeLuminance(hex);
110
+ const minC = Math.min(...luminances.map((surface) => contrastRatio(luminance, surface)));
111
+ if (minC >= secondaryInkContrast) return raw;
112
+ }
113
+ return fallback;
114
+ }
115
+
81
116
  function getBaseTheme(theme: Record<string, string>) {
82
117
  const borderColorHairline = pickHairlineBorderColor(theme.borderColor, (n) => theme[`color${n}`]);
83
118
  return {
@@ -87,7 +122,7 @@ function getBaseTheme(theme: Record<string, string>) {
87
122
  switchThumb: "#ffffff",
88
123
  // The v5 makeSurface templates own the interaction ramp and borders.
89
124
  // No ramp step is pinned here; only semantic aliases are added.
90
- textMuted: theme.color11,
125
+ textMuted: pickSecondaryInk(theme),
91
126
  textSubtle: theme.color6,
92
127
  borderStrong: theme.color7,
93
128
  borderStrongHover: theme.color8,
@@ -0,0 +1,76 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { contrastRatio, normalizeToHex, relativeLuminance } from "../colorRules";
3
+ import { createThemesBuilder, tintHueNames } from "../createThemes";
4
+ import { defaultAccentTheme } from "./accent";
5
+ import { defaultBaseTheme } from "./base";
6
+ import { defaultBuilderOptions, pickSecondaryInk, secondaryInkContrast } from "./builderOptions";
7
+
8
+ type Themes = Record<string, Record<string, string>>;
9
+
10
+ const built = createThemesBuilder(
11
+ defaultBaseTheme,
12
+ defaultAccentTheme,
13
+ defaultBuilderOptions,
14
+ ).themes() as Themes;
15
+
16
+ const luminance = (raw: string) => relativeLuminance(normalizeToHex(raw)!);
17
+ const minContrast = (theme: Record<string, string>, ink: string) =>
18
+ Math.min(
19
+ ...[theme.background!, theme.color1!, theme.color2!, theme.color3!].map((surface) =>
20
+ contrastRatio(luminance(ink), luminance(surface)),
21
+ ),
22
+ );
23
+
24
+ describe("LC-152 secondary ink", () => {
25
+ it("lands on $color9 in light and $color10 in dark on the default ramp", () => {
26
+ expect(built.light!.textMuted).toBe(built.light!.color9);
27
+ expect(built.dark!.textMuted).toBe(built.dark!.color10);
28
+ });
29
+
30
+ it("clears 7:1 on the page and every card tier in both schemes", () => {
31
+ for (const scheme of ["light", "dark"] as const) {
32
+ const theme = built[scheme]!;
33
+ expect(minContrast(theme, theme.textMuted!)).toBeGreaterThanOrEqual(secondaryInkContrast);
34
+ }
35
+ });
36
+
37
+ it("is the most muted step that clears the floor, so it reads as secondary", () => {
38
+ for (const scheme of ["light", "dark"] as const) {
39
+ const theme = built[scheme]!;
40
+ const index = Number(
41
+ Object.entries(theme)
42
+ .find(([key, value]) => /^color\d+$/.test(key) && value === theme.textMuted)![0]
43
+ .slice(5),
44
+ );
45
+ const softer = theme[`color${index - 1}`]!;
46
+ expect(minContrast(theme, softer)).toBeLessThan(secondaryInkContrast);
47
+ expect(theme.textMuted).not.toBe(theme.color12);
48
+ }
49
+ });
50
+
51
+ it("every scheme theme that carries a ramp gets a secondary ink at the floor or the best it has", () => {
52
+ for (const [name, theme] of Object.entries(built)) {
53
+ if (!theme.color5 || !theme.textMuted) continue;
54
+ if (tintHueNames.has(name.split("_")[1] ?? "")) continue;
55
+ expect(theme.textMuted, name).toBe(pickSecondaryInk(theme));
56
+ }
57
+ });
58
+
59
+ it("a tint takes a neutral secondary ink that clears 7:1 on the tint's own surfaces", () => {
60
+ // The hue's own step cleared 7:1 on the palette it was picked from but only
61
+ // 4:1 on the tint's final surfaces (light_orange measured 3.99:1), and the
62
+ // scheme's pick reached 6.6:1 on dark_blue, so a tint picks from the
63
+ // scheme's neutral ramp against its own surfaces.
64
+ let tints = 0;
65
+ for (const [name, theme] of Object.entries(built)) {
66
+ const [scheme, hue, ...rest] = name.split("_");
67
+ if (rest.length || !hue || !tintHueNames.has(hue) || !theme.textMuted) continue;
68
+ tints += 1;
69
+ expect(theme.textMuted, name).toBe(pickSecondaryInk(theme, built[scheme!]!));
70
+ expect(minContrast(theme, theme.textMuted!), name).toBeGreaterThanOrEqual(
71
+ secondaryInkContrast,
72
+ );
73
+ }
74
+ expect(tints).toBeGreaterThan(0);
75
+ });
76
+ });
@@ -150,6 +150,13 @@ export interface CornerSmoothingCarrier {
150
150
  className?: string;
151
151
  }
152
152
 
153
+ export interface TextRoleFragment {
154
+ fontSize: FontSizeTokens;
155
+ lineHeight: FontSizeTokens;
156
+ fontWeight: string;
157
+ color: string;
158
+ }
159
+
153
160
  export interface KnobProps {
154
161
  borderRadius: {
155
162
  borderRadius: string;
@@ -329,6 +336,19 @@ export interface KnobProps {
329
336
  * `pageTitleScale` override) re-opens the display scale for marketing.
330
337
  */
331
338
  pageTitle: PageTitleFragment;
339
+ /**
340
+ * LC-152 TEXT-ROLES, at the control size token. `label`: field, fact and
341
+ * column labels (13/500 web, 15/500 native, secondary ink). `caption`:
342
+ * timestamps and counts (12/400, secondary ink). `headline`: row and card
343
+ * titles (16/600 web, 17/600 native, primary ink). Spread whole.
344
+ */
345
+ textRole: {
346
+ label: TextRoleFragment;
347
+ /** LC-155: a row's secondary line, label size at 400 in the secondary ink. */
348
+ meta: TextRoleFragment;
349
+ caption: TextRoleFragment;
350
+ headline: TextRoleFragment;
351
+ };
332
352
  /** color is set only for solid semantic-intent Buttons (error/warning/success). */
333
353
  body: { fontFamily: string; fontWeight: string; color?: ColorTokens };
334
354
  typography: {
@@ -1101,6 +1101,88 @@ describe("resolveKnobs", () => {
1101
1101
  const low = resolveKnobs(knobsWith({ textAccent: "low" }));
1102
1102
  expect(low.knobProps.textAccent).toBe("low");
1103
1103
  });
1104
+
1105
+ it("low and medium take the theme's secondary ink; high keeps the primary ink (LC-152)", () => {
1106
+ expect(resolveKnobs(knobsWith({ textAccent: "low" })).knobProps.textAccentColor).toBe(
1107
+ "$textMuted",
1108
+ );
1109
+ expect(resolveKnobs(knobsWith({ textAccent: "medium" })).knobProps.textAccentColor).toBe(
1110
+ "$textMuted",
1111
+ );
1112
+ expect(resolveKnobs(knobsWith({ textAccent: "high" })).knobProps.textAccentColor).toBe(
1113
+ "$color",
1114
+ );
1115
+ });
1116
+ });
1117
+
1118
+ // ── text roles (LC-152) ─────────────────────────────────────
1119
+
1120
+ describe("text roles", () => {
1121
+ it("label, caption and headline resolve on the web ladder at $true", () => {
1122
+ const { textRole } = resolveKnobs(defaultKnobs).knobProps;
1123
+ expect(textRole.label).toEqual({
1124
+ fontSize: "$2",
1125
+ lineHeight: "$2",
1126
+ fontWeight: "500",
1127
+ color: "$textMuted",
1128
+ });
1129
+ expect(textRole.meta).toEqual({
1130
+ fontSize: "$2",
1131
+ lineHeight: "$2",
1132
+ fontWeight: "400",
1133
+ color: "$textMuted",
1134
+ });
1135
+ expect(textRole.caption).toEqual({
1136
+ fontSize: "$1",
1137
+ lineHeight: "$1",
1138
+ fontWeight: "400",
1139
+ color: "$textMuted",
1140
+ });
1141
+ expect(textRole.headline).toEqual({
1142
+ fontSize: "$5",
1143
+ lineHeight: "$5",
1144
+ fontWeight: "600",
1145
+ color: "$color",
1146
+ });
1147
+ });
1148
+
1149
+ it("roles follow the control size token and the bold weight knob", () => {
1150
+ const small = resolveKnobs(defaultKnobs, undefined, "light", { sizeToken: "$3" }).knobProps
1151
+ .textRole;
1152
+ expect(small.label.fontSize).toBe("$1");
1153
+ expect(small.headline.fontSize).toBe("$4");
1154
+ const bold = resolveKnobs(knobsWith({ fontWeight: "bold" })).knobProps.textRole;
1155
+ expect(bold.label.fontWeight).toBe("700");
1156
+ expect(bold.headline.fontWeight).toBe("700");
1157
+ expect(bold.caption.fontWeight).toBe("400");
1158
+ });
1159
+
1160
+ it("native reaches the HIG classes: label 15, caption 12, headline 17", async () => {
1161
+ vi.resetModules();
1162
+ vi.doMock("@multiplatform.one/platform", () => ({
1163
+ isWeb: false,
1164
+ isTouchable: false,
1165
+ isWebTouchable: false,
1166
+ }));
1167
+ try {
1168
+ const { resolveKnobs: resolveNative } = await import("./resolveKnobs");
1169
+ const { textRole } = resolveNative(defaultKnobs).knobProps;
1170
+ expect(textRole.label.fontSize).toBe("$3");
1171
+ expect(textRole.caption.fontSize).toBe("$2");
1172
+ expect(textRole.headline.fontSize).toBe("$4");
1173
+ } finally {
1174
+ vi.doUnmock("@multiplatform.one/platform");
1175
+ vi.resetModules();
1176
+ }
1177
+ });
1178
+
1179
+ it("label and caption keep the secondary ink at every textAccent stop", () => {
1180
+ for (const textAccent of ["low", "medium", "high"] as const) {
1181
+ const { textRole } = resolveKnobs(knobsWith({ textAccent })).knobProps;
1182
+ expect(textRole.label.color, textAccent).toBe("$textMuted");
1183
+ expect(textRole.caption.color, textAccent).toBe("$textMuted");
1184
+ }
1185
+ });
1104
1186
  });
1105
1187
 
1106
1188
  // ── typography knobs ────────────────────────────────────────
@@ -1156,10 +1238,10 @@ describe("resolveKnobs", () => {
1156
1238
 
1157
1239
  describe("pageTitleScale knob", () => {
1158
1240
  const compact = (step: string) => ({ fontSize: step, lineHeight: step, letterSpacing: step });
1159
- const moderateTitle = { size: "$10", "$max-sm": compact("$9") };
1241
+ const moderateTitle = { size: "$9", "$max-sm": compact("$9") };
1160
1242
  const displayTitle = { size: "$12", "$max-sm": compact("$11") };
1161
1243
 
1162
- it("defaults to the moderate page-title step ($10 = 40px)", () => {
1244
+ it("defaults to the moderate page-title step ($9, LC-152)", () => {
1163
1245
  expect(resolveKnobs(defaultKnobs).knobProps.pageTitle).toEqual(moderateTitle);
1164
1246
  });
1165
1247
 
@@ -30,6 +30,7 @@ import type {
30
30
  PageTitleFragment,
31
31
  ResolvedKnobs,
32
32
  StateRecipes,
33
+ TextRoleFragment,
33
34
  TextStateProps,
34
35
  } from "./recipes";
35
36
  import { sizeRecipeForToken } from "./sizeRecipes";
@@ -140,11 +141,13 @@ const featureRadiusMap = {
140
141
  } as const;
141
142
 
142
143
  // ── Page-title step (D-11 hero-H1 dial) ───────────────────────
143
- // Default type 15: moderate is 40px; display is 52px. Below `$sm` (a phone)
144
- // each step drops one token, as iOS large titles and Material's compact
145
- // headline do: a 40px title crowds a 390pt column (FZ-7703).
144
+ // Default type 15: moderate is 40px; display is 52px.
145
+ // LC-152: one page-title step on every product screen, the HIG large-title
146
+ // class (30 web / 32 native). It replaces the 40px rider of LC-17. Below `$sm`
147
+ // (a phone) display drops one token, as iOS large titles and Material's
148
+ // compact headline do (FZ-7703); moderate is already the large-title class.
146
149
  const pageTitleSizeMap: Record<PageTitleScale, FontSizeTokens> = {
147
- moderate: "$10",
150
+ moderate: "$9",
148
151
  display: "$12",
149
152
  };
150
153
  const compactPageTitleSizeMap: Record<PageTitleScale, FontSizeTokens> = {
@@ -403,15 +406,55 @@ function elevationChromeFor(key: SizeKey | undefined): ElevationChromeProps {
403
406
  // The fill alone would land on the base edge step and erase the border.
404
407
  const surface2 = { fill: "$color4", edge: "$color6" } as const;
405
408
 
406
- // Legibility floor: body/label text must never land below ~4.5:1 against its
407
- // surface. $color11 is the lowest ramp step that clears AA on color1/2
408
- // surfaces, so "low" clamps there ($color9 measured 1.29-3.43:1 — SB-R-01).
409
+ // `$textMuted` is the theme's secondary ink (LC-152): the most muted ramp
410
+ // step that clears 7:1 on the page and every card tier in its own scheme. A
411
+ // fixed `$color11` read as the primary ink in light on the stock v5 ramp.
409
412
  const textAccentColorMap: Record<string, string> = {
410
- low: "$color11",
411
- medium: "$color11",
413
+ low: "$textMuted",
414
+ medium: "$textMuted",
412
415
  high: "$color",
413
416
  };
414
417
 
418
+ // LC-152 TEXT-ROLES: the type steps of the three non-body roles, as key
419
+ // offsets on the body ladder from the control's type key. Web (15px body) and
420
+ // native (17pt body, HIG) reach the same classes from different offsets:
421
+ // label = footnote/subheadline (13 web, 15 native), caption = caption1
422
+ // (12 on both), headline = headline (16 web, 17 native).
423
+ const FONT_LADDER = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"] as const;
424
+ const textRoleOffsets = isWeb
425
+ ? { label: -2, caption: -3, headline: 1 }
426
+ : { label: -1, caption: -2, headline: 0 };
427
+
428
+ function fontKeyOffset(key: FontSizeTokens, offset: number): FontSizeTokens {
429
+ const bare = key === "$true" ? "4" : String(key).replace(/^\$/, "");
430
+ const index = FONT_LADDER.indexOf(bare as (typeof FONT_LADDER)[number]);
431
+ if (index < 0) return key;
432
+ const next = Math.min(FONT_LADDER.length - 1, Math.max(0, index + offset));
433
+ return `$${FONT_LADDER[next]}` as FontSizeTokens;
434
+ }
435
+
436
+ /**
437
+ * LC-152 TEXT-ROLES: label, meta, caption and headline for a control size
438
+ * token. Label is 500, meta (a row's secondary line, LC-155) and caption 400,
439
+ * all in the secondary ink whatever the textAccent knob (which dials body and
440
+ * helper copy); headline is 600 in the primary ink. The bold fontWeight knob
441
+ * lifts label and headline to 700.
442
+ */
443
+ export function resolveTextRoles(sizeToken: string, bold: boolean): KnobProps["textRole"] {
444
+ const secondaryInk = "$textMuted";
445
+ const base = labelFontSizeFor(sizeToken);
446
+ const role = (offset: number, fontWeight: string, color: string): TextRoleFragment => {
447
+ const size = fontKeyOffset(base, offset);
448
+ return { fontSize: size, lineHeight: size, fontWeight, color };
449
+ };
450
+ return {
451
+ label: role(textRoleOffsets.label, bold ? "700" : "500", secondaryInk),
452
+ meta: role(textRoleOffsets.label, "400", secondaryInk),
453
+ caption: role(textRoleOffsets.caption, "400", secondaryInk),
454
+ headline: role(textRoleOffsets.headline, bold ? "700" : "600", "$color"),
455
+ };
456
+ }
457
+
415
458
  // ── Disabled treatment (LC-40 DISABLED-VISIBLE) ───────────────
416
459
  // A disabled control must be visually distinguishable from its enabled twin
417
460
  // under BOTH `disabledStyle` values (Axiom 6 HONEST STATE; DG-ST-05 names
@@ -778,6 +821,7 @@ export function resolveKnobs(
778
821
  ...(knobs.fontWeight === "bold" ? { fontWeight: "700" } : {}),
779
822
  },
780
823
  pageTitle: resolvePageTitleScale(knobs.pageTitleScale ?? "moderate"),
824
+ textRole: resolveTextRoles(sizeToken, knobs.fontWeight === "bold"),
781
825
  body: {
782
826
  fontFamily: bodyFontValue,
783
827
  fontWeight: fontWeightValue,
@@ -1 +1 @@
1
- {"version":3,"file":"constraintAudit.d.ts","sourceRoot":"","sources":["../../src/audit/constraintAudit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,mBAAmB,CAAC,EAAE,aAAa,CAAC;IACpC,oBAAoB,CAAC,EAAE,aAAa,CAAC;IACrC,uBAAuB,CAAC,EAAE,aAAa,CAAC;IACxC,sBAAsB,CAAC,EAAE,aAAa,CAAC;IACvC,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,uCAAuC;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AA+DD;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG3C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE9C,CAAC;AAmJF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CA6vBrE"}
1
+ {"version":3,"file":"constraintAudit.d.ts","sourceRoot":"","sources":["../../src/audit/constraintAudit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,mBAAmB,CAAC,EAAE,aAAa,CAAC;IACpC,oBAAoB,CAAC,EAAE,aAAa,CAAC;IACrC,uBAAuB,CAAC,EAAE,aAAa,CAAC;IACxC,sBAAsB,CAAC,EAAE,aAAa,CAAC;IACvC,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,uCAAuC;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AA+DD;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG3C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE9C,CAAC;AAmJF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CAkwBrE"}
@@ -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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"}
@@ -1,3 +1,17 @@
1
1
  import type { CreateThemesBuilderOptions } from "../createThemes";
2
+ /**
3
+ * LC-152 TEXT-ROLES: the secondary text ink. Labels, captions and meta are
4
+ * 12-13px, so the floor is 7:1 (AAA) on the page and on every card tier,
5
+ * and the pick is the most muted ramp step that clears it. The stock v5 ramp
6
+ * is not symmetric: light $color11 is 14% lightness, two points off the
7
+ * primary ink, so one fixed step cannot read as secondary in both schemes.
8
+ * On the default ramp this lands on $color9 in light and $color10 in dark.
9
+ */
10
+ export declare const secondaryInkContrast = 7;
11
+ /**
12
+ * `ramp` supplies the candidate steps when they differ from the theme whose
13
+ * surfaces the ink sits on: a tint picks from its scheme's neutral ramp.
14
+ */
15
+ export declare function pickSecondaryInk(theme: Record<string, string>, ramp?: Record<string, string>): string;
2
16
  export declare const defaultBuilderOptions: CreateThemesBuilderOptions;
3
17
  //# sourceMappingURL=builderOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builderOptions.d.ts","sourceRoot":"","sources":["../../../src/theme/defaults/builderOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAiB,MAAM,iBAAiB,CAAC;AA4IjF,eAAO,MAAM,qBAAqB,EAAE,0BA+CnC,CAAC"}
1
+ {"version":3,"file":"builderOptions.d.ts","sourceRoot":"","sources":["../../../src/theme/defaults/builderOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAiB,MAAM,iBAAiB,CAAC;AAgFjF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAS,GACnC,MAAM,CAgBR;AA8DD,eAAO,MAAM,qBAAqB,EAAE,0BA+CnC,CAAC"}
@@ -129,6 +129,12 @@ export interface KnobRecipe<T> {
129
129
  export interface CornerSmoothingCarrier {
130
130
  className?: string;
131
131
  }
132
+ export interface TextRoleFragment {
133
+ fontSize: FontSizeTokens;
134
+ lineHeight: FontSizeTokens;
135
+ fontWeight: string;
136
+ color: string;
137
+ }
132
138
  export interface KnobProps {
133
139
  borderRadius: {
134
140
  borderRadius: string;
@@ -367,6 +373,19 @@ export interface KnobProps {
367
373
  * `pageTitleScale` override) re-opens the display scale for marketing.
368
374
  */
369
375
  pageTitle: PageTitleFragment;
376
+ /**
377
+ * LC-152 TEXT-ROLES, at the control size token. `label`: field, fact and
378
+ * column labels (13/500 web, 15/500 native, secondary ink). `caption`:
379
+ * timestamps and counts (12/400, secondary ink). `headline`: row and card
380
+ * titles (16/600 web, 17/600 native, primary ink). Spread whole.
381
+ */
382
+ textRole: {
383
+ label: TextRoleFragment;
384
+ /** LC-155: a row's secondary line, label size at 400 in the secondary ink. */
385
+ meta: TextRoleFragment;
386
+ caption: TextRoleFragment;
387
+ headline: TextRoleFragment;
388
+ };
370
389
  /** color is set only for solid semantic-intent Buttons (error/warning/success). */
371
390
  body: {
372
391
  fontFamily: string;
@@ -1 +1 @@
1
- {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../src/theme/recipes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../src/theme/recipes.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { FontSizeTokens } from "tamagui";
2
2
  import type { Elevation, Knobs, PageTitleScale } from "./knobs";
3
3
  import { type SizeKey } from "./scale/scaleInputs";
4
- import type { KnobPropsOverride, PageTitleFragment, ResolvedKnobs } from "./recipes";
4
+ import type { KnobProps, KnobPropsOverride, PageTitleFragment, ResolvedKnobs } from "./recipes";
5
5
  export declare const borderRadiusMap: {
6
6
  readonly none: "$0";
7
7
  readonly small: "$2";
@@ -102,6 +102,14 @@ export declare function sizedElevation(px: number): {
102
102
  radius: number;
103
103
  android: number;
104
104
  };
105
+ /**
106
+ * LC-152 TEXT-ROLES: label, meta, caption and headline for a control size
107
+ * token. Label is 500, meta (a row's secondary line, LC-155) and caption 400,
108
+ * all in the secondary ink whatever the textAccent knob (which dials body and
109
+ * helper copy); headline is 600 in the primary ink. The bold fontWeight knob
110
+ * lifts label and headline to 700.
111
+ */
112
+ export declare function resolveTextRoles(sizeToken: string, bold: boolean): KnobProps["textRole"];
105
113
  /**
106
114
  * A content card on a painted parent sits one ramp step off it, so the box
107
115
  * reads without a shadow (nested surfaces never re-elevate).
@@ -1 +1 @@
1
- {"version":3,"file":"resolveKnobs.d.ts","sourceRoot":"","sources":["../../src/theme/resolveKnobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolveKnobs.d.ts","sourceRoot":"","sources":["../../src/theme/resolveKnobs.ts"],"names":[],"mappings":"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"}