@calibrate-ds/generator-react 0.1.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 (85) hide show
  1. package/dist/components/generate-component-css.d.ts +6 -0
  2. package/dist/components/generate-component-css.d.ts.map +1 -0
  3. package/dist/components/generate-component-css.js +97 -0
  4. package/dist/components/generate-component-css.js.map +1 -0
  5. package/dist/components/generate-component-file.d.ts +8 -0
  6. package/dist/components/generate-component-file.d.ts.map +1 -0
  7. package/dist/components/generate-component-file.js +216 -0
  8. package/dist/components/generate-component-file.js.map +1 -0
  9. package/dist/components/generate-composite-file.d.ts +3 -0
  10. package/dist/components/generate-composite-file.d.ts.map +1 -0
  11. package/dist/components/generate-composite-file.js +78 -0
  12. package/dist/components/generate-composite-file.js.map +1 -0
  13. package/dist/components/generate-composite-types.d.ts +7 -0
  14. package/dist/components/generate-composite-types.d.ts.map +1 -0
  15. package/dist/components/generate-composite-types.js +44 -0
  16. package/dist/components/generate-composite-types.js.map +1 -0
  17. package/dist/components/generate-types-file.d.ts +8 -0
  18. package/dist/components/generate-types-file.d.ts.map +1 -0
  19. package/dist/components/generate-types-file.js +65 -0
  20. package/dist/components/generate-types-file.js.map +1 -0
  21. package/dist/components/helpers.d.ts +33 -0
  22. package/dist/components/helpers.d.ts.map +1 -0
  23. package/dist/components/helpers.js +124 -0
  24. package/dist/components/helpers.js.map +1 -0
  25. package/dist/components/index.d.ts +9 -0
  26. package/dist/components/index.d.ts.map +1 -0
  27. package/dist/components/index.js +10 -0
  28. package/dist/components/index.js.map +1 -0
  29. package/dist/components/layout-jsx.d.ts +14 -0
  30. package/dist/components/layout-jsx.d.ts.map +1 -0
  31. package/dist/components/layout-jsx.js +265 -0
  32. package/dist/components/layout-jsx.js.map +1 -0
  33. package/dist/components/prune-components.d.ts +10 -0
  34. package/dist/components/prune-components.d.ts.map +1 -0
  35. package/dist/components/prune-components.js +69 -0
  36. package/dist/components/prune-components.js.map +1 -0
  37. package/dist/components/token-helpers.d.ts +32 -0
  38. package/dist/components/token-helpers.d.ts.map +1 -0
  39. package/dist/components/token-helpers.js +188 -0
  40. package/dist/components/token-helpers.js.map +1 -0
  41. package/dist/components/write-components.d.ts +17 -0
  42. package/dist/components/write-components.d.ts.map +1 -0
  43. package/dist/components/write-components.js +218 -0
  44. package/dist/components/write-components.js.map +1 -0
  45. package/dist/index.d.ts +6 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +14 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/scaffold/generate-placeholder-component-content.d.ts +9 -0
  50. package/dist/scaffold/generate-placeholder-component-content.d.ts.map +1 -0
  51. package/dist/scaffold/generate-placeholder-component-content.js +68 -0
  52. package/dist/scaffold/generate-placeholder-component-content.js.map +1 -0
  53. package/dist/scaffold/index.d.ts +3 -0
  54. package/dist/scaffold/index.d.ts.map +1 -0
  55. package/dist/scaffold/index.js +3 -0
  56. package/dist/scaffold/index.js.map +1 -0
  57. package/dist/scaffold/write-scaffold.d.ts +14 -0
  58. package/dist/scaffold/write-scaffold.d.ts.map +1 -0
  59. package/dist/scaffold/write-scaffold.js +93 -0
  60. package/dist/scaffold/write-scaffold.js.map +1 -0
  61. package/dist/test-css-tokens.d.ts +2 -0
  62. package/dist/test-css-tokens.d.ts.map +1 -0
  63. package/dist/test-css-tokens.js +39 -0
  64. package/dist/test-css-tokens.js.map +1 -0
  65. package/dist/tokens/generate-token-css.d.ts +30 -0
  66. package/dist/tokens/generate-token-css.d.ts.map +1 -0
  67. package/dist/tokens/generate-token-css.js +367 -0
  68. package/dist/tokens/generate-token-css.js.map +1 -0
  69. package/dist/tokens/generate-token-file-content.d.ts +6 -0
  70. package/dist/tokens/generate-token-file-content.d.ts.map +1 -0
  71. package/dist/tokens/generate-token-file-content.js +27 -0
  72. package/dist/tokens/generate-token-file-content.js.map +1 -0
  73. package/dist/tokens/generate-typography-css.d.ts +3 -0
  74. package/dist/tokens/generate-typography-css.d.ts.map +1 -0
  75. package/dist/tokens/generate-typography-css.js +106 -0
  76. package/dist/tokens/generate-typography-css.js.map +1 -0
  77. package/dist/tokens/index.d.ts +5 -0
  78. package/dist/tokens/index.d.ts.map +1 -0
  79. package/dist/tokens/index.js +5 -0
  80. package/dist/tokens/index.js.map +1 -0
  81. package/dist/tokens/write-tokens.d.ts +7 -0
  82. package/dist/tokens/write-tokens.d.ts.map +1 -0
  83. package/dist/tokens/write-tokens.js +115 -0
  84. package/dist/tokens/write-tokens.js.map +1 -0
  85. package/package.json +35 -0
