@motion-proto/live-tokens 0.91.2 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.claude/skills/live-tokens-create-page/SKILL.md +10 -3
  2. package/.claude/skills/live-tokens-set-type/SKILL.md +3 -3
  3. package/CHANGELOG.md +140 -0
  4. package/bin/lib/tokenVocabulary.mjs +2 -2
  5. package/bin/rules/testRuns.mjs +1 -1
  6. package/bin/rules/tokens.mjs +3 -3
  7. package/dist-plugin/chunk-JOSSYGR2.js +1634 -0
  8. package/dist-plugin/index.cjs +932 -15
  9. package/dist-plugin/index.js +1 -1
  10. package/dist-plugin/setType/index.cjs +23 -2
  11. package/dist-plugin/setType/index.js +23 -2
  12. package/dist-plugin/tokensCssMigrations/index.cjs +936 -15
  13. package/dist-plugin/tokensCssMigrations/index.d.cts +23 -3
  14. package/dist-plugin/tokensCssMigrations/index.d.ts +23 -3
  15. package/dist-plugin/tokensCssMigrations/index.js +5 -1
  16. package/package.json +1 -1
  17. package/src/app/site.css +243 -9
  18. package/src/demo/TestingLoops.svelte +9 -9
  19. package/src/editor/core/fonts/weightCoverage.ts +31 -2
  20. package/src/editor/core/palettes/tokenRegistry.ts +36 -37
  21. package/src/editor/core/themes/parsers/mediaBlocks.ts +46 -0
  22. package/src/editor/core/typeScale/typeScale.ts +341 -0
  23. package/src/editor/skill-atlas/SourcePane.svelte +3 -3
  24. package/src/editor/skill-atlas/skillSources.generated.ts +2 -2
  25. package/src/editor/skill-atlas/trees/create-page.ts +14 -14
  26. package/src/editor/skill-atlas/trees/set-type.ts +2 -2
  27. package/src/editor/ui/UIFontFamilySelector.svelte +5 -1
  28. package/src/editor/ui/UIFontWeightSelector.svelte +4 -0
  29. package/src/editor/ui/UILetterSpacingSelector.svelte +4 -0
  30. package/src/editor/ui/UILineHeightSelector.svelte +4 -0
  31. package/src/editor/ui/UITextTransformSelector.svelte +4 -0
  32. package/src/editor/ui/UIVariantSelector.svelte +6 -8
  33. package/src/editor/ui/VariablesTab.svelte +4 -4
  34. package/src/editor/ui/sections/textStyles.ts +44 -92
  35. package/src/editor/ui/text-styles/ControlBody.svelte +100 -0
  36. package/src/editor/ui/text-styles/ResetIcon.svelte +60 -0
  37. package/src/editor/ui/text-styles/StepRow.svelte +330 -0
  38. package/src/editor/ui/text-styles/StyleControl.svelte +128 -0
  39. package/src/editor/ui/text-styles/TextStylesSection.svelte +551 -0
  40. package/src/editor/ui/text-styles/textStyleEdits.ts +308 -0
  41. package/src/editor/ui/variantScales.ts +16 -0
  42. package/src/system/styles/tokens.css +412 -48
  43. package/src/testing-js/page-compliance.contract.js +233 -80
  44. package/src/testing-js/page-compliance.contract.js.map +1 -1
  45. package/dist-plugin/chunk-GWMEYBZ2.js +0 -715
  46. package/src/editor/ui/TextStylesSection.svelte +0 -171
