@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,491 @@
1
+ /**
2
+ * KiwiParser - Parses canvas.fig binary using kiwi schema
3
+ *
4
+ * The canvas.fig file structure:
5
+ * - Header: "fig-kiwi" magic bytes (8 bytes)
6
+ * - Version: uint32 little-endian (4 bytes)
7
+ * - Schema chunk length: uint32 little-endian (4 bytes)
8
+ * - Schema chunk: deflate-compressed binary kiwi schema
9
+ * - Data chunk length: uint32 little-endian (4 bytes)
10
+ * - Data chunk: deflate-compressed document data encoded with the schema
11
+ */
12
+ import * as kiwi from "kiwi-schema";
13
+ import { inflateRaw } from "pako";
14
+ import * as fzstd from "fzstd";
15
+ // ZSTD magic number
16
+ const ZSTD_MAGIC = 0xfd2fb528;
17
+ // Re-export ByteBuffer for external use
18
+ export const ByteBuffer = kiwi.ByteBuffer;
19
+ /**
20
+ * Decompress a buffer that might be deflate or zstd compressed
21
+ */
22
+ function decompressChunk(data) {
23
+ // Check for ZSTD magic
24
+ const magic = readUint32LE(data, 0);
25
+ if (magic === ZSTD_MAGIC) {
26
+ return fzstd.decompress(data);
27
+ }
28
+ // Otherwise try deflate raw
29
+ return inflateRaw(data);
30
+ }
31
+ /**
32
+ * Read a little-endian uint32 from buffer
33
+ */
34
+ function readUint32LE(data, offset) {
35
+ return (data[offset] |
36
+ (data[offset + 1] << 8) |
37
+ (data[offset + 2] << 16) |
38
+ (data[offset + 3] << 24)) >>> 0;
39
+ }
40
+ /**
41
+ * Check if buffer starts with "fig-kiwi" magic
42
+ */
43
+ function hasFigKiwiMagic(data) {
44
+ const magic = "fig-kiwi";
45
+ for (let i = 0; i < magic.length; i++) {
46
+ if (data[i] !== magic.charCodeAt(i)) {
47
+ return false;
48
+ }
49
+ }
50
+ return true;
51
+ }
52
+ /**
53
+ * Parse canvas.fig binary data
54
+ */
55
+ export function parseCanvasFig(data) {
56
+ // Check magic bytes
57
+ if (!hasFigKiwiMagic(data)) {
58
+ throw new Error("Invalid canvas.fig: missing fig-kiwi magic header");
59
+ }
60
+ let offset = 8; // Skip magic
61
+ // Read version
62
+ const version = readUint32LE(data, offset);
63
+ offset += 4;
64
+ // Read schema chunk (compressed)
65
+ const schemaCompressedLength = readUint32LE(data, offset);
66
+ offset += 4;
67
+ const schemaCompressed = data.slice(offset, offset + schemaCompressedLength);
68
+ offset += schemaCompressedLength;
69
+ // Read data chunk (compressed)
70
+ const dataCompressedLength = readUint32LE(data, offset);
71
+ offset += 4;
72
+ const dataCompressed = data.slice(offset, offset + dataCompressedLength);
73
+ // Decompress both chunks (may be deflate or zstd)
74
+ const schemaBuffer = decompressChunk(schemaCompressed);
75
+ const dataBuffer = decompressChunk(dataCompressed);
76
+ // Decode the binary schema
77
+ const schema = kiwi.decodeBinarySchema(schemaBuffer);
78
+ // Compile the schema for decoding data
79
+ const compiledSchema = kiwi.compileSchema(schema);
80
+ // Find the root message type (usually "Message" or "Document")
81
+ const rootType = findRootMessageType(schema);
82
+ // Decode the data using the compiled schema
83
+ const decodeFn = compiledSchema[`decode${rootType}`];
84
+ if (typeof decodeFn !== "function") {
85
+ throw new Error(`Cannot find decoder for root type: ${rootType}`);
86
+ }
87
+ const message = decodeFn.call(compiledSchema, dataBuffer);
88
+ return {
89
+ version,
90
+ schema,
91
+ compiledSchema,
92
+ message,
93
+ rawSchemaBuffer: schemaBuffer,
94
+ };
95
+ }
96
+ /**
97
+ * Find the root message type in the schema
98
+ * The root type for .fig files is always "Message" which contains nodeChanges[]
99
+ */
100
+ function findRootMessageType(schema) {
101
+ // Priority order - "Message" is the main container with nodeChanges
102
+ const possibleRoots = ["Message", "Document", "Fig", "Root"];
103
+ for (const rootName of possibleRoots) {
104
+ const def = schema.definitions.find(d => d.name === rootName);
105
+ if (def) {
106
+ return def.name;
107
+ }
108
+ }
109
+ // If no common root found, try the first MESSAGE type
110
+ for (const def of schema.definitions) {
111
+ if (def.kind === "MESSAGE") {
112
+ return def.name;
113
+ }
114
+ }
115
+ throw new Error("Cannot find root message type in schema");
116
+ }
117
+ /**
118
+ * Convert a raw parsed GUID to our GUID type
119
+ */
120
+ export function parseGUID(raw) {
121
+ if (!raw || typeof raw !== "object")
122
+ return null;
123
+ const obj = raw;
124
+ return {
125
+ sessionID: typeof obj["sessionID"] === "number" ? obj["sessionID"] : 0,
126
+ localID: typeof obj["localID"] === "number" ? obj["localID"] : 0,
127
+ };
128
+ }
129
+ /**
130
+ * Format a GUID as a string for display
131
+ */
132
+ export function formatGUID(guid) {
133
+ if (!guid)
134
+ return "null";
135
+ return `${guid.sessionID}:${guid.localID}`;
136
+ }
137
+ /**
138
+ * Map numeric node type to string type
139
+ */
140
+ export function getNodeTypeName(typeValue) {
141
+ // Type values are typically stored as enum indices or strings
142
+ // This mapping may need adjustment based on actual schema
143
+ const typeMap = {
144
+ 0: "DOCUMENT",
145
+ 1: "CANVAS",
146
+ 2: "FRAME",
147
+ 3: "GROUP",
148
+ 4: "VECTOR",
149
+ 5: "BOOLEAN_OPERATION",
150
+ 6: "STAR",
151
+ 7: "LINE",
152
+ 8: "ELLIPSE",
153
+ 9: "REGULAR_POLYGON",
154
+ 10: "RECTANGLE",
155
+ 11: "TEXT",
156
+ 12: "SLICE",
157
+ 13: "COMPONENT",
158
+ 14: "COMPONENT_SET",
159
+ 15: "INSTANCE",
160
+ // String mappings
161
+ DOCUMENT: "DOCUMENT",
162
+ CANVAS: "CANVAS",
163
+ FRAME: "FRAME",
164
+ GROUP: "GROUP",
165
+ VECTOR: "VECTOR",
166
+ BOOLEAN_OPERATION: "BOOLEAN_OPERATION",
167
+ STAR: "STAR",
168
+ LINE: "LINE",
169
+ ELLIPSE: "ELLIPSE",
170
+ REGULAR_POLYGON: "REGULAR_POLYGON",
171
+ RECTANGLE: "RECTANGLE",
172
+ TEXT: "TEXT",
173
+ SLICE: "SLICE",
174
+ COMPONENT: "COMPONENT",
175
+ COMPONENT_SET: "COMPONENT_SET",
176
+ INSTANCE: "INSTANCE",
177
+ STICKY: "STICKY",
178
+ SHAPE_WITH_TEXT: "SHAPE_WITH_TEXT",
179
+ CONNECTOR: "CONNECTOR",
180
+ SECTION: "SECTION",
181
+ TABLE: "TABLE",
182
+ TABLE_CELL: "TABLE_CELL",
183
+ WIDGET: "WIDGET",
184
+ };
185
+ if (typeValue !== undefined && typeValue !== null) {
186
+ const mapped = typeMap[typeValue];
187
+ if (mapped)
188
+ return mapped;
189
+ }
190
+ return "FRAME"; // Default fallback
191
+ }
192
+ /**
193
+ * Build a tree from the flat nodeChanges array using parentIndex references
194
+ */
195
+ function buildTreeFromNodeChanges(nodeChanges) {
196
+ // Create a map of guid -> node
197
+ const nodeMap = new Map();
198
+ const childrenMap = new Map();
199
+ let documentNode = null;
200
+ // First pass: convert all nodes and build the map
201
+ for (const change of nodeChanges) {
202
+ if (!change || typeof change !== "object")
203
+ continue;
204
+ const changeObj = change;
205
+ const node = convertToFigNode(change);
206
+ if (!node)
207
+ continue;
208
+ // Add children array
209
+ const nodeWithChildren = node;
210
+ nodeWithChildren.children = [];
211
+ const guidKey = formatGUID(node.guid);
212
+ nodeMap.set(guidKey, nodeWithChildren);
213
+ // Track the document node
214
+ if (changeObj["type"] === "DOCUMENT") {
215
+ documentNode = nodeWithChildren;
216
+ }
217
+ // Track parent-child relationships
218
+ const parentIndex = changeObj["parentIndex"];
219
+ if (parentIndex && parentIndex["guid"]) {
220
+ const parentGuid = parseGUID(parentIndex["guid"]);
221
+ if (parentGuid) {
222
+ const parentKey = formatGUID(parentGuid);
223
+ if (!childrenMap.has(parentKey)) {
224
+ childrenMap.set(parentKey, []);
225
+ }
226
+ childrenMap.get(parentKey).push(nodeWithChildren);
227
+ }
228
+ }
229
+ }
230
+ // Second pass: connect children to parents
231
+ for (const [parentKey, children] of childrenMap) {
232
+ const parent = nodeMap.get(parentKey);
233
+ if (parent) {
234
+ parent.children = children;
235
+ }
236
+ }
237
+ return documentNode;
238
+ }
239
+ /**
240
+ * Extract document tree from parsed message
241
+ * This handles the specific structure of the kiwi format used in .fig files
242
+ */
243
+ export function extractDocumentTree(message) {
244
+ // Try direct document property (unlikely in .fig files)
245
+ if (message["document"]) {
246
+ return convertToFigNode(message["document"]);
247
+ }
248
+ // Try root property
249
+ if (message["root"]) {
250
+ return convertToFigNode(message["root"]);
251
+ }
252
+ // Try nodeChanges array (the standard format for .fig files)
253
+ // NodeChanges is a flat array - we need to rebuild the tree using parentIndex
254
+ const nodeChanges = message["nodeChanges"];
255
+ if (Array.isArray(nodeChanges) && nodeChanges.length > 0) {
256
+ return buildTreeFromNodeChanges(nodeChanges);
257
+ }
258
+ // Try to find nodes array
259
+ const nodes = message["nodes"];
260
+ if (Array.isArray(nodes) && nodes.length > 0) {
261
+ return buildTreeFromNodeChanges(nodes);
262
+ }
263
+ return null;
264
+ }
265
+ function inferFontWeight(styleName) {
266
+ const name = styleName.toLowerCase();
267
+ if (name.includes("thin"))
268
+ return 100;
269
+ if (name.includes("extra light") || name.includes("ultra light"))
270
+ return 200;
271
+ if (name.includes("light"))
272
+ return 300;
273
+ if (name.includes("regular") || name.includes("normal") || name.includes("book"))
274
+ return 400;
275
+ if (name.includes("medium"))
276
+ return 500;
277
+ if (name.includes("semi bold") || name.includes("semibold") || name.includes("demi"))
278
+ return 600;
279
+ if (name.includes("bold"))
280
+ return 700;
281
+ if (name.includes("extra bold") || name.includes("extrabold") || name.includes("heavy"))
282
+ return 800;
283
+ if (name.includes("black") || name.includes("ultra black"))
284
+ return 900;
285
+ return 400;
286
+ }
287
+ function inferFontStyle(styleName) {
288
+ const name = styleName.toLowerCase();
289
+ if (name.includes("italic"))
290
+ return "italic";
291
+ if (name.includes("oblique"))
292
+ return "oblique";
293
+ return "normal";
294
+ }
295
+ /**
296
+ * Convert a raw parsed node to our FigNode type
297
+ */
298
+ function convertToFigNode(raw) {
299
+ if (!raw || typeof raw !== "object")
300
+ return null;
301
+ const obj = raw;
302
+ const node = {
303
+ guid: parseGUID(obj["guid"] || obj["id"]) || { sessionID: 0, localID: 0 },
304
+ type: getNodeTypeName(obj["type"]),
305
+ name: String(obj["name"] || "Unnamed"),
306
+ visible: obj["visible"] !== false,
307
+ };
308
+ // Copy over additional properties
309
+ const propsToKeep = [
310
+ "x", "y", "width", "height", "rotation", "transform",
311
+ "opacity", "blendMode",
312
+ "fills", "strokes", "strokeWeight",
313
+ "strokeAlign", "strokeCap", "strokeJoin", "strokeDashes", "strokeWeights",
314
+ "cornerRadius", "effects",
315
+ "constraints", "layoutMode",
316
+ "characters", "style",
317
+ "backgroundColor",
318
+ "clipsContent", "isMask",
319
+ "fillGeometry", "strokeGeometry", "vectorData",
320
+ ];
321
+ // Use an indexable type for property assignment
322
+ const nodeRecord = node;
323
+ const fillPaints = obj["fills"] ?? obj["fillPaints"];
324
+ if (fillPaints !== undefined) {
325
+ nodeRecord["fills"] = fillPaints;
326
+ }
327
+ const strokePaints = obj["strokes"] ?? obj["strokePaints"];
328
+ if (strokePaints !== undefined) {
329
+ nodeRecord["strokes"] = strokePaints;
330
+ }
331
+ for (const prop of propsToKeep) {
332
+ if (obj[prop] !== undefined) {
333
+ nodeRecord[prop] = obj[prop];
334
+ }
335
+ }
336
+ const textData = obj["textData"];
337
+ if (nodeRecord["characters"] === undefined && textData?.["characters"]) {
338
+ nodeRecord["characters"] = textData["characters"];
339
+ }
340
+ // Preserve derivedTextData for text wrapping
341
+ const derivedTextData = obj["derivedTextData"];
342
+ if (derivedTextData) {
343
+ const layoutSize = derivedTextData["layoutSize"];
344
+ const baselines = derivedTextData["baselines"];
345
+ if (layoutSize && baselines) {
346
+ nodeRecord["derivedTextData"] = {
347
+ layoutSize: {
348
+ x: typeof layoutSize["x"] === "number" ? layoutSize["x"] : 0,
349
+ y: typeof layoutSize["y"] === "number" ? layoutSize["y"] : 0,
350
+ },
351
+ baselines: baselines.map(baseline => {
352
+ const pos = baseline["position"];
353
+ return {
354
+ position: {
355
+ x: typeof pos?.["x"] === "number" ? pos["x"] : 0,
356
+ y: typeof pos?.["y"] === "number" ? pos["y"] : 0,
357
+ },
358
+ width: typeof baseline["width"] === "number" ? baseline["width"] : 0,
359
+ lineY: typeof baseline["lineY"] === "number" ? baseline["lineY"] : 0,
360
+ lineHeight: typeof baseline["lineHeight"] === "number" ? baseline["lineHeight"] : 0,
361
+ lineAscent: typeof baseline["lineAscent"] === "number" ? baseline["lineAscent"] : 0,
362
+ firstCharacter: typeof baseline["firstCharacter"] === "number" ? baseline["firstCharacter"] : 0,
363
+ endCharacter: typeof baseline["endCharacter"] === "number" ? baseline["endCharacter"] : 0,
364
+ };
365
+ }),
366
+ };
367
+ }
368
+ }
369
+ if (nodeRecord["style"] === undefined) {
370
+ const fontName = obj["fontName"];
371
+ const fontSize = typeof obj["fontSize"] === "number" ? obj["fontSize"] : undefined;
372
+ const textAlignHorizontal = typeof obj["textAlignHorizontal"] === "string"
373
+ ? obj["textAlignHorizontal"]
374
+ : "LEFT";
375
+ const textAlignVertical = typeof obj["textAlignVertical"] === "string"
376
+ ? obj["textAlignVertical"]
377
+ : "TOP";
378
+ const letterSpacing = obj["letterSpacing"];
379
+ const lineHeight = obj["lineHeight"];
380
+ const fontStyleName = typeof fontName?.["style"] === "string" ? fontName["style"] : "";
381
+ const fontWeightValue = typeof obj["fontWeight"] === "number" ? obj["fontWeight"] : inferFontWeight(fontStyleName);
382
+ const fontStyleValue = inferFontStyle(fontStyleName);
383
+ if (fontName || fontSize || letterSpacing || lineHeight) {
384
+ nodeRecord["style"] = {
385
+ fontFamily: typeof fontName?.["family"] === "string" ? fontName["family"] : "Inter",
386
+ fontPostScriptName: typeof fontName?.["postscript"] === "string" ? fontName["postscript"] : undefined,
387
+ fontStyle: fontStyleValue,
388
+ fontWeight: fontWeightValue,
389
+ fontSize: fontSize ?? 14,
390
+ textAlignHorizontal,
391
+ textAlignVertical,
392
+ letterSpacing: typeof letterSpacing?.["value"] === "number" ? letterSpacing["value"] : 0,
393
+ lineHeightPx: lineHeight?.["units"] === "PIXELS" && typeof lineHeight?.["value"] === "number"
394
+ ? lineHeight["value"]
395
+ : undefined,
396
+ lineHeightPercent: lineHeight?.["units"] === "PERCENT" && typeof lineHeight?.["value"] === "number"
397
+ ? lineHeight["value"]
398
+ : undefined,
399
+ lineHeightUnit: lineHeight?.["units"] === "PERCENT"
400
+ ? "FONT_SIZE_%"
401
+ : lineHeight?.["units"] === "PIXELS"
402
+ ? "PIXELS"
403
+ : "INTRINSIC_%",
404
+ textCase: typeof obj["textCase"] === "string" ? obj["textCase"] : undefined,
405
+ textDecoration: typeof obj["textDecoration"] === "string"
406
+ ? obj["textDecoration"]
407
+ : undefined,
408
+ };
409
+ }
410
+ }
411
+ const bounds = obj["absoluteBoundingBox"] ??
412
+ obj["absoluteRenderBounds"] ??
413
+ obj["bounds"];
414
+ if (bounds) {
415
+ if (nodeRecord["x"] === undefined && typeof bounds["x"] === "number") {
416
+ nodeRecord["x"] = bounds["x"];
417
+ }
418
+ if (nodeRecord["y"] === undefined && typeof bounds["y"] === "number") {
419
+ nodeRecord["y"] = bounds["y"];
420
+ }
421
+ if (nodeRecord["width"] === undefined && typeof bounds["width"] === "number") {
422
+ nodeRecord["width"] = bounds["width"];
423
+ }
424
+ if (nodeRecord["height"] === undefined && typeof bounds["height"] === "number") {
425
+ nodeRecord["height"] = bounds["height"];
426
+ }
427
+ }
428
+ const size = obj["size"];
429
+ if (size && typeof size["x"] === "number" && typeof size["y"] === "number") {
430
+ // Preserve original size field for vector scaling
431
+ nodeRecord["size"] = { x: size["x"], y: size["y"] };
432
+ if (nodeRecord["width"] === undefined) {
433
+ nodeRecord["width"] = size["x"];
434
+ }
435
+ if (nodeRecord["height"] === undefined) {
436
+ nodeRecord["height"] = size["y"];
437
+ }
438
+ }
439
+ const transform = obj["transform"];
440
+ if (transform) {
441
+ if (nodeRecord["x"] === undefined && typeof transform["m02"] === "number") {
442
+ nodeRecord["x"] = transform["m02"];
443
+ }
444
+ if (nodeRecord["y"] === undefined && typeof transform["m12"] === "number") {
445
+ nodeRecord["y"] = transform["m12"];
446
+ }
447
+ }
448
+ // Handle children
449
+ const children = obj["children"];
450
+ if (Array.isArray(children)) {
451
+ nodeRecord["children"] = children
452
+ .map(convertToFigNode)
453
+ .filter((n) => n !== null);
454
+ }
455
+ return node;
456
+ }
457
+ /**
458
+ * Convert image hash bytes object to hex string filename
459
+ * Images in .fig files are referenced by SHA-1 hash (20 bytes)
460
+ * The hash is stored as an object: {"0": byte, "1": byte, ..., "19": byte}
461
+ * The filename in images/ folder is the hex representation of these bytes
462
+ */
463
+ export function hashBytesToHex(hashObj) {
464
+ const bytes = [];
465
+ for (let i = 0; i < 20; i++) {
466
+ const byte = hashObj[String(i)];
467
+ if (byte !== undefined) {
468
+ bytes.push(byte);
469
+ }
470
+ }
471
+ return bytes.map(b => b.toString(16).padStart(2, "0")).join("");
472
+ }
473
+ /**
474
+ * Get schema information for debugging/inspection
475
+ */
476
+ export function getSchemaInfo(schema) {
477
+ return {
478
+ definitionCount: schema.definitions.length,
479
+ definitions: schema.definitions.map((def) => ({
480
+ name: def.name,
481
+ kind: def.kind,
482
+ fieldCount: def.fields.length,
483
+ fields: def.fields.map((f) => ({
484
+ name: f.name,
485
+ type: f.type,
486
+ isArray: f.isArray,
487
+ })),
488
+ })),
489
+ };
490
+ }
491
+ //# sourceMappingURL=kiwi-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiwi-parser.js","sourceRoot":"","sources":["../../src/parser/kiwi-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Layout Inference - Convert raw node data to structured layout information
3
+ *
4
+ * This module analyzes nodes and infers:
5
+ * - Spacing patterns (gaps, padding, margins)
6
+ * - Alignment (horizontal/vertical)
7
+ * - Layout direction (row/column)
8
+ * - Sizing modes (fixed/hug/fill)
9
+ */
10
+ import type { FigNode, SceneNode, InferredLayout, SimplifiedNode, Rect, Color, Paint, Effect } from "./types.js";
11
+ /**
12
+ * Convert RGBA color to CSS string
13
+ */
14
+ export declare function colorToCSS(color: Color | undefined): string | undefined;
15
+ /**
16
+ * Extract primary fill color from paints array
17
+ */
18
+ export declare function getPrimaryFillColor(fills: Paint[] | undefined): string | undefined;
19
+ /**
20
+ * Extract primary stroke color from paints array
21
+ */
22
+ export declare function getPrimaryStrokeColor(strokes: Paint[] | undefined): string | undefined;
23
+ /**
24
+ * Convert effect to CSS-like description
25
+ */
26
+ export declare function effectToDescription(effect: Effect): string;
27
+ /**
28
+ * Get bounds of a node
29
+ */
30
+ export declare function getNodeBounds(node: SceneNode): Rect | undefined;
31
+ /**
32
+ * Infer layout from auto-layout properties
33
+ */
34
+ export declare function inferLayoutFromAutoLayout(node: SceneNode): InferredLayout | undefined;
35
+ /**
36
+ * Infer layout from child positions (for non-auto-layout frames)
37
+ */
38
+ export declare function inferLayoutFromChildren(children: SceneNode[]): InferredLayout | undefined;
39
+ /**
40
+ * Simplify a node for MCP output
41
+ */
42
+ export declare function simplifyNode(node: FigNode, depth?: number, maxDepth?: number, options?: {
43
+ includeStyles?: boolean;
44
+ includeLayout?: boolean;
45
+ includeEffects?: boolean;
46
+ }): SimplifiedNode | null;
47
+ /**
48
+ * Get a summary of the document structure
49
+ */
50
+ export declare function getDocumentSummary(node: FigNode): string;
51
+ /**
52
+ * Find nodes by type
53
+ */
54
+ export declare function findNodesByType(node: FigNode, type: string): FigNode[];
55
+ /**
56
+ * Find node by name (partial match)
57
+ */
58
+ export declare function findNodesByName(node: FigNode, name: string): FigNode[];
59
+ /**
60
+ * Count nodes by type
61
+ */
62
+ export declare function countNodesByType(node: FigNode): Record<string, number>;
63
+ //# sourceMappingURL=layout-inference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-inference.d.ts","sourceRoot":"","sources":["../../src/parser/layout-inference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EAEd,IAAI,EACJ,KAAK,EACL,KAAK,EACL,MAAM,EAEP,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAWlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAStF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAe/D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAyFrF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,cAAc,GAAG,SAAS,CA+DzF;AAiBD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,KAAK,SAAI,EACT,QAAQ,SAAK,EACb,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CACrB,GACL,cAAc,GAAG,IAAI,CA+GvB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAoBxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAgBtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAiBtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CActE"}