@bilalba/fig-mcp 1.0.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/README.md +112 -0
- package/dist/compare-get-vector.d.ts +2 -0
- package/dist/compare-get-vector.d.ts.map +1 -0
- package/dist/compare-get-vector.js +124 -0
- package/dist/compare-get-vector.js.map +1 -0
- package/dist/compare-mcp-vs-direct.d.ts +2 -0
- package/dist/compare-mcp-vs-direct.d.ts.map +1 -0
- package/dist/compare-mcp-vs-direct.js +173 -0
- package/dist/compare-mcp-vs-direct.js.map +1 -0
- package/dist/compare-renderers.d.ts +2 -0
- package/dist/compare-renderers.d.ts.map +1 -0
- package/dist/compare-renderers.js +110 -0
- package/dist/compare-renderers.js.map +1 -0
- package/dist/debug/debug-stroke-geom.d.ts +2 -0
- package/dist/debug/debug-stroke-geom.d.ts.map +1 -0
- package/dist/debug/debug-stroke-geom.js +67 -0
- package/dist/debug/debug-stroke-geom.js.map +1 -0
- package/dist/debug/debug-transforms.d.ts +2 -0
- package/dist/debug/debug-transforms.d.ts.map +1 -0
- package/dist/debug/debug-transforms.js +97 -0
- package/dist/debug/debug-transforms.js.map +1 -0
- package/dist/debug/debug-vertex.d.ts +2 -0
- package/dist/debug/debug-vertex.d.ts.map +1 -0
- package/dist/debug/debug-vertex.js +72 -0
- package/dist/debug/debug-vertex.js.map +1 -0
- package/dist/debug-group.d.ts +5 -0
- package/dist/debug-group.d.ts.map +1 -0
- package/dist/debug-group.js +44 -0
- package/dist/debug-group.js.map +1 -0
- package/dist/debug-stroke-geom.d.ts +2 -0
- package/dist/debug-stroke-geom.d.ts.map +1 -0
- package/dist/debug-stroke-geom.js +67 -0
- package/dist/debug-stroke-geom.js.map +1 -0
- package/dist/debug-transforms.d.ts +2 -0
- package/dist/debug-transforms.d.ts.map +1 -0
- package/dist/debug-transforms.js +97 -0
- package/dist/debug-transforms.js.map +1 -0
- package/dist/debug-vertex.d.ts +2 -0
- package/dist/debug-vertex.d.ts.map +1 -0
- package/dist/debug-vertex.js +72 -0
- package/dist/debug-vertex.js.map +1 -0
- package/dist/decode-vector-network.d.ts +5 -0
- package/dist/decode-vector-network.d.ts.map +1 -0
- package/dist/decode-vector-network.js +160 -0
- package/dist/decode-vector-network.js.map +1 -0
- package/dist/experimental/paint-utils.d.ts +35 -0
- package/dist/experimental/paint-utils.d.ts.map +1 -0
- package/dist/experimental/paint-utils.js +105 -0
- package/dist/experimental/paint-utils.js.map +1 -0
- package/dist/experimental/render-screen-v2.d.ts +32 -0
- package/dist/experimental/render-screen-v2.d.ts.map +1 -0
- package/dist/experimental/render-screen-v2.js +366 -0
- package/dist/experimental/render-screen-v2.js.map +1 -0
- package/dist/experimental/render-screen.d.ts +26 -0
- package/dist/experimental/render-screen.d.ts.map +1 -0
- package/dist/experimental/render-screen.js +547 -0
- package/dist/experimental/render-screen.js.map +1 -0
- package/dist/experimental/render-types.d.ts +43 -0
- package/dist/experimental/render-types.d.ts.map +1 -0
- package/dist/experimental/render-types.js +22 -0
- package/dist/experimental/render-types.js.map +1 -0
- package/dist/experimental/render-utils.d.ts +38 -0
- package/dist/experimental/render-utils.d.ts.map +1 -0
- package/dist/experimental/render-utils.js +126 -0
- package/dist/experimental/render-utils.js.map +1 -0
- package/dist/experimental/screenshot.d.ts +11 -0
- package/dist/experimental/screenshot.d.ts.map +1 -0
- package/dist/experimental/screenshot.js +26 -0
- package/dist/experimental/screenshot.js.map +1 -0
- package/dist/experimental/vector-renderer.d.ts +31 -0
- package/dist/experimental/vector-renderer.d.ts.map +1 -0
- package/dist/experimental/vector-renderer.js +427 -0
- package/dist/experimental/vector-renderer.js.map +1 -0
- package/dist/explore-images.d.ts +9 -0
- package/dist/explore-images.d.ts.map +1 -0
- package/dist/explore-images.js +307 -0
- package/dist/explore-images.js.map +1 -0
- package/dist/http-server.d.ts +8 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +95 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect-fig.d.ts +16 -0
- package/dist/inspect-fig.d.ts.map +1 -0
- package/dist/inspect-fig.js +134 -0
- package/dist/inspect-fig.js.map +1 -0
- package/dist/inspect-frame.d.ts +2 -0
- package/dist/inspect-frame.d.ts.map +1 -0
- package/dist/inspect-frame.js +90 -0
- package/dist/inspect-frame.js.map +1 -0
- package/dist/inspect-nodes.d.ts +5 -0
- package/dist/inspect-nodes.d.ts.map +1 -0
- package/dist/inspect-nodes.js +193 -0
- package/dist/inspect-nodes.js.map +1 -0
- package/dist/mcp/server.d.ts +38 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +1524 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parser/fig-reader.d.ts +29 -0
- package/dist/parser/fig-reader.d.ts.map +1 -0
- package/dist/parser/fig-reader.js +182 -0
- package/dist/parser/fig-reader.js.map +1 -0
- package/dist/parser/index.d.ts +48 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +106 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/kiwi-parser.d.ts +66 -0
- package/dist/parser/kiwi-parser.d.ts.map +1 -0
- package/dist/parser/kiwi-parser.js +491 -0
- package/dist/parser/kiwi-parser.js.map +1 -0
- package/dist/parser/layout-inference.d.ts +63 -0
- package/dist/parser/layout-inference.d.ts.map +1 -0
- package/dist/parser/layout-inference.js +446 -0
- package/dist/parser/layout-inference.js.map +1 -0
- package/dist/parser/types.d.ts +286 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +6 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/render-single.d.ts +2 -0
- package/dist/render-single.d.ts.map +1 -0
- package/dist/render-single.js +53 -0
- package/dist/render-single.js.map +1 -0
- package/dist/renderer/index.d.ts +16 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +18 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/paint-utils.d.ts +35 -0
- package/dist/renderer/paint-utils.d.ts.map +1 -0
- package/dist/renderer/paint-utils.js +105 -0
- package/dist/renderer/paint-utils.js.map +1 -0
- package/dist/renderer/render-screen.d.ts +26 -0
- package/dist/renderer/render-screen.d.ts.map +1 -0
- package/dist/renderer/render-screen.js +547 -0
- package/dist/renderer/render-screen.js.map +1 -0
- package/dist/renderer/render-types.d.ts +43 -0
- package/dist/renderer/render-types.d.ts.map +1 -0
- package/dist/renderer/render-types.js +22 -0
- package/dist/renderer/render-types.js.map +1 -0
- package/dist/renderer/render-utils.d.ts +38 -0
- package/dist/renderer/render-utils.d.ts.map +1 -0
- package/dist/renderer/render-utils.js +126 -0
- package/dist/renderer/render-utils.js.map +1 -0
- package/dist/renderer/screenshot.d.ts +11 -0
- package/dist/renderer/screenshot.d.ts.map +1 -0
- package/dist/renderer/screenshot.js +26 -0
- package/dist/renderer/screenshot.js.map +1 -0
- package/dist/renderer/vector-renderer.d.ts +31 -0
- package/dist/renderer/vector-renderer.d.ts.map +1 -0
- package/dist/renderer/vector-renderer.js +427 -0
- package/dist/renderer/vector-renderer.js.map +1 -0
- package/dist/shared-config.d.ts +9 -0
- package/dist/shared-config.d.ts.map +1 -0
- package/dist/shared-config.js +9 -0
- package/dist/shared-config.js.map +1 -0
- package/dist/test-parser.d.ts +3 -0
- package/dist/test-parser.d.ts.map +1 -0
- package/dist/test-parser.js +74 -0
- package/dist/test-parser.js.map +1 -0
- package/dist/test-render-v2.d.ts +5 -0
- package/dist/test-render-v2.d.ts.map +1 -0
- package/dist/test-render-v2.js +76 -0
- package/dist/test-render-v2.js.map +1 -0
- package/dist/test-render.d.ts +5 -0
- package/dist/test-render.d.ts.map +1 -0
- package/dist/test-render.js +76 -0
- package/dist/test-render.js.map +1 -0
- package/dist/vector-export.d.ts +52 -0
- package/dist/vector-export.d.ts.map +1 -0
- package/dist/vector-export.js +628 -0
- package/dist/vector-export.js.map +1 -0
- package/dist/web-viewer/build-client.d.ts +6 -0
- package/dist/web-viewer/build-client.d.ts.map +1 -0
- package/dist/web-viewer/build-client.js +36 -0
- package/dist/web-viewer/build-client.js.map +1 -0
- package/dist/web-viewer/client/viewer.d.ts +7 -0
- package/dist/web-viewer/client/viewer.d.ts.map +1 -0
- package/dist/web-viewer/client/viewer.js +873 -0
- package/dist/web-viewer/client/viewer.js.map +1 -0
- package/dist/web-viewer/server.d.ts +16 -0
- package/dist/web-viewer/server.d.ts.map +1 -0
- package/dist/web-viewer/server.js +420 -0
- package/dist/web-viewer/server.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decode and inspect vectorNetworkBlob format
|
|
3
|
+
*/
|
|
4
|
+
import { readFigFile } from "./parser/index.js";
|
|
5
|
+
import { parseCanvasFig } from "./parser/kiwi-parser.js";
|
|
6
|
+
const FILE_PATH = "/Users/billy/Downloads/AutoDevice (Copy).fig";
|
|
7
|
+
// Test with different vectors:
|
|
8
|
+
// Simple horizontal line (2 vertices, 1 segment)
|
|
9
|
+
const SIMPLE_LINE_NODE = "457:1695"; // Size: 10 x 0
|
|
10
|
+
// Complex polygon (8+ vertices)
|
|
11
|
+
const COMPLEX_SHAPE_NODE = "457:1697"; // Size: 18 x 12
|
|
12
|
+
// Rotated filled shape
|
|
13
|
+
const ROTATED_NODE = "457:1682";
|
|
14
|
+
async function decodeVectorNetwork() {
|
|
15
|
+
console.log("Reading .fig file...");
|
|
16
|
+
const archive = await readFigFile(FILE_PATH);
|
|
17
|
+
const parsed = parseCanvasFig(archive.canvasFig);
|
|
18
|
+
const nodeChanges = parsed.message["nodeChanges"];
|
|
19
|
+
const blobs = parsed.message["blobs"];
|
|
20
|
+
if (!blobs) {
|
|
21
|
+
console.log("No blobs found!");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Build node map
|
|
25
|
+
const nodeMap = new Map();
|
|
26
|
+
for (const change of nodeChanges) {
|
|
27
|
+
if (!change || typeof change !== "object")
|
|
28
|
+
continue;
|
|
29
|
+
const obj = change;
|
|
30
|
+
const guid = obj["guid"];
|
|
31
|
+
if (guid) {
|
|
32
|
+
nodeMap.set(`${guid.sessionID}:${guid.localID}`, obj);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (const nodeId of [SIMPLE_LINE_NODE, COMPLEX_SHAPE_NODE, ROTATED_NODE]) {
|
|
36
|
+
console.log("\n" + "=".repeat(80));
|
|
37
|
+
console.log(`Decoding vectorNetwork for: ${nodeId}`);
|
|
38
|
+
console.log("=".repeat(80));
|
|
39
|
+
const node = nodeMap.get(nodeId);
|
|
40
|
+
if (!node) {
|
|
41
|
+
console.log("Node not found!");
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
console.log(`Type: ${node["type"]}, Name: ${node["name"]}`);
|
|
45
|
+
const size = node["size"];
|
|
46
|
+
console.log(`Size: ${size?.x} x ${size?.y}`);
|
|
47
|
+
const vectorData = node["vectorData"];
|
|
48
|
+
if (!vectorData || vectorData.vectorNetworkBlob === undefined) {
|
|
49
|
+
console.log("No vectorData.vectorNetworkBlob!");
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
console.log(`NormalizedSize: ${JSON.stringify(vectorData.normalizedSize)}`);
|
|
53
|
+
const blobIndex = vectorData.vectorNetworkBlob;
|
|
54
|
+
const blob = blobs[blobIndex];
|
|
55
|
+
if (!blob?.bytes) {
|
|
56
|
+
console.log("Blob not found!");
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const bytes = blob.bytes;
|
|
60
|
+
console.log(`\nBlob size: ${bytes.length} bytes`);
|
|
61
|
+
console.log(`Raw bytes: [${Array.from(bytes.slice(0, 60)).join(", ")}...]`);
|
|
62
|
+
// Try to decode the structure
|
|
63
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
64
|
+
let offset = 0;
|
|
65
|
+
// Read counts (appears to be 4-byte little-endian integers)
|
|
66
|
+
const count1 = view.getUint32(offset, true);
|
|
67
|
+
offset += 4;
|
|
68
|
+
const count2 = view.getUint32(offset, true);
|
|
69
|
+
offset += 4;
|
|
70
|
+
const count3 = view.getUint32(offset, true);
|
|
71
|
+
offset += 4;
|
|
72
|
+
console.log(`\nStructure (assuming uint32 counts):`);
|
|
73
|
+
console.log(` Count1 (vertices?): ${count1}`);
|
|
74
|
+
console.log(` Count2 (segments?): ${count2}`);
|
|
75
|
+
console.log(` Count3 (regions?): ${count3}`);
|
|
76
|
+
// For simple lines (2 vertices, 1 segment), try to read vertex data
|
|
77
|
+
if (count1 === 2 && count2 === 1) {
|
|
78
|
+
console.log(`\nSimple line detected! Attempting to read vertex positions...`);
|
|
79
|
+
// After the 3 counts (12 bytes), we should have vertex data
|
|
80
|
+
// Each vertex likely has: x (float), y (float), and possibly handle data
|
|
81
|
+
console.log(`\nRemaining bytes after counts: ${bytes.length - 12}`);
|
|
82
|
+
// Try reading as floats
|
|
83
|
+
console.log(`\nAttempting to read as floats starting at offset 12:`);
|
|
84
|
+
for (let i = 0; i < Math.min(8, (bytes.length - 12) / 4); i++) {
|
|
85
|
+
const f = view.getFloat32(12 + i * 4, true);
|
|
86
|
+
console.log(` float[${i}] @ offset ${12 + i * 4}: ${f}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// For more complex shapes, try different interpretations
|
|
90
|
+
if (count1 > 2) {
|
|
91
|
+
console.log(`\nComplex shape with ${count1} vertices and ${count2} segments`);
|
|
92
|
+
// Try to find vertex positions
|
|
93
|
+
console.log(`\nAttempting to read vertex positions as floats:`);
|
|
94
|
+
const vertexStart = 12; // After the 3 counts
|
|
95
|
+
// Each vertex might be: x (4), y (4) = 8 bytes minimum
|
|
96
|
+
// Or with handles: x (4), y (4), handleMode (4), handleIn (8), handleOut (8) = 28+ bytes
|
|
97
|
+
const bytesPerVertex = (bytes.length - 12) / count1;
|
|
98
|
+
console.log(`Estimated bytes per vertex: ${bytesPerVertex.toFixed(1)}`);
|
|
99
|
+
// Read first few vertices assuming just x,y floats
|
|
100
|
+
console.log(`\nFirst 4 vertices (assuming x,y floats):`);
|
|
101
|
+
for (let v = 0; v < Math.min(4, count1); v++) {
|
|
102
|
+
const vOffset = vertexStart + v * 8;
|
|
103
|
+
if (vOffset + 8 <= bytes.length) {
|
|
104
|
+
const x = view.getFloat32(vOffset, true);
|
|
105
|
+
const y = view.getFloat32(vOffset + 4, true);
|
|
106
|
+
console.log(` Vertex ${v}: (${x.toFixed(4)}, ${y.toFixed(4)})`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Also decode the strokeGeometry/fillGeometry path commands for comparison
|
|
111
|
+
const strokeGeometry = node["strokeGeometry"];
|
|
112
|
+
const fillGeometry = node["fillGeometry"];
|
|
113
|
+
const geom = strokeGeometry?.[0] || fillGeometry?.[0];
|
|
114
|
+
if (geom?.commandsBlob !== undefined) {
|
|
115
|
+
const pathBlob = blobs[geom.commandsBlob];
|
|
116
|
+
if (pathBlob?.bytes) {
|
|
117
|
+
console.log(`\nPath commands blob (${pathBlob.bytes.length} bytes):`);
|
|
118
|
+
decodePathCommands(pathBlob.bytes);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function decodePathCommands(bytes) {
|
|
124
|
+
const cmdNames = {
|
|
125
|
+
0: "CLOSE",
|
|
126
|
+
1: "MOVE",
|
|
127
|
+
2: "LINE",
|
|
128
|
+
3: "QUAD",
|
|
129
|
+
4: "CUBIC",
|
|
130
|
+
};
|
|
131
|
+
const cmdArgCounts = {
|
|
132
|
+
0: 0, 1: 2, 2: 2, 3: 4, 4: 6,
|
|
133
|
+
};
|
|
134
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
135
|
+
let offset = 0;
|
|
136
|
+
let cmdIndex = 0;
|
|
137
|
+
while (offset < bytes.length && cmdIndex < 20) {
|
|
138
|
+
const cmd = bytes[offset++];
|
|
139
|
+
const cmdName = cmdNames[cmd] || `UNKNOWN(${cmd})`;
|
|
140
|
+
const argCount = cmdArgCounts[cmd] ?? 0;
|
|
141
|
+
const args = [];
|
|
142
|
+
for (let i = 0; i < argCount && offset + 4 <= bytes.length; i++) {
|
|
143
|
+
args.push(view.getFloat32(offset, true));
|
|
144
|
+
offset += 4;
|
|
145
|
+
}
|
|
146
|
+
if (args.length > 0) {
|
|
147
|
+
const argStr = args.map(a => a.toFixed(4)).join(", ");
|
|
148
|
+
console.log(` [${cmdIndex}] ${cmdName}: ${argStr}`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
console.log(` [${cmdIndex}] ${cmdName}`);
|
|
152
|
+
}
|
|
153
|
+
cmdIndex++;
|
|
154
|
+
}
|
|
155
|
+
if (offset < bytes.length) {
|
|
156
|
+
console.log(` ... (${bytes.length - offset} more bytes)`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
decodeVectorNetwork().catch(console.error);
|
|
160
|
+
//# sourceMappingURL=decode-vector-network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode-vector-network.js","sourceRoot":"","sources":["../src/decode-vector-network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paint handling utilities for SVG rendering
|
|
3
|
+
*/
|
|
4
|
+
import type { FigNode, Paint } from "../parser/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Get paints array from a node (handles both 'fills'/'strokes' and 'fillPaints'/'strokePaints').
|
|
7
|
+
*/
|
|
8
|
+
export declare function getPaints(node: FigNode, key: "fills" | "strokes"): Paint[] | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Get the first visible paint from an array.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getVisiblePaint(paints: Paint[] | undefined): Paint | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Convert a paint to a CSS color string.
|
|
15
|
+
* Returns undefined if the paint is not visible or not a solid color.
|
|
16
|
+
*/
|
|
17
|
+
export declare function paintToColor(paint: Paint | undefined): string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Normalize an image hash from various formats to a hex string.
|
|
20
|
+
* Handles: string, array of bytes, object with hash property, or object with numeric keys.
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeImageHash(value: unknown): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Extract image hash from a paint object.
|
|
25
|
+
*/
|
|
26
|
+
export declare function paintToImageHash(paint: Paint | undefined): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Detect image format from binary data.
|
|
29
|
+
*/
|
|
30
|
+
export declare function detectImageFormat(data: Uint8Array): string;
|
|
31
|
+
/**
|
|
32
|
+
* Get MIME type for image format.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getMimeType(format: string): string;
|
|
35
|
+
//# sourceMappingURL=paint-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paint-utils.d.ts","sourceRoot":"","sources":["../../src/experimental/paint-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,SAAS,GAAG,KAAK,EAAE,GAAG,SAAS,CAItF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAG9E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAOzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkChE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAM1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQlD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paint handling utilities for SVG rendering
|
|
3
|
+
*/
|
|
4
|
+
import { colorToCSS } from "../parser/layout-inference.js";
|
|
5
|
+
/**
|
|
6
|
+
* Get paints array from a node (handles both 'fills'/'strokes' and 'fillPaints'/'strokePaints').
|
|
7
|
+
*/
|
|
8
|
+
export function getPaints(node, key) {
|
|
9
|
+
const record = node;
|
|
10
|
+
const paints = record[key] ?? record[key === "fills" ? "fillPaints" : "strokePaints"];
|
|
11
|
+
return Array.isArray(paints) ? paints : undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the first visible paint from an array.
|
|
15
|
+
*/
|
|
16
|
+
export function getVisiblePaint(paints) {
|
|
17
|
+
if (!paints)
|
|
18
|
+
return undefined;
|
|
19
|
+
return paints.find((p) => p.visible !== false);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Convert a paint to a CSS color string.
|
|
23
|
+
* Returns undefined if the paint is not visible or not a solid color.
|
|
24
|
+
*/
|
|
25
|
+
export function paintToColor(paint) {
|
|
26
|
+
if (!paint || paint.visible === false || paint.type !== "SOLID" || !paint.color) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const opacity = paint.opacity ?? 1;
|
|
30
|
+
const color = { ...paint.color, a: paint.color.a * opacity };
|
|
31
|
+
return colorToCSS(color);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Normalize an image hash from various formats to a hex string.
|
|
35
|
+
* Handles: string, array of bytes, object with hash property, or object with numeric keys.
|
|
36
|
+
*/
|
|
37
|
+
export function normalizeImageHash(value) {
|
|
38
|
+
if (!value)
|
|
39
|
+
return null;
|
|
40
|
+
if (typeof value === "string")
|
|
41
|
+
return value.toLowerCase();
|
|
42
|
+
if (Array.isArray(value) && value.length === 20) {
|
|
43
|
+
const bytes = value.filter((b) => typeof b === "number");
|
|
44
|
+
if (bytes.length === 20) {
|
|
45
|
+
return bytes.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (typeof value === "object") {
|
|
49
|
+
const obj = value;
|
|
50
|
+
if (obj["hash"] && typeof obj["hash"] === "object") {
|
|
51
|
+
const bytes = obj["hash"];
|
|
52
|
+
return Object.keys(bytes)
|
|
53
|
+
.filter((key) => /^\d+$/.test(key))
|
|
54
|
+
.sort((a, b) => Number(a) - Number(b))
|
|
55
|
+
.map((key) => bytes[key].toString(16).padStart(2, "0"))
|
|
56
|
+
.join("");
|
|
57
|
+
}
|
|
58
|
+
const hasByteKeys = Object.keys(obj).some((key) => /^\d+$/.test(key));
|
|
59
|
+
if (hasByteKeys) {
|
|
60
|
+
const bytes = obj;
|
|
61
|
+
return Object.keys(bytes)
|
|
62
|
+
.filter((key) => /^\d+$/.test(key))
|
|
63
|
+
.sort((a, b) => Number(a) - Number(b))
|
|
64
|
+
.map((key) => bytes[key].toString(16).padStart(2, "0"))
|
|
65
|
+
.join("");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract image hash from a paint object.
|
|
72
|
+
*/
|
|
73
|
+
export function paintToImageHash(paint) {
|
|
74
|
+
if (!paint)
|
|
75
|
+
return null;
|
|
76
|
+
const record = paint;
|
|
77
|
+
return normalizeImageHash(record["image"]) ?? normalizeImageHash(record["imageHash"]);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Detect image format from binary data.
|
|
81
|
+
*/
|
|
82
|
+
export function detectImageFormat(data) {
|
|
83
|
+
if (data[0] === 0xff && data[1] === 0xd8)
|
|
84
|
+
return "jpeg";
|
|
85
|
+
if (data[0] === 0x89 && data[1] === 0x50 && data[2] === 0x4e && data[3] === 0x47)
|
|
86
|
+
return "png";
|
|
87
|
+
if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46)
|
|
88
|
+
return "gif";
|
|
89
|
+
if (data[0] === 0x52 && data[1] === 0x49 && data[2] === 0x46 && data[3] === 0x46)
|
|
90
|
+
return "webp";
|
|
91
|
+
return "unknown";
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get MIME type for image format.
|
|
95
|
+
*/
|
|
96
|
+
export function getMimeType(format) {
|
|
97
|
+
switch (format) {
|
|
98
|
+
case "jpeg": return "image/jpeg";
|
|
99
|
+
case "png": return "image/png";
|
|
100
|
+
case "gif": return "image/gif";
|
|
101
|
+
case "webp": return "image/webp";
|
|
102
|
+
default: return "application/octet-stream";
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=paint-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paint-utils.js","sourceRoot":"","sources":["../../src/experimental/paint-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAa,EAAE,GAAwB;IAC/D,MAAM,MAAM,GAAG,IAA0C,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAA2B;IACzD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC;IAC7D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAE1D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAa,CAAC;QACrE,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAA2B,CAAC;YACpD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;iBACtB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;iBACrC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;iBACtD,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,GAA6B,CAAC;YAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;iBACtB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;iBACrC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;iBACtD,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAwB;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,KAA2C,CAAC;IAC3D,OAAO,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgB;IAChD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACxD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/F,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3E,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAChG,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,OAAO,YAAY,CAAC;QACjC,KAAK,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC;QAC/B,KAAK,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC;QAC/B,KAAK,MAAM,CAAC,CAAC,OAAO,YAAY,CAAC;QACjC,OAAO,CAAC,CAAC,OAAO,0BAA0B,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render Screen V2 - Improved vector rendering
|
|
3
|
+
*
|
|
4
|
+
* Key improvements over v1:
|
|
5
|
+
* 1. For stroked vectors: Use vectorNetworkBlob or normalizedSize to get centerline, NOT strokeGeometry
|
|
6
|
+
* 2. strokeGeometry contains pre-outlined stroke - only use as fallback
|
|
7
|
+
* 3. Proper transform composition for rotated/positioned vectors
|
|
8
|
+
* 4. Better detection of stroked vs filled vectors
|
|
9
|
+
* 5. Mask rendering support (isMask flag handling)
|
|
10
|
+
* 6. Image embedding support
|
|
11
|
+
* 7. Full text styling (font-style, letter-spacing, etc.)
|
|
12
|
+
*/
|
|
13
|
+
import type { FigmaNode } from "../parser/types.js";
|
|
14
|
+
import type { BlobEntry, RenderScreenOptions, RenderScreenResult } from "./render-types.js";
|
|
15
|
+
export type { RenderScreenOptions, RenderScreenResult } from "./render-types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Render a Figma node subtree to SVG.
|
|
18
|
+
*
|
|
19
|
+
* @param node - The root node to render
|
|
20
|
+
* @param images - Optional map of image hash -> image data for embedding
|
|
21
|
+
* @param blobs - Optional array of blob data for vector paths
|
|
22
|
+
* @param options - Rendering options
|
|
23
|
+
* @returns The rendered SVG and metadata
|
|
24
|
+
*/
|
|
25
|
+
export declare function renderScreenV2(node: FigmaNode, images?: Map<string, Uint8Array>, blobs?: BlobEntry[], options?: RenderScreenOptions): RenderScreenResult;
|
|
26
|
+
/**
|
|
27
|
+
* Alias for backwards compatibility with V1 interface.
|
|
28
|
+
* V1 used: renderScreen(node, images, blobs, options)
|
|
29
|
+
* V2 uses: renderScreenV2(node, images, blobs, options)
|
|
30
|
+
*/
|
|
31
|
+
export declare const renderScreen: typeof renderScreenV2;
|
|
32
|
+
//# sourceMappingURL=render-screen-v2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-screen-v2.d.ts","sourceRoot":"","sources":["../../src/experimental/render-screen-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAA+B,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAEV,SAAS,EAET,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAuB3B,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAmXjF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,KAAK,CAAC,EAAE,SAAS,EAAE,EACnB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA4CpB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,uBAAiB,CAAC"}
|