@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,547 @@
1
+ /**
2
+ * Render Screen - Improved vector rendering
3
+ *
4
+ * Key improvements:
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 { DEFAULT_RENDER_OPTIONS, IDENTITY_TRANSFORM } from "./render-types.js";
14
+ import { escapeXml, multiplyTransforms, getLocalTransform, transformPoint, } from "./render-utils.js";
15
+ import { getPaints, getVisiblePaint, paintToColor, paintToImageHash, detectImageFormat, getMimeType, } from "./paint-utils.js";
16
+ import { isStrokedVector, renderStrokedVector, renderFilledVector, } from "./vector-renderer.js";
17
+ // ============================================================================
18
+ // Shadow/Effect Rendering
19
+ // ============================================================================
20
+ /**
21
+ * Convert a color to an rgba() string for SVG
22
+ */
23
+ function colorToRgba(color) {
24
+ if (!color)
25
+ return "rgba(0,0,0,0.25)";
26
+ const r = Math.round(color.r * 255);
27
+ const g = Math.round(color.g * 255);
28
+ const b = Math.round(color.b * 255);
29
+ const a = color.a ?? 1;
30
+ return `rgba(${r},${g},${b},${a.toFixed(3)})`;
31
+ }
32
+ /**
33
+ * Generate an SVG filter definition for a drop shadow effect.
34
+ * Returns the filter ID.
35
+ */
36
+ function generateDropShadowFilter(effect, ctx) {
37
+ const filterId = `shadow-${ctx.shadowCounter++}`;
38
+ const x = effect.offset?.x ?? 0;
39
+ const y = effect.offset?.y ?? 0;
40
+ const blur = effect.radius ?? 0;
41
+ const spread = effect.spread ?? 0;
42
+ const color = colorToRgba(effect.color);
43
+ // For SVG, we use feDropShadow or a combination of feGaussianBlur + feOffset + feFlood
44
+ // feDropShadow is simpler but has less control over spread
45
+ // We'll use a more complex filter to support spread
46
+ if (spread === 0) {
47
+ // Simple drop shadow without spread
48
+ ctx.defs.push(`<filter id="${filterId}" x="-50%" y="-50%" width="200%" height="200%">` +
49
+ `<feDropShadow dx="${x}" dy="${y}" stdDeviation="${blur / 2}" flood-color="${color}" />` +
50
+ `</filter>`);
51
+ }
52
+ else {
53
+ // Drop shadow with spread - use morphology to expand/contract
54
+ // stdDeviation is blur/2 because SVG blur is roughly 2x CSS blur
55
+ const stdDev = blur / 2;
56
+ ctx.defs.push(`<filter id="${filterId}" x="-100%" y="-100%" width="300%" height="300%">` +
57
+ // Create the shadow
58
+ `<feGaussianBlur in="SourceAlpha" stdDeviation="${stdDev}" result="blur" />` +
59
+ // Apply spread using morphology (dilate for positive, erode for negative)
60
+ (spread !== 0
61
+ ? `<feMorphology in="blur" operator="${spread > 0 ? 'dilate' : 'erode'}" radius="${Math.abs(spread)}" result="spread" />`
62
+ : `<feOffset in="blur" result="spread" />`) +
63
+ // Offset the shadow
64
+ `<feOffset in="spread" dx="${x}" dy="${y}" result="offsetBlur" />` +
65
+ // Color the shadow
66
+ `<feFlood flood-color="${color}" result="color" />` +
67
+ `<feComposite in="color" in2="offsetBlur" operator="in" result="shadow" />` +
68
+ // Merge with original
69
+ `<feMerge>` +
70
+ `<feMergeNode in="shadow" />` +
71
+ `<feMergeNode in="SourceGraphic" />` +
72
+ `</feMerge>` +
73
+ `</filter>`);
74
+ }
75
+ return filterId;
76
+ }
77
+ /**
78
+ * Generate an SVG filter definition for an inner shadow effect.
79
+ * Returns the filter ID.
80
+ */
81
+ function generateInnerShadowFilter(effect, ctx) {
82
+ const filterId = `inner-shadow-${ctx.shadowCounter++}`;
83
+ const x = effect.offset?.x ?? 0;
84
+ const y = effect.offset?.y ?? 0;
85
+ const blur = effect.radius ?? 0;
86
+ const color = colorToRgba(effect.color);
87
+ const stdDev = blur / 2;
88
+ // Inner shadow is created by:
89
+ // 1. Invert the alpha of the source
90
+ // 2. Apply blur and offset
91
+ // 3. Clip to original shape
92
+ ctx.defs.push(`<filter id="${filterId}" x="-50%" y="-50%" width="200%" height="200%">` +
93
+ // Invert the source alpha to get the "outside" shape
94
+ `<feComponentTransfer in="SourceAlpha" result="inverse">` +
95
+ `<feFuncA type="table" tableValues="1 0" />` +
96
+ `</feComponentTransfer>` +
97
+ // Blur the inverted shape
98
+ `<feGaussianBlur in="inverse" stdDeviation="${stdDev}" result="blur" />` +
99
+ // Offset the blur
100
+ `<feOffset in="blur" dx="${x}" dy="${y}" result="offsetBlur" />` +
101
+ // Color the shadow
102
+ `<feFlood flood-color="${color}" result="color" />` +
103
+ `<feComposite in="color" in2="offsetBlur" operator="in" result="shadow" />` +
104
+ // Clip to original shape
105
+ `<feComposite in="shadow" in2="SourceAlpha" operator="in" result="innerShadow" />` +
106
+ // Merge with original
107
+ `<feMerge>` +
108
+ `<feMergeNode in="SourceGraphic" />` +
109
+ `<feMergeNode in="innerShadow" />` +
110
+ `</feMerge>` +
111
+ `</filter>`);
112
+ return filterId;
113
+ }
114
+ /**
115
+ * Generate SVG filter(s) for a node's effects.
116
+ * Returns the filter ID to apply, or undefined if no filters needed.
117
+ */
118
+ function generateEffectFilters(node, ctx, includeShadows) {
119
+ if (!includeShadows || !node.effects || node.effects.length === 0) {
120
+ return undefined;
121
+ }
122
+ // Collect visible shadow effects
123
+ const dropShadows = node.effects.filter((e) => e.type === "DROP_SHADOW" && e.visible !== false);
124
+ const innerShadows = node.effects.filter((e) => e.type === "INNER_SHADOW" && e.visible !== false);
125
+ if (dropShadows.length === 0 && innerShadows.length === 0) {
126
+ return undefined;
127
+ }
128
+ // For simplicity, we'll handle the first drop shadow and first inner shadow
129
+ // A more complete implementation would combine multiple effects
130
+ if (dropShadows.length > 0) {
131
+ return generateDropShadowFilter(dropShadows[0], ctx);
132
+ }
133
+ if (innerShadows.length > 0) {
134
+ return generateInnerShadowFilter(innerShadows[0], ctx);
135
+ }
136
+ return undefined;
137
+ }
138
+ // ============================================================================
139
+ // Text Rendering
140
+ // ============================================================================
141
+ function renderText(node, transform, output) {
142
+ const text = node.characters;
143
+ if (!text)
144
+ return false;
145
+ const fills = getPaints(node, "fills");
146
+ const fillColor = paintToColor(getVisiblePaint(fills)) ?? "#000";
147
+ const style = node.style;
148
+ const fontSize = style?.fontSize ?? 14;
149
+ const fontFamily = escapeXml(style?.fontFamily ?? "Inter");
150
+ const fontWeight = style?.fontWeight ?? 400;
151
+ const fontStyle = style?.fontStyle ?? "normal";
152
+ const defaultLineHeight = style?.lineHeightPx ?? fontSize * 1.2;
153
+ const letterSpacing = style?.letterSpacing ?? 0;
154
+ const pos = transformPoint(0, 0, transform);
155
+ // Handle text alignment
156
+ const anchor = style?.textAlignHorizontal?.toLowerCase() ?? "left";
157
+ const textAnchor = anchor === "center" ? "middle" : anchor === "right" ? "end" : "start";
158
+ const width = node.width ?? 0;
159
+ const baseX = textAnchor === "middle"
160
+ ? pos.x + width / 2
161
+ : textAnchor === "end"
162
+ ? pos.x + width
163
+ : pos.x;
164
+ const attrs = [
165
+ `x="${baseX}"`,
166
+ `y="${pos.y}"`,
167
+ `font-family="${fontFamily}"`,
168
+ `font-size="${fontSize}"`,
169
+ `font-weight="${fontWeight}"`,
170
+ `font-style="${fontStyle}"`,
171
+ `fill="${fillColor}"`,
172
+ `dominant-baseline="text-before-edge"`,
173
+ `text-anchor="${textAnchor}"`,
174
+ ];
175
+ if (letterSpacing !== 0) {
176
+ attrs.push(`letter-spacing="${letterSpacing}"`);
177
+ }
178
+ if (node.opacity !== undefined && node.opacity < 1) {
179
+ attrs.push(`opacity="${node.opacity}"`);
180
+ }
181
+ if (style?.fontPostScriptName) {
182
+ attrs.push(`data-postscript="${escapeXml(style.fontPostScriptName)}"`);
183
+ }
184
+ // Use derivedTextData.baselines for wrapped text if available
185
+ const derivedTextData = node.derivedTextData;
186
+ let spans;
187
+ if (derivedTextData?.baselines && derivedTextData.baselines.length > 0) {
188
+ // Use baselines for proper text wrapping
189
+ spans = derivedTextData.baselines
190
+ .map((baseline, index) => {
191
+ // Extract the substring for this line
192
+ const lineText = text.substring(baseline.firstCharacter, baseline.endCharacter);
193
+ const safeLineText = escapeXml(lineText.trim()); // Trim to remove trailing spaces/newlines
194
+ // Calculate Y position from baseline data
195
+ // lineY gives us the offset from the top of the text block
196
+ const lineY = baseline.lineY;
197
+ if (index === 0) {
198
+ return `<tspan x="${baseX}" dy="0">${safeLineText}</tspan>`;
199
+ }
200
+ else {
201
+ // Use lineHeight for spacing between lines
202
+ const dy = baseline.lineHeight;
203
+ return `<tspan x="${baseX}" dy="${dy}">${safeLineText}</tspan>`;
204
+ }
205
+ })
206
+ .join("");
207
+ }
208
+ else {
209
+ // Fallback: split by newlines (for text with explicit line breaks)
210
+ const safeText = escapeXml(text);
211
+ const lines = safeText.split(/\r?\n/);
212
+ spans = lines
213
+ .map((line, index) => {
214
+ const dy = index === 0 ? 0 : defaultLineHeight;
215
+ return `<tspan x="${baseX}" dy="${dy}">${line}</tspan>`;
216
+ })
217
+ .join("");
218
+ }
219
+ output.push(`<text ${attrs.join(" ")}>${spans}</text>`);
220
+ return true;
221
+ }
222
+ // ============================================================================
223
+ // Rectangle Rendering
224
+ // ============================================================================
225
+ function renderRectangle(node, transform, images, includeImages, output) {
226
+ const fills = getPaints(node, "fills");
227
+ const strokes = getPaints(node, "strokes");
228
+ const fillPaint = getVisiblePaint(fills);
229
+ const fillColor = paintToColor(fillPaint);
230
+ const strokeColor = paintToColor(getVisiblePaint(strokes));
231
+ // Check for image fill
232
+ let hasImageFill = false;
233
+ if (includeImages && fillPaint?.type === "IMAGE" && images) {
234
+ const hash = paintToImageHash(fillPaint);
235
+ const imageData = hash ? images.get(hash) : undefined;
236
+ if (imageData) {
237
+ hasImageFill = true;
238
+ const format = detectImageFormat(imageData);
239
+ const mimeType = getMimeType(format);
240
+ const base64 = Buffer.from(imageData).toString("base64");
241
+ const scaleMode = fillPaint.imageScaleMode ??
242
+ fillPaint.scaleMode;
243
+ const preserve = scaleMode === "FIT"
244
+ ? "xMidYMid meet"
245
+ : scaleMode === "STRETCH"
246
+ ? "none"
247
+ : "xMidYMid slice";
248
+ const pos = transformPoint(0, 0, transform);
249
+ const width = node.width ?? 0;
250
+ const height = node.height ?? 0;
251
+ const attrs = [
252
+ `x="${pos.x}"`,
253
+ `y="${pos.y}"`,
254
+ `width="${width}"`,
255
+ `height="${height}"`,
256
+ `preserveAspectRatio="${preserve}"`,
257
+ `href="data:${mimeType};base64,${base64}"`,
258
+ ];
259
+ if (node.opacity !== undefined && node.opacity < 1) {
260
+ attrs.push(`opacity="${node.opacity}"`);
261
+ }
262
+ output.push(`<image ${attrs.join(" ")} />`);
263
+ }
264
+ }
265
+ if (hasImageFill)
266
+ return true;
267
+ if (!fillColor && !strokeColor)
268
+ return false;
269
+ const width = node.width ?? 0;
270
+ const height = node.height ?? 0;
271
+ // Transform the four corners
272
+ const p0 = transformPoint(0, 0, transform);
273
+ const p1 = transformPoint(width, 0, transform);
274
+ const p2 = transformPoint(width, height, transform);
275
+ const p3 = transformPoint(0, height, transform);
276
+ // Check if it's still axis-aligned (no rotation)
277
+ const isAxisAligned = Math.abs(p0.y - p1.y) < 0.01 && Math.abs(p1.x - p2.x) < 0.01;
278
+ if (isAxisAligned) {
279
+ const attrs = [
280
+ `x="${p0.x}"`,
281
+ `y="${p0.y}"`,
282
+ `width="${width}"`,
283
+ `height="${height}"`,
284
+ ];
285
+ if (fillColor)
286
+ attrs.push(`fill="${fillColor}"`);
287
+ else
288
+ attrs.push(`fill="none"`);
289
+ if (strokeColor) {
290
+ attrs.push(`stroke="${strokeColor}"`);
291
+ attrs.push(`stroke-width="${node.strokeWeight ?? 1}"`);
292
+ }
293
+ const cornerRadius = typeof node.cornerRadius === "number" ? node.cornerRadius : undefined;
294
+ if (cornerRadius) {
295
+ // Clamp to ensure circular arcs (not elliptical)
296
+ // SVG clamps rx/ry independently which creates elliptical corners
297
+ // when cornerRadius > min(width, height)/2, producing a tapered "football" shape.
298
+ // By clamping ourselves, we ensure proper pill/stadium shapes.
299
+ const maxRadius = Math.min(width, height) / 2;
300
+ const clampedRadius = Math.min(cornerRadius, maxRadius);
301
+ attrs.push(`rx="${clampedRadius}"`);
302
+ attrs.push(`ry="${clampedRadius}"`);
303
+ }
304
+ if (node.opacity !== undefined && node.opacity < 1) {
305
+ attrs.push(`opacity="${node.opacity}"`);
306
+ }
307
+ output.push(`<rect ${attrs.join(" ")} />`);
308
+ }
309
+ else {
310
+ // Rotated - use path
311
+ const pathD = `M ${p0.x} ${p0.y} L ${p1.x} ${p1.y} L ${p2.x} ${p2.y} L ${p3.x} ${p3.y} Z`;
312
+ const attrs = [`d="${pathD}"`];
313
+ if (fillColor)
314
+ attrs.push(`fill="${fillColor}"`);
315
+ else
316
+ attrs.push(`fill="none"`);
317
+ if (strokeColor) {
318
+ attrs.push(`stroke="${strokeColor}"`);
319
+ attrs.push(`stroke-width="${node.strokeWeight ?? 1}"`);
320
+ }
321
+ if (node.opacity !== undefined && node.opacity < 1) {
322
+ attrs.push(`opacity="${node.opacity}"`);
323
+ }
324
+ output.push(`<path ${attrs.join(" ")} />`);
325
+ }
326
+ return true;
327
+ }
328
+ // ============================================================================
329
+ // Main Node Rendering
330
+ // ============================================================================
331
+ const VECTOR_TYPES = new Set([
332
+ "VECTOR",
333
+ "LINE",
334
+ "STAR",
335
+ "REGULAR_POLYGON",
336
+ "ELLIPSE",
337
+ "BOOLEAN_OPERATION",
338
+ ]);
339
+ const CONTAINER_TYPES = new Set(["FRAME", "GROUP", "COMPONENT", "INSTANCE"]);
340
+ /**
341
+ * Render a mask node to create a clipPath definition.
342
+ * Returns the clip path content for the mask.
343
+ */
344
+ function renderMaskContent(node, transform, blobs, ctx) {
345
+ const maskOutput = [];
346
+ const width = node.width ?? 0;
347
+ const height = node.height ?? 0;
348
+ // Try to render the mask using vector geometry if available
349
+ if (node.fillGeometry?.length) {
350
+ const tempOutput = [];
351
+ const rendered = renderFilledVector(node, transform, blobs, ctx, tempOutput);
352
+ if (rendered && tempOutput.length > 0) {
353
+ // Convert fill to white for mask
354
+ return tempOutput.join("").replace(/fill="[^"]*"/g, 'fill="white"');
355
+ }
356
+ }
357
+ // Fallback to simple rectangle
358
+ const pos = transformPoint(0, 0, transform);
359
+ return `<rect x="${pos.x}" y="${pos.y}" width="${width}" height="${height}" fill="white" />`;
360
+ }
361
+ function renderNode(node, parentTransform, depth, options, images, blobs, ctx, output) {
362
+ if (depth > options.maxDepth)
363
+ return;
364
+ if (node.visible === false)
365
+ return;
366
+ const sceneNode = node;
367
+ const localTransform = getLocalTransform(sceneNode);
368
+ const worldTransform = multiplyTransforms(parentTransform, localTransform);
369
+ // Generate shadow filter if this node has effects
370
+ const filterId = generateEffectFilters(sceneNode, ctx, options.includeShadows);
371
+ // Use a temporary output array if we need to wrap with a filter
372
+ const nodeOutput = filterId ? [] : output;
373
+ let rendered = false;
374
+ // Handle different node types
375
+ if (node.type === "TEXT" && options.includeText) {
376
+ rendered = renderText(sceneNode, worldTransform, nodeOutput);
377
+ }
378
+ else if (VECTOR_TYPES.has(node.type ?? "")) {
379
+ if (options.includeStrokes && isStrokedVector(sceneNode)) {
380
+ rendered = renderStrokedVector(sceneNode, worldTransform, blobs, ctx, nodeOutput);
381
+ }
382
+ if (!rendered && options.includeFills) {
383
+ rendered = renderFilledVector(sceneNode, worldTransform, blobs, ctx, nodeOutput);
384
+ }
385
+ }
386
+ else if (node.type === "RECTANGLE") {
387
+ if (options.includeFills ||
388
+ options.includeStrokes ||
389
+ options.includeImages) {
390
+ rendered = renderRectangle(sceneNode, worldTransform, images, options.includeImages, nodeOutput);
391
+ }
392
+ }
393
+ else if (CONTAINER_TYPES.has(node.type ?? "")) {
394
+ if (options.includeFills || options.includeImages) {
395
+ const fills = getPaints(node, "fills");
396
+ const fillPaint = getVisiblePaint(fills);
397
+ const fillColor = paintToColor(fillPaint);
398
+ const hasImageFill = fillPaint?.type === "IMAGE";
399
+ if ((fillColor || (options.includeImages && hasImageFill)) &&
400
+ sceneNode.width &&
401
+ sceneNode.height) {
402
+ rendered = renderRectangle(sceneNode, worldTransform, images, options.includeImages, nodeOutput);
403
+ }
404
+ }
405
+ }
406
+ // Render children with mask support
407
+ // When we have a filter, children should render to nodeOutput so the filter applies to everything
408
+ const baseOutput = filterId ? nodeOutput : output;
409
+ if (node.children) {
410
+ const children = node.children;
411
+ const childOutput = [];
412
+ const targetOutput = sceneNode.clipsContent ? childOutput : baseOutput;
413
+ let index = 0;
414
+ while (index < children.length) {
415
+ const child = children[index];
416
+ const childScene = child;
417
+ // Handle mask nodes
418
+ if (childScene.isMask) {
419
+ const maskId = `mask-${ctx.clipCounter++}`;
420
+ const childTransform = multiplyTransforms(worldTransform, getLocalTransform(childScene));
421
+ // Create mask clipPath
422
+ const maskContent = renderMaskContent(childScene, childTransform, blobs, ctx);
423
+ ctx.defs.push(`<clipPath id="${maskId}" clipPathUnits="userSpaceOnUse">${maskContent}</clipPath>`);
424
+ // Collect all siblings until the next mask
425
+ const groupOutput = [];
426
+ index += 1;
427
+ while (index < children.length) {
428
+ const sibling = children[index];
429
+ const siblingScene = sibling;
430
+ if (siblingScene.isMask)
431
+ break;
432
+ renderNode(sibling, worldTransform, depth + 1, options, images, blobs, ctx, groupOutput);
433
+ index += 1;
434
+ }
435
+ // Wrap masked content in a group with the clip-path
436
+ targetOutput.push(`<g clip-path="url(#${maskId})">${groupOutput.join("")}</g>`);
437
+ continue;
438
+ }
439
+ renderNode(child, worldTransform, depth + 1, options, images, blobs, ctx, targetOutput);
440
+ index += 1;
441
+ }
442
+ // Handle clipping - wrap childOutput in clip-path if needed
443
+ if (sceneNode.clipsContent && sceneNode.width && sceneNode.height) {
444
+ const clipId = `clip-${ctx.clipCounter++}`;
445
+ const p0 = transformPoint(0, 0, worldTransform);
446
+ ctx.defs.push(`<clipPath id="${clipId}"><rect x="${p0.x}" y="${p0.y}" width="${sceneNode.width}" height="${sceneNode.height}" /></clipPath>`);
447
+ baseOutput.push(`<g clip-path="url(#${clipId})">${childOutput.join("")}</g>`);
448
+ }
449
+ }
450
+ // If we have a filter, wrap all node content (including children) with the filter
451
+ if (filterId && nodeOutput.length > 0) {
452
+ output.push(`<g filter="url(#${filterId})">${nodeOutput.join("")}</g>`);
453
+ }
454
+ }
455
+ // ============================================================================
456
+ // Bounds Calculation
457
+ // ============================================================================
458
+ function collectBounds(node, parentTransform) {
459
+ if (node.visible === false)
460
+ return null;
461
+ const sceneNode = node;
462
+ const localTransform = getLocalTransform(sceneNode);
463
+ const worldTransform = multiplyTransforms(parentTransform, localTransform);
464
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
465
+ // Skip CANVAS/DOCUMENT bounds - they represent pages, not visual content
466
+ // Only include actual content node bounds
467
+ const isPageNode = node.type === "CANVAS" || node.type === "DOCUMENT";
468
+ if (!isPageNode &&
469
+ sceneNode.width !== undefined &&
470
+ sceneNode.height !== undefined) {
471
+ const corners = [
472
+ transformPoint(0, 0, worldTransform),
473
+ transformPoint(sceneNode.width, 0, worldTransform),
474
+ transformPoint(sceneNode.width, sceneNode.height, worldTransform),
475
+ transformPoint(0, sceneNode.height, worldTransform),
476
+ ];
477
+ for (const p of corners) {
478
+ minX = Math.min(minX, p.x);
479
+ minY = Math.min(minY, p.y);
480
+ maxX = Math.max(maxX, p.x);
481
+ maxY = Math.max(maxY, p.y);
482
+ }
483
+ }
484
+ // Include children bounds
485
+ if (node.children) {
486
+ for (const child of node.children) {
487
+ const childBounds = collectBounds(child, worldTransform);
488
+ if (childBounds) {
489
+ minX = Math.min(minX, childBounds.minX);
490
+ minY = Math.min(minY, childBounds.minY);
491
+ maxX = Math.max(maxX, childBounds.maxX);
492
+ maxY = Math.max(maxY, childBounds.maxY);
493
+ }
494
+ }
495
+ }
496
+ if (!Number.isFinite(minX))
497
+ return null;
498
+ return { minX, minY, maxX, maxY };
499
+ }
500
+ // ============================================================================
501
+ // Main Export
502
+ // ============================================================================
503
+ /**
504
+ * Render a node subtree to SVG.
505
+ *
506
+ * @param node - The root node to render
507
+ * @param images - Optional map of image hash -> image data for embedding
508
+ * @param blobs - Optional array of blob data for vector paths
509
+ * @param options - Rendering options
510
+ * @returns The rendered SVG and metadata
511
+ */
512
+ export function renderScreen(node, images, blobs, options = {}) {
513
+ const resolved = { ...DEFAULT_RENDER_OPTIONS, ...options };
514
+ const ctx = { defs: [], clipCounter: 0, shadowCounter: 0, warnings: [] };
515
+ // Calculate bounds
516
+ const bounds = collectBounds(node, IDENTITY_TRANSFORM);
517
+ if (!bounds) {
518
+ ctx.warnings.push("No bounds found for node subtree");
519
+ return { svg: "", width: 0, height: 0, warnings: ctx.warnings };
520
+ }
521
+ const width = Math.max(1, bounds.maxX - bounds.minX);
522
+ const height = Math.max(1, bounds.maxY - bounds.minY);
523
+ // Offset transform to bring content to origin
524
+ const offsetTransform = {
525
+ a: 1,
526
+ b: 0,
527
+ c: 0,
528
+ d: 1,
529
+ e: -bounds.minX,
530
+ f: -bounds.minY,
531
+ };
532
+ // Render
533
+ const output = [];
534
+ if (resolved.background) {
535
+ output.push(`<rect width="100%" height="100%" fill="${resolved.background}" />`);
536
+ }
537
+ renderNode(node, offsetTransform, 0, resolved, images, blobs, ctx, output);
538
+ // Build SVG
539
+ const defs = ctx.defs.length > 0 ? `<defs>${ctx.defs.join("")}</defs>` : "";
540
+ const scaledWidth = width * resolved.scale;
541
+ const scaledHeight = height * resolved.scale;
542
+ const svg = `<?xml version="1.0" encoding="UTF-8"?>` +
543
+ `<svg xmlns="http://www.w3.org/2000/svg" width="${scaledWidth}" height="${scaledHeight}" viewBox="0 0 ${width} ${height}">` +
544
+ `${defs}${output.join("")}</svg>`;
545
+ return { svg, width, height, warnings: ctx.warnings };
546
+ }
547
+ //# sourceMappingURL=render-screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-screen.js","sourceRoot":"","sources":["../../src/experimental/render-screen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkBH,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAQ9B,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E;;GAEG;AACH,SAAS,WAAW,CAAC,KAAwB;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,kBAAkB,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,SAAS,wBAAwB,CAC/B,MAAc,EACd,GAAkB;IAElB,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;IACjD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExC,uFAAuF;IACvF,2DAA2D;IAC3D,oDAAoD;IAEpD,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,oCAAoC;QACpC,GAAG,CAAC,IAAI,CAAC,IAAI,CACX,eAAe,QAAQ,iDAAiD;YACxE,qBAAqB,CAAC,SAAS,CAAC,mBAAmB,IAAI,GAAG,CAAC,kBAAkB,KAAK,MAAM;YACxF,WAAW,CACZ,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,8DAA8D;QAC9D,iEAAiE;QACjE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,IAAI,CACX,eAAe,QAAQ,mDAAmD;YAC1E,oBAAoB;YACpB,kDAAkD,MAAM,oBAAoB;YAC5E,0EAA0E;YAC1E,CAAC,MAAM,KAAK,CAAC;gBACX,CAAC,CAAC,qCAAqC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,aAAa,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,sBAAsB;gBACzH,CAAC,CAAC,wCAAwC,CAAC;YAC7C,oBAAoB;YACpB,6BAA6B,CAAC,SAAS,CAAC,0BAA0B;YAClE,mBAAmB;YACnB,yBAAyB,KAAK,qBAAqB;YACnD,2EAA2E;YAC3E,sBAAsB;YACtB,WAAW;YACX,6BAA6B;YAC7B,oCAAoC;YACpC,YAAY;YACZ,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAChC,MAAc,EACd,GAAkB;IAElB,MAAM,QAAQ,GAAG,gBAAgB,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;IAExB,8BAA8B;IAC9B,oCAAoC;IACpC,2BAA2B;IAC3B,4BAA4B;IAC5B,GAAG,CAAC,IAAI,CAAC,IAAI,CACX,eAAe,QAAQ,iDAAiD;QACxE,qDAAqD;QACrD,yDAAyD;QACzD,4CAA4C;QAC5C,wBAAwB;QACxB,0BAA0B;QAC1B,8CAA8C,MAAM,oBAAoB;QACxE,kBAAkB;QAClB,2BAA2B,CAAC,SAAS,CAAC,0BAA0B;QAChE,mBAAmB;QACnB,yBAAyB,KAAK,qBAAqB;QACnD,2EAA2E;QAC3E,yBAAyB;QACzB,kFAAkF;QAClF,sBAAsB;QACtB,WAAW;QACX,oCAAoC;QACpC,kCAAkC;QAClC,YAAY;QACZ,WAAW,CACZ,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAC5B,IAAe,EACf,GAAkB,EAClB,cAAuB;IAEvB,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iCAAiC;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CACvD,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CACxD,CAAC;IAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,4EAA4E;IAC5E,gEAAgE;IAChE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,wBAAwB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,yBAAyB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,SAAS,UAAU,CACjB,IAAe,EACf,SAA0B,EAC1B,MAAgB;IAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAe,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC;IAEjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAA8B,CAAC;IAClD,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,EAAE,UAAU,IAAI,OAAO,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,KAAK,EAAE,UAAU,IAAI,GAAG,CAAC;IAC5C,MAAM,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,QAAQ,CAAC;IAC/C,MAAM,iBAAiB,GAAG,KAAK,EAAE,YAAY,IAAI,QAAQ,GAAG,GAAG,CAAC;IAChE,MAAM,aAAa,GAAG,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;IAEhD,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAE5C,wBAAwB;IACxB,MAAM,MAAM,GAAG,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;IACnE,MAAM,UAAU,GACd,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,GACT,UAAU,KAAK,QAAQ;QACrB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;QACnB,CAAC,CAAC,UAAU,KAAK,KAAK;YACpB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;YACf,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAEd,MAAM,KAAK,GAAa;QACtB,MAAM,KAAK,GAAG;QACd,MAAM,GAAG,CAAC,CAAC,GAAG;QACd,gBAAgB,UAAU,GAAG;QAC7B,cAAc,QAAQ,GAAG;QACzB,gBAAgB,UAAU,GAAG;QAC7B,eAAe,SAAS,GAAG;QAC3B,SAAS,SAAS,GAAG;QACrB,sCAAsC;QACtC,gBAAgB,UAAU,GAAG;KAC9B,CAAC;IAEF,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,mBAAmB,aAAa,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,oBAAoB,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,8DAA8D;IAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,eAA8C,CAAC;IAC5E,IAAI,KAAa,CAAC;IAElB,IAAI,eAAe,EAAE,SAAS,IAAI,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvE,yCAAyC;QACzC,KAAK,GAAG,eAAe,CAAC,SAAS;aAC9B,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACvB,sCAAsC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAC7B,QAAQ,CAAC,cAAc,EACvB,QAAQ,CAAC,YAAY,CACtB,CAAC;YACF,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,0CAA0C;YAE3F,0CAA0C;YAC1C,2DAA2D;YAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAE7B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,aAAa,KAAK,YAAY,YAAY,UAAU,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,2CAA2C;gBAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC;gBAC/B,OAAO,aAAa,KAAK,SAAS,EAAE,KAAK,YAAY,UAAU,CAAC;YAClE,CAAC;QACH,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;SAAM,CAAC;QACN,mEAAmE;QACnE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,KAAK,GAAG,KAAK;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnB,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;YAC/C,OAAO,aAAa,KAAK,SAAS,EAAE,KAAK,IAAI,UAAU,CAAC;QAC1D,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,SAAS,eAAe,CACtB,IAAe,EACf,SAA0B,EAC1B,MAA2C,EAC3C,aAAsB,EACtB,MAAgB;IAEhB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAe,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAe,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3D,uBAAuB;IACvB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,aAAa,IAAI,SAAS,EAAE,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,GAAG,IAAI,CAAC;YACpB,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEzD,MAAM,SAAS,GACZ,SAAoD,CAAC,cAAc;gBACpE,SAAS,CAAC,SAAS,CAAC;YACtB,MAAM,QAAQ,GACZ,SAAS,KAAK,KAAK;gBACjB,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,SAAS,KAAK,SAAS;oBACvB,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,gBAAgB,CAAC;YAEzB,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YAEhC,MAAM,KAAK,GAAa;gBACtB,MAAM,GAAG,CAAC,CAAC,GAAG;gBACd,MAAM,GAAG,CAAC,CAAC,GAAG;gBACd,UAAU,KAAK,GAAG;gBAClB,WAAW,MAAM,GAAG;gBACpB,wBAAwB,QAAQ,GAAG;gBACnC,cAAc,QAAQ,WAAW,MAAM,GAAG;aAC3C,CAAC;YAEF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,YAAY;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAE7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAEhC,6BAA6B;IAC7B,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAEhD,iDAAiD;IACjD,MAAM,aAAa,GACjB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/D,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,KAAK,GAAa;YACtB,MAAM,EAAE,CAAC,CAAC,GAAG;YACb,MAAM,EAAE,CAAC,CAAC,GAAG;YACb,UAAU,KAAK,GAAG;YAClB,WAAW,MAAM,GAAG;SACrB,CAAC;QAEF,IAAI,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,CAAC,CAAC;;YAC5C,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE/B,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,GAAG,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,YAAY,GAChB,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,IAAI,YAAY,EAAE,CAAC;YACjB,iDAAiD;YACjD,kEAAkE;YAClE,kFAAkF;YAClF,+DAA+D;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,OAAO,aAAa,GAAG,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,OAAO,aAAa,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QAE1F,MAAM,KAAK,GAAa,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,CAAC,CAAC;;YAC5C,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,GAAG,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,QAAQ;IACR,MAAM;IACN,MAAM;IACN,iBAAiB;IACjB,SAAS;IACT,mBAAmB;CACpB,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAE7E;;;GAGG;AACH,SAAS,iBAAiB,CACxB,IAAe,EACf,SAA0B,EAC1B,KAA8B,EAC9B,GAAkB;IAElB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAEhC,4DAA4D;IAC5D,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,kBAAkB,CACjC,IAAI,EACJ,SAAS,EACT,KAAK,EACL,GAAG,EACH,UAAU,CACX,CAAC;QACF,IAAI,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,iCAAiC;YACjC,OAAO,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,YAAY,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,YAAY,KAAK,aAAa,MAAM,mBAAmB,CAAC;AAC/F,CAAC;AAED,SAAS,UAAU,CACjB,IAAa,EACb,eAAgC,EAChC,KAAa,EACb,OAAsC,EACtC,MAA2C,EAC3C,KAA8B,EAC9B,GAAkB,EAClB,MAAgB;IAEhB,IAAI,KAAK,GAAG,OAAO,CAAC,QAAQ;QAAE,OAAO;IACrC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO;IAEnC,MAAM,SAAS,GAAG,IAAiB,CAAC;IACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,kBAAkB,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAE3E,kDAAkD;IAClD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAE/E,gEAAgE;IAChE,MAAM,UAAU,GAAa,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACpD,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,8BAA8B;IAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAChD,QAAQ,GAAG,UAAU,CAAC,SAAS,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7C,IAAI,OAAO,CAAC,cAAc,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;YACzD,QAAQ,GAAG,mBAAmB,CAC5B,SAAS,EACT,cAAc,EACd,KAAK,EACL,GAAG,EACH,UAAU,CACX,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACtC,QAAQ,GAAG,kBAAkB,CAC3B,SAAS,EACT,cAAc,EACd,KAAK,EACL,GAAG,EACH,UAAU,CACX,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACrC,IACE,OAAO,CAAC,YAAY;YACpB,OAAO,CAAC,cAAc;YACtB,OAAO,CAAC,aAAa,EACrB,CAAC;YACD,QAAQ,GAAG,eAAe,CACxB,SAAS,EACT,cAAc,EACd,MAAM,EACN,OAAO,CAAC,aAAa,EACrB,UAAU,CACX,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,YAAY,GAAG,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC;YACjD,IACE,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,YAAY,CAAC,CAAC;gBACtD,SAAS,CAAC,KAAK;gBACf,SAAS,CAAC,MAAM,EAChB,CAAC;gBACD,QAAQ,GAAG,eAAe,CACxB,SAAS,EACT,cAAc,EACd,MAAM,EACN,OAAO,CAAC,aAAa,EACrB,UAAU,CACX,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,kGAAkG;IAClG,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAElD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAqB,CAAC;QAC5C,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;QAEvE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAY,CAAC;YACzC,MAAM,UAAU,GAAG,KAAkB,CAAC;YAEtC,oBAAoB;YACpB,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC3C,MAAM,cAAc,GAAG,kBAAkB,CACvC,cAAc,EACd,iBAAiB,CAAC,UAAU,CAAC,CAC9B,CAAC;gBAEF,uBAAuB;gBACvB,MAAM,WAAW,GAAG,iBAAiB,CACnC,UAAU,EACV,cAAc,EACd,KAAK,EACL,GAAG,CACJ,CAAC;gBACF,GAAG,CAAC,IAAI,CAAC,IAAI,CACX,iBAAiB,MAAM,oCAAoC,WAAW,aAAa,CACpF,CAAC;gBAEF,2CAA2C;gBAC3C,MAAM,WAAW,GAAa,EAAE,CAAC;gBACjC,KAAK,IAAI,CAAC,CAAC;gBACX,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAY,CAAC;oBAC3C,MAAM,YAAY,GAAG,OAAoB,CAAC;oBAC1C,IAAI,YAAY,CAAC,MAAM;wBAAE,MAAM;oBAC/B,UAAU,CACR,OAAO,EACP,cAAc,EACd,KAAK,GAAG,CAAC,EACT,OAAO,EACP,MAAM,EACN,KAAK,EACL,GAAG,EACH,WAAW,CACZ,CAAC;oBACF,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;gBAED,oDAAoD;gBACpD,YAAY,CAAC,IAAI,CACf,sBAAsB,MAAM,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAC7D,CAAC;gBACF,SAAS;YACX,CAAC;YAED,UAAU,CACR,KAAK,EACL,cAAc,EACd,KAAK,GAAG,CAAC,EACT,OAAO,EACP,MAAM,EACN,KAAK,EACL,GAAG,EACH,YAAY,CACb,CAAC;YACF,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QAED,4DAA4D;QAC5D,IAAI,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,IAAI,CACX,iBAAiB,MAAM,cAAc,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,SAAS,CAAC,KAAK,aAAa,SAAS,CAAC,MAAM,iBAAiB,CAC/H,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,sBAAsB,MAAM,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,IAAI,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,mBAAmB,QAAQ,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,SAAS,aAAa,CACpB,IAAa,EACb,eAAgC;IAEhC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,SAAS,GAAG,IAAiB,CAAC;IACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,kBAAkB,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAE3E,IAAI,IAAI,GAAG,QAAQ,EACjB,IAAI,GAAG,QAAQ,EACf,IAAI,GAAG,CAAC,QAAQ,EAChB,IAAI,GAAG,CAAC,QAAQ,CAAC;IAEnB,yEAAyE;IACzE,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;IAEtE,IACE,CAAC,UAAU;QACX,SAAS,CAAC,KAAK,KAAK,SAAS;QAC7B,SAAS,CAAC,MAAM,KAAK,SAAS,EAC9B,CAAC;QACD,MAAM,OAAO,GAAG;YACd,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;YACpC,cAAc,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,CAAC;YAClD,cAAc,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;YACjE,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;SACpD,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAqB,EAAE,CAAC;YAC/C,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YACzD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAa,EACb,MAAgC,EAChC,KAAmB,EACnB,UAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,EAAE,GAAG,sBAAsB,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAExF,mBAAmB;IACnB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAEvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACtD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtD,8CAA8C;IAC9C,MAAM,eAAe,GAAoB;QACvC,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI;QACf,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI;KAChB,CAAC;IAEF,SAAS;IACT,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CACT,0CAA0C,QAAQ,CAAC,UAAU,MAAM,CACpE,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAE3E,YAAY;IACZ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE7C,MAAM,GAAG,GACP,wCAAwC;QACxC,kDAAkD,WAAW,aAAa,YAAY,kBAAkB,KAAK,IAAI,MAAM,IAAI;QAC3H,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC;IAEpC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Shared types for the SVG renderer modules
3
+ */
4
+ export type TransformMatrix = {
5
+ a: number;
6
+ b: number;
7
+ c: number;
8
+ d: number;
9
+ e: number;
10
+ f: number;
11
+ };
12
+ export type BlobEntry = {
13
+ bytes: Uint8Array;
14
+ };
15
+ export type RenderContext = {
16
+ defs: string[];
17
+ clipCounter: number;
18
+ shadowCounter: number;
19
+ warnings: string[];
20
+ };
21
+ export type PathCommand = {
22
+ cmd: number;
23
+ values: number[];
24
+ };
25
+ export type RenderScreenOptions = {
26
+ maxDepth?: number;
27
+ includeText?: boolean;
28
+ includeFills?: boolean;
29
+ includeStrokes?: boolean;
30
+ includeImages?: boolean;
31
+ includeShadows?: boolean;
32
+ background?: string;
33
+ scale?: number;
34
+ };
35
+ export type RenderScreenResult = {
36
+ svg: string;
37
+ width: number;
38
+ height: number;
39
+ warnings: string[];
40
+ };
41
+ export declare const DEFAULT_RENDER_OPTIONS: Required<RenderScreenOptions>;
42
+ export declare const IDENTITY_TRANSFORM: TransformMatrix;
43
+ //# sourceMappingURL=render-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-types.d.ts","sourceRoot":"","sources":["../../src/experimental/render-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,mBAAmB,CAShE,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAOhC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shared types for the SVG renderer modules
3
+ */
4
+ export const DEFAULT_RENDER_OPTIONS = {
5
+ maxDepth: 200,
6
+ includeText: true,
7
+ includeFills: true,
8
+ includeStrokes: true,
9
+ includeImages: false,
10
+ includeShadows: true,
11
+ background: "",
12
+ scale: 1,
13
+ };
14
+ export const IDENTITY_TRANSFORM = {
15
+ a: 1,
16
+ b: 0,
17
+ c: 0,
18
+ d: 1,
19
+ e: 0,
20
+ f: 0,
21
+ };
22
+ //# sourceMappingURL=render-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-types.js","sourceRoot":"","sources":["../../src/experimental/render-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6CH,MAAM,CAAC,MAAM,sBAAsB,GAAkC;IACnE,QAAQ,EAAE,GAAG;IACb,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,KAAK;IACpB,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAoB;IACjD,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;CACL,CAAC"}