@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,33 @@
1
+ import type { ComponentDefinition } from "@calibrate-ds/shared-types";
2
+ /**
3
+ * Converts a raw generic Figma property name into a safe camelCase TypeScript prop name.
4
+ * Exampe: "Property 1" -> "property1", "State" -> "state"
5
+ */
6
+ export declare function normalizePropName(rawName: string): string;
7
+ /**
8
+ * Strips quotes from variant option values to keep types clean.
9
+ */
10
+ export declare function sanitizeOptionName(option: string): string;
11
+ /**
12
+ * Ensures a consistent `./ComponentName.module.css` relative import path.
13
+ */
14
+ export declare function getCssModuleImportPath(componentName: string): string;
15
+ export type BaseElementInfo = {
16
+ tag: string;
17
+ interfaceName: string;
18
+ };
19
+ /**
20
+ * Infers the most logical HTML base element from the component's name and category.
21
+ * Provides a sensible fallback mapping to React HTMLAttributes.
22
+ */
23
+ export declare function inferBaseElement(componentName: string, categoryPath: string): BaseElementInfo;
24
+ /**
25
+ * Derives the exact canonical subfolder path to resolve imports predictably securely.
26
+ */
27
+ export declare function resolveRelativeImportTarget(sourceComponent: ComponentDefinition, targetComponent: ComponentDefinition, namingStrategy: any): string;
28
+ /**
29
+ * Derives the exact canonical path relative to a component backwards dynamically
30
+ * towards `../../layout/<Primitive>` flawlessly structurally!
31
+ */
32
+ export declare function resolveRelativeLayoutImport(sourceComponent: ComponentDefinition, primitiveName: "Row" | "Stack" | "Grid", namingStrategy: any): string;
33
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/components/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwBzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,eAAe,CAsC7F;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACvC,eAAe,EAAE,mBAAmB,EACpC,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,GAAG,GACpB,MAAM,CAuBR;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACvC,eAAe,EAAE,mBAAmB,EACpC,aAAa,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,EACvC,cAAc,EAAE,GAAG,GACpB,MAAM,CAmBR"}
@@ -0,0 +1,124 @@
1
+ import * as path from "node:path";
2
+ /**
3
+ * Converts a raw generic Figma property name into a safe camelCase TypeScript prop name.
4
+ * Exampe: "Property 1" -> "property1", "State" -> "state"
5
+ */
6
+ export function normalizePropName(rawName) {
7
+ if (!rawName)
8
+ return "unknownProp";
9
+ const cleanStr = rawName
10
+ .replace(/([A-Z])/g, " $1") // Insert space before uppercase letters safely
11
+ .replace(/[^a-zA-Z0-9]+/g, " ") // Replace non-alphanumeric with space cleanly
12
+ .trim();
13
+ const camelCase = cleanStr
14
+ .split(/\s+/)
15
+ .map((word, index) => {
16
+ if (index === 0) {
17
+ return word.toLowerCase();
18
+ }
19
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
20
+ })
21
+ .join("");
22
+ // Ensure it doesn't start with a number
23
+ if (/^[0-9]/.test(camelCase)) {
24
+ return `prop${camelCase}`;
25
+ }
26
+ return camelCase || "unknownProp";
27
+ }
28
+ /**
29
+ * Strips quotes from variant option values to keep types clean.
30
+ */
31
+ export function sanitizeOptionName(option) {
32
+ return option.replace(/["']/g, "");
33
+ }
34
+ /**
35
+ * Ensures a consistent `./ComponentName.module.css` relative import path.
36
+ */
37
+ export function getCssModuleImportPath(componentName) {
38
+ return `./${componentName}.module.css`;
39
+ }
40
+ /**
41
+ * Infers the most logical HTML base element from the component's name and category.
42
+ * Provides a sensible fallback mapping to React HTMLAttributes.
43
+ */
44
+ export function inferBaseElement(componentName, categoryPath) {
45
+ const searchString = `${componentName.toLowerCase()} ${categoryPath.toLowerCase()}`;
46
+ // Form elements
47
+ if (searchString.includes("button") || searchString.includes("btn")) {
48
+ return { tag: "button", interfaceName: "React.ButtonHTMLAttributes<HTMLButtonElement>" };
49
+ }
50
+ if (searchString.includes("input") || searchString.includes("textfield") || searchString.includes("search")) {
51
+ return { tag: "input", interfaceName: "React.InputHTMLAttributes<HTMLInputElement>" };
52
+ }
53
+ if (searchString.includes("checkbox") || searchString.includes("radio") || searchString.includes("switch") || searchString.includes("toggle")) {
54
+ // Typically a wrapper around an input, but for simple skeleton keeping it generic wrapper or input depending on pattern.
55
+ // Usually, a checkbox is a label + input wrapper. A `div` wrapper is safest for a skeletal React component structure.
56
+ return { tag: "div", interfaceName: "React.HTMLAttributes<HTMLDivElement>" };
57
+ }
58
+ if (searchString.includes("select") || searchString.includes("dropdown")) {
59
+ return { tag: "select", interfaceName: "React.SelectHTMLAttributes<HTMLSelectElement>" };
60
+ }
61
+ if (searchString.includes("form")) {
62
+ return { tag: "form", interfaceName: "React.FormHTMLAttributes<HTMLFormElement>" };
63
+ }
64
+ // Media
65
+ if (searchString.includes("image") || searchString.includes("img") || searchString.includes("avatar")) {
66
+ return { tag: "img", interfaceName: "React.ImgHTMLAttributes<HTMLImageElement>" };
67
+ }
68
+ // Text / Typography
69
+ if (searchString.includes("text") || searchString.includes("typography") || searchString.includes("heading") || searchString.includes("title") || searchString.includes("paragraph")) {
70
+ return { tag: "span", interfaceName: "React.HTMLAttributes<HTMLSpanElement>" };
71
+ }
72
+ if (searchString.includes("icon")) {
73
+ // Icons are often SVG or span wrappers
74
+ return { tag: "span", interfaceName: "React.HTMLAttributes<HTMLSpanElement>" };
75
+ }
76
+ // Default Fallback
77
+ return { tag: "div", interfaceName: "React.HTMLAttributes<HTMLDivElement>" };
78
+ }
79
+ /**
80
+ * Derives the exact canonical subfolder path to resolve imports predictably securely.
81
+ */
82
+ export function resolveRelativeImportTarget(sourceComponent, targetComponent, namingStrategy) {
83
+ const sourceFolder = namingStrategy.formatFolderName(sourceComponent.name);
84
+ let sourcePath = sourceFolder;
85
+ if (sourceComponent.categoryPath) {
86
+ const sourceCategory = namingStrategy.formatFolderName(sourceComponent.categoryPath);
87
+ sourcePath = path.posix.join(sourceCategory, sourceFolder);
88
+ }
89
+ const targetFolder = namingStrategy.formatFolderName(targetComponent.name);
90
+ let targetPath = targetFolder;
91
+ if (targetComponent.categoryPath) {
92
+ const targetCategory = namingStrategy.formatFolderName(targetComponent.categoryPath);
93
+ targetPath = path.posix.join(targetCategory, targetFolder);
94
+ }
95
+ // Since both start relative to `packages/ui/src/components/`, find relative distance natively!
96
+ // path.posix to enforce forward slashes in compiled code cleanly
97
+ let relativeStr = path.posix.relative(sourcePath, targetPath);
98
+ if (!relativeStr.startsWith(".")) {
99
+ relativeStr = `./${relativeStr}`;
100
+ }
101
+ return `${relativeStr}/${targetFolder}`;
102
+ }
103
+ /**
104
+ * Derives the exact canonical path relative to a component backwards dynamically
105
+ * towards `../../layout/<Primitive>` flawlessly structurally!
106
+ */
107
+ export function resolveRelativeLayoutImport(sourceComponent, primitiveName, namingStrategy) {
108
+ const sourceFolder = namingStrategy.formatFolderName(sourceComponent.name);
109
+ let sourcePath = sourceFolder;
110
+ if (sourceComponent.categoryPath) {
111
+ const sourceCategory = namingStrategy.formatFolderName(sourceComponent.categoryPath);
112
+ sourcePath = path.posix.join(sourceCategory, sourceFolder);
113
+ }
114
+ // `packages/ui/src/components` vs `packages/ui/src/layout` -> we go up one level from `components/`
115
+ // SourcePath represents distance *inside* `components/`. We must escape components natively!
116
+ let pathAcc = ".."; // Escaping the 'components' folder boundary logically
117
+ // Each level deep inside components adds another `../`
118
+ const depth = sourcePath.split("/").length;
119
+ for (let i = 0; i < depth; i++) {
120
+ pathAcc = path.posix.join("..", pathAcc);
121
+ }
122
+ return path.posix.join(pathAcc, "layout", primitiveName);
123
+ }
124
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/components/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export * from "./generate-types-file.js";
2
+ export * from "./generate-component-file.js";
3
+ export * from "./write-components.js";
4
+ export * from "./prune-components.js";
5
+ export * from "./helpers.js";
6
+ export * from "./token-helpers.js";
7
+ export * from "./generate-composite-types.js";
8
+ export * from "./generate-composite-file.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from "./generate-types-file.js";
2
+ export * from "./generate-component-file.js";
3
+ export * from "./write-components.js";
4
+ export * from "./prune-components.js";
5
+ export * from "./helpers.js";
6
+ export * from "./token-helpers.js";
7
+ // Merged Composite Generators
8
+ export * from "./generate-composite-types.js";
9
+ export * from "./generate-composite-file.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AAEnC,8BAA8B;AAC9B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { LayoutTreeNode, ComponentDefinition, DesignSystemModel } from "@calibrate-ds/shared-types";
2
+ export interface LayoutJSXResult {
3
+ jsx: string;
4
+ dependencies: Map<string, string>;
5
+ }
6
+ /**
7
+ * Generates recursive Flexbox JSX structure from a normalized LayoutTreeNode.
8
+ *
9
+ * @param node The layout tree node to process
10
+ * @param indentLevel The current string indentation for pretty printing
11
+ * @returns Formatted JSX string containing structural <div> instances and leaf implementations
12
+ */
13
+ export declare function generateLayoutJSX(node: LayoutTreeNode, sourceComponent: ComponentDefinition, model: DesignSystemModel, namingStrategy: any, indentLevel?: number): LayoutJSXResult;
14
+ //# sourceMappingURL=layout-jsx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-jsx.d.ts","sourceRoot":"","sources":["../../src/components/layout-jsx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAIzH,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,cAAc,EACpB,eAAe,EAAE,mBAAmB,EACpC,KAAK,EAAE,iBAAiB,EACxB,cAAc,EAAE,GAAG,EACnB,WAAW,GAAE,MAAU,GACxB,eAAe,CA2EjB"}
@@ -0,0 +1,265 @@
1
+ import { normalizeFigmaName } from "@calibrate-ds/core";
2
+ import { resolveRelativeImportTarget, resolveRelativeLayoutImport } from "./helpers.js";
3
+ /**
4
+ * Generates recursive Flexbox JSX structure from a normalized LayoutTreeNode.
5
+ *
6
+ * @param node The layout tree node to process
7
+ * @param indentLevel The current string indentation for pretty printing
8
+ * @returns Formatted JSX string containing structural <div> instances and leaf implementations
9
+ */
10
+ export function generateLayoutJSX(node, sourceComponent, model, namingStrategy, indentLevel = 2) {
11
+ const dependencies = new Map();
12
+ const indent = " ".repeat(indentLevel);
13
+ const innerIndent = " ".repeat(indentLevel + 1);
14
+ // 1. First try to resolve if it represents an instance (even if it has children in the LayoutTree)
15
+ if (node.role === "instance") {
16
+ const { targetComponent, targetName, importPath } = tryResolveInstance(node, sourceComponent, model, namingStrategy);
17
+ if (targetComponent && targetName && importPath) {
18
+ dependencies.set(importPath, targetName);
19
+ return { jsx: `${indent}<${targetName} />`, dependencies };
20
+ }
21
+ }
22
+ if (node.type === "leaf") {
23
+ return renderLeafNode(node, sourceComponent, model, namingStrategy, indent);
24
+ }
25
+ // It is a container
26
+ const isRoot = indentLevel === 2; // Typically the outermost wrapper of the component
27
+ let tagName = "div";
28
+ let isPrimitive = false;
29
+ if (node.layout) {
30
+ if (node.layout.direction === "row") {
31
+ tagName = "Row";
32
+ isPrimitive = true;
33
+ }
34
+ else if (node.layout.direction === "column") {
35
+ tagName = "Stack";
36
+ isPrimitive = true;
37
+ }
38
+ }
39
+ if (isPrimitive) {
40
+ const importPath = resolveRelativeLayoutImport(sourceComponent, tagName, namingStrategy);
41
+ dependencies.set(importPath, tagName);
42
+ }
43
+ // Base attributes string
44
+ let propsStr = "";
45
+ if (isPrimitive) {
46
+ const primitiveProps = generatePrimitivePropsString(node.layout);
47
+ if (primitiveProps) {
48
+ propsStr += primitiveProps;
49
+ }
50
+ }
51
+ else {
52
+ // Generate inline style mapping Auto Layout Flexbox semantics securely
53
+ const styleObj = generateFlexStyleString(node.layout);
54
+ if (styleObj) {
55
+ propsStr += `style={{ ${styleObj} }}`;
56
+ }
57
+ }
58
+ propsStr = propsStr ? ` ${propsStr}` : ""; // Ensure leading space if properties exist
59
+ // Format recursively printed children seamlessly traversing the DOM map
60
+ let childrenJSX = "";
61
+ if (node.children && node.children.length > 0) {
62
+ const childStrings = node.children.map(child => {
63
+ const childResult = generateLayoutJSX(child, sourceComponent, model, namingStrategy, indentLevel + 1);
64
+ for (const [path, name] of childResult.dependencies.entries()) {
65
+ dependencies.set(path, name);
66
+ }
67
+ return childResult.jsx;
68
+ });
69
+ childrenJSX = `\n${childStrings.join("\n")}\n${indent}`;
70
+ }
71
+ // Return the physically assembled container tag string!
72
+ return {
73
+ jsx: `${indent}<${tagName}${propsStr}>${childrenJSX}</${tagName}>`,
74
+ dependencies
75
+ };
76
+ }
77
+ /**
78
+ * Formats canonical proprietary layout primitives mapping natively onto React components.
79
+ */
80
+ function generatePrimitivePropsString(layout) {
81
+ if (!layout)
82
+ return "";
83
+ const props = [];
84
+ if (layout.gap) {
85
+ const gapVal = typeof layout.gap === "object" ? (layout.gap.resolvedToken?.name || layout.gap.rawValue) : layout.gap;
86
+ if (gapVal !== 0 && gapVal !== undefined) {
87
+ props.push(`gap={${typeof gapVal === "number" ? gapVal : `"${gapVal}"`}}`);
88
+ }
89
+ }
90
+ if (layout.padding) {
91
+ const { top, right, bottom, left } = layout.padding;
92
+ const t = (top.resolvedToken?.name || top.rawValue);
93
+ const r = (right.resolvedToken?.name || right.rawValue);
94
+ const b = (bottom.resolvedToken?.name || bottom.rawValue);
95
+ const l = (left.resolvedToken?.name || left.rawValue);
96
+ if (t === b && l === r) {
97
+ if (t === l) {
98
+ if (t !== 0)
99
+ props.push(`padding="${typeof t === "number" ? t + "px" : t}"`);
100
+ }
101
+ else {
102
+ props.push(`padding="${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r}"`);
103
+ }
104
+ }
105
+ else {
106
+ props.push(`padding="${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r} ${typeof b === "number" ? b + "px" : b} ${typeof l === "number" ? l + "px" : l}"`);
107
+ }
108
+ }
109
+ if (layout.mainAlignment) {
110
+ switch (layout.mainAlignment) {
111
+ case "center":
112
+ props.push('justify="center"');
113
+ break;
114
+ case "space-between":
115
+ props.push('justify="space-between"');
116
+ break;
117
+ case "start":
118
+ props.push('justify="flex-start"');
119
+ break;
120
+ case "end":
121
+ props.push('justify="flex-end"');
122
+ break;
123
+ }
124
+ }
125
+ if (layout.crossAlignment) {
126
+ switch (layout.crossAlignment) {
127
+ case "center":
128
+ props.push('align="center"');
129
+ break;
130
+ case "start":
131
+ props.push('align="flex-start"');
132
+ break;
133
+ case "end":
134
+ props.push('align="flex-end"');
135
+ break;
136
+ case "baseline":
137
+ props.push('align="baseline"');
138
+ break;
139
+ }
140
+ }
141
+ return props.join(" ");
142
+ }
143
+ /**
144
+ * Formats standard inline Flexbox CSS rules mimicking Figma Auto Layout primitives dynamically.
145
+ */
146
+ function generateFlexStyleString(layout) {
147
+ if (!layout)
148
+ return null;
149
+ const styles = ['display: "flex"'];
150
+ if (layout.direction === "row") {
151
+ styles.push('flexDirection: "row"');
152
+ }
153
+ else if (layout.direction === "column") {
154
+ styles.push('flexDirection: "column"');
155
+ }
156
+ if (layout.gap) {
157
+ const gapVal = typeof layout.gap === "object" ? (layout.gap.resolvedToken?.name || layout.gap.rawValue) : layout.gap;
158
+ styles.push(`gap: ${typeof gapVal === "number" ? gapVal + "px" : gapVal}`);
159
+ }
160
+ if (layout.padding) {
161
+ const { top, right, bottom, left } = layout.padding;
162
+ const t = (top.resolvedToken?.name || top.rawValue);
163
+ const r = (right.resolvedToken?.name || right.rawValue);
164
+ const b = (bottom.resolvedToken?.name || bottom.rawValue);
165
+ const l = (left.resolvedToken?.name || left.rawValue);
166
+ // Optimize formatting shorthand natively if symmetric!
167
+ if (t === b && l === r) {
168
+ if (t === l) {
169
+ styles.push(`padding: ${typeof t === "number" ? t + "px" : t}`);
170
+ }
171
+ else {
172
+ styles.push(`padding: "${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r}"`);
173
+ }
174
+ }
175
+ else {
176
+ styles.push(`padding: "${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r} ${typeof b === "number" ? b + "px" : b} ${typeof l === "number" ? l + "px" : l}"`);
177
+ }
178
+ }
179
+ // Alignment mappings bridging Axis heuristics to CSS
180
+ if (layout.mainAlignment) {
181
+ switch (layout.mainAlignment) {
182
+ case "center":
183
+ styles.push('justifyContent: "center"');
184
+ break;
185
+ case "space-between":
186
+ styles.push('justifyContent: "space-between"');
187
+ break;
188
+ case "start":
189
+ styles.push('justifyContent: "flex-start"');
190
+ break;
191
+ case "end":
192
+ styles.push('justifyContent: "flex-end"');
193
+ break;
194
+ }
195
+ }
196
+ if (layout.crossAlignment) {
197
+ switch (layout.crossAlignment) {
198
+ case "center":
199
+ styles.push('alignItems: "center"');
200
+ break;
201
+ case "start":
202
+ styles.push('alignItems: "flex-start"');
203
+ break;
204
+ case "end":
205
+ styles.push('alignItems: "flex-end"');
206
+ break;
207
+ case "baseline":
208
+ styles.push('alignItems: "baseline"');
209
+ break;
210
+ }
211
+ }
212
+ return styles.join(", ");
213
+ }
214
+ function tryResolveInstance(node, sourceComponent, model, namingStrategy) {
215
+ if (node.role !== "instance")
216
+ return {};
217
+ let targetComponent;
218
+ // 1. Resolve securely by exact ID Mapping (Safest Signal natively)
219
+ if (node.componentId) {
220
+ targetComponent = model.components.find(c => c.id === node.componentId);
221
+ }
222
+ // 2. Fallback matching structural Figma Names heuristics organically
223
+ if (!targetComponent) {
224
+ const { baseName: instanceBaseName } = normalizeFigmaName(node.name || "");
225
+ const cleanInstanceName = instanceBaseName.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
226
+ if (cleanInstanceName) {
227
+ targetComponent = model.components.find(c => {
228
+ const { baseName: cBaseName } = normalizeFigmaName(c.name);
229
+ const cleanCanonicalName = cBaseName.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
230
+ return cleanCanonicalName === cleanInstanceName;
231
+ });
232
+ }
233
+ }
234
+ // 3. Bind the deterministic Export Mapping predictably
235
+ if (targetComponent && targetComponent.id !== sourceComponent.id) {
236
+ const targetName = namingStrategy.formatComponentName(targetComponent.name);
237
+ const importPath = resolveRelativeImportTarget(sourceComponent, targetComponent, namingStrategy);
238
+ return { targetComponent, targetName, importPath };
239
+ }
240
+ return {};
241
+ }
242
+ /**
243
+ * Predicts and maps correct component primitives securely targeting React native elements implicitly.
244
+ */
245
+ function renderLeafNode(node, sourceComponent, model, namingStrategy, indent) {
246
+ const dependencies = new Map();
247
+ if (node.role === "instance") {
248
+ // Instance couldn't be resolved to a known component — emit a placeholder.
249
+ // Use the naming strategy so the identifier is valid and matches any future resolution.
250
+ const { baseName } = normalizeFigmaName(node.name || "Unknown");
251
+ const instanceName = namingStrategy.formatComponentName(baseName);
252
+ return { jsx: `${indent}{/* ptb: unresolved instance — ${instanceName} */}`, dependencies };
253
+ }
254
+ if (node.role === "text") {
255
+ // Fallback explicit text placeholders organically matching HTML structural primitives
256
+ return { jsx: `${indent}<span>${node.name || "Text"}</span>`, dependencies };
257
+ }
258
+ if (node.role === "icon") {
259
+ // Fallback explicit abstract vector placeholders organically
260
+ return { jsx: `${indent}<svg aria-label="${node.name || "icon"}" />`, dependencies };
261
+ }
262
+ // Generic fallback visually preserving space safely
263
+ return { jsx: `${indent}<div data-role="${node.role || "unknown"}" />`, dependencies };
264
+ }
265
+ //# sourceMappingURL=layout-jsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-jsx.js","sourceRoot":"","sources":["../../src/components/layout-jsx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { PTBConfig, PruneResult, ComponentArtifacts } from "@calibrate-ds/shared-types";
2
+ /**
3
+ * Safely removes generated artifacts based on tracked paths in the manifest.
4
+ * Only deletes if the folder contains exactly the expected files.
5
+ */
6
+ export declare function pruneComponents(config: PTBConfig, staleEntries: {
7
+ id: string;
8
+ data: ComponentArtifacts;
9
+ }[]): Promise<PruneResult>;
10
+ //# sourceMappingURL=prune-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune-components.d.ts","sourceRoot":"","sources":["../../src/components/prune-components.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG7F;;;GAGG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,EAAE,GACzD,OAAO,CAAC,WAAW,CAAC,CAmEtB"}
@@ -0,0 +1,69 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { resolveDSPaths } from "@calibrate-ds/core";
4
+ /**
5
+ * Safely removes generated artifacts based on tracked paths in the manifest.
6
+ * Only deletes if the folder contains exactly the expected files.
7
+ */
8
+ export async function pruneComponents(config, staleEntries) {
9
+ const { packageRoot } = resolveDSPaths(config);
10
+ const result = {
11
+ deleted: [],
12
+ skipped: [],
13
+ errors: []
14
+ };
15
+ for (const { id, data } of staleEntries) {
16
+ // Find the folder from the artifacts.
17
+ if (!data.artifacts || data.artifacts.length === 0)
18
+ continue;
19
+ if (!data.folder) {
20
+ result.skipped.push(`${data.name} (missing folder path in manifest)`);
21
+ continue;
22
+ }
23
+ const folderPath = path.join(packageRoot, data.folder);
24
+ try {
25
+ const stats = await fs.stat(folderPath);
26
+ if (!stats.isDirectory()) {
27
+ result.errors.push(`Artifact path ${folderPath} is not a directory.`);
28
+ continue;
29
+ }
30
+ const filesInDir = await fs.readdir(folderPath);
31
+ const expectedBasenames = new Set(data.artifacts.map((f) => path.basename(f)));
32
+ let hasUnexpectedFiles = false;
33
+ for (const file of filesInDir) {
34
+ if (!expectedBasenames.has(file)) {
35
+ hasUnexpectedFiles = true;
36
+ break;
37
+ }
38
+ }
39
+ if (hasUnexpectedFiles) {
40
+ result.skipped.push(`${data.name} (unexpected files in ${folderPath})`);
41
+ continue;
42
+ }
43
+ // Safe to delete files
44
+ for (const artifact of data.artifacts) {
45
+ const fullPath = path.join(packageRoot, artifact);
46
+ try {
47
+ const artifactStats = await fs.stat(fullPath);
48
+ if (artifactStats.isFile()) {
49
+ await fs.unlink(fullPath);
50
+ }
51
+ }
52
+ catch {
53
+ }
54
+ }
55
+ await fs.rm(folderPath, { recursive: true, force: true });
56
+ result.deleted.push(data.name);
57
+ }
58
+ catch (err) {
59
+ if (err.code === "ENOENT") {
60
+ result.deleted.push(data.name);
61
+ }
62
+ else {
63
+ result.errors.push(`Error pruning ${data.name}: ${err.message}`);
64
+ }
65
+ }
66
+ }
67
+ return result;
68
+ }
69
+ //# sourceMappingURL=prune-components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune-components.js","sourceRoot":"","sources":["../../src/components/prune-components.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { TokenCollection } from "@calibrate-ds/shared-types";
2
+ /**
3
+ * Heuristically infers which token collections are likely relevant to a component
4
+ * based on its name and category path.
5
+ */
6
+ export declare function inferRelevantTokenCollections(componentName: string, categoryPath: string, availableCollections: TokenCollection[]): TokenCollection[];
7
+ /**
8
+ * Computes a simple relative path from inside a component directory back to the tokens directory.
9
+ * Assumes component generation is at `src/components/<category>/<name>/`
10
+ * Assumes token generation is at `src/tokens/`
11
+ */
12
+ export declare function resolveRelativeTokenImport(collectionName: string): string;
13
+ /**
14
+ * Formats a clean variable name from a collection name to import.
15
+ * E.g. "Brand Colors" -> "brandColors"
16
+ */
17
+ export declare function formatCollectionImportName(collectionName: string): string;
18
+ /**
19
+ * Valid Style Intents
20
+ */
21
+ export type StyleSlot = "background" | "text" | "border" | "radius" | "spacingX" | "spacingY" | "iconColor" | "placeholder" | "focusRing" | "opacity";
22
+ /**
23
+ * Predicts the essential structural intent attributes a given component typically uses.
24
+ */
25
+ export declare function inferStyleSlots(componentName: string, categoryPath: string): StyleSlot[];
26
+ /**
27
+ * Guesses the most reasonable literal exact Token per requested slot locally spanning the Collections mapped.
28
+ * Returns a Record of strictly typed token literal bindings representing Figma stylistic intent physically mapped!
29
+ * If a token is NOT found, it maps directly against the physical `styleMetadata` literals available avoiding empty refs.
30
+ */
31
+ export declare function selectTokensForSlots(slots: StyleSlot[], availableCollections: TokenCollection[], styleMetadata?: Record<string, string | number>): Record<string, string>;
32
+ //# sourceMappingURL=token-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-helpers.d.ts","sourceRoot":"","sources":["../../src/components/token-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE;;;GAGG;AACH,wBAAgB,6BAA6B,CACzC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,oBAAoB,EAAE,eAAe,EAAE,GACxC,eAAe,EAAE,CA4BnB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAQzE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GACf,YAAY,GACZ,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,UAAU,GACV,WAAW,GACX,aAAa,GACb,WAAW,GACX,SAAS,CAAC;AAEhB;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,CAqCxF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,SAAS,EAAE,EAClB,oBAAoB,EAAE,eAAe,EAAE,EACvC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkGxB"}