@bilalba/fig-mcp 1.0.0 → 1.1.2
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/LICENSE +21 -0
- package/README.md +110 -55
- package/dist/index.js +59 -2
- package/dist/index.js.map +1 -1
- package/dist/inspect-fig.d.ts +1 -1
- package/dist/inspect-fig.d.ts.map +1 -1
- package/dist/inspect-fig.js +7 -3
- package/dist/inspect-fig.js.map +1 -1
- package/package.json +5 -2
- package/dist/debug/debug-stroke-geom.d.ts +0 -2
- package/dist/debug/debug-stroke-geom.d.ts.map +0 -1
- package/dist/debug/debug-stroke-geom.js +0 -67
- package/dist/debug/debug-stroke-geom.js.map +0 -1
- package/dist/debug/debug-transforms.d.ts +0 -2
- package/dist/debug/debug-transforms.d.ts.map +0 -1
- package/dist/debug/debug-transforms.js +0 -97
- package/dist/debug/debug-transforms.js.map +0 -1
- package/dist/debug/debug-vertex.d.ts +0 -2
- package/dist/debug/debug-vertex.d.ts.map +0 -1
- package/dist/debug/debug-vertex.js +0 -72
- package/dist/debug/debug-vertex.js.map +0 -1
- package/dist/debug-group.d.ts +0 -5
- package/dist/debug-group.d.ts.map +0 -1
- package/dist/debug-group.js +0 -44
- package/dist/debug-group.js.map +0 -1
- package/dist/debug-stroke-geom.d.ts +0 -2
- package/dist/debug-stroke-geom.d.ts.map +0 -1
- package/dist/debug-stroke-geom.js +0 -67
- package/dist/debug-stroke-geom.js.map +0 -1
- package/dist/debug-transforms.d.ts +0 -2
- package/dist/debug-transforms.d.ts.map +0 -1
- package/dist/debug-transforms.js +0 -97
- package/dist/debug-transforms.js.map +0 -1
- package/dist/debug-vertex.d.ts +0 -2
- package/dist/debug-vertex.d.ts.map +0 -1
- package/dist/debug-vertex.js +0 -72
- package/dist/debug-vertex.js.map +0 -1
- package/dist/experimental/paint-utils.d.ts +0 -35
- package/dist/experimental/paint-utils.d.ts.map +0 -1
- package/dist/experimental/paint-utils.js +0 -105
- package/dist/experimental/paint-utils.js.map +0 -1
- package/dist/experimental/render-screen-v2.d.ts +0 -32
- package/dist/experimental/render-screen-v2.d.ts.map +0 -1
- package/dist/experimental/render-screen-v2.js +0 -366
- package/dist/experimental/render-screen-v2.js.map +0 -1
- package/dist/experimental/render-screen.d.ts +0 -26
- package/dist/experimental/render-screen.d.ts.map +0 -1
- package/dist/experimental/render-screen.js +0 -547
- package/dist/experimental/render-screen.js.map +0 -1
- package/dist/experimental/render-types.d.ts +0 -43
- package/dist/experimental/render-types.d.ts.map +0 -1
- package/dist/experimental/render-types.js +0 -22
- package/dist/experimental/render-types.js.map +0 -1
- package/dist/experimental/render-utils.d.ts +0 -38
- package/dist/experimental/render-utils.d.ts.map +0 -1
- package/dist/experimental/render-utils.js +0 -126
- package/dist/experimental/render-utils.js.map +0 -1
- package/dist/experimental/screenshot.d.ts +0 -11
- package/dist/experimental/screenshot.d.ts.map +0 -1
- package/dist/experimental/screenshot.js +0 -26
- package/dist/experimental/screenshot.js.map +0 -1
- package/dist/experimental/vector-renderer.d.ts +0 -31
- package/dist/experimental/vector-renderer.d.ts.map +0 -1
- package/dist/experimental/vector-renderer.js +0 -427
- package/dist/experimental/vector-renderer.js.map +0 -1
- package/dist/test-render-v2.d.ts +0 -5
- package/dist/test-render-v2.d.ts.map +0 -1
- package/dist/test-render-v2.js +0 -76
- package/dist/test-render-v2.js.map +0 -1
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debug vertex parsing for complex vector 457:1697
|
|
3
|
-
*/
|
|
4
|
-
import { readFigFile } from "../parser/index.js";
|
|
5
|
-
import { parseCanvasFig, formatGUID, extractDocumentTree } from "../parser/kiwi-parser.js";
|
|
6
|
-
async function debug() {
|
|
7
|
-
const archive = await readFigFile("/Users/billy/Downloads/AutoDevice (Copy).fig");
|
|
8
|
-
const parsed = parseCanvasFig(archive.canvasFig);
|
|
9
|
-
const doc = extractDocumentTree(parsed.message);
|
|
10
|
-
if (!doc)
|
|
11
|
-
return;
|
|
12
|
-
const nodeIndex = new Map();
|
|
13
|
-
function indexNode(node) {
|
|
14
|
-
nodeIndex.set(formatGUID(node.guid), node);
|
|
15
|
-
if (node.children) {
|
|
16
|
-
for (const child of node.children) {
|
|
17
|
-
indexNode(child);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
indexNode(doc);
|
|
22
|
-
const blobs = parsed.message["blobs"];
|
|
23
|
-
const rawNode = nodeIndex.get("457:1697");
|
|
24
|
-
if (!rawNode) {
|
|
25
|
-
console.log("Node 457:1697 not found");
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const node = rawNode;
|
|
29
|
-
const vectorData = node.vectorData;
|
|
30
|
-
if (!vectorData) {
|
|
31
|
-
console.log("Node has no vectorData");
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const blobIndex = vectorData.vectorNetworkBlob;
|
|
35
|
-
const bytes = blobs[blobIndex].bytes;
|
|
36
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
37
|
-
console.log("Complex vector 457:1697");
|
|
38
|
-
console.log("normalizedSize:", vectorData.normalizedSize);
|
|
39
|
-
console.log("\nHeader:");
|
|
40
|
-
console.log(" vertices:", view.getUint32(0, true));
|
|
41
|
-
console.log(" segments:", view.getUint32(4, true));
|
|
42
|
-
console.log(" regions:", view.getUint32(8, true));
|
|
43
|
-
console.log("\nVertex raw bytes (16 bytes each):");
|
|
44
|
-
for (let i = 0; i < 8; i++) {
|
|
45
|
-
const offset = 12 + i * 16;
|
|
46
|
-
const hexBytes = Buffer.from(bytes.slice(offset, offset + 16)).toString("hex");
|
|
47
|
-
const x = view.getFloat32(offset, true);
|
|
48
|
-
const y = view.getFloat32(offset + 4, true);
|
|
49
|
-
const auxA = view.getFloat32(offset + 8, true);
|
|
50
|
-
const auxB = view.getFloat32(offset + 12, true);
|
|
51
|
-
console.log(` [${i}] hex: ${hexBytes}`);
|
|
52
|
-
console.log(` x=${x.toFixed(2)}, y=${y.toFixed(2)}, auxA=${auxA.toFixed(2)}, auxB=${auxB.toFixed(2)}`);
|
|
53
|
-
}
|
|
54
|
-
console.log("\nSegment raw bytes (from offset 140):");
|
|
55
|
-
const segmentStart = 12 + 8 * 16; // 140
|
|
56
|
-
for (let i = 0; i < 8; i++) {
|
|
57
|
-
const offset = segmentStart + i * 24;
|
|
58
|
-
if (offset + 24 > bytes.length)
|
|
59
|
-
break;
|
|
60
|
-
const hexBytes = Buffer.from(bytes.slice(offset, offset + 24)).toString("hex");
|
|
61
|
-
const s0 = view.getUint32(offset, true);
|
|
62
|
-
const f1 = view.getFloat32(offset + 4, true);
|
|
63
|
-
const f2 = view.getFloat32(offset + 8, true);
|
|
64
|
-
const s1 = view.getUint32(offset + 12, true);
|
|
65
|
-
const f3 = view.getFloat32(offset + 16, true);
|
|
66
|
-
const f4 = view.getFloat32(offset + 20, true);
|
|
67
|
-
console.log(` [${i}] hex: ${hexBytes}`);
|
|
68
|
-
console.log(` ${s0} -> ${s1}, (${f1.toFixed(3)}, ${f2.toFixed(3)}), (${f3.toFixed(3)}, ${f4.toFixed(3)})`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
debug().catch(console.error);
|
|
72
|
-
//# sourceMappingURL=debug-vertex.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-vertex.js","sourceRoot":"","sources":["../../src/debug/debug-vertex.ts"],"names":[],"mappings":"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"}
|
package/dist/debug-group.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-group.d.ts","sourceRoot":"","sources":["../src/debug-group.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/debug-group.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debug script to investigate node 457:1682 and its parent structure
|
|
3
|
-
*/
|
|
4
|
-
import { parseFigFile, buildNodeIdIndex, formatGUID } from "./parser/index.js";
|
|
5
|
-
import { nodeToSvg } from "./vector-export.js";
|
|
6
|
-
async function main() {
|
|
7
|
-
const filePath = "/Users/billy/Downloads/AutoDevice (Copy).fig";
|
|
8
|
-
console.log("Parsing fig file...");
|
|
9
|
-
const parsed = await parseFigFile(filePath);
|
|
10
|
-
const nodeIdIndex = buildNodeIdIndex(parsed.document);
|
|
11
|
-
// Check parent node 457:1681
|
|
12
|
-
const parent = nodeIdIndex.get("457:1681");
|
|
13
|
-
if (parent) {
|
|
14
|
-
const parentScene = parent;
|
|
15
|
-
console.log("\n=== Parent Node 457:1681 ===");
|
|
16
|
-
console.log("Type:", parent.type);
|
|
17
|
-
console.log("Name:", parent.name);
|
|
18
|
-
console.log("x:", parentScene.x);
|
|
19
|
-
console.log("y:", parentScene.y);
|
|
20
|
-
console.log("width:", parentScene.width ?? parentScene.size?.x);
|
|
21
|
-
console.log("height:", parentScene.height ?? parentScene.size?.y);
|
|
22
|
-
if (parent.children?.length) {
|
|
23
|
-
console.log("\nChildren positions:");
|
|
24
|
-
for (const child of parent.children) {
|
|
25
|
-
const childScene = child;
|
|
26
|
-
console.log(` ${formatGUID(child.guid)} ${child.name}:`);
|
|
27
|
-
console.log(` x: ${childScene.x}, y: ${childScene.y}`);
|
|
28
|
-
console.log(` width: ${childScene.width ?? childScene.size?.x}, height: ${childScene.height ?? childScene.size?.y}`);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
// Test nodeToSvg on parent
|
|
32
|
-
try {
|
|
33
|
-
const svg2 = nodeToSvg(parent, parsed.blobs);
|
|
34
|
-
console.log("\nParent nodeToSvg result:");
|
|
35
|
-
console.log(" SVG paths count:", (svg2.svgString.match(/<path/g) || []).length);
|
|
36
|
-
console.log(" SVG:\n", svg2.svgString);
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
console.log("Error generating SVG for parent:", err);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
main().catch(console.error);
|
|
44
|
-
//# sourceMappingURL=debug-group.js.map
|
package/dist/debug-group.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-group.js","sourceRoot":"","sources":["../src/debug-group.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAgB,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG7D,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,8CAA8C,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEtD,6BAA6B;IAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,WAAW,GAAG,MAA8B,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAElE,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,KAA6B,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,UAAU,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,aAAa,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1H,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-stroke-geom.d.ts","sourceRoot":"","sources":["../src/debug-stroke-geom.ts"],"names":[],"mappings":""}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debug strokeGeometry for complex vector 457:1697
|
|
3
|
-
*/
|
|
4
|
-
import { readFigFile } from "./parser/index.js";
|
|
5
|
-
import { parseCanvasFig, formatGUID, extractDocumentTree } from "./parser/kiwi-parser.js";
|
|
6
|
-
async function debug() {
|
|
7
|
-
const archive = await readFigFile("/Users/billy/Downloads/AutoDevice (Copy).fig");
|
|
8
|
-
const parsed = parseCanvasFig(archive.canvasFig);
|
|
9
|
-
const doc = extractDocumentTree(parsed.message);
|
|
10
|
-
if (!doc)
|
|
11
|
-
return;
|
|
12
|
-
const nodeIndex = new Map();
|
|
13
|
-
function indexNode(node) {
|
|
14
|
-
nodeIndex.set(formatGUID(node.guid), node);
|
|
15
|
-
if (node.children) {
|
|
16
|
-
for (const child of node.children) {
|
|
17
|
-
indexNode(child);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
indexNode(doc);
|
|
22
|
-
const blobs = parsed.message["blobs"];
|
|
23
|
-
// Check all 3 vectors in frame 457:1694
|
|
24
|
-
for (const id of ["457:1695", "457:1696", "457:1697"]) {
|
|
25
|
-
const rawNode = nodeIndex.get(id);
|
|
26
|
-
if (!rawNode) {
|
|
27
|
-
console.log(`Node ${id} not found`);
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
const node = rawNode;
|
|
31
|
-
console.log(`\n${"=".repeat(60)}`);
|
|
32
|
-
console.log(`Node ${id}: ${node.name}`);
|
|
33
|
-
console.log("fillGeometry:", JSON.stringify(node.fillGeometry, null, 2));
|
|
34
|
-
console.log("strokeGeometry:", JSON.stringify(node.strokeGeometry, null, 2));
|
|
35
|
-
// If strokeGeometry has commandsBlob, decode it
|
|
36
|
-
const strokeGeom = node.strokeGeometry;
|
|
37
|
-
if (strokeGeom?.[0]?.commandsBlob !== undefined && blobs) {
|
|
38
|
-
const blobIdx = strokeGeom[0].commandsBlob;
|
|
39
|
-
const bytes = blobs[blobIdx].bytes;
|
|
40
|
-
console.log(`\nstrokeGeometry[0].commandsBlob (${bytes.length} bytes):`);
|
|
41
|
-
// Decode path commands
|
|
42
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
43
|
-
const cmdNames = { 0: "Z", 1: "M", 2: "L", 3: "Q", 4: "C", 5: "Q2" };
|
|
44
|
-
const argCounts = { 0: 0, 1: 2, 2: 2, 3: 4, 4: 6, 5: 4 };
|
|
45
|
-
let offset = 0;
|
|
46
|
-
const cmds = [];
|
|
47
|
-
while (offset < bytes.length) {
|
|
48
|
-
const cmd = bytes[offset++];
|
|
49
|
-
const name = cmdNames[cmd] ?? `?${cmd}`;
|
|
50
|
-
const argCount = argCounts[cmd];
|
|
51
|
-
if (argCount === undefined) {
|
|
52
|
-
cmds.push(`${name}(unknown)`);
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
const args = [];
|
|
56
|
-
for (let i = 0; i < argCount && offset + 4 <= bytes.length; i++) {
|
|
57
|
-
args.push(view.getFloat32(offset, true));
|
|
58
|
-
offset += 4;
|
|
59
|
-
}
|
|
60
|
-
cmds.push(`${name}(${args.map(a => a.toFixed(2)).join(", ")})`);
|
|
61
|
-
}
|
|
62
|
-
console.log(cmds.join(" → "));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
debug().catch(console.error);
|
|
67
|
-
//# sourceMappingURL=debug-stroke-geom.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-stroke-geom.js","sourceRoot":"","sources":["../src/debug-stroke-geom.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-transforms.d.ts","sourceRoot":"","sources":["../src/debug-transforms.ts"],"names":[],"mappings":""}
|
package/dist/debug-transforms.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debug transforms - show what transform data exists on nodes
|
|
3
|
-
*/
|
|
4
|
-
import { readFigFile } from "./parser/index.js";
|
|
5
|
-
import { parseCanvasFig, extractDocumentTree, formatGUID } from "./parser/kiwi-parser.js";
|
|
6
|
-
const FILE_PATH = "/Users/billy/Downloads/AutoDevice (Copy).fig";
|
|
7
|
-
const NODE_ID = process.argv[2] || "457:1681";
|
|
8
|
-
function normalizeNodeId(nodeId) {
|
|
9
|
-
let normalized = nodeId.trim();
|
|
10
|
-
if (/^\d+-\d+$/.test(normalized)) {
|
|
11
|
-
normalized = normalized.replace('-', ':');
|
|
12
|
-
}
|
|
13
|
-
return normalized;
|
|
14
|
-
}
|
|
15
|
-
async function debug() {
|
|
16
|
-
const normalizedId = normalizeNodeId(NODE_ID);
|
|
17
|
-
console.log("Node ID:", normalizedId);
|
|
18
|
-
const archive = await readFigFile(FILE_PATH);
|
|
19
|
-
const parsed = parseCanvasFig(archive.canvasFig);
|
|
20
|
-
const doc = extractDocumentTree(parsed.message);
|
|
21
|
-
if (!doc) {
|
|
22
|
-
console.log("Failed to extract document");
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
const nodeIndex = new Map();
|
|
26
|
-
function indexNode(node) {
|
|
27
|
-
nodeIndex.set(formatGUID(node.guid), node);
|
|
28
|
-
if (node.children) {
|
|
29
|
-
for (const child of node.children) {
|
|
30
|
-
indexNode(child);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
indexNode(doc);
|
|
35
|
-
const node = nodeIndex.get(normalizedId);
|
|
36
|
-
if (!node) {
|
|
37
|
-
console.log("Node not found:", normalizedId);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const sceneNode = node;
|
|
41
|
-
console.log("\n=== ROOT NODE ===");
|
|
42
|
-
console.log("Name:", node.name);
|
|
43
|
-
console.log("Type:", node.type);
|
|
44
|
-
console.log("x:", sceneNode.x);
|
|
45
|
-
console.log("y:", sceneNode.y);
|
|
46
|
-
console.log("width:", sceneNode.width);
|
|
47
|
-
console.log("height:", sceneNode.height);
|
|
48
|
-
console.log("transform:", sceneNode.transform);
|
|
49
|
-
if (node.children) {
|
|
50
|
-
console.log("\n=== CHILDREN ===");
|
|
51
|
-
for (const child of node.children) {
|
|
52
|
-
const childScene = child;
|
|
53
|
-
console.log("\n--- Child:", child.name, "(", child.type, ") ---");
|
|
54
|
-
console.log("x:", childScene.x);
|
|
55
|
-
console.log("y:", childScene.y);
|
|
56
|
-
console.log("width:", childScene.width);
|
|
57
|
-
console.log("height:", childScene.height);
|
|
58
|
-
console.log("transform:", childScene.transform);
|
|
59
|
-
console.log("size:", childScene.size);
|
|
60
|
-
console.log("vectorData?.normalizedSize:", childScene.vectorData?.normalizedSize);
|
|
61
|
-
console.log("fillGeometry count:", childScene.fillGeometry?.length || 0);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// Show what renderScreenV2 uses vs what nodeToSvg uses
|
|
65
|
-
console.log("\n=== TRANSFORM USAGE COMPARISON ===");
|
|
66
|
-
console.log("\nrenderScreenV2 (vector-renderer.ts):");
|
|
67
|
-
console.log(" - Uses getLocalTransform() which reads node.transform matrix");
|
|
68
|
-
console.log(" - Composes transforms: multiplyTransforms(parentTransform, localTransform)");
|
|
69
|
-
console.log(" - Handles rotation properly");
|
|
70
|
-
console.log("\nnodeToSvg (vector-export.ts):");
|
|
71
|
-
console.log(" - Uses offset-based positioning only (x/y accumulation)");
|
|
72
|
-
console.log(" - Creates identity-like transform with just scale");
|
|
73
|
-
console.log(" - IGNORES node.transform matrix entirely!");
|
|
74
|
-
// Check if children have transforms
|
|
75
|
-
console.log("\n=== DO CHILDREN HAVE TRANSFORMS? ===");
|
|
76
|
-
if (node.children) {
|
|
77
|
-
for (const child of node.children) {
|
|
78
|
-
const childScene = child;
|
|
79
|
-
const hasTransform = childScene.transform != null;
|
|
80
|
-
const isIdentity = childScene.transform &&
|
|
81
|
-
Math.abs(childScene.transform.m00 - 1) < 0.001 &&
|
|
82
|
-
Math.abs(childScene.transform.m01) < 0.001 &&
|
|
83
|
-
Math.abs(childScene.transform.m10) < 0.001 &&
|
|
84
|
-
Math.abs(childScene.transform.m11 - 1) < 0.001;
|
|
85
|
-
console.log(`${child.name}:`);
|
|
86
|
-
console.log(` hasTransform: ${hasTransform}`);
|
|
87
|
-
if (hasTransform) {
|
|
88
|
-
console.log(` isIdentity: ${isIdentity}`);
|
|
89
|
-
console.log(` m00=${childScene.transform.m00}, m01=${childScene.transform.m01}`);
|
|
90
|
-
console.log(` m10=${childScene.transform.m10}, m11=${childScene.transform.m11}`);
|
|
91
|
-
console.log(` m02=${childScene.transform.m02}, m12=${childScene.transform.m12}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
debug().catch(console.error);
|
|
97
|
-
//# sourceMappingURL=debug-transforms.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-transforms.js","sourceRoot":"","sources":["../src/debug-transforms.ts"],"names":[],"mappings":"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"}
|
package/dist/debug-vertex.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-vertex.d.ts","sourceRoot":"","sources":["../src/debug-vertex.ts"],"names":[],"mappings":""}
|
package/dist/debug-vertex.js
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debug vertex parsing for complex vector 457:1697
|
|
3
|
-
*/
|
|
4
|
-
import { readFigFile } from "./parser/index.js";
|
|
5
|
-
import { parseCanvasFig, formatGUID, extractDocumentTree } from "./parser/kiwi-parser.js";
|
|
6
|
-
async function debug() {
|
|
7
|
-
const archive = await readFigFile("/Users/billy/Downloads/AutoDevice (Copy).fig");
|
|
8
|
-
const parsed = parseCanvasFig(archive.canvasFig);
|
|
9
|
-
const doc = extractDocumentTree(parsed.message);
|
|
10
|
-
if (!doc)
|
|
11
|
-
return;
|
|
12
|
-
const nodeIndex = new Map();
|
|
13
|
-
function indexNode(node) {
|
|
14
|
-
nodeIndex.set(formatGUID(node.guid), node);
|
|
15
|
-
if (node.children) {
|
|
16
|
-
for (const child of node.children) {
|
|
17
|
-
indexNode(child);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
indexNode(doc);
|
|
22
|
-
const blobs = parsed.message["blobs"];
|
|
23
|
-
const rawNode = nodeIndex.get("457:1697");
|
|
24
|
-
if (!rawNode) {
|
|
25
|
-
console.log("Node 457:1697 not found");
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const node = rawNode;
|
|
29
|
-
const vectorData = node.vectorData;
|
|
30
|
-
if (!vectorData) {
|
|
31
|
-
console.log("Node has no vectorData");
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const blobIndex = vectorData.vectorNetworkBlob;
|
|
35
|
-
const bytes = blobs[blobIndex].bytes;
|
|
36
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
37
|
-
console.log("Complex vector 457:1697");
|
|
38
|
-
console.log("normalizedSize:", vectorData.normalizedSize);
|
|
39
|
-
console.log("\nHeader:");
|
|
40
|
-
console.log(" vertices:", view.getUint32(0, true));
|
|
41
|
-
console.log(" segments:", view.getUint32(4, true));
|
|
42
|
-
console.log(" regions:", view.getUint32(8, true));
|
|
43
|
-
console.log("\nVertex raw bytes (16 bytes each):");
|
|
44
|
-
for (let i = 0; i < 8; i++) {
|
|
45
|
-
const offset = 12 + i * 16;
|
|
46
|
-
const hexBytes = Buffer.from(bytes.slice(offset, offset + 16)).toString("hex");
|
|
47
|
-
const x = view.getFloat32(offset, true);
|
|
48
|
-
const y = view.getFloat32(offset + 4, true);
|
|
49
|
-
const v2 = view.getFloat32(offset + 8, true);
|
|
50
|
-
const v3 = view.getFloat32(offset + 12, true);
|
|
51
|
-
console.log(` [${i}] hex: ${hexBytes}`);
|
|
52
|
-
console.log(` x=${x.toFixed(2)}, y=${y.toFixed(2)}, v2=${v2.toFixed(2)}, v3=${v3.toFixed(2)}`);
|
|
53
|
-
}
|
|
54
|
-
console.log("\nSegment raw bytes (from offset 140):");
|
|
55
|
-
const segmentStart = 12 + 8 * 16; // 140
|
|
56
|
-
for (let i = 0; i < 8; i++) {
|
|
57
|
-
const offset = segmentStart + i * 24;
|
|
58
|
-
if (offset + 24 > bytes.length)
|
|
59
|
-
break;
|
|
60
|
-
const hexBytes = Buffer.from(bytes.slice(offset, offset + 24)).toString("hex");
|
|
61
|
-
const s0 = view.getUint32(offset, true);
|
|
62
|
-
const f1 = view.getFloat32(offset + 4, true);
|
|
63
|
-
const f2 = view.getFloat32(offset + 8, true);
|
|
64
|
-
const s1 = view.getUint32(offset + 12, true);
|
|
65
|
-
const f3 = view.getFloat32(offset + 16, true);
|
|
66
|
-
const f4 = view.getFloat32(offset + 20, true);
|
|
67
|
-
console.log(` [${i}] hex: ${hexBytes}`);
|
|
68
|
-
console.log(` ${s0} -> ${s1}, (${f1.toFixed(3)}, ${f2.toFixed(3)}), (${f3.toFixed(3)}, ${f4.toFixed(3)})`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
debug().catch(console.error);
|
|
72
|
-
//# sourceMappingURL=debug-vertex.js.map
|
package/dist/debug-vertex.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-vertex.js","sourceRoot":"","sources":["../src/debug-vertex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,105 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paint-utils.js","sourceRoot":"","sources":["../../src/experimental/paint-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|