@@ -13,91 +13,244 @@ import {
13
13
  // src/testing/page-compliance.contract.ts
14
14
  import { test } from "@playwright/test";
15
15
 
16
+ // src/editor/core/typeScale/typeScale.ts
17
+ var USAGES = ["display", "heading", "body", "editorial", "code"];
18
+ var STEPS = ["2xs", "xs", "sm", "md", "lg", "xl", "2xl"];
19
+ var EXPONENT = {
20
+ "2xs": -3,
21
+ xs: -2,
22
+ sm: -1,
23
+ md: 0,
24
+ lg: 1,
25
+ xl: 2,
26
+ "2xl": 3
27
+ };
28
+ var VIEWPORTS = ["desktop", "tablet", "phone"];
29
+ var allNormal = {
30
+ "2xs": "normal",
31
+ xs: "normal",
32
+ sm: "normal",
33
+ md: "normal",
34
+ lg: "normal",
35
+ xl: "normal",
36
+ "2xl": "normal"
37
+ };
38
+ var DEFAULTS = {
39
+ compression: { tablet: 0.75, phone: 0.63 },
40
+ usages: {
41
+ display: {
42
+ face: "--font-display",
43
+ weight: "--font-weight-semibold",
44
+ base: 3,
45
+ ratio: 1.2,
46
+ lineHeight: {
47
+ "2xs": "tighter",
48
+ xs: "tighter",
49
+ sm: "tighter",
50
+ md: "tightest",
51
+ lg: "tightest",
52
+ xl: "tightest",
53
+ "2xl": "tightest"
54
+ },
55
+ letterSpacing: { ...allNormal, lg: "tight", xl: "tight", "2xl": "tight" },
56
+ familyPins: {},
57
+ elements: {}
58
+ },
59
+ heading: {
60
+ face: "--font-display",
61
+ weight: "--font-weight-semibold",
62
+ base: 1.5,
63
+ ratio: 1.25,
64
+ lineHeight: {
65
+ "2xs": "tight",
66
+ xs: "tight",
67
+ sm: "tighter",
68
+ md: "tighter",
69
+ lg: "tightest",
70
+ xl: "tightest",
71
+ "2xl": "tightest"
72
+ },
73
+ letterSpacing: allNormal,
74
+ familyPins: { "2xs": "--font-sans", xs: "--font-sans", sm: "--font-sans" },
75
+ elements: { "2xs": ["h6"], xs: ["h5"], sm: ["h4"], md: ["h3"], lg: ["h2"], xl: ["h1"] }
76
+ },
77
+ body: {
78
+ face: "--font-sans",
79
+ weight: "--font-weight-normal",
80
+ base: 1,
81
+ ratio: 1.125,
82
+ lineHeight: {
83
+ "2xs": "tight",
84
+ xs: "tight",
85
+ sm: "tight",
86
+ md: "normal",
87
+ lg: "tight",
88
+ xl: "tighter",
89
+ "2xl": "tighter"
90
+ },
91
+ letterSpacing: allNormal,
92
+ familyPins: {},
93
+ elements: { sm: ["small"], md: ["p", "li"] }
94
+ },
95
+ editorial: {
96
+ face: "--font-editorial",
97
+ weight: "--font-weight-normal",
98
+ base: 1,
99
+ ratio: 1.125,
100
+ lineHeight: {
101
+ "2xs": "tighter",
102
+ xs: "tighter",
103
+ sm: "tight",
104
+ md: "normal",
105
+ lg: "tight",
106
+ xl: "tighter",
107
+ "2xl": "tightest"
108
+ },
109
+ letterSpacing: allNormal,
110
+ familyPins: {},
111
+ elements: {}
112
+ },
113
+ code: {
114
+ face: "--font-mono",
115
+ weight: "--font-weight-normal",
116
+ base: 0.875,
117
+ ratio: 1.125,
118
+ lineHeight: {
119
+ "2xs": "normal",
120
+ xs: "normal",
121
+ sm: "normal",
122
+ md: "normal",
123
+ lg: "normal",
124
+ xl: "normal",
125
+ "2xl": "normal"
126
+ },
127
+ letterSpacing: allNormal,
128
+ familyPins: {},
129
+ elements: { md: ["pre"] }
130
+ }
131
+ },
132
+ eyebrow: {
133
+ usage: "body",
134
+ sizeStep: "sm",
135
+ lineHeight: "normal",
136
+ letterSpacing: "normal",
137
+ textTransform: "none"
138
+ }
139
+ };
140
+ var EYEBROW_PREFIX = "--eyebrow";
141
+ var compressionName = (viewport) => `--type-${viewport}-scale-compression`;
142
+ var usageName = (usage, setting) => `--${usage}-${setting}`;
143
+ var stepPrefix = (usage, step) => `--${usage}-${step}`;
144
+ var axisName = (prefix, axis) => `${prefix}-${axis}`;
145
+ var sizeName = (prefix, viewport) => `${prefix}-${viewport}-font-size`;
146
+ var fontSizeName = (prefix) => `${prefix}-font-size`;
147
+ var STEPS_DOWN = [...STEPS].reverse();
148
+ var STYLE_PREFIXES = [
149
+ ...USAGES.flatMap((usage) => STEPS_DOWN.map((step) => stepPrefix(usage, step))),
150
+ EYEBROW_PREFIX
151
+ ];
152
+ function formatNumber(n) {
153
+ return String(Number(n.toFixed(4)));
154
+ }
155
+ function scaleTerm(usage, step) {
156
+ const base = `var(${usageName(usage, "scale-base")})`;
157
+ const n = EXPONENT[step];
158
+ return n === 0 ? base : `${base} * pow(var(${usageName(usage, "scale-ratio")}), ${n})`;
159
+ }
160
+ function desktopScaleExpression(usage, step) {
161
+ return `calc(${scaleTerm(usage, step)} * 1rem)`;
162
+ }
163
+ function recommendationExpression(prefix, remTerm, viewport) {
164
+ return `min(var(${sizeName(prefix, "desktop")}), calc(pow(${remTerm}, var(${compressionName(viewport)})) * 1rem))`;
165
+ }
166
+ function recommendedScaleExpression(usage, step, viewport) {
167
+ return recommendationExpression(stepPrefix(usage, step), scaleTerm(usage, step), viewport);
168
+ }
169
+ var ref = (name) => `var(${name})`;
170
+ var COMPRESSED = ["tablet", "phone"];
171
+ function typeScaleDeclarations() {
172
+ const out = COMPRESSED.map((vp) => ({
173
+ name: compressionName(vp),
174
+ value: formatNumber(DEFAULTS.compression[vp])
175
+ }));
176
+ for (const usage of USAGES) {
177
+ const d = DEFAULTS.usages[usage];
178
+ out.push(
179
+ { name: usageName(usage, "font-family"), value: ref(d.face) },
180
+ { name: usageName(usage, "font-weight"), value: ref(d.weight) },
181
+ { name: usageName(usage, "scale-base"), value: formatNumber(d.base) },
182
+ { name: usageName(usage, "scale-ratio"), value: formatNumber(d.ratio) }
183
+ );
184
+ for (const step of STEPS_DOWN) {
185
+ const prefix = stepPrefix(usage, step);
186
+ const pin = d.familyPins[step];
187
+ out.push(
188
+ { name: axisName(prefix, "font-family"), value: ref(pin ?? usageName(usage, "font-family")) },
189
+ { name: sizeName(prefix, "desktop"), value: desktopScaleExpression(usage, step) },
190
+ ...COMPRESSED.map((vp) => ({
191
+ name: sizeName(prefix, vp),
192
+ value: recommendedScaleExpression(usage, step, vp)
193
+ })),
194
+ { name: fontSizeName(prefix), value: ref(sizeName(prefix, "desktop")) },
195
+ { name: axisName(prefix, "font-weight"), value: ref(usageName(usage, "font-weight")) },
196
+ { name: axisName(prefix, "line-height"), value: ref(`--line-height-${d.lineHeight[step]}`) },
197
+ { name: axisName(prefix, "letter-spacing"), value: ref(`--letter-spacing-${d.letterSpacing[step]}`) }
198
+ );
199
+ }
200
+ }
201
+ const e = DEFAULTS.eyebrow;
202
+ const follows = stepPrefix(e.usage, e.sizeStep);
203
+ out.push(
204
+ { name: axisName(EYEBROW_PREFIX, "font-family"), value: ref(usageName(e.usage, "font-family")) },
205
+ ...VIEWPORTS.map((vp) => ({ name: sizeName(EYEBROW_PREFIX, vp), value: ref(sizeName(follows, vp)) })),
206
+ { name: fontSizeName(EYEBROW_PREFIX), value: ref(sizeName(EYEBROW_PREFIX, "desktop")) },
207
+ { name: axisName(EYEBROW_PREFIX, "font-weight"), value: ref(usageName(e.usage, "font-weight")) },
208
+ { name: axisName(EYEBROW_PREFIX, "line-height"), value: ref(`--line-height-${e.lineHeight}`) },
209
+ { name: axisName(EYEBROW_PREFIX, "letter-spacing"), value: ref(`--letter-spacing-${e.letterSpacing}`) },
210
+ { name: axisName(EYEBROW_PREFIX, "text-transform"), value: e.textTransform }
211
+ );
212
+ return out;
213
+ }
214
+ var STRUCTURAL_NAMES = new Set(STYLE_PREFIXES.map(fontSizeName));
215
+ var EDITABLE_NAMES = new Set(
216
+ typeScaleDeclarations().map((d) => d.name).filter((name) => !STRUCTURAL_NAMES.has(name))
217
+ );
218
+
16
219
  // src/editor/ui/sections/textStyles.ts
220
+ var USAGE_LABEL = {
221
+ display: "Display",
222
+ heading: "Heading",
223
+ body: "Body",
224
+ editorial: "Editorial",
225
+ code: "Code"
226
+ };
227
+ var USAGE_PREVIEW = {
228
+ display: "Tokens that move with every edit",
229
+ heading: "Choosing a palette for the launch page",
230
+ body: "Body copy for comfortable reading.",
231
+ editorial: "A pull quote sets the tone for the essay.",
232
+ code: "const total = sum(items.map(price));"
233
+ };
17
234
  var TEXT_STYLES = [
18
- {
19
- name: "heading-xl",
20
- label: "Heading XL",
21
- prefix: "--heading-xl",
22
- defaultElement: "h1",
23
- preview: "Page title"
24
- },
25
- {
26
- name: "heading-lg",
27
- label: "Heading LG",
28
- prefix: "--heading-lg",
29
- defaultElement: "h2",
30
- preview: "Section heading"
31
- },
32
- {
33
- name: "heading-md",
34
- label: "Heading MD",
35
- prefix: "--heading-md",
36
- defaultElement: "h3",
37
- preview: "Subsection heading"
38
- },
39
- {
40
- name: "heading-sm",
41
- label: "Heading SM",
42
- prefix: "--heading-sm",
43
- defaultElement: "h4",
44
- preview: "Minor heading"
45
- },
46
- {
47
- name: "body-md",
48
- label: "Body MD",
49
- prefix: "--body-md",
50
- defaultElement: "p",
51
- preview: "Body copy for comfortable reading."
52
- },
53
- {
54
- name: "body-sm",
55
- label: "Body SM",
56
- prefix: "--body-sm",
57
- defaultElement: "small",
58
- preview: "Captions and secondary text."
59
- },
60
- {
61
- name: "editorial-xl",
62
- label: "Editorial XL",
63
- prefix: "--editorial-xl",
64
- defaultElement: "editorial-xl",
65
- preview: "Pull quotes and opening statements."
66
- },
67
- {
68
- name: "editorial-lg",
69
- label: "Editorial LG",
70
- prefix: "--editorial-lg",
71
- defaultElement: "editorial-lg",
72
- preview: "Standfirsts and section ledes."
73
- },
74
- {
75
- name: "editorial-md",
76
- label: "Editorial MD",
77
- prefix: "--editorial-md",
78
- defaultElement: "editorial-md",
79
- preview: "Long-form reading, set in the editorial face."
80
- },
81
- {
82
- name: "editorial-sm",
83
- label: "Editorial SM",
84
- prefix: "--editorial-sm",
85
- defaultElement: "editorial-sm",
86
- preview: "Captions, credits, and asides."
87
- },
88
- {
89
- name: "code",
90
- label: "Code",
91
- prefix: "--code",
92
- defaultElement: "code",
93
- preview: "const total = sum(items);"
94
- },
235
+ ...USAGES.flatMap(
236
+ (usage) => [...STEPS].reverse().map((step) => {
237
+ const name = `${usage}-${step}`;
238
+ const elements = DEFAULTS.usages[usage].elements[step];
239
+ return {
240
+ name,
241
+ label: `${USAGE_LABEL[usage]} ${step.toUpperCase()}`,
242
+ prefix: stepPrefix(usage, step),
243
+ defaultElement: elements ? elements.join(", ") : `.${name}`,
244
+ preview: USAGE_PREVIEW[usage]
245
+ };
246
+ })
247
+ ),
95
248
  {
96
249
  name: "eyebrow",
97
250
  label: "Eyebrow",
98
- prefix: "--eyebrow",
99
- defaultElement: "eyebrow",
100
- preview: "Overline label",
251
+ prefix: EYEBROW_PREFIX,
252
+ defaultElement: ".eyebrow",
253
+ preview: "Release notes",
101
254
  hasTextTransform: true
102
255
  }
103
256
  ];