figma-to-code-agent 0.3.4 → 0.5.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/CHANGELOG.md +27 -0
- package/dist/FigmaToCodeAgent.d.ts +2 -0
- package/dist/FigmaToCodeAgent.d.ts.map +1 -1
- package/dist/FigmaToCodeAgent.js +17 -0
- package/dist/FigmaToCodeAgent.js.map +1 -1
- package/dist/assets/AssetManager.d.ts +61 -0
- package/dist/assets/AssetManager.d.ts.map +1 -0
- package/dist/assets/AssetManager.js +136 -0
- package/dist/assets/AssetManager.js.map +1 -0
- package/dist/assets/index.d.ts +2 -1
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +3 -0
- package/dist/assets/index.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/ConfigManager.d.ts +41 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +155 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +43 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/errors/index.d.ts +88 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +128 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/generation/FileOrganizer.d.ts +35 -0
- package/dist/generation/FileOrganizer.d.ts.map +1 -0
- package/dist/generation/FileOrganizer.js +117 -0
- package/dist/generation/FileOrganizer.js.map +1 -0
- package/dist/generation/ReactGenerator.d.ts +11 -2
- package/dist/generation/ReactGenerator.d.ts.map +1 -1
- package/dist/generation/ReactGenerator.js +147 -24
- package/dist/generation/ReactGenerator.js.map +1 -1
- package/dist/generation/VueGenerator.d.ts +14 -0
- package/dist/generation/VueGenerator.d.ts.map +1 -1
- package/dist/generation/VueGenerator.js +139 -2
- package/dist/generation/VueGenerator.js.map +1 -1
- package/dist/tokens/DesignTokenExporter.d.ts +12 -0
- package/dist/tokens/DesignTokenExporter.d.ts.map +1 -0
- package/dist/tokens/DesignTokenExporter.js +61 -0
- package/dist/tokens/DesignTokenExporter.js.map +1 -0
- package/dist/tokens/DesignTokenExtractor.d.ts +14 -0
- package/dist/tokens/DesignTokenExtractor.d.ts.map +1 -0
- package/dist/tokens/DesignTokenExtractor.js +124 -0
- package/dist/tokens/DesignTokenExtractor.js.map +1 -0
- package/dist/tokens/index.d.ts +4 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +8 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/types.d.ts +44 -0
- package/dist/tokens/types.d.ts.map +1 -0
- package/dist/tokens/types.js +7 -0
- package/dist/tokens/types.js.map +1 -0
- package/dist/transformation/transformers/AccessibilityEnhancer.d.ts +22 -0
- package/dist/transformation/transformers/AccessibilityEnhancer.d.ts.map +1 -0
- package/dist/transformation/transformers/AccessibilityEnhancer.js +113 -0
- package/dist/transformation/transformers/AccessibilityEnhancer.js.map +1 -0
- package/dist/transformation/transformers/ComponentSplitter.d.ts +32 -0
- package/dist/transformation/transformers/ComponentSplitter.d.ts.map +1 -0
- package/dist/transformation/transformers/ComponentSplitter.js +108 -0
- package/dist/transformation/transformers/ComponentSplitter.js.map +1 -0
- package/dist/transformation/transformers/PerformanceOptimizer.d.ts +24 -0
- package/dist/transformation/transformers/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/transformation/transformers/PerformanceOptimizer.js +95 -0
- package/dist/transformation/transformers/PerformanceOptimizer.js.map +1 -0
- package/dist/transformation/transformers/ResponsiveMerger.d.ts +39 -0
- package/dist/transformation/transformers/ResponsiveMerger.d.ts.map +1 -0
- package/dist/transformation/transformers/ResponsiveMerger.js +114 -0
- package/dist/transformation/transformers/ResponsiveMerger.js.map +1 -0
- package/dist/transformation/transformers/StyleMerger.d.ts +18 -0
- package/dist/transformation/transformers/StyleMerger.d.ts.map +1 -0
- package/dist/transformation/transformers/StyleMerger.js +71 -0
- package/dist/transformation/transformers/StyleMerger.js.map +1 -0
- package/dist/validation/VisualValidator.d.ts +69 -0
- package/dist/validation/VisualValidator.d.ts.map +1 -0
- package/dist/validation/VisualValidator.js +198 -0
- package/dist/validation/VisualValidator.js.map +1 -0
- package/dist/validation/index.d.ts +2 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +3 -0
- package/dist/validation/index.js.map +1 -1
- package/package.json +1 -1
- package/test-app/test-react/src/Component.module.css +21 -141
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DesignTokenExporter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Exports design tokens to various formats: CSS variables, SCSS, JSON, JS.
|
|
6
|
+
*/
|
|
7
|
+
class DesignTokenExporter {
|
|
8
|
+
export(tokens, format) {
|
|
9
|
+
switch (format) {
|
|
10
|
+
case 'css': return this.toCSS(tokens);
|
|
11
|
+
case 'scss': return this.toSCSS(tokens);
|
|
12
|
+
case 'json': return this.toJSON(tokens);
|
|
13
|
+
case 'js': return this.toJS(tokens);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
toCSS(tokens) {
|
|
17
|
+
const lines = [':root {'];
|
|
18
|
+
for (const c of tokens.colors)
|
|
19
|
+
lines.push(` --${c.name}: ${c.css};`);
|
|
20
|
+
for (const t of tokens.typography) {
|
|
21
|
+
lines.push(` --${t.name}-family: ${t.fontFamily};`);
|
|
22
|
+
lines.push(` --${t.name}-size: ${t.fontSize}px;`);
|
|
23
|
+
lines.push(` --${t.name}-weight: ${t.fontWeight};`);
|
|
24
|
+
lines.push(` --${t.name}-line-height: ${t.lineHeight}px;`);
|
|
25
|
+
}
|
|
26
|
+
for (const s of tokens.spacing)
|
|
27
|
+
lines.push(` --${s.name}: ${s.value}px;`);
|
|
28
|
+
for (const e of tokens.effects)
|
|
29
|
+
lines.push(` --${e.name}: ${e.css};`);
|
|
30
|
+
for (const r of tokens.borderRadius)
|
|
31
|
+
lines.push(` --${r.name}: ${r.value}px;`);
|
|
32
|
+
lines.push('}');
|
|
33
|
+
return lines.join('\n') + '\n';
|
|
34
|
+
}
|
|
35
|
+
toSCSS(tokens) {
|
|
36
|
+
const lines = [];
|
|
37
|
+
for (const c of tokens.colors)
|
|
38
|
+
lines.push(`$${c.name}: ${c.css};`);
|
|
39
|
+
for (const t of tokens.typography) {
|
|
40
|
+
lines.push(`$${t.name}-family: ${t.fontFamily};`);
|
|
41
|
+
lines.push(`$${t.name}-size: ${t.fontSize}px;`);
|
|
42
|
+
lines.push(`$${t.name}-weight: ${t.fontWeight};`);
|
|
43
|
+
lines.push(`$${t.name}-line-height: ${t.lineHeight}px;`);
|
|
44
|
+
}
|
|
45
|
+
for (const s of tokens.spacing)
|
|
46
|
+
lines.push(`$${s.name}: ${s.value}px;`);
|
|
47
|
+
for (const e of tokens.effects)
|
|
48
|
+
lines.push(`$${e.name}: ${e.css};`);
|
|
49
|
+
for (const r of tokens.borderRadius)
|
|
50
|
+
lines.push(`$${r.name}: ${r.value}px;`);
|
|
51
|
+
return lines.join('\n') + '\n';
|
|
52
|
+
}
|
|
53
|
+
toJSON(tokens) {
|
|
54
|
+
return JSON.stringify(tokens, null, 2) + '\n';
|
|
55
|
+
}
|
|
56
|
+
toJS(tokens) {
|
|
57
|
+
return `export const designTokens = ${JSON.stringify(tokens, null, 2)};\n`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.DesignTokenExporter = DesignTokenExporter;
|
|
61
|
+
//# sourceMappingURL=DesignTokenExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignTokenExporter.js","sourceRoot":"","sources":["../../src/tokens/DesignTokenExporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ASTNode } from '../transformation/types';
|
|
2
|
+
import type { DesignTokens } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Extracts design tokens (colors, typography, spacing, effects, border-radius)
|
|
5
|
+
* from an AST tree by traversing all nodes and deduplicating values.
|
|
6
|
+
*/
|
|
7
|
+
export declare class DesignTokenExtractor {
|
|
8
|
+
extract(root: ASTNode): DesignTokens;
|
|
9
|
+
private traverse;
|
|
10
|
+
private generateColorName;
|
|
11
|
+
private generateTypographyName;
|
|
12
|
+
private generateEffectName;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=DesignTokenExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignTokenExtractor.d.ts","sourceRoot":"","sources":["../../src/tokens/DesignTokenExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY;IAqGpC,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,kBAAkB;CAI3B"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DesignTokenExtractor = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Extracts design tokens (colors, typography, spacing, effects, border-radius)
|
|
6
|
+
* from an AST tree by traversing all nodes and deduplicating values.
|
|
7
|
+
*/
|
|
8
|
+
class DesignTokenExtractor {
|
|
9
|
+
extract(root) {
|
|
10
|
+
const colors = new Map();
|
|
11
|
+
const typography = new Map();
|
|
12
|
+
const spacingSet = new Set();
|
|
13
|
+
const effects = new Map();
|
|
14
|
+
const radiusSet = new Set();
|
|
15
|
+
this.traverse(root, (node) => {
|
|
16
|
+
// Colors
|
|
17
|
+
if (node.styles.backgroundColor) {
|
|
18
|
+
const c = node.styles.backgroundColor;
|
|
19
|
+
const css = `rgba(${c.r}, ${c.g}, ${c.b}, ${c.a})`;
|
|
20
|
+
if (!colors.has(css)) {
|
|
21
|
+
colors.set(css, {
|
|
22
|
+
name: this.generateColorName(c),
|
|
23
|
+
value: { r: c.r, g: c.g, b: c.b, a: c.a },
|
|
24
|
+
css,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Typography
|
|
29
|
+
if (node.styles.typography) {
|
|
30
|
+
const t = node.styles.typography;
|
|
31
|
+
const key = `${t.fontFamily}-${t.fontSize}-${t.fontWeight}`;
|
|
32
|
+
if (!typography.has(key)) {
|
|
33
|
+
typography.set(key, {
|
|
34
|
+
name: this.generateTypographyName(t.fontSize, t.fontWeight),
|
|
35
|
+
fontFamily: t.fontFamily,
|
|
36
|
+
fontSize: t.fontSize,
|
|
37
|
+
fontWeight: t.fontWeight,
|
|
38
|
+
lineHeight: t.lineHeight,
|
|
39
|
+
letterSpacing: t.letterSpacing,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Spacing (from padding)
|
|
44
|
+
if (node.layout.padding) {
|
|
45
|
+
const p = node.layout.padding;
|
|
46
|
+
if ('top' in p) {
|
|
47
|
+
[p.top, p.right, p.bottom, p.left].forEach((v) => {
|
|
48
|
+
if (v > 0)
|
|
49
|
+
spacingSet.add(v);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Gap
|
|
54
|
+
if (node.layout.gap && node.layout.gap > 0) {
|
|
55
|
+
spacingSet.add(node.layout.gap);
|
|
56
|
+
}
|
|
57
|
+
// Border radius
|
|
58
|
+
if (node.styles.borderRadius) {
|
|
59
|
+
const br = node.styles.borderRadius;
|
|
60
|
+
if (typeof br === 'number' && br > 0) {
|
|
61
|
+
radiusSet.add(br);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Box shadows
|
|
65
|
+
if (node.styles.boxShadow) {
|
|
66
|
+
for (const shadow of node.styles.boxShadow) {
|
|
67
|
+
const css = shadow.type === 'inner-shadow'
|
|
68
|
+
? `inset ${shadow.offsetX}px ${shadow.offsetY}px ${shadow.blur}px ${shadow.spread}px rgba(${shadow.color.r}, ${shadow.color.g}, ${shadow.color.b}, ${shadow.color.a})`
|
|
69
|
+
: `${shadow.offsetX}px ${shadow.offsetY}px ${shadow.blur}px ${shadow.spread}px rgba(${shadow.color.r}, ${shadow.color.g}, ${shadow.color.b}, ${shadow.color.a})`;
|
|
70
|
+
if (!effects.has(css)) {
|
|
71
|
+
effects.set(css, {
|
|
72
|
+
name: this.generateEffectName(shadow.type, effects.size),
|
|
73
|
+
type: shadow.type,
|
|
74
|
+
css,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Build sorted spacing tokens
|
|
81
|
+
const spacingValues = Array.from(spacingSet).sort((a, b) => a - b);
|
|
82
|
+
const spacingTokens = spacingValues.map((v, i) => ({
|
|
83
|
+
name: `spacing-${i + 1}`,
|
|
84
|
+
value: v,
|
|
85
|
+
}));
|
|
86
|
+
// Build sorted border-radius tokens
|
|
87
|
+
const radiusValues = Array.from(radiusSet).sort((a, b) => a - b);
|
|
88
|
+
const radiusTokens = radiusValues.map((v, i) => ({
|
|
89
|
+
name: `radius-${i + 1}`,
|
|
90
|
+
value: v,
|
|
91
|
+
}));
|
|
92
|
+
return {
|
|
93
|
+
colors: Array.from(colors.values()),
|
|
94
|
+
typography: Array.from(typography.values()),
|
|
95
|
+
spacing: spacingTokens,
|
|
96
|
+
effects: Array.from(effects.values()),
|
|
97
|
+
borderRadius: radiusTokens,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
traverse(node, visitor) {
|
|
101
|
+
visitor(node);
|
|
102
|
+
node.children.forEach((child) => this.traverse(child, visitor));
|
|
103
|
+
}
|
|
104
|
+
generateColorName(c) {
|
|
105
|
+
if (c.r === 255 && c.g === 255 && c.b === 255)
|
|
106
|
+
return c.a < 1 ? 'white-transparent' : 'white';
|
|
107
|
+
if (c.r === 0 && c.g === 0 && c.b === 0)
|
|
108
|
+
return c.a < 1 ? 'black-transparent' : 'black';
|
|
109
|
+
return `color-${c.r}-${c.g}-${c.b}${c.a < 1 ? `-a${Math.round(c.a * 100)}` : ''}`;
|
|
110
|
+
}
|
|
111
|
+
generateTypographyName(fontSize, fontWeight) {
|
|
112
|
+
const sizeLabel = fontSize <= 12 ? 'xs' : fontSize <= 14 ? 'sm' : fontSize <= 16 ? 'base' :
|
|
113
|
+
fontSize <= 20 ? 'lg' : fontSize <= 24 ? 'xl' : fontSize <= 32 ? '2xl' : '3xl';
|
|
114
|
+
const weightLabel = fontWeight <= 300 ? 'light' : fontWeight <= 400 ? 'regular' :
|
|
115
|
+
fontWeight <= 500 ? 'medium' : fontWeight <= 600 ? 'semibold' : 'bold';
|
|
116
|
+
return `text-${sizeLabel}-${weightLabel}`;
|
|
117
|
+
}
|
|
118
|
+
generateEffectName(type, index) {
|
|
119
|
+
const prefix = type === 'inner-shadow' ? 'inner-shadow' : type === 'blur' ? 'blur' : 'shadow';
|
|
120
|
+
return `${prefix}-${index + 1}`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.DesignTokenExtractor = DesignTokenExtractor;
|
|
124
|
+
//# sourceMappingURL=DesignTokenExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignTokenExtractor.js","sourceRoot":"","sources":["../../src/tokens/DesignTokenExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { DesignTokenExtractor } from './DesignTokenExtractor';
|
|
2
|
+
export { DesignTokenExporter } from './DesignTokenExporter';
|
|
3
|
+
export type { DesignTokens, ColorToken, TypographyToken, SpacingToken, EffectToken, BorderRadiusToken, TokenExportFormat, } from './types';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DesignTokenExporter = exports.DesignTokenExtractor = void 0;
|
|
4
|
+
var DesignTokenExtractor_1 = require("./DesignTokenExtractor");
|
|
5
|
+
Object.defineProperty(exports, "DesignTokenExtractor", { enumerable: true, get: function () { return DesignTokenExtractor_1.DesignTokenExtractor; } });
|
|
6
|
+
var DesignTokenExporter_1 = require("./DesignTokenExporter");
|
|
7
|
+
Object.defineProperty(exports, "DesignTokenExporter", { enumerable: true, get: function () { return DesignTokenExporter_1.DesignTokenExporter; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAC7B,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design Token Types
|
|
3
|
+
* Represents extracted design tokens from Figma designs
|
|
4
|
+
*/
|
|
5
|
+
export interface ColorToken {
|
|
6
|
+
name: string;
|
|
7
|
+
value: {
|
|
8
|
+
r: number;
|
|
9
|
+
g: number;
|
|
10
|
+
b: number;
|
|
11
|
+
a: number;
|
|
12
|
+
};
|
|
13
|
+
css: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TypographyToken {
|
|
16
|
+
name: string;
|
|
17
|
+
fontFamily: string;
|
|
18
|
+
fontSize: number;
|
|
19
|
+
fontWeight: number;
|
|
20
|
+
lineHeight: number;
|
|
21
|
+
letterSpacing?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SpacingToken {
|
|
24
|
+
name: string;
|
|
25
|
+
value: number;
|
|
26
|
+
}
|
|
27
|
+
export interface EffectToken {
|
|
28
|
+
name: string;
|
|
29
|
+
type: 'drop-shadow' | 'inner-shadow' | 'blur';
|
|
30
|
+
css: string;
|
|
31
|
+
}
|
|
32
|
+
export interface BorderRadiusToken {
|
|
33
|
+
name: string;
|
|
34
|
+
value: number;
|
|
35
|
+
}
|
|
36
|
+
export interface DesignTokens {
|
|
37
|
+
colors: ColorToken[];
|
|
38
|
+
typography: TypographyToken[];
|
|
39
|
+
spacing: SpacingToken[];
|
|
40
|
+
effects: EffectToken[];
|
|
41
|
+
borderRadius: BorderRadiusToken[];
|
|
42
|
+
}
|
|
43
|
+
export type TokenExportFormat = 'css' | 'scss' | 'json' | 'js';
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tokens/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,MAAM,CAAC;IAC9C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tokens/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ASTNode } from '../types';
|
|
2
|
+
import type { Transformer } from '../TransformationPipeline';
|
|
3
|
+
/**
|
|
4
|
+
* Enhances AST nodes with accessibility attributes.
|
|
5
|
+
* - Adds ARIA roles based on node type and structure
|
|
6
|
+
* - Adds alt text hints for images
|
|
7
|
+
* - Adds landmark roles for navigation/header/footer patterns
|
|
8
|
+
* - Flags interactive elements that need keyboard support
|
|
9
|
+
*/
|
|
10
|
+
export declare class AccessibilityEnhancer implements Transformer {
|
|
11
|
+
name: string;
|
|
12
|
+
transform(node: ASTNode): ASTNode;
|
|
13
|
+
private enhance;
|
|
14
|
+
private isNavigation;
|
|
15
|
+
private isHeader;
|
|
16
|
+
private isFooter;
|
|
17
|
+
private isButton;
|
|
18
|
+
private isList;
|
|
19
|
+
private generateAltText;
|
|
20
|
+
private generateAriaLabel;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=AccessibilityEnhancer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessibilityEnhancer.d.ts","sourceRoot":"","sources":["../../../src/transformation/transformers/AccessibilityEnhancer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;;;;;GAMG;AACH,qBAAa,qBAAsB,YAAW,WAAW;IACvD,IAAI,SAA4B;IAEhC,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAIjC,OAAO,CAAC,OAAO;IAyDf,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;CAI1B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AccessibilityEnhancer = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Enhances AST nodes with accessibility attributes.
|
|
6
|
+
* - Adds ARIA roles based on node type and structure
|
|
7
|
+
* - Adds alt text hints for images
|
|
8
|
+
* - Adds landmark roles for navigation/header/footer patterns
|
|
9
|
+
* - Flags interactive elements that need keyboard support
|
|
10
|
+
*/
|
|
11
|
+
class AccessibilityEnhancer {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.name = 'accessibility-enhancer';
|
|
14
|
+
}
|
|
15
|
+
transform(node) {
|
|
16
|
+
return this.enhance(node);
|
|
17
|
+
}
|
|
18
|
+
enhance(node) {
|
|
19
|
+
const a11y = {};
|
|
20
|
+
// Image nodes need alt text
|
|
21
|
+
if (node.type === 'Image') {
|
|
22
|
+
a11y.role = 'img';
|
|
23
|
+
a11y.alt = this.generateAltText(node.name);
|
|
24
|
+
}
|
|
25
|
+
// Text nodes
|
|
26
|
+
if (node.type === 'Text') {
|
|
27
|
+
const fontSize = node.styles.typography?.fontSize;
|
|
28
|
+
if (fontSize && fontSize >= 24) {
|
|
29
|
+
a11y.role = 'heading';
|
|
30
|
+
a11y.ariaLevel = fontSize >= 32 ? '1' : fontSize >= 24 ? '2' : '3';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Detect navigation patterns
|
|
34
|
+
if (this.isNavigation(node)) {
|
|
35
|
+
a11y.role = 'navigation';
|
|
36
|
+
a11y.ariaLabel = this.generateAriaLabel(node.name, 'navigation');
|
|
37
|
+
}
|
|
38
|
+
// Detect header patterns
|
|
39
|
+
if (this.isHeader(node)) {
|
|
40
|
+
a11y.role = 'banner';
|
|
41
|
+
}
|
|
42
|
+
// Detect footer patterns
|
|
43
|
+
if (this.isFooter(node)) {
|
|
44
|
+
a11y.role = 'contentinfo';
|
|
45
|
+
}
|
|
46
|
+
// Detect button-like elements
|
|
47
|
+
if (this.isButton(node)) {
|
|
48
|
+
a11y.role = 'button';
|
|
49
|
+
a11y.tabIndex = '0';
|
|
50
|
+
}
|
|
51
|
+
// Detect list patterns
|
|
52
|
+
if (this.isList(node)) {
|
|
53
|
+
a11y.role = 'list';
|
|
54
|
+
}
|
|
55
|
+
const hasA11y = Object.keys(a11y).length > 0;
|
|
56
|
+
return {
|
|
57
|
+
...node,
|
|
58
|
+
metadata: {
|
|
59
|
+
...node.metadata,
|
|
60
|
+
...(hasA11y ? { accessibility: a11y } : {}),
|
|
61
|
+
},
|
|
62
|
+
children: node.children.map((child) => this.enhance(child)),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
isNavigation(node) {
|
|
66
|
+
const name = node.name.toLowerCase();
|
|
67
|
+
return ((name.includes('nav') || name.includes('menu') || name.includes('toolbar')) &&
|
|
68
|
+
node.children.length >= 2);
|
|
69
|
+
}
|
|
70
|
+
isHeader(node) {
|
|
71
|
+
const name = node.name.toLowerCase();
|
|
72
|
+
return name.includes('header') || name.includes('top-bar') || name.includes('topbar');
|
|
73
|
+
}
|
|
74
|
+
isFooter(node) {
|
|
75
|
+
const name = node.name.toLowerCase();
|
|
76
|
+
return name.includes('footer') || name.includes('bottom-bar');
|
|
77
|
+
}
|
|
78
|
+
isButton(node) {
|
|
79
|
+
const name = node.name.toLowerCase();
|
|
80
|
+
if (name.includes('button') || name.includes('btn') || name.includes('cta')) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
// Small container with single text child and background color = likely a button
|
|
84
|
+
if (node.type === 'Container' &&
|
|
85
|
+
node.children.length === 1 &&
|
|
86
|
+
node.children[0].type === 'Text' &&
|
|
87
|
+
node.styles.backgroundColor &&
|
|
88
|
+
node.styles.borderRadius) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
isList(node) {
|
|
94
|
+
if (node.children.length < 3)
|
|
95
|
+
return false;
|
|
96
|
+
// Check if children have similar structure (same type and similar layout)
|
|
97
|
+
const types = node.children.map((c) => c.type);
|
|
98
|
+
const allSameType = types.every((t) => t === types[0]);
|
|
99
|
+
return allSameType && node.layout.display === 'flex';
|
|
100
|
+
}
|
|
101
|
+
generateAltText(name) {
|
|
102
|
+
return name
|
|
103
|
+
.replace(/[-_]+/g, ' ')
|
|
104
|
+
.replace(/\b\w/g, (c) => c.toUpperCase())
|
|
105
|
+
.trim() || 'Image';
|
|
106
|
+
}
|
|
107
|
+
generateAriaLabel(name, fallback) {
|
|
108
|
+
const cleaned = name.replace(/[-_]+/g, ' ').trim();
|
|
109
|
+
return cleaned || fallback;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.AccessibilityEnhancer = AccessibilityEnhancer;
|
|
113
|
+
//# sourceMappingURL=AccessibilityEnhancer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessibilityEnhancer.js","sourceRoot":"","sources":["../../../src/transformation/transformers/AccessibilityEnhancer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ASTNode } from '../types';
|
|
2
|
+
import type { Transformer } from '../TransformationPipeline';
|
|
3
|
+
/**
|
|
4
|
+
* Splits large designs into smaller sub-components.
|
|
5
|
+
* - Nodes with >50 children get split into sub-components
|
|
6
|
+
* - Component boundaries are placed at container nodes (Frame/Group), never at leaves
|
|
7
|
+
* - Max nesting depth is 4 levels
|
|
8
|
+
*/
|
|
9
|
+
export declare class ComponentSplitter implements Transformer {
|
|
10
|
+
name: string;
|
|
11
|
+
private readonly childThreshold;
|
|
12
|
+
private readonly maxDepth;
|
|
13
|
+
constructor(childThreshold?: number, maxDepth?: number);
|
|
14
|
+
transform(node: ASTNode): ASTNode;
|
|
15
|
+
private splitNode;
|
|
16
|
+
/**
|
|
17
|
+
* Split a large list of children into groups, wrapping each group as a Component.
|
|
18
|
+
*/
|
|
19
|
+
private splitChildren;
|
|
20
|
+
/**
|
|
21
|
+
* Create a sub-component wrapper for a group of children.
|
|
22
|
+
* Boundary is always a container, never a leaf.
|
|
23
|
+
*/
|
|
24
|
+
private createSubComponent;
|
|
25
|
+
/**
|
|
26
|
+
* Flatten children that exceed max depth by pulling grandchildren up.
|
|
27
|
+
*/
|
|
28
|
+
private flattenExcessDepth;
|
|
29
|
+
private getDepth;
|
|
30
|
+
private toPascalCase;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ComponentSplitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentSplitter.d.ts","sourceRoot":"","sources":["../../../src/transformation/transformers/ComponentSplitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,IAAI,SAAwB;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,cAAc,SAAK,EAAE,QAAQ,SAAI;IAK7C,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAIjC,OAAO,CAAC,SAAS;IAoBjB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAmC1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ComponentSplitter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Splits large designs into smaller sub-components.
|
|
6
|
+
* - Nodes with >50 children get split into sub-components
|
|
7
|
+
* - Component boundaries are placed at container nodes (Frame/Group), never at leaves
|
|
8
|
+
* - Max nesting depth is 4 levels
|
|
9
|
+
*/
|
|
10
|
+
class ComponentSplitter {
|
|
11
|
+
constructor(childThreshold = 50, maxDepth = 4) {
|
|
12
|
+
this.name = 'component-splitter';
|
|
13
|
+
this.childThreshold = childThreshold;
|
|
14
|
+
this.maxDepth = maxDepth;
|
|
15
|
+
}
|
|
16
|
+
transform(node) {
|
|
17
|
+
return this.splitNode(node, 0);
|
|
18
|
+
}
|
|
19
|
+
splitNode(node, depth) {
|
|
20
|
+
// Don't split leaf nodes
|
|
21
|
+
if (node.children.length === 0)
|
|
22
|
+
return node;
|
|
23
|
+
// Recursively process children first
|
|
24
|
+
let children = node.children.map((child) => this.splitNode(child, depth + 1));
|
|
25
|
+
// If this node has too many children and we haven't exceeded max depth, split
|
|
26
|
+
if (children.length > this.childThreshold && depth < this.maxDepth) {
|
|
27
|
+
children = this.splitChildren(children, node.name, depth);
|
|
28
|
+
}
|
|
29
|
+
// Flatten depth if exceeding max
|
|
30
|
+
if (depth >= this.maxDepth) {
|
|
31
|
+
children = this.flattenExcessDepth(children);
|
|
32
|
+
}
|
|
33
|
+
return { ...node, children };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Split a large list of children into groups, wrapping each group as a Component.
|
|
37
|
+
*/
|
|
38
|
+
splitChildren(children, parentName, depth) {
|
|
39
|
+
const groupSize = Math.ceil(children.length / Math.ceil(children.length / this.childThreshold));
|
|
40
|
+
const groups = [];
|
|
41
|
+
for (let i = 0; i < children.length; i += groupSize) {
|
|
42
|
+
groups.push(children.slice(i, i + groupSize));
|
|
43
|
+
}
|
|
44
|
+
// If only one group, no need to split
|
|
45
|
+
if (groups.length <= 1)
|
|
46
|
+
return children;
|
|
47
|
+
return groups.map((group, index) => this.createSubComponent(group, parentName, index, depth));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a sub-component wrapper for a group of children.
|
|
51
|
+
* Boundary is always a container, never a leaf.
|
|
52
|
+
*/
|
|
53
|
+
createSubComponent(children, parentName, index, _depth) {
|
|
54
|
+
const name = `${parentName}-section-${index + 1}`;
|
|
55
|
+
// Compute bounding box from children
|
|
56
|
+
const minX = Math.min(...children.map((c) => c.layout.position.x));
|
|
57
|
+
const minY = Math.min(...children.map((c) => c.layout.position.y));
|
|
58
|
+
const maxX = Math.max(...children.map((c) => c.layout.position.x + c.layout.size.width));
|
|
59
|
+
const maxY = Math.max(...children.map((c) => c.layout.position.y + c.layout.size.height));
|
|
60
|
+
return {
|
|
61
|
+
id: `split-${parentName}-${index}`,
|
|
62
|
+
type: 'Component',
|
|
63
|
+
name,
|
|
64
|
+
children,
|
|
65
|
+
layout: {
|
|
66
|
+
display: 'flex',
|
|
67
|
+
position: { x: minX, y: minY },
|
|
68
|
+
size: { width: maxX - minX, height: maxY - minY },
|
|
69
|
+
flexDirection: 'column',
|
|
70
|
+
},
|
|
71
|
+
styles: {},
|
|
72
|
+
metadata: {
|
|
73
|
+
figmaId: `split-${parentName}-${index}`,
|
|
74
|
+
figmaType: 'FRAME',
|
|
75
|
+
isComponent: true,
|
|
76
|
+
componentName: this.toPascalCase(name),
|
|
77
|
+
exportable: false,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Flatten children that exceed max depth by pulling grandchildren up.
|
|
83
|
+
*/
|
|
84
|
+
flattenExcessDepth(children) {
|
|
85
|
+
return children.map((child) => {
|
|
86
|
+
if (this.getDepth(child) > this.maxDepth) {
|
|
87
|
+
// Pull grandchildren up if child is just a wrapper
|
|
88
|
+
if (child.type === 'Container' && !child.metadata.isComponent) {
|
|
89
|
+
return { ...child, children: child.children.flatMap((gc) => [gc]) };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return child;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
getDepth(node) {
|
|
96
|
+
if (node.children.length === 0)
|
|
97
|
+
return 0;
|
|
98
|
+
return 1 + Math.max(...node.children.map((c) => this.getDepth(c)));
|
|
99
|
+
}
|
|
100
|
+
toPascalCase(str) {
|
|
101
|
+
return str
|
|
102
|
+
.split(/[-_\s]+/)
|
|
103
|
+
.map((s) => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase())
|
|
104
|
+
.join('');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.ComponentSplitter = ComponentSplitter;
|
|
108
|
+
//# sourceMappingURL=ComponentSplitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentSplitter.js","sourceRoot":"","sources":["../../../src/transformation/transformers/ComponentSplitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ASTNode } from '../types';
|
|
2
|
+
import type { Transformer } from '../TransformationPipeline';
|
|
3
|
+
/**
|
|
4
|
+
* Optimizes AST for better runtime performance.
|
|
5
|
+
* - Marks large images for lazy loading
|
|
6
|
+
* - Suggests code splitting for large component trees
|
|
7
|
+
* - Removes redundant wrapper nodes
|
|
8
|
+
* - Marks offscreen content for deferred rendering
|
|
9
|
+
*/
|
|
10
|
+
export declare class PerformanceOptimizer implements Transformer {
|
|
11
|
+
name: string;
|
|
12
|
+
private readonly lazyLoadThreshold;
|
|
13
|
+
private readonly codeSplitThreshold;
|
|
14
|
+
constructor(lazyLoadThreshold?: number, codeSplitThreshold?: number);
|
|
15
|
+
transform(node: ASTNode): ASTNode;
|
|
16
|
+
private optimize;
|
|
17
|
+
/**
|
|
18
|
+
* Check if a node is a redundant wrapper (single child, no meaningful styles).
|
|
19
|
+
* Never unwrap the root node (no parent context to absorb it).
|
|
20
|
+
*/
|
|
21
|
+
private isRedundantWrapper;
|
|
22
|
+
private countDescendants;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=PerformanceOptimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PerformanceOptimizer.d.ts","sourceRoot":"","sources":["../../../src/transformation/transformers/PerformanceOptimizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,WAAW;IACtD,IAAI,SAA2B;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,iBAAiB,SAAM,EAAE,kBAAkB,SAAK;IAK5D,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAIjC,OAAO,CAAC,QAAQ;IAwDhB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,gBAAgB;CAOzB"}
|