@bilalba/fig-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -0
- package/dist/compare-get-vector.d.ts +2 -0
- package/dist/compare-get-vector.d.ts.map +1 -0
- package/dist/compare-get-vector.js +124 -0
- package/dist/compare-get-vector.js.map +1 -0
- package/dist/compare-mcp-vs-direct.d.ts +2 -0
- package/dist/compare-mcp-vs-direct.d.ts.map +1 -0
- package/dist/compare-mcp-vs-direct.js +173 -0
- package/dist/compare-mcp-vs-direct.js.map +1 -0
- package/dist/compare-renderers.d.ts +2 -0
- package/dist/compare-renderers.d.ts.map +1 -0
- package/dist/compare-renderers.js +110 -0
- package/dist/compare-renderers.js.map +1 -0
- package/dist/debug/debug-stroke-geom.d.ts +2 -0
- package/dist/debug/debug-stroke-geom.d.ts.map +1 -0
- package/dist/debug/debug-stroke-geom.js +67 -0
- package/dist/debug/debug-stroke-geom.js.map +1 -0
- package/dist/debug/debug-transforms.d.ts +2 -0
- package/dist/debug/debug-transforms.d.ts.map +1 -0
- package/dist/debug/debug-transforms.js +97 -0
- package/dist/debug/debug-transforms.js.map +1 -0
- package/dist/debug/debug-vertex.d.ts +2 -0
- package/dist/debug/debug-vertex.d.ts.map +1 -0
- package/dist/debug/debug-vertex.js +72 -0
- package/dist/debug/debug-vertex.js.map +1 -0
- package/dist/debug-group.d.ts +5 -0
- package/dist/debug-group.d.ts.map +1 -0
- package/dist/debug-group.js +44 -0
- package/dist/debug-group.js.map +1 -0
- package/dist/debug-stroke-geom.d.ts +2 -0
- package/dist/debug-stroke-geom.d.ts.map +1 -0
- package/dist/debug-stroke-geom.js +67 -0
- package/dist/debug-stroke-geom.js.map +1 -0
- package/dist/debug-transforms.d.ts +2 -0
- package/dist/debug-transforms.d.ts.map +1 -0
- package/dist/debug-transforms.js +97 -0
- package/dist/debug-transforms.js.map +1 -0
- package/dist/debug-vertex.d.ts +2 -0
- package/dist/debug-vertex.d.ts.map +1 -0
- package/dist/debug-vertex.js +72 -0
- package/dist/debug-vertex.js.map +1 -0
- package/dist/decode-vector-network.d.ts +5 -0
- package/dist/decode-vector-network.d.ts.map +1 -0
- package/dist/decode-vector-network.js +160 -0
- package/dist/decode-vector-network.js.map +1 -0
- package/dist/experimental/paint-utils.d.ts +35 -0
- package/dist/experimental/paint-utils.d.ts.map +1 -0
- package/dist/experimental/paint-utils.js +105 -0
- package/dist/experimental/paint-utils.js.map +1 -0
- package/dist/experimental/render-screen-v2.d.ts +32 -0
- package/dist/experimental/render-screen-v2.d.ts.map +1 -0
- package/dist/experimental/render-screen-v2.js +366 -0
- package/dist/experimental/render-screen-v2.js.map +1 -0
- package/dist/experimental/render-screen.d.ts +26 -0
- package/dist/experimental/render-screen.d.ts.map +1 -0
- package/dist/experimental/render-screen.js +547 -0
- package/dist/experimental/render-screen.js.map +1 -0
- package/dist/experimental/render-types.d.ts +43 -0
- package/dist/experimental/render-types.d.ts.map +1 -0
- package/dist/experimental/render-types.js +22 -0
- package/dist/experimental/render-types.js.map +1 -0
- package/dist/experimental/render-utils.d.ts +38 -0
- package/dist/experimental/render-utils.d.ts.map +1 -0
- package/dist/experimental/render-utils.js +126 -0
- package/dist/experimental/render-utils.js.map +1 -0
- package/dist/experimental/screenshot.d.ts +11 -0
- package/dist/experimental/screenshot.d.ts.map +1 -0
- package/dist/experimental/screenshot.js +26 -0
- package/dist/experimental/screenshot.js.map +1 -0
- package/dist/experimental/vector-renderer.d.ts +31 -0
- package/dist/experimental/vector-renderer.d.ts.map +1 -0
- package/dist/experimental/vector-renderer.js +427 -0
- package/dist/experimental/vector-renderer.js.map +1 -0
- package/dist/explore-images.d.ts +9 -0
- package/dist/explore-images.d.ts.map +1 -0
- package/dist/explore-images.js +307 -0
- package/dist/explore-images.js.map +1 -0
- package/dist/http-server.d.ts +8 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +95 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect-fig.d.ts +16 -0
- package/dist/inspect-fig.d.ts.map +1 -0
- package/dist/inspect-fig.js +134 -0
- package/dist/inspect-fig.js.map +1 -0
- package/dist/inspect-frame.d.ts +2 -0
- package/dist/inspect-frame.d.ts.map +1 -0
- package/dist/inspect-frame.js +90 -0
- package/dist/inspect-frame.js.map +1 -0
- package/dist/inspect-nodes.d.ts +5 -0
- package/dist/inspect-nodes.d.ts.map +1 -0
- package/dist/inspect-nodes.js +193 -0
- package/dist/inspect-nodes.js.map +1 -0
- package/dist/mcp/server.d.ts +38 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +1524 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parser/fig-reader.d.ts +29 -0
- package/dist/parser/fig-reader.d.ts.map +1 -0
- package/dist/parser/fig-reader.js +182 -0
- package/dist/parser/fig-reader.js.map +1 -0
- package/dist/parser/index.d.ts +48 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +106 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/kiwi-parser.d.ts +66 -0
- package/dist/parser/kiwi-parser.d.ts.map +1 -0
- package/dist/parser/kiwi-parser.js +491 -0
- package/dist/parser/kiwi-parser.js.map +1 -0
- package/dist/parser/layout-inference.d.ts +63 -0
- package/dist/parser/layout-inference.d.ts.map +1 -0
- package/dist/parser/layout-inference.js +446 -0
- package/dist/parser/layout-inference.js.map +1 -0
- package/dist/parser/types.d.ts +286 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +6 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/render-single.d.ts +2 -0
- package/dist/render-single.d.ts.map +1 -0
- package/dist/render-single.js +53 -0
- package/dist/render-single.js.map +1 -0
- package/dist/renderer/index.d.ts +16 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +18 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/paint-utils.d.ts +35 -0
- package/dist/renderer/paint-utils.d.ts.map +1 -0
- package/dist/renderer/paint-utils.js +105 -0
- package/dist/renderer/paint-utils.js.map +1 -0
- package/dist/renderer/render-screen.d.ts +26 -0
- package/dist/renderer/render-screen.d.ts.map +1 -0
- package/dist/renderer/render-screen.js +547 -0
- package/dist/renderer/render-screen.js.map +1 -0
- package/dist/renderer/render-types.d.ts +43 -0
- package/dist/renderer/render-types.d.ts.map +1 -0
- package/dist/renderer/render-types.js +22 -0
- package/dist/renderer/render-types.js.map +1 -0
- package/dist/renderer/render-utils.d.ts +38 -0
- package/dist/renderer/render-utils.d.ts.map +1 -0
- package/dist/renderer/render-utils.js +126 -0
- package/dist/renderer/render-utils.js.map +1 -0
- package/dist/renderer/screenshot.d.ts +11 -0
- package/dist/renderer/screenshot.d.ts.map +1 -0
- package/dist/renderer/screenshot.js +26 -0
- package/dist/renderer/screenshot.js.map +1 -0
- package/dist/renderer/vector-renderer.d.ts +31 -0
- package/dist/renderer/vector-renderer.d.ts.map +1 -0
- package/dist/renderer/vector-renderer.js +427 -0
- package/dist/renderer/vector-renderer.js.map +1 -0
- package/dist/shared-config.d.ts +9 -0
- package/dist/shared-config.d.ts.map +1 -0
- package/dist/shared-config.js +9 -0
- package/dist/shared-config.js.map +1 -0
- package/dist/test-parser.d.ts +3 -0
- package/dist/test-parser.d.ts.map +1 -0
- package/dist/test-parser.js +74 -0
- package/dist/test-parser.js.map +1 -0
- package/dist/test-render-v2.d.ts +5 -0
- package/dist/test-render-v2.d.ts.map +1 -0
- package/dist/test-render-v2.js +76 -0
- package/dist/test-render-v2.js.map +1 -0
- package/dist/test-render.d.ts +5 -0
- package/dist/test-render.d.ts.map +1 -0
- package/dist/test-render.js +76 -0
- package/dist/test-render.js.map +1 -0
- package/dist/vector-export.d.ts +52 -0
- package/dist/vector-export.d.ts.map +1 -0
- package/dist/vector-export.js +628 -0
- package/dist/vector-export.js.map +1 -0
- package/dist/web-viewer/build-client.d.ts +6 -0
- package/dist/web-viewer/build-client.d.ts.map +1 -0
- package/dist/web-viewer/build-client.js +36 -0
- package/dist/web-viewer/build-client.js.map +1 -0
- package/dist/web-viewer/client/viewer.d.ts +7 -0
- package/dist/web-viewer/client/viewer.d.ts.map +1 -0
- package/dist/web-viewer/client/viewer.js +873 -0
- package/dist/web-viewer/client/viewer.js.map +1 -0
- package/dist/web-viewer/server.d.ts +16 -0
- package/dist/web-viewer/server.d.ts.map +1 -0
- package/dist/web-viewer/server.js +420 -0
- package/dist/web-viewer/server.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,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":"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"}
|
|
@@ -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"}
|