@multiplatform.one/theme 7.2.1 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/theme",
3
- "version": "7.2.1",
3
+ "version": "7.3.0",
4
4
  "description": "Tamagui theme system for multiplatform.one",
5
5
  "keywords": [
6
6
  "multiplatform",
@@ -53,8 +53,8 @@
53
53
  "@tamagui/toast": "2.7.6",
54
54
  "@tamagui/web": "2.7.6",
55
55
  "react-cookie": "^8.1.2",
56
- "@multiplatform.one/platform": "7.2.1",
57
- "@multiplatform.one/store": "7.2.1"
56
+ "@multiplatform.one/platform": "7.3.0",
57
+ "@multiplatform.one/store": "7.3.0"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@tamagui/animations-css": "2.7.6",
@@ -69,8 +69,8 @@
69
69
  "tamagui": "2.7.6",
70
70
  "typescript": "~5.9.3",
71
71
  "vitest": "^4.1.5",
72
- "@multiplatform.one/config": "7.2.1",
73
- "@multiplatform.one/test-utils": "7.2.1"
72
+ "@multiplatform.one/config": "7.3.0",
73
+ "@multiplatform.one/test-utils": "7.3.0"
74
74
  },
75
75
  "peerDependencies": {
76
76
  "@tamagui/animations-css": "^2.0.0-rc",
@@ -117,7 +117,7 @@ describe("useResolvedKnobs inside Surface", () => {
117
117
  expect(result.current.knobProps.sizeToken).toBe("$3");
118
118
  expect(result.current.knobProps.density).toBe("compact");
119
119
  expect(result.current.knobProps.gap).toEqual({ gap: "$2" });
120
- expect(result.current.knobProps.control.height).toBe(28);
120
+ expect(result.current.knobProps.control.height).toBe(36);
121
121
  });
122
122
 
123
123
  it("a large size request inside a medium Surface resolves medium", () => {
@@ -124,10 +124,10 @@ describe("createDefaultThemeConfig — builderOptions.getTheme composition (DF-0
124
124
  expect(config.recipeFamilies?.control.boxVariants.$4.height).toBe(40);
125
125
  expect(config.recipeFamilies?.control.recipes.$4).toEqual({
126
126
  height: 40,
127
- paddingHorizontal: Math.round(40 * (12 / 32)),
128
- fontSize: Math.round(40 * (14 / 32)),
129
- iconSize: Math.round(40 * (16 / 32)),
130
- gap: Math.round(40 * (6 / 32)),
127
+ paddingHorizontal: Math.round(40 * (18 / 44)),
128
+ fontSize: Math.round(40 * (14 / 44)),
129
+ iconSize: Math.round(40 * (16 / 44)),
130
+ gap: Math.round(40 * (9 / 44)),
131
131
  });
132
132
  expect(config.recipeInputs?.baseHeight).toBe(40);
133
133
  const themes = (config.tamagui as unknown as { themes: RawThemes }).themes;
@@ -147,6 +147,6 @@ describe("createDefaultThemeConfig — builderOptions.getTheme composition (DF-0
147
147
  expect(normalizeToHex(theme.outlineColor)).toBeTruthy();
148
148
  expect(theme.textMuted).toBe(theme.color11);
149
149
  }
150
- expect(config.recipeFamilies?.control.boxVariants.$4.height).toBe(32);
150
+ expect(config.recipeFamilies?.control.boxVariants.$4.height).toBe(44);
151
151
  });
152
152
  });
@@ -18,9 +18,10 @@ import {
18
18
  } from "./layoutTokens";
19
19
 
