@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.
Files changed (186) hide show
  1. package/README.md +112 -0
  2. package/dist/compare-get-vector.d.ts +2 -0
  3. package/dist/compare-get-vector.d.ts.map +1 -0
  4. package/dist/compare-get-vector.js +124 -0
  5. package/dist/compare-get-vector.js.map +1 -0
  6. package/dist/compare-mcp-vs-direct.d.ts +2 -0
  7. package/dist/compare-mcp-vs-direct.d.ts.map +1 -0
  8. package/dist/compare-mcp-vs-direct.js +173 -0
  9. package/dist/compare-mcp-vs-direct.js.map +1 -0
  10. package/dist/compare-renderers.d.ts +2 -0
  11. package/dist/compare-renderers.d.ts.map +1 -0
  12. package/dist/compare-renderers.js +110 -0
  13. package/dist/compare-renderers.js.map +1 -0
  14. package/dist/debug/debug-stroke-geom.d.ts +2 -0
  15. package/dist/debug/debug-stroke-geom.d.ts.map +1 -0
  16. package/dist/debug/debug-stroke-geom.js +67 -0
  17. package/dist/debug/debug-stroke-geom.js.map +1 -0
  18. package/dist/debug/debug-transforms.d.ts +2 -0
  19. package/dist/debug/debug-transforms.d.ts.map +1 -0
  20. package/dist/debug/debug-transforms.js +97 -0
  21. package/dist/debug/debug-transforms.js.map +1 -0
  22. package/dist/debug/debug-vertex.d.ts +2 -0
  23. package/dist/debug/debug-vertex.d.ts.map +1 -0
  24. package/dist/debug/debug-vertex.js +72 -0
  25. package/dist/debug/debug-vertex.js.map +1 -0
  26. package/dist/debug-group.d.ts +5 -0
  27. package/dist/debug-group.d.ts.map +1 -0
  28. package/dist/debug-group.js +44 -0
  29. package/dist/debug-group.js.map +1 -0
  30. package/dist/debug-stroke-geom.d.ts +2 -0
  31. package/dist/debug-stroke-geom.d.ts.map +1 -0
  32. package/dist/debug-stroke-geom.js +67 -0
  33. package/dist/debug-stroke-geom.js.map +1 -0
  34. package/dist/debug-transforms.d.ts +2 -0
  35. package/dist/debug-transforms.d.ts.map +1 -0
  36. package/dist/debug-transforms.js +97 -0
  37. package/dist/debug-transforms.js.map +1 -0
  38. package/dist/debug-vertex.d.ts +2 -0
  39. package/dist/debug-vertex.d.ts.map +1 -0
  40. package/dist/debug-vertex.js +72 -0
  41. package/dist/debug-vertex.js.map +1 -0
  42. package/dist/decode-vector-network.d.ts +5 -0
  43. package/dist/decode-vector-network.d.ts.map +1 -0
  44. package/dist/decode-vector-network.js +160 -0
  45. package/dist/decode-vector-network.js.map +1 -0
  46. package/dist/experimental/paint-utils.d.ts +35 -0
  47. package/dist/experimental/paint-utils.d.ts.map +1 -0
  48. package/dist/experimental/paint-utils.js +105 -0
  49. package/dist/experimental/paint-utils.js.map +1 -0
  50. package/dist/experimental/render-screen-v2.d.ts +32 -0
  51. package/dist/experimental/render-screen-v2.d.ts.map +1 -0
  52. package/dist/experimental/render-screen-v2.js +366 -0
  53. package/dist/experimental/render-screen-v2.js.map +1 -0
  54. package/dist/experimental/render-screen.d.ts +26 -0
  55. package/dist/experimental/render-screen.d.ts.map +1 -0
  56. package/dist/experimental/render-screen.js +547 -0
  57. package/dist/experimental/render-screen.js.map +1 -0
  58. package/dist/experimental/render-types.d.ts +43 -0
  59. package/dist/experimental/render-types.d.ts.map +1 -0
  60. package/dist/experimental/render-types.js +22 -0
  61. package/dist/experimental/render-types.js.map +1 -0
  62. package/dist/experimental/render-utils.d.ts +38 -0
  63. package/dist/experimental/render-utils.d.ts.map +1 -0
  64. package/dist/experimental/render-utils.js +126 -0
  65. package/dist/experimental/render-utils.js.map +1 -0
  66. package/dist/experimental/screenshot.d.ts +11 -0
  67. package/dist/experimental/screenshot.d.ts.map +1 -0
  68. package/dist/experimental/screenshot.js +26 -0
  69. package/dist/experimental/screenshot.js.map +1 -0
  70. package/dist/experimental/vector-renderer.d.ts +31 -0
  71. package/dist/experimental/vector-renderer.d.ts.map +1 -0
  72. package/dist/experimental/vector-renderer.js +427 -0
  73. package/dist/experimental/vector-renderer.js.map +1 -0
  74. package/dist/explore-images.d.ts +9 -0
  75. package/dist/explore-images.d.ts.map +1 -0
  76. package/dist/explore-images.js +307 -0
  77. package/dist/explore-images.js.map +1 -0
  78. package/dist/http-server.d.ts +8 -0
  79. package/dist/http-server.d.ts.map +1 -0
  80. package/dist/http-server.js +95 -0
  81. package/dist/http-server.js.map +1 -0
  82. package/dist/index.d.ts +9 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +34 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/inspect-fig.d.ts +16 -0
  87. package/dist/inspect-fig.d.ts.map +1 -0
  88. package/dist/inspect-fig.js +134 -0
  89. package/dist/inspect-fig.js.map +1 -0
  90. package/dist/inspect-frame.d.ts +2 -0
  91. package/dist/inspect-frame.d.ts.map +1 -0
  92. package/dist/inspect-frame.js +90 -0
  93. package/dist/inspect-frame.js.map +1 -0
  94. package/dist/inspect-nodes.d.ts +5 -0
  95. package/dist/inspect-nodes.d.ts.map +1 -0
  96. package/dist/inspect-nodes.js +193 -0
  97. package/dist/inspect-nodes.js.map +1 -0
  98. package/dist/mcp/server.d.ts +38 -0
  99. package/dist/mcp/server.d.ts.map +1 -0
  100. package/dist/mcp/server.js +1524 -0
  101. package/dist/mcp/server.js.map +1 -0
  102. package/dist/parser/fig-reader.d.ts +29 -0
  103. package/dist/parser/fig-reader.d.ts.map +1 -0
  104. package/dist/parser/fig-reader.js +182 -0
  105. package/dist/parser/fig-reader.js.map +1 -0
  106. package/dist/parser/index.d.ts +48 -0
  107. package/dist/parser/index.d.ts.map +1 -0
  108. package/dist/parser/index.js +106 -0
  109. package/dist/parser/index.js.map +1 -0
  110. package/dist/parser/kiwi-parser.d.ts +66 -0
  111. package/dist/parser/kiwi-parser.d.ts.map +1 -0
  112. package/dist/parser/kiwi-parser.js +491 -0
  113. package/dist/parser/kiwi-parser.js.map +1 -0
  114. package/dist/parser/layout-inference.d.ts +63 -0
  115. package/dist/parser/layout-inference.d.ts.map +1 -0
  116. package/dist/parser/layout-inference.js +446 -0
  117. package/dist/parser/layout-inference.js.map +1 -0
  118. package/dist/parser/types.d.ts +286 -0
  119. package/dist/parser/types.d.ts.map +1 -0
  120. package/dist/parser/types.js +6 -0
  121. package/dist/parser/types.js.map +1 -0
  122. package/dist/render-single.d.ts +2 -0
  123. package/dist/render-single.d.ts.map +1 -0
  124. package/dist/render-single.js +53 -0
  125. package/dist/render-single.js.map +1 -0
  126. package/dist/renderer/index.d.ts +16 -0
  127. package/dist/renderer/index.d.ts.map +1 -0
  128. package/dist/renderer/index.js +18 -0
  129. package/dist/renderer/index.js.map +1 -0
  130. package/dist/renderer/paint-utils.d.ts +35 -0
  131. package/dist/renderer/paint-utils.d.ts.map +1 -0
  132. package/dist/renderer/paint-utils.js +105 -0
  133. package/dist/renderer/paint-utils.js.map +1 -0
  134. package/dist/renderer/render-screen.d.ts +26 -0
  135. package/dist/renderer/render-screen.d.ts.map +1 -0
  136. package/dist/renderer/render-screen.js +547 -0
  137. package/dist/renderer/render-screen.js.map +1 -0
  138. package/dist/renderer/render-types.d.ts +43 -0
  139. package/dist/renderer/render-types.d.ts.map +1 -0
  140. package/dist/renderer/render-types.js +22 -0
  141. package/dist/renderer/render-types.js.map +1 -0
  142. package/dist/renderer/render-utils.d.ts +38 -0
  143. package/dist/renderer/render-utils.d.ts.map +1 -0
  144. package/dist/renderer/render-utils.js +126 -0
  145. package/dist/renderer/render-utils.js.map +1 -0
  146. package/dist/renderer/screenshot.d.ts +11 -0
  147. package/dist/renderer/screenshot.d.ts.map +1 -0
  148. package/dist/renderer/screenshot.js +26 -0
  149. package/dist/renderer/screenshot.js.map +1 -0
  150. package/dist/renderer/vector-renderer.d.ts +31 -0
  151. package/dist/renderer/vector-renderer.d.ts.map +1 -0
  152. package/dist/renderer/vector-renderer.js +427 -0
  153. package/dist/renderer/vector-renderer.js.map +1 -0
  154. package/dist/shared-config.d.ts +9 -0
  155. package/dist/shared-config.d.ts.map +1 -0
  156. package/dist/shared-config.js +9 -0
  157. package/dist/shared-config.js.map +1 -0
  158. package/dist/test-parser.d.ts +3 -0
  159. package/dist/test-parser.d.ts.map +1 -0
  160. package/dist/test-parser.js +74 -0
  161. package/dist/test-parser.js.map +1 -0
  162. package/dist/test-render-v2.d.ts +5 -0
  163. package/dist/test-render-v2.d.ts.map +1 -0
  164. package/dist/test-render-v2.js +76 -0
  165. package/dist/test-render-v2.js.map +1 -0
  166. package/dist/test-render.d.ts +5 -0
  167. package/dist/test-render.d.ts.map +1 -0
  168. package/dist/test-render.js +76 -0
  169. package/dist/test-render.js.map +1 -0
  170. package/dist/vector-export.d.ts +52 -0
  171. package/dist/vector-export.d.ts.map +1 -0
  172. package/dist/vector-export.js +628 -0
  173. package/dist/vector-export.js.map +1 -0
  174. package/dist/web-viewer/build-client.d.ts +6 -0
  175. package/dist/web-viewer/build-client.d.ts.map +1 -0
  176. package/dist/web-viewer/build-client.js +36 -0
  177. package/dist/web-viewer/build-client.js.map +1 -0
  178. package/dist/web-viewer/client/viewer.d.ts +7 -0
  179. package/dist/web-viewer/client/viewer.d.ts.map +1 -0
  180. package/dist/web-viewer/client/viewer.js +873 -0
  181. package/dist/web-viewer/client/viewer.js.map +1 -0
  182. package/dist/web-viewer/server.d.ts +16 -0
  183. package/dist/web-viewer/server.d.ts.map +1 -0
  184. package/dist/web-viewer/server.js +420 -0
  185. package/dist/web-viewer/server.js.map +1 -0
  186. package/package.json +66 -0