@@ -0,0 +1,106 @@
1
+ import { getPTBTokenVariableName } from "@calibrate-ds/core";
2
+ function styleNameToClass(name) {
3
+ return "type-" + name.toLowerCase().replace(/[/\s]+/g, "-").replace(/[^a-z0-9-]/g, "");
4
+ }
5
+ function buildTokenVarLookup(model) {
6
+ const fontSize = new Map();
7
+ const lineHeight = new Map();
8
+ for (const collection of model.tokens) {
9
+ for (const token of collection.tokens) {
10
+ const fszMatch = token.name.match(/^font size\/(.+)$/i);
11
+ const lhMatch = token.name.match(/^line height\/(.+)$/i);
12
+ if (fszMatch)
13
+ fontSize.set(fszMatch[1], getPTBTokenVariableName(collection.name, token.name));
14
+ if (lhMatch)
15
+ lineHeight.set(lhMatch[1], getPTBTokenVariableName(collection.name, token.name));
16
+ }
17
+ }
18
+ return { fontSize, lineHeight };
19
+ }
20
+ function walkRenderTree(node, collector, styleMap) {
21
+ if (!node)
22
+ return;
23
+ const figmaStyleId = node.rawStyles?.figmaStyles?.text;
24
+ const textStyle = node.rawStyles?.textStyle;
25
+ if (figmaStyleId && textStyle) {
26
+ const styleMeta = styleMap[figmaStyleId];
27
+ if (styleMeta?.name) {
28
+ const displayName = styleMeta.name;
29
+ const className = styleNameToClass(displayName);
30
+ if (!collector.has(className)) {
31
+ // Only use line-height when Figma explicitly set it in pixels.
32
+ // AUTO and PERCENT units produce computed/fractional values that should
33
+ // come from the token var instead.
34
+ const lineHeightUnit = textStyle.lineHeightUnit;
35
+ const lineHeight = lineHeightUnit === "PIXELS" && typeof textStyle.lineHeightPx === "number"
36
+ ? Math.round(textStyle.lineHeightPx)
37
+ : undefined;
38
+ collector.set(className, {
39
+ className,
40
+ displayName,
41
+ fontFamily: typeof textStyle.fontFamily === "string" ? textStyle.fontFamily : undefined,
42
+ fontSize: typeof textStyle.fontSize === "number" ? textStyle.fontSize : undefined,
43
+ fontWeight: typeof textStyle.fontWeight === "number" ? textStyle.fontWeight : undefined,
44
+ lineHeight,
45
+ letterSpacing: typeof textStyle.letterSpacing === "number" && textStyle.letterSpacing !== 0
46
+ ? textStyle.letterSpacing
47
+ : undefined,
48
+ });
49
+ }
50
+ }
51
+ }
52
+ for (const child of (node.children ?? [])) {
53
+ walkRenderTree(child, collector, styleMap);
54
+ }
55
+ }
56
+ function cssValue(cssVar, rawPx) {
57
+ if (cssVar && rawPx != null)
58
+ return `var(${cssVar}, ${rawPx}px)`;
59
+ if (cssVar)
60
+ return `var(${cssVar})`;
61
+ if (rawPx != null)
62
+ return `${rawPx}px`;
63
+ return null;
64
+ }
65
+ export function generateTypographyCss(model) {
66
+ const styleMap = model.styles ?? {};
67
+ const collector = new Map();
68
+ const tokenVars = buildTokenVarLookup(model);
69
+ for (const component of model.components) {
70
+ walkRenderTree(component.renderTree, collector, styleMap);
71
+ walkRenderTree(component.baseRenderTree, collector, styleMap);
72
+ walkRenderTree(component.layoutTree, collector, styleMap);
73
+ }
74
+ if (collector.size === 0) {
75
+ return "/* No Figma text styles found in component render trees. */\n";
76
+ }
77
+ const entries = Array.from(collector.values()).sort((a, b) => a.displayName.localeCompare(b.displayName));
78
+ const lines = [
79
+ "/**",
80
+ " * Typography utility classes.",
81
+ " * Generated by Calibrate from Figma text styles.",
82
+ " * Do not edit — regenerate with `ptb tokens`.",
83
+ " */",
84
+ "",
85
+ ];
86
+ for (const entry of entries) {
87
+ const fszValue = cssValue(tokenVars.fontSize.get(entry.displayName), entry.fontSize);
88
+ const lhValue = cssValue(tokenVars.lineHeight.get(entry.displayName), entry.lineHeight);
89
+ lines.push(`/* ${entry.displayName} */`);
90
+ lines.push(`.${entry.className} {`);
91
+ if (entry.fontFamily)
92
+ lines.push(` font-family: "${entry.fontFamily}", sans-serif;`);
93
+ if (fszValue)
94
+ lines.push(` font-size: ${fszValue};`);
95
+ if (entry.fontWeight != null)
96
+ lines.push(` font-weight: ${entry.fontWeight};`);
97
+ if (lhValue)
98
+ lines.push(` line-height: ${lhValue};`);
99
+ if (entry.letterSpacing != null)
100
+ lines.push(` letter-spacing: ${entry.letterSpacing}px;`);
101
+ lines.push(`}`);
102
+ lines.push("");
103
+ }
104
+ return lines.join("\n");
105
+ }
106
+ //# sourceMappingURL=generate-typography-css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-typography-css.js","sourceRoot":"","sources":["../../src/tokens/generate-typography-css.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./generate-token-file-content.js";
2
+ export * from "./generate-token-css.js";
3
+ export * from "./generate-typography-css.js";
4
+ export * from "./write-tokens.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./generate-token-file-content.js";
2
+ export * from "./generate-token-css.js";
3
+ export * from "./generate-typography-css.js";
4
+ export * from "./write-tokens.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DesignSystemModel, PTBConfig, WriteTokensReport, WriteTokensOptions } from "@calibrate-ds/shared-types";
2
+ /**
3
+ * Orchestrates writing the Token file payload outputs to the developer's
4
+ * active codebase safely without overwriting exiting constraints.
5
+ */
6
+ export declare function writeTokens(model: DesignSystemModel, config: PTBConfig, options?: WriteTokensOptions): Promise<WriteTokensReport>;
7
+ //# sourceMappingURL=write-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-tokens.d.ts","sourceRoot":"","sources":["../../src/tokens/write-tokens.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAe,MAAM,4BAA4B,CAAC;AAenI;;;GAGG;AACH,wBAAsB,WAAW,CAC7B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAwG5B"}
@@ -0,0 +1,115 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { generateTokenFileContent } from "./generate-token-file-content.js";
4
+ import { generateTokenCssContent, generateUnifiedTokenCssContent } from "./generate-token-css.js";
5
+ import { generateTypographyCss } from "./generate-typography-css.js";
6
+ import { resolveDSPaths } from "@calibrate-ds/core";
7
+ /**
8
+ * Normalizes a Figma collection name perfectly into a safe file path.
9
+ */
10
+ function normalizeFilename(name) {
11
+ return name.toLowerCase()
12
+ .replace(/[^a-z0-9]+/g, "-")
13
+ .replace(/(^-|-$)/g, "");
14
+ }
15
+ /**
16
+ * Orchestrates writing the Token file payload outputs to the developer's
17
+ * active codebase safely without overwriting exiting constraints.
18
+ */
19
+ export async function writeTokens(model, config, options) {
20
+ const report = {
21
+ createdFiles: [],
22
+ skippedFiles: [],
23
+ metrics: { resolved: 0, unresolved: 0, nonScalar: 0, cycles: 0, withUnits: 0, unitless: 0 }
24
+ };
25
+ const { tokensDir } = resolveDSPaths(config);
26
+ const cssTokensDir = path.join(tokensDir, "css");
27
+ // Ensure output directories exist
28
+ await fs.mkdir(tokensDir, { recursive: true });
29
+ await fs.mkdir(cssTokensDir, { recursive: true });
30
+ // 1. Generate typography.css first so tokens.css can @import it
31
+ const typographyCssContent = generateTypographyCss(model);
32
+ const typographyCssPath = path.join(tokensDir, "typography.css");
33
+ await fs.writeFile(typographyCssPath, typographyCssContent, "utf-8");
34
+ report.createdFiles.push("typography.css");
35
+ // 2. Generate unified tokens.css — @import must come before any rules (CSS spec)
36
+ const { content: unifiedCssContent, metrics } = generateUnifiedTokenCssContent(model);
37
+ const unifiedCssPath = path.join(tokensDir, "tokens.css");
38
+ await fs.writeFile(unifiedCssPath, `@import "./typography.css";\n\n` + unifiedCssContent, "utf-8");
39
+ report.createdFiles.push("tokens.css");
40
+ report.metrics = metrics;
41
+ // Build a collection-aware global map so per-collection CSS can:
42
+ // a) resolve cross-collection aliases, and
43
+ // b) emit var() references that preserve the CSS cascade architecture
44
+ const globalTokenMap = new Map();
45
+ for (const col of model.tokens) {
46
+ for (const t of col.tokens) {
47
+ const entry = { token: t, collectionName: col.name };
48
+ // Index by raw ID (e.g. "VariableID:30:592") AND stripped ID ("30:592") so
49
+ // alias lookups succeed regardless of whether the prefix was preserved or stripped.
50
+ globalTokenMap.set(t.id, entry);
51
+ const stripped = t.id.replace(/^VariableID:/i, "");
52
+ if (stripped !== t.id)
53
+ globalTokenMap.set(stripped, entry);
54
+ }
55
+ }
56
+ const indexExports = [];
57
+ const cssIndexImports = [];
58
+ for (const collection of model.tokens) {
59
+ const safeName = normalizeFilename(collection.name);
60
+ const fileName = `${safeName}.ts`;
61
+ const filePath = path.join(tokensDir, fileName);
62
+ const content = generateTokenFileContent(collection);
63
+ // Brownfield safety check natively matching scaffold pipeline style
64
+ try {
65
+ if (options?.forceOverwriteTokens)
66
+ throw new Error("overwrite_trigger"); // Force skip into catch natively
67
+ await fs.stat(filePath);
68
+ report.skippedFiles.push(fileName);
69
+ }
70
+ catch {
71
+ await fs.writeFile(filePath, content, "utf-8");
72
+ report.createdFiles.push(fileName);
73
+ }
74
+ indexExports.push(`export * from "./${safeName}.js";`);
75
+ // Generate matching CSS Variable structure output deterministically
76
+ const cssContent = generateTokenCssContent(collection, globalTokenMap);
77
+ const cssFileName = `${safeName}.css`;
78
+ const cssFilePath = path.join(cssTokensDir, cssFileName);
79
+ try {
80
+ if (options?.forceOverwriteTokens)
81
+ throw new Error("overwrite_trigger");
82
+ await fs.stat(cssFilePath);
83
+ report.skippedFiles.push(`css/${cssFileName}`);
84
+ }
85
+ catch {
86
+ await fs.writeFile(cssFilePath, cssContent, "utf-8");
87
+ report.createdFiles.push(`css/${cssFileName}`);
88
+ }
89
+ cssIndexImports.push(`@import "./${cssFileName}";`);
90
+ }
91
+ // css/index.css always regenerates — it's purely derived from model.tokens + typography
92
+ // and is not user-editable. Always overwrite keeps it in sync.
93
+ const cssIndexPath = path.join(cssTokensDir, "index.css");
94
+ const indexCssContent = `/**\n * Generated Design Tokens Index (CSS)\n * Do not edit — regenerate with \`ptb tokens\`.\n */\n\n${cssIndexImports.join("\n")}\n@import "../typography.css";\n`;
95
+ await fs.writeFile(cssIndexPath, indexCssContent, "utf-8");
96
+ report.createdFiles.push("css/index.css");
97
+ // Attempt pushing index.ts
98
+ const indexPath = path.join(tokensDir, "index.ts");
99
+ try {
100
+ if (options?.forceOverwriteTokens)
101
+ throw new Error("overwrite_trigger");
102
+ await fs.stat(indexPath);
103
+ report.skippedFiles.push("index.ts");
104
+ }
105
+ catch {
106
+ const indexContent = `/**
107
+ * Generated Design Tokens Index
108
+ * Do not edit. This file is auto-generated by Calibrate.
109
+ */\n\n${indexExports.join("\n")}\n`;
110
+ await fs.writeFile(indexPath, indexContent, "utf-8");
111
+ report.createdFiles.push("index.ts");
112
+ }
113
+ return report;
114
+ }
115
+ //# sourceMappingURL=write-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-tokens.js","sourceRoot":"","sources":["../../src/tokens/write-tokens.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@calibrate-ds/generator-react",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "exports": {
15
+ ".": {
16
+ "import": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
18
+ }
19
+ },
20
+ "dependencies": {
21
+ "react": "^19.0.0",
22
+ "@calibrate-ds/shared-types": "0.1.0",
23
+ "@calibrate-ds/core": "0.1.0"
24
+ },
25
+ "devDependencies": {
26
+ "typescript": "^5.7.3",
27
+ "@types/react": "^19.0.0",
28
+ "@types/node": "^22.13.5"
29
+ },
30
+ "scripts": {
31
+ "build": "tsc -p tsconfig.json",
32
+ "lint": "echo \"No lint yet\"",
33
+ "test": "echo \"No tests yet\""
34
+ }
35
+ }