20
20
  describe("layoutBreakpoints (DG-LAY-01)", () => {
21
- it("documents FloatingPanel 860 as expanded / overlay", () => {
21
+ it("pivots overlays at medium 640 (Tamagui $sm — MPO-13 C5); expanded 860 stays the pane class", () => {
22
22
  expect(layoutBreakpoints.expanded).toBe(860);
23
- expect(OVERLAY_BREAKPOINT).toBe(860);
23
+ expect(OVERLAY_BREAKPOINT).toBe(640);
24
+ expect(OVERLAY_BREAKPOINT).toBe(layoutBreakpoints.medium);
24
25
  });
25
26
 
26
27
  it("documents DeskShell narrow as medium 640", () => {
@@ -10,8 +10,10 @@
10
10
  * Hybrid of shipped MP1 behavior + Material window-size naming:
11
11
  * - **Names** follow Material (compact → xl).
12
12
  * - **Numbers** prefer already-shipped thresholds:
13
- * - `medium` @ 640 = Tamagui `$sm` / DeskShell narrow (Fluent sm).
14
- * - `expanded` @ 860 = FloatingPanel sheet↔float pivot (~Material 840).
13
+ * - `medium` @ 640 = Tamagui `$sm` / DeskShell narrow (Fluent sm) — and,
14
+ * since MPO-13, the overlay sheet↔float pivot (see OVERLAY_BREAKPOINT).
15
+ * - `expanded` @ 860 = pane-budget class only (~Material 840). No Tamagui
16
+ * counterpart; Tamagui has no pane system, so this stays additive.
15
17
  * - `large` / `xl` = Tamagui `$lg` / `$xl`.
16
18
  *
17
19
  * Fluent (480/640/1024/1366/1920) and Material (600/840/1200/1600) stay in the
@@ -19,9 +21,9 @@
19
21
  *
20
22
  * | Class | Min px | Max panes (default) | Tamagui media | Notes |
21
23
  * |-----------|--------|---------------------|---------------|--------------------------------|
22
- * | compact | 0 | 1 | < `$sm` | phones; drawer nav |
23
- * | medium | 640 | 1 | `$sm` | DeskShell rail; still 1 pane |
24
- * | expanded | 860 | 2 | — (custom) | FloatingPanel float; 2 panes |
24
+ * | compact | 0 | 1 | < `$sm` | phones; drawer nav; sheets |
25
+ * | medium | 640 | 1 | `$sm` | DeskShell rail; overlays float |
26
+ * | expanded | 860 | 2 | — (custom) | 2 panes |
25
27
  * | large | 1024 | 2 | `$lg` | |
26
28
  * | xl | 1280 | 2 | `$xl` | |
27
29
  *
@@ -40,9 +42,13 @@ export type LayoutSizeClass = "compact" | "medium" | "expanded" | "large" | "xl"
40
42
 
41
43
  /** Named min-widths. Prefer these over literals in layout code. */
42
44
  export const layoutBreakpoints = {
43
- /** End of compact / DeskShell narrow drawer threshold (Tamagui `$sm`). */
45
+ /**
46
+ * End of compact / DeskShell narrow drawer threshold (Tamagui `$sm`).
47
+ * Also the overlay sheet↔float pivot and the DataTable card↔grid pivot —
48
+ * one idiom flip per viewport (MPO-13 C5).
49
+ */
44
50
  medium: 640,
45
- /** Two-pane + FloatingPanel float threshold (~M3 expanded 840). */
51
+ /** Two-pane budget threshold (~M3 expanded 840). Not an overlay pivot. */
46
52
  expanded: 860,
47
53
  /** Tamagui `$lg`. */
48
54
  large: 1024,
@@ -53,10 +59,16 @@ export const layoutBreakpoints = {
53
59
  export type LayoutBreakpointName = keyof typeof layoutBreakpoints;
54
60
 
55
61
  /**
56
- * Alias kept for FloatingPanel / overlay consumers — same value as
57
- * `layoutBreakpoints.expanded`.
62
+ * Overlay sheet↔float pivot for FloatingPanel / AdaptivePopup consumers.
63
+ *
64
+ * MPO-13 C5: was `layoutBreakpoints.expanded` (860, a custom threshold with
65
+ * no Tamagui counterpart), which split the system in two — at 700px a
66
+ * DataTable rendered its desktop grid while a Select in one of its cells
67
+ * opened as a bottom sheet. Overlays now pivot where the table does:
68
+ * `layoutBreakpoints.medium` (640, Tamagui v5 `$sm` — the same `media.sm`
69
+ * key DataTableRoot reads), so every surface flips idiom at one width.
58
70
  */
59
- export const OVERLAY_BREAKPOINT = layoutBreakpoints.expanded;
71
+ export const OVERLAY_BREAKPOINT = layoutBreakpoints.medium;
60
72
 
61
73
  /** DeskShell sidebar collapse — same value as `layoutBreakpoints.medium`. */
62
74
  export const NARROW_BREAKPOINT = layoutBreakpoints.medium;
@@ -0,0 +1,149 @@
1
+ /**
2
+ * MPO-13 PROOF — the measured corrections, asserted against the values read
3
+ * off the live tamagui.dev computed styles (reference doc §4, §5.1, §6.1,
4
+ * §6.2; 1440x900 DPR2, light and dark).
5
+ *
6
+ * This file exists so the corrections cannot silently regress: it pins the
7
+ * generator's OUTPUT to the reference numbers, and it pins the RELATIONSHIPS
8
+ * that produced them (gap tracks radius; space ≈ 40% of size; input padding
9
+ * one space step below button) rather than the literals alone. A design that
10
+ * only looks right at one hardcoded set of numbers fails the acceptance test
11
+ * — every value below resolves through `SizeRecipeInputs`, so re-pointing the
12
+ * knob re-derives all of them.
13
+ */
14
+
15
+ import { describe, expect, it } from "vitest";
16
+ import { layoutBreakpoints, OVERLAY_BREAKPOINT } from "./layoutTokens";
17
+ import { DEFAULT_SIZE_RECIPE_INPUTS, generateSizeRecipes, sizeRecipeForToken } from "./sizeRecipes";
18
+
19
+ /** Stock Tamagui token scales, read from the live CSS variables (§4). */
20
+ const tamaguiSize = {
21
+ $1: 20,
22
+ "$1.5": 24,
23
+ $2: 28,
24
+ "$2.5": 32,
25
+ $3: 36,
26
+ "$3.5": 40,
27
+ $4: 44,
28
+ $true: 44,
29
+ $5: 52,
30
+ $6: 64,
31
+ } as const;
32
+
33
+ const tamaguiRadiusTrue = 9;
34
+ const tamaguiSpaceTrue = 18;
35
+
36
+ describe("MPO-13 C1/C2 — $4 means ONE height, and it is 44", () => {
37
+ it("every recipe height equals the raw Tamagui $size token at the same key", () => {
38
+ const { heights } = generateSizeRecipes(DEFAULT_SIZE_RECIPE_INPUTS);
39
+ for (const [token, px] of Object.entries(tamaguiSize)) {
40
+ expect(heights[token], `heights.${token}`).toBe(px);
41
+ }
42
+ });
43
+
44
+ it("baseHeight is $size.true, so recipe and token cannot re-diverge", () => {
45
+ expect(DEFAULT_SIZE_RECIPE_INPUTS.baseHeight).toBe(tamaguiSize.$true);
46
+ expect(sizeRecipeForToken("$4").height).toBe(tamaguiSize.$4);
47
+ expect(sizeRecipeForToken("$true").height).toBe(sizeRecipeForToken("$4").height);
48
+ });
49
+
50
+ it("the $4 control is the measured 44 / 18 / 14 / 16 / 9", () => {
51
+ expect(sizeRecipeForToken("$4")).toEqual({
52
+ height: 44,
53
+ paddingHorizontal: 18,
54
+ fontSize: 14,
55
+ iconSize: 16,
56
+ gap: 9,
57
+ });
58
+ });
59
+ });
60
+
61
+ describe("MPO-13 C3 — radius is $radius.true = 9", () => {
62
+ it("radiusPx is the stored input, at the measured value", () => {
63
+ expect(DEFAULT_SIZE_RECIPE_INPUTS.radiusPx).toBe(tamaguiRadiusTrue);
64
+ });
65
+
66
+ it("gap tracks radius exactly at $4 (the reference's stated rule)", () => {
67
+ expect(sizeRecipeForToken("$4").gap).toBe(DEFAULT_SIZE_RECIPE_INPUTS.radiusPx);
68
+ });
69
+
70
+ it("radius never rides the size axis — it stays on the borderRadius knob", () => {
71
+ for (const token of ["$2", "$3", "$4", "$5", "$6"] as const) {
72
+ expect(sizeRecipeForToken(token)).not.toHaveProperty("radius");
73
+ expect(sizeRecipeForToken(token)).not.toHaveProperty("borderRadius");
74
+ }
75
+ });
76
+ });
77
+
78
+ describe("MPO-13 — the ratios are relationships, not literals", () => {
79
+ it("padding at $4 is $space.true, ~40% of the size step (reference §4)", () => {
80
+ const recipe = sizeRecipeForToken("$4");
81
+ expect(recipe.paddingHorizontal).toBe(tamaguiSpaceTrue);
82
+ const spaceToSize = recipe.paddingHorizontal / recipe.height;
83
+ expect(spaceToSize).toBeGreaterThan(0.38);
84
+ expect(spaceToSize).toBeLessThan(0.42);
85
+ });
86
+
87
+ it("compact is one space step below control at the SAME height (LC-76)", () => {
88
+ const control = sizeRecipeForToken("$4");
89
+ const compact = sizeRecipeForToken("$4", { family: "controlCompact" });
90
+ expect(compact.height).toBe(control.height);
91
+ expect(compact.paddingHorizontal).toBeLessThan(control.paddingHorizontal);
92
+ // $space.3 = 13 vs $space.true = 18 — the measured Input↔Button offset.
93
+ expect(compact.paddingHorizontal).toBe(13);
94
+ });
95
+
96
+ it("re-pointing baseHeight re-derives every channel — no hardcoded 44", () => {
97
+ const scaled = generateSizeRecipes({ baseHeight: 88 });
98
+ const base = sizeRecipeForToken("$4");
99
+ expect(scaled.recipes.$4.height).toBe(base.height * 2);
100
+ expect(scaled.recipes.$4.paddingHorizontal).toBe(base.paddingHorizontal * 2);
101
+ expect(scaled.recipes.$4.fontSize).toBe(base.fontSize * 2);
102
+ expect(scaled.recipes.$4.gap).toBe(base.gap * 2);
103
+ });
104
+ });
105
+
106
+ describe("MPO-13 C4/C5 — one breakpoint system", () => {
107
+ it("overlays pivot on the Tamagui v5 $sm key the table already uses", () => {
108
+ expect(OVERLAY_BREAKPOINT).toBe(640);
109
+ expect(OVERLAY_BREAKPOINT).toBe(layoutBreakpoints.medium);
110
+ });
111
+
112
+ it("no viewport can mix a desktop grid with a sheet overlay", () => {
113
+ // The 700px case from the drift register: DataTable reads `media.sm`
114
+ // (v5 minWidth 640) and FloatingPanel reads OVERLAY_BREAKPOINT. Equal
115
+ // thresholds means one idiom per width, by construction.
116
+ const dataTableGridFrom = 640;
117
+ expect(OVERLAY_BREAKPOINT).toBe(dataTableGridFrom);
118
+ for (const width of [500, 639, 700, 800, 900]) {
119
+ const tableIsGrid = width >= dataTableGridFrom;
120
+ const overlayFloats = width > OVERLAY_BREAKPOINT;
121
+ // The only disagreement allowed is the single boundary pixel row
122
+ // (>= vs >), never a 220px band.
123
+ expect(tableIsGrid === overlayFloats || width === 640).toBe(true);
124
+ }
125
+ });
126
+
127
+ it("expanded 860 survives as the pane-budget class only", () => {
128
+ expect(layoutBreakpoints.expanded).toBe(860);
129
+ expect(OVERLAY_BREAKPOINT).not.toBe(layoutBreakpoints.expanded);
130
+ });
131
+ });
132
+
133
+ describe("MPO-13 — the touch floor stops fighting the desktop ramp", () => {
134
+ it("$4 meets the 44 floor natively; touch lifts it, never shrinks it", () => {
135
+ const desktop = sizeRecipeForToken("$4");
136
+ const touch = sizeRecipeForToken("$4", { touch: true });
137
+ expect(desktop.height).toBe(DEFAULT_SIZE_RECIPE_INPUTS.touchFloor);
138
+ expect(touch.height).toBeGreaterThanOrEqual(desktop.height);
139
+ });
140
+
141
+ it("every touch height clears the floor", () => {
142
+ const { heightsTouch } = generateSizeRecipes(DEFAULT_SIZE_RECIPE_INPUTS);
143
+ for (const [token, px] of Object.entries(heightsTouch)) {
144
+ expect(px, `heightsTouch.${token}`).toBeGreaterThanOrEqual(
145
+ DEFAULT_SIZE_RECIPE_INPUTS.touchFloor,
146
+ );
147
+ }
148
+ });
149
+ });
@@ -9,9 +9,11 @@
9
9
  * Tamagui `createThemes` / theme-builder still emits COLOR palettes only.
10
10
  * Do not stuff recipe keys into `getTheme()` / `themes`.
11
11
  *
12
- * DEFAULT uses `tokenHeights` so published px match today's lossless table
13
- * ($4=32, $3=28, $5=40, $6=48). `{ baseHeight: 40 }` (no tokenHeights /
14
- * sizeFactors) regenerates geometrically from `baseHeight * stepRatio ** step`.
12
+ * DEFAULT uses `tokenHeights` pinned to the stock Tamagui `$size` scale as
13
+ * measured on tamagui.dev ($4=44, $3=36, $5=52, $6=64 — MPO-13 C1/C2: the
14
+ * recipe key and the raw token now agree). `{ baseHeight: 40 }` (no
15
+ * tokenHeights / sizeFactors) regenerates geometrically from
16
+ * `baseHeight * stepRatio ** step`.
15
17
  */
16
18
 
17
19
  export const SIZE_RECIPE_TOKENS = [
@@ -119,56 +121,73 @@ export const SIZE_TOKEN_EXPONENTS: Record<SizeRecipeToken, number> = {
119
121
  $6: 2,
120
122
  };
121
123
 
124
+ // Stock Tamagui `$size` px as measured from the live tamagui.dev CSS vars
125
+ // (MPO-13 fidelity pass): $1:20 $1.5:24 $2:28 $2.5:32 $3:36 $3.5:40
126
+ // $4/$true:44 $5:52 $6:64. The recipe key "$4" and the raw Tamagui token
127
+ // `$size.4` resolve to the SAME height — the C1 split (recipe 32 vs token
128
+ // 44) is gone.
122
129
  const DEFAULT_TOKEN_HEIGHTS: Record<string, number> = {
123
130
  $1: 20,
124
131
  "$1.5": 24,
125
- $2: 24,
126
- "$2.5": 28,
127
- $3: 28,
128
- "$3.5": 30,
129
- $4: 32,
130
- $true: 32,
131
- $5: 40,
132
- $6: 48,
132
+ $2: 28,
133
+ "$2.5": 32,
134
+ $3: 36,
135
+ "$3.5": 40,
136
+ $4: 44,
137
+ $true: 44,
138
+ $5: 52,
139
+ $6: 64,
133
140
  };
134
141
 
135
- /** Lossless relative table: today's 20/24/28/32/40/48 ramp at baseHeight 32. */
142
+ /** Lossless relative table: the stock Tamagui 20/24/28/32/36/40/44/52/64 ramp at baseHeight 44. */
136
143
  export const defaultSizeFactors: Record<SizeRecipeToken, number> = {
137
- $1: 20 / 32,
138
- "$1.5": 24 / 32,
139
- $2: 24 / 32,
140
- "$2.5": 28 / 32,
141
- $3: 28 / 32,
142
- "$3.5": 30 / 32,
144
+ $1: 20 / 44,
145
+ "$1.5": 24 / 44,
146
+ $2: 28 / 44,
147
+ "$2.5": 32 / 44,
148
+ $3: 36 / 44,
149
+ "$3.5": 40 / 44,
143
150
  $4: 1,
144
151
  $true: 1,
145
- $5: 40 / 32,
146
- $6: 48 / 32,
152
+ $5: 52 / 44,
153
+ $6: 64 / 44,
147
154
  };
148
155
 
156
+ // Anchored at the measured $4/$true control: height 44, padX 18
157
+ // ($space.true), font 14, icon 16, gap 9 (gap tracks $radius.true). The
158
+ // ratio model is linear, so steps away from $4 approximate Tamagui's
159
+ // hand-tuned ramp rather than matching it exactly.
149
160
  const DEFAULT_RATIOS: SizeRecipeRatios = {
150
- padX: 12 / 32,
151
- font: 14 / 32,
152
- icon: 16 / 32,
153
- gap: 6 / 32,
161
+ padX: 18 / 44,
162
+ font: 14 / 44,
163
+ icon: 16 / 44,
164
+ gap: 9 / 44,
154
165
  };
155
166
 
167
+ // One space step and one type step below control at the same height:
168
+ // $4 compact = padX 13 ($space.3), font 13 ($3 label), icon 14, gap 7
169
+ // ($space.2).
156
170
  const DEFAULT_COMPACT_RATIOS: SizeRecipeRatios = {
157
- padX: 8 / 32,
158
- font: 13 / 32,
159
- icon: 14 / 32,
160
- gap: 4 / 32,
171
+ padX: 13 / 44,
172
+ font: 13 / 44,
173
+ icon: 14 / 44,
174
+ gap: 7 / 44,
161
175
  };
162
176
 
163
177
  export const DEFAULT_SIZE_RECIPE_INPUTS: SizeRecipeInputs = {
164
- baseHeight: 32,
178
+ // Tamagui `$size.true` = 44 — the iOS touch minimum, measured on every
179
+ // tamagui.dev button and input (MPO-13 C2; was 32).
180
+ baseHeight: 44,
165
181
  stepRatio: 1.25,
166
182
  tokenSteps: { ...SIZE_TOKEN_EXPONENTS },
167
183
  tokenHeights: { ...DEFAULT_TOKEN_HEIGHTS },
168
184
  sizeFactors: { ...defaultSizeFactors },
169
185
  ratios: { ...DEFAULT_RATIOS },
170
186
  compactRatios: { ...DEFAULT_COMPACT_RATIOS },
171
- radiusPx: 6,
187
+ // Tamagui `$radius.true` = 9, matching the borderRadius knob's medium
188
+ // stop ($4 = 9px) — the stored input no longer contradicts the knob
189
+ // (MPO-13 C3; was 6).
190
+ radiusPx: 9,
172
191
  touchFloor: 44,
173
192
  };
174
193
 
@@ -398,9 +398,9 @@ describe("resolveKnobs", () => {
398
398
  it("fills control / controlType / controlIcon from the size recipe", () => {
399
399
  const { knobProps } = resolveKnobs(defaultKnobs);
400
400
  expect(knobProps.control).toEqual({
401
- height: 32,
402
- paddingHorizontal: 12,
403
- gap: 6,
401
+ height: 44,
402
+ paddingHorizontal: 18,
403
+ gap: 9,
404
404
  });
405
405
  expect(knobProps.controlType).toEqual({ fontSize: 14 });
406
406
  expect(knobProps.controlIcon).toEqual({ width: 16, height: 16 });
@@ -412,8 +412,8 @@ describe("resolveKnobs", () => {
412
412
  it("small and large share the same borderRadius fragment", () => {
413
413
  const small = resolveKnobs(knobsWith({ size: "small" }));
414
414
  const large = resolveKnobs(knobsWith({ size: "large" }));
415
- expect(small.knobProps.control.height).toBe(28);
416
- expect(large.knobProps.control.height).toBe(40);
415
+ expect(small.knobProps.control.height).toBe(36);
416
+ expect(large.knobProps.control.height).toBe(52);
417
417
  expect(small.knobProps.borderRadius).toEqual(large.knobProps.borderRadius);
418
418
  });
419
419
  });
@@ -37,23 +37,23 @@ function expectNoRadius(value: object) {
37
37
  }
38
38
 
39
39
  describe("size recipes", () => {
40
- it("medium / $4 matches the 32/12/14/16/6 reference", () => {
40
+ it("medium / $4 matches the measured tamagui.dev 44/18/14/16/9 reference", () => {
41
41
  const recipe = sizeRecipes.$4;
42
42
  expect(recipe).toEqual({
43
- height: 32,
44
- paddingHorizontal: 12,
43
+ height: 44,
44
+ paddingHorizontal: 18,
45
45
  fontSize: 14,
46
46
  iconSize: 16,
47
- gap: 6,
47
+ gap: 9,
48
48
  });
49
- expect(sizeRecipeFromHeight(32)).toEqual(recipe);
49
+ expect(sizeRecipeFromHeight(44)).toEqual(recipe);
50
50
  expect(sizeRecipeForToken("$4")).toEqual(recipe);
51
- expect(SIZE_RECIPE_HEIGHTS.$4).toBe(32);
51
+ expect(SIZE_RECIPE_HEIGHTS.$4).toBe(44);
52
52
  expect(SIZE_RECIPE_RATIOS).toEqual({
53
- padX: 12 / 32,
54
- font: 14 / 32,
55
- icon: 16 / 32,
56
- gap: 6 / 32,
53
+ padX: 18 / 44,
54
+ font: 14 / 44,
55
+ icon: 16 / 44,
56
+ gap: 9 / 44,
57
57
  });
58
58
  });
59
59
 
@@ -65,7 +65,7 @@ describe("size recipes", () => {
65
65
 
66
66
  it("radius is not on the recipe or any variant object", () => {
67
67
  expectNoRadius(sizeRecipes.$4);
68
- expectNoRadius(sizeRecipeFromHeight(32));
68
+ expectNoRadius(sizeRecipeFromHeight(44));
69
69
  expectNoRadius(sizeRecipeForToken("$4"));
70
70
  for (const token of RECIPE_KEYS) {
71
71
  expectNoRadius(sizeRecipes[token]);
@@ -144,13 +144,13 @@ describe("size recipes", () => {
144
144
  it("touch heights floor at 44 and still differentiate size steps", () => {
145
145
  const desktop = sizeRecipeForToken("$4");
146
146
  expect(desktop).toEqual(sizeRecipes.$4);
147
- expect(applyTouchFloor(desktop, false).height).toBe(32);
147
+ expect(applyTouchFloor(desktop, false).height).toBe(44);
148
148
  expect(applyTouchFloor(desktop, true)).toEqual(sizeRecipeFromHeight(48));
149
149
  expect(sizeRecipeForToken("$4", { touch: true })).toEqual(sizeRecipeFromHeight(48));
150
150
  expect(sizeRecipeForToken("$3", { touch: true }).height).toBe(44);
151
151
  expect(sizeRecipeForToken("$5", { touch: true }).height).toBe(56);
152
- expect(sizeRecipeForToken("$6", { touch: true }).height).toBe(64);
153
- expect(sizeRecipeBoxVariants.$4.height).toBe(32);
152
+ expect(sizeRecipeForToken("$6", { touch: true }).height).toBe(68);
153
+ expect(sizeRecipeBoxVariants.$4.height).toBe(44);
154
154
  expectNoRadius(applyTouchFloor(desktop, true));
155
155
  });
156
156
  });
@@ -168,29 +168,29 @@ describe("generateSizeRecipes (LC-70)", () => {
168
168
  setSizeRecipeInputs();
169
169
  });
170
170
 
171
- it("DEFAULT $4 is 32/12/14/16/6 with no radius", () => {
171
+ it("DEFAULT $4 is the measured 44/18/14/16/9 with no radius", () => {
172
172
  const generated = generateSizeRecipes(DEFAULT_SIZE_RECIPE_INPUTS);
173
173
  expect(generated.recipes.$4).toEqual({
174
- height: 32,
175
- paddingHorizontal: 12,
174
+ height: 44,
175
+ paddingHorizontal: 18,
176
176
  fontSize: 14,
177
177
  iconSize: 16,
178
- gap: 6,
178
+ gap: 9,
179
179
  });
180
180
  expectNoRadius(generated.recipes.$4);
181
181
  expectNoRadius(generated.boxVariants.$4);
182
- expect(generated.inputs.radiusPx).toBe(6);
182
+ expect(generated.inputs.radiusPx).toBe(9);
183
183
  expect(generated.heights).toEqual({
184
184
  $1: 20,
185
185
  "$1.5": 24,
186
- $2: 24,
187
- "$2.5": 28,
188
- $3: 28,
189
- "$3.5": 30,
190
- $4: 32,
191
- $true: 32,
192
- $5: 40,
193
- $6: 48,
186
+ $2: 28,
187
+ "$2.5": 32,
188
+ $3: 36,
189
+ "$3.5": 40,
190
+ $4: 44,
191
+ $true: 44,
192
+ $5: 52,
193
+ $6: 64,
194
194
  });
195
195
  expect(generated.heightsTouch).toEqual({
196
196
  $1: 44,
@@ -202,9 +202,11 @@ describe("generateSizeRecipes (LC-70)", () => {
202
202
  $4: 48,
203
203
  $true: 48,
204
204
  $5: 56,
205
- $6: 64,
205
+ $6: 68,
206
206
  });
207
- expect(generateSizeRecipeTables(defaultRecipeInputs).touchHeights).toEqual(generated.heightsTouch);
207
+ expect(generateSizeRecipeTables(defaultRecipeInputs).touchHeights).toEqual(
208
+ generated.heightsTouch,
209
+ );
208
210
  expect(SIZE_RECIPE_HEIGHTS_TOUCH.$4).toBe(48);
209
211
  });
210
212
 
@@ -214,10 +216,10 @@ describe("generateSizeRecipes (LC-70)", () => {
214
216
  expect(generated.heights.$4).toBe(40);
215
217
  expect(generated.recipes.$4).toEqual({
216
218
  height: 40,
217
- paddingHorizontal: Math.round(40 * (12 / 32)),
218
- fontSize: Math.round(40 * (14 / 32)),
219
- iconSize: Math.round(40 * (16 / 32)),
220
- gap: Math.round(40 * (6 / 32)),
219
+ paddingHorizontal: Math.round(40 * (18 / 44)),
220
+ fontSize: Math.round(40 * (14 / 44)),
221
+ iconSize: Math.round(40 * (16 / 44)),
222
+ gap: Math.round(40 * (9 / 44)),
221
223
  });
222
224
  expect(generated.heights.$5).not.toBe(generated.heights.$4);
223
225
  expectNoRadius(generated.recipes.$4);
@@ -225,10 +227,10 @@ describe("generateSizeRecipes (LC-70)", () => {
225
227
 
226
228
  it("controlCompact padX is tighter than control at the same $4 height", () => {
227
229
  const generated = generateSizeRecipes(DEFAULT_SIZE_RECIPE_INPUTS);
228
- expect(generated.families.control.recipes.$4.height).toBe(32);
229
- expect(generated.families.controlCompact.recipes.$4.height).toBe(32);
230
- expect(generated.families.control.recipes.$4.paddingHorizontal).toBe(12);
231
- expect(generated.families.controlCompact.recipes.$4.paddingHorizontal).toBe(8);
230
+ expect(generated.families.control.recipes.$4.height).toBe(44);
231
+ expect(generated.families.controlCompact.recipes.$4.height).toBe(44);
232
+ expect(generated.families.control.recipes.$4.paddingHorizontal).toBe(18);
233
+ expect(generated.families.controlCompact.recipes.$4.paddingHorizontal).toBe(13);
232
234
  expect(generated.families.controlCompact.recipes.$4.paddingHorizontal).toBeLessThan(
233
235
  generated.families.control.recipes.$4.paddingHorizontal,
234
236
  );
@@ -275,9 +277,9 @@ describe("size recipe families", () => {
275
277
  expect(control.heightVariants[token]).toEqual({ height: SIZE_RECIPE_HEIGHTS[token] });
276
278
  }
277
279
  expect(control.boxVariants.$4).toEqual({
278
- height: 32,
279
- paddingHorizontal: 12,
280
- gap: 6,
280
+ height: 44,
281
+ paddingHorizontal: 18,
282
+ gap: 9,
281
283
  });
282
284
  });
283
285
 
@@ -289,8 +291,8 @@ describe("size recipe families", () => {
289
291
  expect(compact.boxVariants.$4.paddingHorizontal).toBeLessThan(
290
292
  control.boxVariants.$4.paddingHorizontal,
291
293
  );
292
- expect(compact.boxVariants.$4.paddingHorizontal).toBe(8);
293
- expect(compact.boxVariants.$4.gap).toBe(4);
294
+ expect(compact.boxVariants.$4.paddingHorizontal).toBe(13);
295
+ expect(compact.boxVariants.$4.gap).toBe(7);
294
296
  expect(sizeRecipeForToken("$4", { family: "controlCompact" })).toEqual(compact.recipes.$4);
295
297
  });
296
298
  });
@@ -13,7 +13,8 @@
13
13
  * reserve it for non-enumerable values only. Do NOT put recipe tables on a
14
14
  * `createStyledContext` primitive (`neverFlatten`).
15
15
  *
16
- * Reference md ($4 / $true): height 32, padX 12, font 14, icon 16, gap 6.
16
+ * Reference md ($4 / $true): height 44, padX 18, font 14, icon 16, gap 9
17
+ * (the measured tamagui.dev $4 control — MPO-13).
17
18
  * `sizeToken` remains the recipe KEY (string "$4") so styled() variants
18
19
  * can switch; it is not a height scalar.
19
20
  *
@@ -167,10 +168,7 @@ export function applyTouchFloor(
167
168
  (key) => tables.heights[key] === recipe.height,
168
169
  );
169
170
  if (token && tables.recipesTouch[token]) return tables.recipesTouch[token];
170
- return recipeFromHeight(
171
- Math.max(recipe.height, tables.inputs.touchFloor),
172
- tables.ratios,
173
- );
171
+ return recipeFromHeight(Math.max(recipe.height, tables.inputs.touchFloor), tables.ratios);
174
172
  }
175
173
 
176
174
  export function sizeRecipeForToken(
@@ -2,6 +2,7 @@ import { ToastProvider } from "@tamagui/toast";
2
2
  import { useContext, useMemo } from "react";
3
3
  import { type CreateTamaguiProps, TamaguiProvider, type TamaguiProviderProps } from "tamagui";
4
4
  import type { PropsWithChildren } from "react";
5
+ import { FontKnobStyles } from "./FontKnobStyles";
5
6
  import { PresetContext, type PresetContextValue } from "./PresetContext";
6
7
  import { defaultPreset } from "./presets";
7
8
  import { useTheme } from "./useTheme";
@@ -57,9 +58,16 @@ function KnobBridge({ children }: PropsWithChildren) {
57
58
  [knobs],
58
59
  );
59
60
 
61
+ const tree = (
62
+ <>
63
+ <FontKnobStyles />
64
+ {children}
65
+ </>
66
+ );
67
+
60
68
  if (existingCtx) {
61
- return <>{children}</>;
69
+ return tree;
62
70
  }
63
71
 
64
- return <PresetContext.Provider value={presetCtxValue}>{children}</PresetContext.Provider>;
72
+ return <PresetContext.Provider value={presetCtxValue}>{tree}</PresetContext.Provider>;
65
73
  }
@@ -0,0 +1,24 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { describe, expect, it } from "vitest";
5
+
6
+ const here = dirname(fileURLToPath(import.meta.url));
7
+
8
+ describe("ThemeProvider knob injectors", () => {
9
+ it("mounts FontKnobStyles inside KnobBridge so shipped apps inherit heading/body fonts", () => {
10
+ const src = readFileSync(join(here, "theme.tsx"), "utf8");
11
+ expect(src).toMatch(/import \{ FontKnobStyles \} from "\.\/FontKnobStyles"/);
12
+ expect(src).toContain("<FontKnobStyles");
13
+ expect(src).toContain("function KnobBridge");
14
+ const bridge = src.slice(src.indexOf("function KnobBridge"));
15
+ expect(bridge).toContain("<FontKnobStyles");
16
+ });
17
+
18
+ it("does not invent a second knob store — cookies still feed PresetContext", () => {
19
+ const src = readFileSync(join(here, "theme.tsx"), "utf8");
20
+ expect(src).toContain("readPresetCookie");
21
+ expect(src).toContain("readOverridesCookie");
22
+ expect(src).toContain("PresetContext.Provider");
23
+ });
24
+ });
@@ -5,6 +5,7 @@ import { type CreateTamaguiProps, TamaguiProvider, type TamaguiProviderProps } f
5
5
  import type { PropsWithChildren } from "react";
6
6
  import { animationDurations } from "./animations/css";
7
7
  import { getCookieWatchList, readOverridesCookie, readPresetCookie } from "./cookies";
8
+ import { FontKnobStyles } from "./FontKnobStyles";
8
9
  import { PresetContext, type PresetContextValue } from "./PresetContext";
9
10
  import { defaultPreset } from "./presets";
10
11
  import { getPreset } from "./shared";
@@ -155,6 +156,10 @@ export function ThemeProvider<T extends CreateTamaguiProps>({
155
156
  *
156
157
  * If an ancestor PresetContext already exists (e.g. from a Storybook decorator),
157
158
  * the bridge is a pass-through to avoid overriding it.
159
+ *
160
+ * FontKnobStyles mounts here (not only in Storybook CreatePreview) so
161
+ * headingFont/bodyFont restyle every shipped app that uses ThemeProvider.
162
+ * Hairline and corner-smoothing already self-mount on module load.
158
163
  */
159
164
  function KnobBridge({ children }: PropsWithChildren) {
160
165
  const existingCtx = useContext(PresetContext);
@@ -182,9 +187,18 @@ function KnobBridge({ children }: PropsWithChildren) {
182
187
  document.documentElement.style.setProperty("--mp-transition", `${durationMs}ms`);
183
188
  }, [animationValue]);
184
189
 
190
+ // Inside the provider (or the Storybook ancestor context) so the
191
+ // heading/body CSS vars follow the same cookie path as useResolvedKnobs.
192
+ const tree = (
193
+ <>
194
+ <FontKnobStyles />
195
+ {children}
196
+ </>
197
+ );
198
+
185
199
  if (existingCtx) {
186
- return <>{children}</>;
200
+ return tree;
187
201
  }
188
202
 
189
- return <PresetContext.Provider value={presetCtxValue}>{children}</PresetContext.Provider>;
203
+ return <PresetContext.Provider value={presetCtxValue}>{tree}</PresetContext.Provider>;
190
204
  }
@@ -10,8 +10,10 @@
10
10
  * Hybrid of shipped MP1 behavior + Material window-size naming:
11
11
  * - **Names** follow Material (compact → xl).
12
12
  * - **Numbers** prefer already-shipped thresholds:
13
- * - `medium` @ 640 = Tamagui `$sm` / DeskShell narrow (Fluent sm).
14
- * - `expanded` @ 860 = FloatingPanel sheet↔float pivot (~Material 840).
13
+ * - `medium` @ 640 = Tamagui `$sm` / DeskShell narrow (Fluent sm) — and,
14
+ * since MPO-13, the overlay sheet↔float pivot (see OVERLAY_BREAKPOINT).
15
+ * - `expanded` @ 860 = pane-budget class only (~Material 840). No Tamagui
16
+ * counterpart; Tamagui has no pane system, so this stays additive.
15
17
  * - `large` / `xl` = Tamagui `$lg` / `$xl`.
16
18
  *
17
19
  * Fluent (480/640/1024/1366/1920) and Material (600/840/1200/1600) stay in the
@@ -19,9 +21,9 @@
19
21
  *
20
22
  * | Class | Min px | Max panes (default) | Tamagui media | Notes |
21
23
  * |-----------|--------|---------------------|---------------|--------------------------------|
22
- * | compact | 0 | 1 | < `$sm` | phones; drawer nav |
23
- * | medium | 640 | 1 | `$sm` | DeskShell rail; still 1 pane |
24
- * | expanded | 860 | 2 | — (custom) | FloatingPanel float; 2 panes |
24
+ * | compact | 0 | 1 | < `$sm` | phones; drawer nav; sheets |
25
+ * | medium | 640 | 1 | `$sm` | DeskShell rail; overlays float |
26
+ * | expanded | 860 | 2 | — (custom) | 2 panes |
25
27
  * | large | 1024 | 2 | `$lg` | |
26
28
  * | xl | 1280 | 2 | `$xl` | |
27
29
  *
@@ -31,9 +33,13 @@
31
33
  export type LayoutSizeClass = "compact" | "medium" | "expanded" | "large" | "xl";
32
34
  /** Named min-widths. Prefer these over literals in layout code. */
33
35
  export declare const layoutBreakpoints: {
34
- /** End of compact / DeskShell narrow drawer threshold (Tamagui `$sm`). */
36
+ /**
37
+ * End of compact / DeskShell narrow drawer threshold (Tamagui `$sm`).
38
+ * Also the overlay sheet↔float pivot and the DataTable card↔grid pivot —
39
+ * one idiom flip per viewport (MPO-13 C5).
40
+ */
35
41
  readonly medium: 640;
36
- /** Two-pane + FloatingPanel float threshold (~M3 expanded 840). */
42
+ /** Two-pane budget threshold (~M3 expanded 840). Not an overlay pivot. */
37
43
  readonly expanded: 860;
38
44
  /** Tamagui `$lg`. */
39
45
  readonly large: 1024;
@@ -42,10 +48,16 @@ export declare const layoutBreakpoints: {
42
48
  };
43
49
  export type LayoutBreakpointName = keyof typeof layoutBreakpoints;
44
50
  /**
45
- * Alias kept for FloatingPanel / overlay consumers — same value as
46
- * `layoutBreakpoints.expanded`.
51
+ * Overlay sheet↔float pivot for FloatingPanel / AdaptivePopup consumers.
52
+ *
53
+ * MPO-13 C5: was `layoutBreakpoints.expanded` (860, a custom threshold with
54
+ * no Tamagui counterpart), which split the system in two — at 700px a
55
+ * DataTable rendered its desktop grid while a Select in one of its cells
56
+ * opened as a bottom sheet. Overlays now pivot where the table does:
57
+ * `layoutBreakpoints.medium` (640, Tamagui v5 `$sm` — the same `media.sm`
58
+ * key DataTableRoot reads), so every surface flips idiom at one width.
47
59
  */
48
- export declare const OVERLAY_BREAKPOINT: 860;
60
+ export declare const OVERLAY_BREAKPOINT: 640;
49
61
  /** DeskShell sidebar collapse — same value as `layoutBreakpoints.medium`. */
50
62
  export declare const NARROW_BREAKPOINT: 640;
51
63
  export declare const LAYOUT_SIZE_CLASS_ORDER: readonly LayoutSizeClass[];
@@ -1 +1 @@
1
- {"version":3,"file":"layoutTokens.d.ts","sourceRoot":"","sources":["../../src/theme/layoutTokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AASH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC;AAEjF,mEAAmE;AACnE,eAAO,MAAM,iBAAiB;IAC5B,0EAA0E;;IAE1E,mEAAmE;;IAEnE,qBAAqB;;IAErB,qBAAqB;;CAEb,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,KAA6B,CAAC;AAE7D,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,KAA2B,CAAC;AAE1D,eAAO,MAAM,uBAAuB,EAAE,SAAS,eAAe,EAMpD,CAAC;AAEX,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAMjE;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,SAAS,EAAE,eAAe,GAAG,CAAC,GAAG,CAAC,CAEjE;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,GACvB,OAAO,CAET;AAQD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAiCpD;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAItD;AAID,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,MAAM,GAAG,MAAM,GAAG,IAAuB,GACjD,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAI3C;AAID,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAyB,GAAG,gBAAgB,CAElF;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAyB,GAC7B,aAAa,CAGf;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAIpC;;;GAGG;AACH,wBAAgB,eAAe,IAAI;IACjC,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC,CAMA"}
1
+ {"version":3,"file":"layoutTokens.d.ts","sourceRoot":"","sources":["../../src/theme/layoutTokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AASH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC;AAEjF,mEAAmE;AACnE,eAAO,MAAM,iBAAiB;IAC5B;;;;OAIG;;IAEH,0EAA0E;;IAE1E,qBAAqB;;IAErB,qBAAqB;;CAEb,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAElE;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,KAA2B,CAAC;AAE3D,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,KAA2B,CAAC;AAE1D,eAAO,MAAM,uBAAuB,EAAE,SAAS,eAAe,EAMpD,CAAC;AAEX,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAMjE;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,SAAS,EAAE,eAAe,GAAG,CAAC,GAAG,CAAC,CAEjE;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,GACvB,OAAO,CAET;AAQD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAiCpD;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAItD;AAID,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,MAAM,GAAG,MAAM,GAAG,IAAuB,GACjD,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAI3C;AAID,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAyB,GAAG,gBAAgB,CAElF;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAyB,GAC7B,aAAa,CAGf;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAIpC;;;GAGG;AACH,wBAAgB,eAAe,IAAI;IACjC,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC,CAMA"}
@@ -9,9 +9,11 @@
9
9
  * Tamagui `createThemes` / theme-builder still emits COLOR palettes only.
10
10
  * Do not stuff recipe keys into `getTheme()` / `themes`.
11
11
  *
12
- * DEFAULT uses `tokenHeights` so published px match today's lossless table
13
- * ($4=32, $3=28, $5=40, $6=48). `{ baseHeight: 40 }` (no tokenHeights /
14
- * sizeFactors) regenerates geometrically from `baseHeight * stepRatio ** step`.
12
+ * DEFAULT uses `tokenHeights` pinned to the stock Tamagui `$size` scale as
13
+ * measured on tamagui.dev ($4=44, $3=36, $5=52, $6=64 — MPO-13 C1/C2: the
14
+ * recipe key and the raw token now agree). `{ baseHeight: 40 }` (no
15
+ * tokenHeights / sizeFactors) regenerates geometrically from
16
+ * `baseHeight * stepRatio ** step`.
15
17
  */
16
18
  export declare const SIZE_RECIPE_TOKENS: readonly ["$1", "$1.5", "$2", "$2.5", "$3", "$3.5", "$4", "$true", "$5", "$6"];
17
19
  export type SizeRecipeToken = (typeof SIZE_RECIPE_TOKENS)[number];
@@ -91,7 +93,7 @@ export type GeneratedSizeRecipes = {
91
93
  families: RecipeFamilies;
92
94
  };
93
95
  export declare const SIZE_TOKEN_EXPONENTS: Record<SizeRecipeToken, number>;
94
- /** Lossless relative table: today's 20/24/28/32/40/48 ramp at baseHeight 32. */
96
+ /** Lossless relative table: the stock Tamagui 20/24/28/32/36/40/44/52/64 ramp at baseHeight 44. */
95
97
  export declare const defaultSizeFactors: Record<SizeRecipeToken, number>;
96
98
  export declare const DEFAULT_SIZE_RECIPE_INPUTS: SizeRecipeInputs;
97
99
  export declare const defaultRecipeInputs: SizeRecipeInputs;
@@ -1 +1 @@
1
- {"version":3,"file":"recipeInputs.d.ts","sourceRoot":"","sources":["../../src/theme/recipeInputs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recipeInputs.d.ts","sourceRoot":"","sources":["../../src/theme/recipeInputs.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,8 @@
13
13
  * reserve it for non-enumerable values only. Do NOT put recipe tables on a
14
14
  * `createStyledContext` primitive (`neverFlatten`).
15
15
  *
16
- * Reference md ($4 / $true): height 32, padX 12, font 14, icon 16, gap 6.
16
+ * Reference md ($4 / $true): height 44, padX 18, font 14, icon 16, gap 9
17
+ * (the measured tamagui.dev $4 control — MPO-13).
17
18
  * `sizeToken` remains the recipe KEY (string "$4") so styled() variants
18
19
  * can switch; it is not a height scalar.
19
20
  *
@@ -1 +1 @@
1
- {"version":3,"file":"sizeRecipes.d.ts","sourceRoot":"","sources":["../../src/theme/sizeRecipes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,gBAAgB,CAAC;AAyBxB;;;GAGG;AACH,eAAO,MAAM,cAAc,yCAAmB,CAAC;AAE/C,oFAAoF;AACpF,eAAO,MAAM,WAAW,4BAAiC,CAAC;AAC1D,eAAO,MAAM,qBAAqB,+DAAqC,CAAC;AACxE,eAAO,MAAM,sBAAsB,gEAAsC,CAAC;AAC1E,eAAO,MAAM,sBAAsB,gEAAsC,CAAC;AAC1E,eAAO,MAAM,mBAAmB,wBAAiC,CAAC;AAClE,eAAO,MAAM,yBAAyB,wBAAsC,CAAC;AAC7E,eAAO,MAAM,kBAAkB,2CAAgC,CAAC;AAChE,eAAO,MAAM,0BAA0B,2CAAuC,CAAC;AAE/E,eAAO,MAAM,wBAAwB,wCAAyC,CAAC;AAmB/E,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,oBAAoB,CAE7F;AAED,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,gBAA4B,GAAG,gBAAgB,CAExF;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,YAAY,CAAC,QAAQ,CAAyB,GACrD,UAAU,CAEZ;AAOD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,GAC3C,UAAU,CAWZ;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAAA;CAAE,GAC1E,UAAU,CAKZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAE/C"}
1
+ {"version":3,"file":"sizeRecipes.d.ts","sourceRoot":"","sources":["../../src/theme/sizeRecipes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,gBAAgB,CAAC;AAyBxB;;;GAGG;AACH,eAAO,MAAM,cAAc,yCAAmB,CAAC;AAE/C,oFAAoF;AACpF,eAAO,MAAM,WAAW,4BAAiC,CAAC;AAC1D,eAAO,MAAM,qBAAqB,+DAAqC,CAAC;AACxE,eAAO,MAAM,sBAAsB,gEAAsC,CAAC;AAC1E,eAAO,MAAM,sBAAsB,gEAAsC,CAAC;AAC1E,eAAO,MAAM,mBAAmB,wBAAiC,CAAC;AAClE,eAAO,MAAM,yBAAyB,wBAAsC,CAAC;AAC7E,eAAO,MAAM,kBAAkB,2CAAgC,CAAC;AAChE,eAAO,MAAM,0BAA0B,2CAAuC,CAAC;AAE/E,eAAO,MAAM,wBAAwB,wCAAyC,CAAC;AAmB/E,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,oBAAoB,CAE7F;AAED,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,gBAA4B,GAAG,gBAAgB,CAExF;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,YAAY,CAAC,QAAQ,CAAyB,GACrD,UAAU,CAEZ;AAOD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,GAC3C,UAAU,CAQZ;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAAA;CAAE,GAC1E,UAAU,CAKZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAE/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/theme/theme.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,kBAAkB,EAAmB,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAO/C;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAkB5D;AAMD,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,CACjD,SAAQ,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,cAAc,CAAC,CAAC;IAChF,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,UAAU,CAAC,cAAc,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC;AAMD,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,EAAE,EAC1D,QAAQ,EACR,MAAM,EACN,WAAqB,EACrB,GAAG,YAAY,EAChB,EAAE,kBAAkB,CAAC,CAAC,CAAC,2CAiFvB"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/theme/theme.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,kBAAkB,EAAmB,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAQ/C;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAkB5D;AAMD,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,CACjD,SAAQ,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,cAAc,CAAC,CAAC;IAChF,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,UAAU,CAAC,cAAc,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC;AAMD,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,EAAE,EAC1D,QAAQ,EACR,MAAM,EACN,WAAqB,EACrB,GAAG,YAAY,EAChB,EAAE,kBAAkB,CAAC,CAAC,CAAC,2CAiFvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"theme.native.d.ts","sourceRoot":"","sources":["../../src/theme/theme.native.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAmB,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAS/C,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,CACjD,SAAQ,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,cAAc,CAAC,CAAC;IAChF,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,UAAU,CAAC,cAAc,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC;AAMD,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,EAAE,EAC1D,QAAQ,EACR,MAAM,EACN,WAAqB,EACrB,GAAG,YAAY,EAChB,EAAE,kBAAkB,CAAC,CAAC,CAAC,2CAevB"}
1
+ {"version":3,"file":"theme.native.d.ts","sourceRoot":"","sources":["../../src/theme/theme.native.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAmB,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAU/C,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,CACjD,SAAQ,iBAAiB,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,cAAc,CAAC,CAAC;IAChF,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,UAAU,CAAC,cAAc,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC;AAMD,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,EAAE,EAC1D,QAAQ,EACR,MAAM,EACN,WAAqB,EACrB,GAAG,YAAY,EAChB,EAAE,kBAAkB,CAAC,CAAC,CAAC,2CAevB"}