@@ -0,0 +1,427 @@
1
+ /**
2
+ * Vector Renderer - Handles rendering of vector nodes to SVG
3
+ *
4
+ * This module contains all vector-related rendering logic including:
5
+ * - Vector network decoding (blob and structured formats)
6
+ * - Path command parsing and building
7
+ * - Stroked and filled vector rendering
8
+ */
9
+ import { multiplyTransforms, buildSvgPath, computeCommandBounds } from "./render-utils.js";
10
+ import { getPaints, getVisiblePaint, paintToColor } from "./paint-utils.js";
11
+ // ============================================================================
12
+ // Vector Network Decoding
13
+ // ============================================================================
14
+ /**
15
+ * Decode vectorNetworkBlob to extract vertices and segments.
16
+ *
17
+ * Format: [vertexCount(4), segmentCount(4), regionCount(4), ...vertexData, ...segmentData]
18
+ * Each vertex is 12 bytes: styleID(uint32), x(float32), y(float32)
19
+ * Each segment is 28 bytes: styleID(4), startVertex(4), startDx(4), startDy(4), endVertex(4), endDx(4), endDy(4)
20
+ */
21
+ function decodeVectorNetworkBlob(blobIndex, blobs, ctx) {
22
+ if (blobIndex === undefined || !blobs?.[blobIndex]?.bytes)
23
+ return null;
24
+ const bytes = blobs[blobIndex].bytes;
25
+ if (bytes.length < 12)
26
+ return null;
27
+ try {
28
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
29
+ const vertexCount = view.getUint32(0, true);
30
+ const segmentCount = view.getUint32(4, true);
31
+ // regionCount at offset 8, not needed for centerline
32
+ if (vertexCount > 1000 || segmentCount > 1000)
33
+ return null;
34
+ const vertices = [];
35
+ const segments = [];
36
+ const VERTEX_STRIDE = 12;
37
+ let offset = 12;
38
+ for (let i = 0; i < vertexCount && offset + VERTEX_STRIDE <= bytes.length; i++) {
39
+ const x = view.getFloat32(offset + 4, true);
40
+ const y = view.getFloat32(offset + 8, true);
41
+ vertices.push({ x, y });
42
+ offset += VERTEX_STRIDE;
43
+ }
44
+ const SEGMENT_STRIDE = 28;
45
+ for (let i = 0; i < segmentCount && offset + SEGMENT_STRIDE <= bytes.length; i++) {
46
+ const startVertex = view.getUint32(offset + 4, true);
47
+ const startDx = view.getFloat32(offset + 8, true);
48
+ const startDy = view.getFloat32(offset + 12, true);
49
+ const endVertex = view.getUint32(offset + 16, true);
50
+ const endDx = view.getFloat32(offset + 20, true);
51
+ const endDy = view.getFloat32(offset + 24, true);
52
+ if (startVertex < vertices.length && endVertex < vertices.length) {
53
+ segments.push({
54
+ start: {
55
+ vertex: startVertex,
56
+ dx: Number.isFinite(startDx) ? startDx : 0,
57
+ dy: Number.isFinite(startDy) ? startDy : 0,
58
+ },
59
+ end: {
60
+ vertex: endVertex,
61
+ dx: Number.isFinite(endDx) ? endDx : 0,
62
+ dy: Number.isFinite(endDy) ? endDy : 0,
63
+ },
64
+ });
65
+ }
66
+ offset += SEGMENT_STRIDE;
67
+ }
68
+ return { vertices, segments };
69
+ }
70
+ catch (e) {
71
+ ctx.warnings.push(`Failed to decode vector network: ${e}`);
72
+ return null;
73
+ }
74
+ }
75
+ /**
76
+ * Parse the structured vectorNetwork object from vectorData.
77
+ * This is the preferred source for vector network data (not the blob).
78
+ */
79
+ function parseStructuredVectorNetwork(vectorData) {
80
+ if (!vectorData?.vectorNetwork)
81
+ return null;
82
+ const vn = vectorData.vectorNetwork;
83
+ if (!vn.vertices?.length || !vn.segments?.length)
84
+ return null;
85
+ const vertices = vn.vertices.map((v) => ({ x: v.x, y: v.y }));
86
+ const segments = vn.segments.map((s) => ({
87
+ start: {
88
+ vertex: s.start.vertex,
89
+ dx: s.start.dx ?? 0,
90
+ dy: s.start.dy ?? 0,
91
+ },
92
+ end: {
93
+ vertex: s.end.vertex,
94
+ dx: s.end.dx ?? 0,
95
+ dy: s.end.dy ?? 0,
96
+ },
97
+ }));
98
+ return { vertices, segments };
99
+ }
100
+ // ============================================================================
101
+ // Path Command Decoding
102
+ // ============================================================================
103
+ /**
104
+ * Decode path commands from a binary blob.
105
+ */
106
+ export function decodePathCommands(blobIndex, blobs, ctx) {
107
+ if (blobIndex === undefined || !blobs?.[blobIndex]?.bytes)
108
+ return null;
109
+ const bytes = blobs[blobIndex].bytes;
110
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
111
+ const cmdArgCounts = { 0: 0, 1: 2, 2: 2, 3: 4, 4: 6, 5: 4 };
112
+ const commands = [];
113
+ let offset = 0;
114
+ while (offset < bytes.length) {
115
+ const cmd = bytes[offset++];
116
+ const argCount = cmdArgCounts[cmd];
117
+ if (argCount === undefined)
118
+ break;
119
+ const values = [];
120
+ for (let i = 0; i < argCount && offset + 4 <= bytes.length; i++) {
121
+ values.push(view.getFloat32(offset, true));
122
+ offset += 4;
123
+ }
124
+ commands.push({ cmd, values });
125
+ }
126
+ return commands.length > 0 ? commands : null;
127
+ }
128
+ /**
129
+ * Decode path commands from an array format (alternative to blob).
130
+ */
131
+ export function decodePathCommandsFromArray(commands) {
132
+ if (!commands?.length)
133
+ return null;
134
+ const cmdMap = { M: 1, L: 2, Q: 3, C: 4, Z: 0 };
135
+ const argCounts = { 0: 0, 1: 2, 2: 2, 3: 4, 4: 6 };
136
+ const result = [];
137
+ let currentCmd = null;
138
+ let buffer = [];
139
+ for (const entry of commands) {
140
+ if (typeof entry === "string") {
141
+ const cmd = cmdMap[entry.toUpperCase()];
142
+ if (cmd === undefined)
143
+ continue;
144
+ if (cmd === 0) {
145
+ result.push({ cmd, values: [] });
146
+ continue;
147
+ }
148
+ currentCmd = cmd;
149
+ buffer = [];
150
+ }
151
+ else if (typeof entry === "number" && currentCmd !== null) {
152
+ buffer.push(entry);
153
+ const expected = argCounts[currentCmd] ?? 0;
154
+ if (buffer.length === expected) {
155
+ result.push({ cmd: currentCmd, values: buffer });
156
+ buffer = [];
157
+ }
158
+ }
159
+ }
160
+ return result.length > 0 ? result : null;
161
+ }
162
+ // ============================================================================
163
+ // Centerline Generation
164
+ // ============================================================================
165
+ /**
166
+ * Create simple centerline path for a stroked vector from normalizedSize.
167
+ * This is a straight line from (0,0) to (width, height).
168
+ */
169
+ function createCenterlineFromNormalizedSize(normalizedSize) {
170
+ return [
171
+ { cmd: 1, values: [0, 0] },
172
+ { cmd: 2, values: [normalizedSize.x, normalizedSize.y] },
173
+ ];
174
+ }
175
+ /**
176
+ * Create centerline from decoded vector network.
177
+ * Handles bezier curves using dx/dy control points.
178
+ */
179
+ function createCenterlineFromNetwork(network, normalizedSize) {
180
+ if (network.vertices.length === 0)
181
+ return null;
182
+ // Filter out degenerate segments (where start vertex == end vertex)
183
+ const validSegments = network.segments.filter((seg) => seg.start.vertex !== seg.end.vertex);
184
+ if (validSegments.length === 0)
185
+ return null;
186
+ // Validate vertex coordinates against normalizedSize (with tolerance for stroke width)
187
+ if (normalizedSize) {
188
+ const tolerance = 2;
189
+ for (const v of network.vertices) {
190
+ if (v.x < -tolerance ||
191
+ v.y < -tolerance ||
192
+ v.x > normalizedSize.x + tolerance ||
193
+ v.y > normalizedSize.y + tolerance) {
194
+ return null;
195
+ }
196
+ }
197
+ }
198
+ const commands = [];
199
+ const usedSegments = new Set();
200
+ let currentVertex = validSegments[0].start.vertex;
201
+ // Move to the starting vertex
202
+ const startV = network.vertices[currentVertex];
203
+ if (!startV)
204
+ return null;
205
+ commands.push({ cmd: 1, values: [startV.x, startV.y] });
206
+ // Walk through segments to build the path
207
+ while (usedSegments.size < validSegments.length) {
208
+ let foundSegment = null;
209
+ let foundIdx = -1;
210
+ for (let i = 0; i < validSegments.length; i++) {
211
+ if (usedSegments.has(i))
212
+ continue;
213
+ const seg = validSegments[i];
214
+ if (seg.start.vertex === currentVertex) {
215
+ foundSegment = seg;
216
+ foundIdx = i;
217
+ break;
218
+ }
219
+ }
220
+ if (!foundSegment) {
221
+ // No connected segment found, try to find any unused segment to continue
222
+ for (let i = 0; i < validSegments.length; i++) {
223
+ if (!usedSegments.has(i)) {
224
+ foundSegment = validSegments[i];
225
+ foundIdx = i;
226
+ const v = network.vertices[foundSegment.start.vertex];
227
+ if (v) {
228
+ commands.push({ cmd: 1, values: [v.x, v.y] });
229
+ }
230
+ break;
231
+ }
232
+ }
233
+ }
234
+ if (!foundSegment || foundIdx === -1)
235
+ break;
236
+ usedSegments.add(foundIdx);
237
+ const v0 = network.vertices[foundSegment.start.vertex];
238
+ const v1 = network.vertices[foundSegment.end.vertex];
239
+ if (!v0 || !v1)
240
+ continue;
241
+ const hasCurve = Math.abs(foundSegment.start.dx) > 0.001 ||
242
+ Math.abs(foundSegment.start.dy) > 0.001 ||
243
+ Math.abs(foundSegment.end.dx) > 0.001 ||
244
+ Math.abs(foundSegment.end.dy) > 0.001;
245
+ if (hasCurve) {
246
+ const cp1x = v0.x + foundSegment.start.dx;
247
+ const cp1y = v0.y + foundSegment.start.dy;
248
+ const cp2x = v1.x + foundSegment.end.dx;
249
+ const cp2y = v1.y + foundSegment.end.dy;
250
+ commands.push({ cmd: 4, values: [cp1x, cp1y, cp2x, cp2y, v1.x, v1.y] });
251
+ }
252
+ else {
253
+ commands.push({ cmd: 2, values: [v1.x, v1.y] });
254
+ }
255
+ currentVertex = foundSegment.end.vertex;
256
+ }
257
+ // Close the path if it ends where it started
258
+ if (commands.length > 1) {
259
+ const firstCmd = commands[0];
260
+ const lastCmd = commands[commands.length - 1];
261
+ if (firstCmd && lastCmd) {
262
+ const startX = firstCmd.values[0];
263
+ const startY = firstCmd.values[1];
264
+ const lastVals = lastCmd.values;
265
+ const endX = lastVals[lastVals.length - 2];
266
+ const endY = lastVals[lastVals.length - 1];
267
+ if (Math.abs((startX ?? 0) - (endX ?? 0)) < 0.01 &&
268
+ Math.abs((startY ?? 0) - (endY ?? 0)) < 0.01) {
269
+ commands.push({ cmd: 0, values: [] });
270
+ }
271
+ }
272
+ }
273
+ return commands.length > 0 ? commands : null;
274
+ }
275
+ // ============================================================================
276
+ // Vector Type Detection
277
+ // ============================================================================
278
+ /**
279
+ * Check if a vector node is stroked (has stroke paint, no fill paint).
280
+ */
281
+ export function isStrokedVector(node) {
282
+ const fills = getPaints(node, "fills");
283
+ const strokes = getPaints(node, "strokes");
284
+ const hasVisibleFill = fills?.some((p) => p.visible !== false && p.type === "SOLID");
285
+ const hasVisibleStroke = strokes?.some((p) => p.visible !== false && p.type === "SOLID");
286
+ return !hasVisibleFill && hasVisibleStroke === true;
287
+ }
288
+ // ============================================================================
289
+ // Stroked Vector Rendering
290
+ // ============================================================================
291
+ /**
292
+ * Render a stroked vector using its centerline.
293
+ */
294
+ export function renderStrokedVector(node, transform, blobs, ctx, output) {
295
+ const strokes = getPaints(node, "strokes");
296
+ const strokeColor = paintToColor(getVisiblePaint(strokes));
297
+ if (!strokeColor)
298
+ return false;
299
+ const vectorData = node.vectorData;
300
+ const normalizedSize = vectorData?.normalizedSize;
301
+ // Get centerline commands using priority-based approach
302
+ let centerline = null;
303
+ // PRIORITY 1: Use structured vectorNetwork data (most reliable)
304
+ const structuredNetwork = parseStructuredVectorNetwork(vectorData);
305
+ if (structuredNetwork && structuredNetwork.vertices.length >= 2) {
306
+ centerline = createCenterlineFromNetwork(structuredNetwork, normalizedSize);
307
+ }
308
+ // PRIORITY 2: Try blob-encoded vector network
309
+ if (!centerline && vectorData?.vectorNetworkBlob !== undefined) {
310
+ const blobNetwork = decodeVectorNetworkBlob(vectorData.vectorNetworkBlob, blobs, ctx);
311
+ if (blobNetwork && blobNetwork.vertices.length >= 2) {
312
+ centerline = createCenterlineFromNetwork(blobNetwork, normalizedSize);
313
+ }
314
+ }
315
+ // PRIORITY 3: Fallback to simple line from normalizedSize
316
+ if (!centerline && normalizedSize && (normalizedSize.x > 0 || normalizedSize.y > 0)) {
317
+ centerline = createCenterlineFromNormalizedSize(normalizedSize);
318
+ }
319
+ if (!centerline || centerline.length === 0)
320
+ return false;
321
+ // Get target size from node
322
+ const targetWidth = node.size?.x ?? node.width ?? normalizedSize?.x ?? 1;
323
+ const targetHeight = node.size?.y ?? node.height ?? normalizedSize?.y ?? 1;
324
+ // Compute actual bounds and calculate scale
325
+ const commandBounds = computeCommandBounds(centerline);
326
+ const baseScaleX = normalizedSize?.x ? targetWidth / normalizedSize.x : 1;
327
+ const baseScaleY = normalizedSize?.y ? targetHeight / normalizedSize.y : 1;
328
+ const cmdWidth = commandBounds ? commandBounds.maxX - commandBounds.minX : 0;
329
+ const cmdHeight = commandBounds ? commandBounds.maxY - commandBounds.minY : 0;
330
+ const scaleX = cmdWidth > 0.001 ? targetWidth / cmdWidth : baseScaleX;
331
+ const scaleY = cmdHeight > 0.001 ? targetHeight / cmdHeight : baseScaleY;
332
+ const offsetX = commandBounds ? -commandBounds.minX : 0;
333
+ const offsetY = commandBounds ? -commandBounds.minY : 0;
334
+ // Build transform: offset -> scale -> parent transform
335
+ const localTransform = {
336
+ a: scaleX,
337
+ b: 0,
338
+ c: 0,
339
+ d: scaleY,
340
+ e: offsetX * scaleX,
341
+ f: offsetY * scaleY,
342
+ };
343
+ const finalTransform = multiplyTransforms(transform, localTransform);
344
+ const pathD = buildSvgPath(centerline, finalTransform);
345
+ if (!pathD)
346
+ return false;
347
+ // Build stroke attributes
348
+ const strokeWeight = node.strokeWeight ?? 1;
349
+ const attrs = [
350
+ `d="${pathD}"`,
351
+ `fill="none"`,
352
+ `stroke="${strokeColor}"`,
353
+ `stroke-width="${strokeWeight}"`,
354
+ ];
355
+ if (node.strokeCap)
356
+ attrs.push(`stroke-linecap="${node.strokeCap.toLowerCase()}"`);
357
+ if (node.strokeJoin)
358
+ attrs.push(`stroke-linejoin="${node.strokeJoin.toLowerCase()}"`);
359
+ if (node.strokeDashes?.length)
360
+ attrs.push(`stroke-dasharray="${node.strokeDashes.join(" ")}"`);
361
+ if (node.opacity !== undefined && node.opacity < 1)
362
+ attrs.push(`opacity="${node.opacity}"`);
363
+ output.push(`<path ${attrs.join(" ")} />`);
364
+ return true;
365
+ }
366
+ // ============================================================================
367
+ // Filled Vector Rendering
368
+ // ============================================================================
369
+ /**
370
+ * Render a filled vector using its fillGeometry.
371
+ */
372
+ export function renderFilledVector(node, transform, blobs, ctx, output) {
373
+ const fills = getPaints(node, "fills");
374
+ const fillColor = paintToColor(getVisiblePaint(fills));
375
+ if (!fillColor)
376
+ return false;
377
+ const fillGeometry = node.fillGeometry;
378
+ if (!fillGeometry?.length)
379
+ return false;
380
+ const vectorData = node.vectorData;
381
+ const normalizedSize = vectorData?.normalizedSize;
382
+ const targetWidth = node.size?.x ?? node.width ?? normalizedSize?.x ?? 1;
383
+ const targetHeight = node.size?.y ?? node.height ?? normalizedSize?.y ?? 1;
384
+ const baseScaleX = normalizedSize?.x ? targetWidth / normalizedSize.x : 1;
385
+ const baseScaleY = normalizedSize?.y ? targetHeight / normalizedSize.y : 1;
386
+ for (const path of fillGeometry) {
387
+ let commands = null;
388
+ if (typeof path.commandsBlob === "number") {
389
+ commands = decodePathCommands(path.commandsBlob, blobs, ctx);
390
+ }
391
+ else if (path.commands) {
392
+ commands = decodePathCommandsFromArray(path.commands);
393
+ }
394
+ if (!commands)
395
+ continue;
396
+ const commandBounds = computeCommandBounds(commands);
397
+ const cmdWidth = commandBounds ? commandBounds.maxX - commandBounds.minX : 0;
398
+ const cmdHeight = commandBounds ? commandBounds.maxY - commandBounds.minY : 0;
399
+ const scaleX = cmdWidth > 0.001 ? targetWidth / cmdWidth : baseScaleX;
400
+ const scaleY = cmdHeight > 0.001 ? targetHeight / cmdHeight : baseScaleY;
401
+ const offsetX = commandBounds ? -commandBounds.minX : 0;
402
+ const offsetY = commandBounds ? -commandBounds.minY : 0;
403
+ const localTransform = {
404
+ a: scaleX,
405
+ b: 0,
406
+ c: 0,
407
+ d: scaleY,
408
+ e: offsetX * scaleX,
409
+ f: offsetY * scaleY,
410
+ };
411
+ const finalTransform = multiplyTransforms(transform, localTransform);
412
+ const pathD = buildSvgPath(commands, finalTransform);
413
+ if (!pathD)
414
+ continue;
415
+ const windingRule = path.windingRule?.toLowerCase() === "evenodd" ? "evenodd" : "nonzero";
416
+ const attrs = [
417
+ `d="${pathD}"`,
418
+ `fill="${fillColor}"`,
419
+ `fill-rule="${windingRule}"`,
420
+ ];
421
+ if (node.opacity !== undefined && node.opacity < 1)
422
+ attrs.push(`opacity="${node.opacity}"`);
423
+ output.push(`<path ${attrs.join(" ")} />`);
424
+ }
425
+ return true;
426
+ }
427
+ //# sourceMappingURL=vector-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-renderer.js","sourceRoot":"","sources":["../../src/experimental/vector-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Explore image references in .fig files
4
+ *
5
+ * This script traces how images are referenced in fillPaints and
6
+ * how those references map to files in the images/ folder.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=explore-images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore-images.d.ts","sourceRoot":"","sources":["../src/explore-images.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}