@charz/dom-to-figma 0.0.0-stage → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +172 -2
- package/dist/figma.d.mts +566 -0
- package/dist/figma.d.mts.map +1 -0
- package/dist/figma.mjs +7191 -0
- package/dist/figma.mjs.map +1 -0
- package/package.json +69 -3
package/dist/figma.d.mts
ADDED
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
//#region src/converter/nodes/image/loader.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Identifier for the image being loaded. The element is included so loaders
|
|
4
|
+
* can read auxiliary attributes (`crossOrigin`, `referrerPolicy`, etc.) when
|
|
5
|
+
* choosing a fetch strategy, but `src` is the canonical key.
|
|
6
|
+
*/
|
|
7
|
+
type ImageRequest = {
|
|
8
|
+
src: string;
|
|
9
|
+
element: HTMLImageElement;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Bytes returned from the loader along with the actual content type. The
|
|
13
|
+
* package re-encodes to PNG when the type isn't directly supported by Figma's
|
|
14
|
+
* clipboard format.
|
|
15
|
+
*/
|
|
16
|
+
type ImageFile = {
|
|
17
|
+
bytes: ArrayBuffer;
|
|
18
|
+
mimeType: string;
|
|
19
|
+
};
|
|
20
|
+
type ImageLoader = (request: ImageRequest) => Promise<ImageFile>;
|
|
21
|
+
/**
|
|
22
|
+
* Build an `ImageLoader` that performs a single direct `fetch(src)`. Works
|
|
23
|
+
* for same-origin images and remote images that send permissive CORS headers.
|
|
24
|
+
* Cross-origin images without CORS will throw — consumers that need a proxy
|
|
25
|
+
* chain should inject their own `ImageLoader`.
|
|
26
|
+
*/
|
|
27
|
+
declare function createDirectImageLoader(): ImageLoader;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/converter/types/core.d.ts
|
|
30
|
+
type FigmaGuid = {
|
|
31
|
+
sessionID: number;
|
|
32
|
+
localID: number;
|
|
33
|
+
};
|
|
34
|
+
type FigmaTransform = {
|
|
35
|
+
m00: number;
|
|
36
|
+
m01: number;
|
|
37
|
+
m02: number;
|
|
38
|
+
m10: number;
|
|
39
|
+
m11: number;
|
|
40
|
+
m12: number;
|
|
41
|
+
};
|
|
42
|
+
type FigmaSize = {
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
};
|
|
46
|
+
type FigmaColor = {
|
|
47
|
+
r: number;
|
|
48
|
+
g: number;
|
|
49
|
+
b: number;
|
|
50
|
+
a: number;
|
|
51
|
+
};
|
|
52
|
+
type FigmaBlob = {
|
|
53
|
+
bytes: Array<number>;
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/converter/types/effects.d.ts
|
|
57
|
+
type FigmaEffectType = "INNER_SHADOW" | "DROP_SHADOW" | "FOREGROUND_BLUR" | "BACKGROUND_BLUR";
|
|
58
|
+
type FigmaBlendMode = "NORMAL" | "DARKEN" | "MULTIPLY" | "COLOR_BURN" | "LIGHTEN" | "SCREEN" | "COLOR_DODGE" | "OVERLAY" | "SOFT_LIGHT" | "HARD_LIGHT" | "DIFFERENCE" | "EXCLUSION" | "HUE" | "SATURATION" | "COLOR" | "LUMINOSITY";
|
|
59
|
+
type FigmaEffectBase = {
|
|
60
|
+
type: FigmaEffectType;
|
|
61
|
+
visible: boolean;
|
|
62
|
+
radius: number;
|
|
63
|
+
};
|
|
64
|
+
type FigmaShadowEffect = FigmaEffectBase & {
|
|
65
|
+
type: "INNER_SHADOW" | "DROP_SHADOW";
|
|
66
|
+
color: FigmaColor;
|
|
67
|
+
offset: {
|
|
68
|
+
x: number;
|
|
69
|
+
y: number;
|
|
70
|
+
};
|
|
71
|
+
blendMode: FigmaBlendMode;
|
|
72
|
+
spread?: number;
|
|
73
|
+
showShadowBehindNode?: boolean;
|
|
74
|
+
};
|
|
75
|
+
type FigmaBlurEffect = FigmaEffectBase & {
|
|
76
|
+
type: "FOREGROUND_BLUR" | "BACKGROUND_BLUR";
|
|
77
|
+
color?: FigmaColor;
|
|
78
|
+
offset?: {
|
|
79
|
+
x: number;
|
|
80
|
+
y: number;
|
|
81
|
+
};
|
|
82
|
+
blendMode?: FigmaBlendMode;
|
|
83
|
+
spread?: number;
|
|
84
|
+
showShadowBehindNode?: boolean;
|
|
85
|
+
};
|
|
86
|
+
type FigmaEffect = FigmaShadowEffect | FigmaBlurEffect;
|
|
87
|
+
//#endregion
|
|
88
|
+
//#region src/converter/types/layout.d.ts
|
|
89
|
+
type FigmaStackMode = "HORIZONTAL" | "VERTICAL" | "NONE";
|
|
90
|
+
//#endregion
|
|
91
|
+
//#region src/converter/types/paint.d.ts
|
|
92
|
+
type FigmaImageScaleMode = "FILL" | "FIT" | "STRETCH" | "TILE";
|
|
93
|
+
type FigmaBasePaint = {
|
|
94
|
+
opacity: number;
|
|
95
|
+
visible: boolean;
|
|
96
|
+
blendMode: string;
|
|
97
|
+
transform?: FigmaTransform;
|
|
98
|
+
};
|
|
99
|
+
type FigmaSolidPaint = FigmaBasePaint & {
|
|
100
|
+
type: "SOLID";
|
|
101
|
+
color: FigmaColor;
|
|
102
|
+
};
|
|
103
|
+
type FigmaGradientStop = {
|
|
104
|
+
color: FigmaColor;
|
|
105
|
+
position: number;
|
|
106
|
+
};
|
|
107
|
+
type FigmaGradientLinearPaint = FigmaBasePaint & {
|
|
108
|
+
type: "GRADIENT_LINEAR";
|
|
109
|
+
stops: Array<FigmaGradientStop>;
|
|
110
|
+
};
|
|
111
|
+
type FigmaGradientRadialPaint = FigmaBasePaint & {
|
|
112
|
+
type: "GRADIENT_RADIAL";
|
|
113
|
+
stops: Array<FigmaGradientStop>;
|
|
114
|
+
};
|
|
115
|
+
type FigmaGradientAngularPaint = FigmaBasePaint & {
|
|
116
|
+
type: "GRADIENT_ANGULAR";
|
|
117
|
+
stops: Array<FigmaGradientStop>;
|
|
118
|
+
};
|
|
119
|
+
type FigmaImagePaint = FigmaBasePaint & {
|
|
120
|
+
type: "IMAGE";
|
|
121
|
+
image: {
|
|
122
|
+
hash: Array<number>;
|
|
123
|
+
dataBlob?: number;
|
|
124
|
+
name?: string;
|
|
125
|
+
};
|
|
126
|
+
imageThumbnail?: {
|
|
127
|
+
hash: Array<number>;
|
|
128
|
+
name?: string;
|
|
129
|
+
};
|
|
130
|
+
imageScaleMode?: FigmaImageScaleMode;
|
|
131
|
+
animationFrame?: number;
|
|
132
|
+
imageShouldColorManage?: boolean;
|
|
133
|
+
rotation?: number;
|
|
134
|
+
scale?: number;
|
|
135
|
+
originalImageWidth?: number;
|
|
136
|
+
originalImageHeight?: number;
|
|
137
|
+
thumbHash?: Array<number>;
|
|
138
|
+
altText?: string;
|
|
139
|
+
};
|
|
140
|
+
type FigmaPaint = FigmaSolidPaint | FigmaImagePaint | FigmaGradientLinearPaint | FigmaGradientRadialPaint | FigmaGradientAngularPaint;
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region src/converter/types/text.d.ts
|
|
143
|
+
type FigmaTextAlignHorizontal = "LEFT" | "CENTER" | "RIGHT" | "JUSTIFIED";
|
|
144
|
+
type FigmaTextDecoration = "NONE" | "UNDERLINE" | "STRIKETHROUGH";
|
|
145
|
+
type FigmaTextCase = "ORIGINAL" | "UPPER" | "LOWER" | "TITLE" | "SMALL_CAPS" | "SMALL_CAPS_FORCED";
|
|
146
|
+
type FigmaTextData = {
|
|
147
|
+
characters: string;
|
|
148
|
+
lines?: Array<unknown>;
|
|
149
|
+
};
|
|
150
|
+
type FigmaDerivedTextData = {
|
|
151
|
+
layoutSize?: {
|
|
152
|
+
x: number;
|
|
153
|
+
y: number;
|
|
154
|
+
};
|
|
155
|
+
layoutVersion?: number;
|
|
156
|
+
derivedLines: Array<{
|
|
157
|
+
directionality: "LTR" | "RTL";
|
|
158
|
+
}>;
|
|
159
|
+
fontMetaData?: Array<{
|
|
160
|
+
key: {
|
|
161
|
+
family: string;
|
|
162
|
+
style: string;
|
|
163
|
+
postscript: string;
|
|
164
|
+
};
|
|
165
|
+
fontDigest?: Array<number>;
|
|
166
|
+
fontWeight: number;
|
|
167
|
+
fontLineHeight: number;
|
|
168
|
+
fontStyle: "NORMAL" | "ITALIC";
|
|
169
|
+
}>;
|
|
170
|
+
baselines?: Array<{
|
|
171
|
+
position: {
|
|
172
|
+
x: number;
|
|
173
|
+
y: number;
|
|
174
|
+
};
|
|
175
|
+
width: number;
|
|
176
|
+
lineY: number;
|
|
177
|
+
lineHeight: number;
|
|
178
|
+
lineAscent: number;
|
|
179
|
+
firstCharacter: number;
|
|
180
|
+
endCharacter: number;
|
|
181
|
+
}>;
|
|
182
|
+
glyphs?: Array<{
|
|
183
|
+
commandsBlob: number;
|
|
184
|
+
position: {
|
|
185
|
+
x: number;
|
|
186
|
+
y: number;
|
|
187
|
+
};
|
|
188
|
+
fontSize: number;
|
|
189
|
+
firstCharacter: number;
|
|
190
|
+
advance: number;
|
|
191
|
+
rotation: number;
|
|
192
|
+
}>;
|
|
193
|
+
truncationStartIndex?: number;
|
|
194
|
+
truncatedHeight?: number;
|
|
195
|
+
logicalIndexToCharacterOffsetMap?: Array<number>;
|
|
196
|
+
};
|
|
197
|
+
//#endregion
|
|
198
|
+
//#region src/converter/types/node.d.ts
|
|
199
|
+
type FigmaBaseNodeChange = {
|
|
200
|
+
guid: FigmaGuid;
|
|
201
|
+
phase: string;
|
|
202
|
+
parentIndex?: {
|
|
203
|
+
guid: FigmaGuid;
|
|
204
|
+
position: string;
|
|
205
|
+
};
|
|
206
|
+
name: string;
|
|
207
|
+
visible: boolean;
|
|
208
|
+
opacity: number;
|
|
209
|
+
blendMode?: string;
|
|
210
|
+
size?: FigmaSize;
|
|
211
|
+
transform?: FigmaTransform;
|
|
212
|
+
mask?: boolean;
|
|
213
|
+
maskType?: string;
|
|
214
|
+
locked?: boolean;
|
|
215
|
+
autoRename?: boolean;
|
|
216
|
+
};
|
|
217
|
+
type FigmaTextNodeChange = FigmaBaseNodeChange & {
|
|
218
|
+
type: "TEXT";
|
|
219
|
+
fontSize?: number;
|
|
220
|
+
characters: string;
|
|
221
|
+
textAlignHorizontal?: FigmaTextAlignHorizontal;
|
|
222
|
+
textAlignVertical?: string;
|
|
223
|
+
lineHeight?: {
|
|
224
|
+
value: number;
|
|
225
|
+
units: string;
|
|
226
|
+
};
|
|
227
|
+
fontName?: {
|
|
228
|
+
family: string;
|
|
229
|
+
style: string;
|
|
230
|
+
postscript?: string;
|
|
231
|
+
};
|
|
232
|
+
textData?: FigmaTextData;
|
|
233
|
+
derivedTextData?: FigmaDerivedTextData;
|
|
234
|
+
textExplicitLayoutVersion?: number;
|
|
235
|
+
emojiImageSet?: string;
|
|
236
|
+
textDecorationSkipInk?: boolean;
|
|
237
|
+
fontVariantCommonLigatures?: boolean;
|
|
238
|
+
fontVariantContextualLigatures?: boolean;
|
|
239
|
+
fontVariantDiscretionaryLigatures?: boolean;
|
|
240
|
+
fontVariantHistoricalLigatures?: boolean;
|
|
241
|
+
fontVariantOrdinal?: boolean;
|
|
242
|
+
fontVariantSlashedZero?: boolean;
|
|
243
|
+
fontVariantNumericFigure?: string;
|
|
244
|
+
fontVariantNumericSpacing?: string;
|
|
245
|
+
fontVariantNumericFraction?: string;
|
|
246
|
+
fontVariantCaps?: string;
|
|
247
|
+
fontVariantPosition?: string;
|
|
248
|
+
letterSpacing?: {
|
|
249
|
+
value: number;
|
|
250
|
+
units: string;
|
|
251
|
+
};
|
|
252
|
+
fontVersion?: string;
|
|
253
|
+
textUserLayoutVersion?: number;
|
|
254
|
+
toggledOnOTFeatures?: Array<unknown>;
|
|
255
|
+
toggledOffOTFeatures?: Array<unknown>;
|
|
256
|
+
fontVariations?: Array<unknown>;
|
|
257
|
+
textBidiVersion?: number;
|
|
258
|
+
textTracking?: number;
|
|
259
|
+
handleMirroring?: string;
|
|
260
|
+
textAutoResize?: string;
|
|
261
|
+
detachOpticalSizeFromFontSize?: boolean;
|
|
262
|
+
textDecoration?: FigmaTextDecoration;
|
|
263
|
+
textCase?: FigmaTextCase;
|
|
264
|
+
strokeWeight?: number;
|
|
265
|
+
strokeAlign?: string;
|
|
266
|
+
strokeCap?: string;
|
|
267
|
+
strokeJoin?: string;
|
|
268
|
+
fillPaints?: Array<FigmaPaint>;
|
|
269
|
+
effects?: Array<FigmaEffect>;
|
|
270
|
+
targetAspectRatio?: {
|
|
271
|
+
value: {
|
|
272
|
+
x: number;
|
|
273
|
+
y: number;
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
type FigmaFrameNodeChange = FigmaBaseNodeChange & {
|
|
278
|
+
type: "FRAME";
|
|
279
|
+
fillPaints?: Array<FigmaPaint>;
|
|
280
|
+
strokePaints?: Array<FigmaPaint>;
|
|
281
|
+
effects?: Array<FigmaEffect>;
|
|
282
|
+
cornerRadius?: number;
|
|
283
|
+
backgroundOpacity?: number;
|
|
284
|
+
backgroundEnabled?: boolean;
|
|
285
|
+
strokeWeight?: number;
|
|
286
|
+
strokeAlign?: string;
|
|
287
|
+
strokeCap?: string;
|
|
288
|
+
strokeJoin?: string;
|
|
289
|
+
dashPattern?: Array<number>;
|
|
290
|
+
borderTopWeight?: number;
|
|
291
|
+
borderRightWeight?: number;
|
|
292
|
+
borderBottomWeight?: number;
|
|
293
|
+
borderLeftWeight?: number;
|
|
294
|
+
borderStrokeWeightsIndependent?: boolean;
|
|
295
|
+
rectangleTopLeftCornerRadius?: number;
|
|
296
|
+
rectangleTopRightCornerRadius?: number;
|
|
297
|
+
rectangleBottomLeftCornerRadius?: number;
|
|
298
|
+
rectangleBottomRightCornerRadius?: number;
|
|
299
|
+
rectangleCornerRadiiIndependent?: boolean;
|
|
300
|
+
rectangleCornerToolIndependent?: boolean;
|
|
301
|
+
proportionsConstrained?: boolean;
|
|
302
|
+
bordersTakeSpace?: boolean;
|
|
303
|
+
horizontalConstraint?: string;
|
|
304
|
+
verticalConstraint?: string;
|
|
305
|
+
stackMode?: FigmaStackMode;
|
|
306
|
+
stackSpacing?: number;
|
|
307
|
+
stackHorizontalPadding?: number;
|
|
308
|
+
stackVerticalPadding?: number;
|
|
309
|
+
stackPrimarySizing?: string;
|
|
310
|
+
stackPrimaryAlignItems?: string;
|
|
311
|
+
stackCounterAlignItems?: string;
|
|
312
|
+
stackChildPrimaryGrow?: number;
|
|
313
|
+
stackPaddingRight?: number;
|
|
314
|
+
stackPaddingBottom?: number;
|
|
315
|
+
stackChildAlignSelf?: string;
|
|
316
|
+
stackPositioning?: string;
|
|
317
|
+
stackWrap?: string;
|
|
318
|
+
stackCounterSpacing?: number;
|
|
319
|
+
stackReverseZIndex?: boolean;
|
|
320
|
+
minSize?: object;
|
|
321
|
+
maxSize?: object;
|
|
322
|
+
miterLimit?: number;
|
|
323
|
+
frameMaskDisabled?: boolean;
|
|
324
|
+
resizeToFit?: boolean;
|
|
325
|
+
exportBackgroundDisabled?: boolean;
|
|
326
|
+
cornerSmoothing?: number;
|
|
327
|
+
containerSupportsFillStrokeAndCorners?: boolean;
|
|
328
|
+
stackCounterSizing?: string;
|
|
329
|
+
};
|
|
330
|
+
type FigmaVectorNodeChange = FigmaBaseNodeChange & {
|
|
331
|
+
type: "VECTOR";
|
|
332
|
+
strokeWeight?: number;
|
|
333
|
+
strokeAlign?: string;
|
|
334
|
+
strokeCap?: string;
|
|
335
|
+
strokeJoin?: string;
|
|
336
|
+
fillPaints?: Array<FigmaPaint>;
|
|
337
|
+
strokePaints?: Array<FigmaPaint>;
|
|
338
|
+
dashPattern?: Array<number>;
|
|
339
|
+
horizontalConstraint?: string;
|
|
340
|
+
verticalConstraint?: string;
|
|
341
|
+
effects?: Array<FigmaEffect>;
|
|
342
|
+
vectorData?: {
|
|
343
|
+
vectorNetworkBlob: number;
|
|
344
|
+
normalizedSize: {
|
|
345
|
+
x: number;
|
|
346
|
+
y: number;
|
|
347
|
+
};
|
|
348
|
+
};
|
|
349
|
+
};
|
|
350
|
+
type FigmaGroupNodeChange = FigmaBaseNodeChange & {
|
|
351
|
+
type: "GROUP";
|
|
352
|
+
};
|
|
353
|
+
type FigmaCanvasNodeChange = FigmaBaseNodeChange & {
|
|
354
|
+
type: "CANVAS";
|
|
355
|
+
backgroundOpacity?: number;
|
|
356
|
+
backgroundEnabled?: boolean;
|
|
357
|
+
};
|
|
358
|
+
type FigmaDocumentNodeChange = FigmaBaseNodeChange & {
|
|
359
|
+
type: "DOCUMENT";
|
|
360
|
+
};
|
|
361
|
+
type FigmaRoundedRectangleNodeChange = FigmaBaseNodeChange & {
|
|
362
|
+
type: "ROUNDED_RECTANGLE";
|
|
363
|
+
fillPaints?: Array<FigmaPaint>;
|
|
364
|
+
strokePaints?: Array<FigmaPaint>;
|
|
365
|
+
effects?: Array<FigmaEffect>;
|
|
366
|
+
cornerRadius?: number;
|
|
367
|
+
cornerSmoothing?: number;
|
|
368
|
+
strokeWeight?: number;
|
|
369
|
+
strokeAlign?: string;
|
|
370
|
+
strokeCap?: string;
|
|
371
|
+
strokeJoin?: string;
|
|
372
|
+
dashPattern?: Array<number>;
|
|
373
|
+
targetAspectRatio?: {
|
|
374
|
+
value: {
|
|
375
|
+
x: number;
|
|
376
|
+
y: number;
|
|
377
|
+
};
|
|
378
|
+
};
|
|
379
|
+
};
|
|
380
|
+
type FigmaNodeChange = FigmaTextNodeChange | FigmaFrameNodeChange | FigmaVectorNodeChange | FigmaGroupNodeChange | FigmaCanvasNodeChange | FigmaDocumentNodeChange | FigmaRoundedRectangleNodeChange;
|
|
381
|
+
//#endregion
|
|
382
|
+
//#region src/converter/types/clipboard.d.ts
|
|
383
|
+
type FigmaClipboard = {
|
|
384
|
+
type: "NODE_CHANGES";
|
|
385
|
+
sessionID: number;
|
|
386
|
+
ackID: number;
|
|
387
|
+
nodeChanges: Array<FigmaNodeChange>;
|
|
388
|
+
blobs: Array<FigmaBlob>;
|
|
389
|
+
pasteID: number;
|
|
390
|
+
pasteFileKey: string;
|
|
391
|
+
pasteIsPartiallyOutsideEnclosingFrame: boolean;
|
|
392
|
+
isCut: boolean;
|
|
393
|
+
pasteEditorType: string;
|
|
394
|
+
publishedAssetGuids: Array<string>;
|
|
395
|
+
};
|
|
396
|
+
//#endregion
|
|
397
|
+
//#region src/converter/nodes/text/primitives/font/loader.d.ts
|
|
398
|
+
/**
|
|
399
|
+
* Font properties used to request a font file. The loader is free to apply
|
|
400
|
+
* fallbacks (closest available weight, drop italic when not available, etc.)
|
|
401
|
+
* and reports the resolved values back via `FontFile`.
|
|
402
|
+
*/
|
|
403
|
+
type FontProperties = {
|
|
404
|
+
family: string;
|
|
405
|
+
weight: number;
|
|
406
|
+
italic: boolean;
|
|
407
|
+
};
|
|
408
|
+
/**
|
|
409
|
+
* Result of loading a font file. `bytes` is the raw font file (TTF, OTF,
|
|
410
|
+
* WOFF, or WOFF2 — fontkit detects the format). The optional `resolved*`
|
|
411
|
+
* fields let the loader signal that a fallback was applied.
|
|
412
|
+
*
|
|
413
|
+
* `resolvedFamily` is set when the loader could not honour the requested
|
|
414
|
+
* family and substituted bytes from a different family entirely (e.g. when
|
|
415
|
+
* the requested family isn't in the loader's catalog). The conversion still
|
|
416
|
+
* uses the *requested* family in the Figma payload — the substituted bytes
|
|
417
|
+
* exist so dom-to-figma has metrics to lay out the text. Figma resolves
|
|
418
|
+
* fonts at paste time via the user's system fonts, so a system-installed
|
|
419
|
+
* family like Verdana renders correctly even if the loader had to feed
|
|
420
|
+
* Inter bytes through the converter.
|
|
421
|
+
*/
|
|
422
|
+
type FontFile = {
|
|
423
|
+
bytes: ArrayBuffer;
|
|
424
|
+
resolvedWeight?: number;
|
|
425
|
+
resolvedItalic?: boolean;
|
|
426
|
+
resolvedFamily?: string;
|
|
427
|
+
};
|
|
428
|
+
/**
|
|
429
|
+
* A function that resolves font properties to a font file. The loader owns
|
|
430
|
+
* any catalog or fallback logic; the converter only consumes the bytes.
|
|
431
|
+
*/
|
|
432
|
+
type FontLoader = (request: FontProperties) => Promise<FontFile>;
|
|
433
|
+
/**
|
|
434
|
+
* Options for the default fontsource-backed loader.
|
|
435
|
+
*/
|
|
436
|
+
type FontsourceLoaderOptions = {
|
|
437
|
+
/** Subset to request. Defaults to "latin". Common alternatives: "latin-ext", "cyrillic", "greek". */subset?: string;
|
|
438
|
+
/**
|
|
439
|
+
* Family to substitute when the requested family isn't in fontsource (web-safe
|
|
440
|
+
* fonts like Verdana, Tahoma, Georgia, Times New Roman, etc. — fontsource
|
|
441
|
+
* mirrors Google Fonts only). The substitute must itself be on fontsource.
|
|
442
|
+
* The Figma payload still claims the *requested* family name, so destinations
|
|
443
|
+
* with the system font installed render it correctly — the substituted bytes
|
|
444
|
+
* only feed conversion-time metrics.
|
|
445
|
+
*
|
|
446
|
+
* Defaults to `"Inter"`. Pass `null` to disable substitution and throw on
|
|
447
|
+
* missing families instead — the converter's per-node try/catch will then
|
|
448
|
+
* silently drop affected text nodes.
|
|
449
|
+
*/
|
|
450
|
+
fallbackFamily?: string | null;
|
|
451
|
+
};
|
|
452
|
+
/**
|
|
453
|
+
* Build a `FontLoader` that pulls Google Fonts as static `.woff2` files from
|
|
454
|
+
* fontsource via jsDelivr's CDN. No API key, no UA tricks, browser-friendly.
|
|
455
|
+
* fontkit decompresses WOFF2 transparently.
|
|
456
|
+
*
|
|
457
|
+
* Falls back through a small chain when the exact (weight, italic) combo
|
|
458
|
+
* isn't available: drop italic, then regular 400, then throw.
|
|
459
|
+
*
|
|
460
|
+
* Families that fontsource genuinely doesn't carry (Verdana, Tahoma, etc. —
|
|
461
|
+
* fontsource mirrors Google Fonts only) are memoized after the first
|
|
462
|
+
* exhausted-with-404s attempt, so subsequent requests for the same family
|
|
463
|
+
* fail fast instead of re-hitting jsDelivr for every text node on a page.
|
|
464
|
+
* Transient failures (network, 5xx) are not memoized.
|
|
465
|
+
*/
|
|
466
|
+
declare function createFontsourceLoader(options?: FontsourceLoaderOptions): FontLoader;
|
|
467
|
+
//#endregion
|
|
468
|
+
//#region src/converter/classify.d.ts
|
|
469
|
+
type ElementKind = "skip" | "group" | "frame" | "vector" | "image" | "text" | "form-with-placeholder";
|
|
470
|
+
declare function defaultClassify(element: Element): ElementKind;
|
|
471
|
+
//#endregion
|
|
472
|
+
//#region src/converter/trace.d.ts
|
|
473
|
+
/**
|
|
474
|
+
* A single entry in a {@link ConvertTrace}: the link from one emitted Figma
|
|
475
|
+
* node to the DOM element (or text node) it came from. Produced only when the
|
|
476
|
+
* converter is created with `{ trace: true }`. Consumed by the visual-parity
|
|
477
|
+
* harness to attribute discrepancies back to source DOM.
|
|
478
|
+
*/
|
|
479
|
+
type TraceEntry = {
|
|
480
|
+
/** GUID of the emitted node change this entry describes. */guid: FigmaGuid; /** Classified kind for the source element; always `"text"` for text nodes. */
|
|
481
|
+
kind: ElementKind; /** Lowercase tag name of the source element; `"#text"` for text nodes. */
|
|
482
|
+
tag: string;
|
|
483
|
+
/**
|
|
484
|
+
* Selector that resolves the source element from the scene root, built
|
|
485
|
+
* incrementally from real DOM child positions, e.g.
|
|
486
|
+
* `:scope > div:nth-child(2) > p:nth-child(1)`. The root element itself is
|
|
487
|
+
* `:scope`. Text nodes carry their owner element's path plus a
|
|
488
|
+
* `::text[i]` suffix (not a valid CSS selector — strip it to resolve the
|
|
489
|
+
* owner element); every line segment of one text node shares that path.
|
|
490
|
+
*/
|
|
491
|
+
domPath: string; /** Source rect in viewport coordinates at convert time (`getBoundingClientRect`). */
|
|
492
|
+
rect: {
|
|
493
|
+
x: number;
|
|
494
|
+
y: number;
|
|
495
|
+
width: number;
|
|
496
|
+
height: number;
|
|
497
|
+
}; /** First 120 characters of the rendered text; text nodes only. */
|
|
498
|
+
text?: string;
|
|
499
|
+
};
|
|
500
|
+
/** The full trace for one `convert()` call. Exposed as `ConvertResult.trace`. */
|
|
501
|
+
type ConvertTrace = {
|
|
502
|
+
/** Root frame GUID the traced nodes descend from. */rootGuid: FigmaGuid;
|
|
503
|
+
entries: Array<TraceEntry>;
|
|
504
|
+
};
|
|
505
|
+
//#endregion
|
|
506
|
+
//#region src/converter/walk.d.ts
|
|
507
|
+
type Classify = (element: Element, defaultKind: ElementKind) => ElementKind;
|
|
508
|
+
/** `"auto"` infers Figma auto-layout for flex containers; `"absolute"` keeps
|
|
509
|
+
* every frame absolutely positioned (the historical behavior). */
|
|
510
|
+
type ConverterLayout = "absolute" | "auto";
|
|
511
|
+
//#endregion
|
|
512
|
+
//#region src/figma.d.ts
|
|
513
|
+
type FrameInput = {
|
|
514
|
+
element: Element;
|
|
515
|
+
width: number;
|
|
516
|
+
height: number;
|
|
517
|
+
x: number;
|
|
518
|
+
y: number;
|
|
519
|
+
name: string;
|
|
520
|
+
};
|
|
521
|
+
type FigmaConverterConfig = {
|
|
522
|
+
/** Defaults to `createFontsourceLoader()` (Google Fonts via fontsource jsDelivr CDN). */fontLoader?: FontLoader; /** Defaults to `createDirectImageLoader()` (single direct `fetch(src)`). */
|
|
523
|
+
imageLoader?: ImageLoader; /** Override the default DOM-element classification. */
|
|
524
|
+
classify?: Classify;
|
|
525
|
+
/**
|
|
526
|
+
* `"auto"` (default) converts containers into Figma auto-layout frames
|
|
527
|
+
* whenever the layout can be reproduced exactly, falling back to absolute
|
|
528
|
+
* positioning per node when it can't. `"absolute"` positions every frame
|
|
529
|
+
* absolutely, disabling auto-layout inference entirely.
|
|
530
|
+
*/
|
|
531
|
+
layout?: ConverterLayout;
|
|
532
|
+
/**
|
|
533
|
+
* When `true`, `convert()` also returns a {@link ConvertTrace} mapping every
|
|
534
|
+
* emitted node back to its source DOM element. Off by default and adds no
|
|
535
|
+
* cost when disabled; does not change the payload bytes. Intended for the
|
|
536
|
+
* visual-parity harness, not production copies.
|
|
537
|
+
*/
|
|
538
|
+
trace?: boolean;
|
|
539
|
+
};
|
|
540
|
+
type SingleFrameInput = {
|
|
541
|
+
element: Element;
|
|
542
|
+
width: number;
|
|
543
|
+
height: number;
|
|
544
|
+
name?: string;
|
|
545
|
+
};
|
|
546
|
+
type CanvasInput = {
|
|
547
|
+
frames: ReadonlyArray<FrameInput>;
|
|
548
|
+
canvasName?: string;
|
|
549
|
+
};
|
|
550
|
+
type ConvertInput = SingleFrameInput | CanvasInput;
|
|
551
|
+
type ConvertResult = {
|
|
552
|
+
/** Raw Figma node-change document. */document: FigmaClipboard; /** Encoded `.fig`-style binary. */
|
|
553
|
+
bytes: Uint8Array; /** Base64-encoded representation of `bytes`. */
|
|
554
|
+
base64: string; /** Construct a browser `ClipboardItem` for `navigator.clipboard.write([...])`. */
|
|
555
|
+
toClipboardItem(): ClipboardItem; /** Get the raw HTML envelope Figma reads on paste. */
|
|
556
|
+
toClipboardHtml(): string; /** DOM-to-node trace, present only when created with `{ trace: true }`. */
|
|
557
|
+
trace?: ConvertTrace;
|
|
558
|
+
};
|
|
559
|
+
type FigmaConverter = {
|
|
560
|
+
convert(input: ConvertInput): Promise<ConvertResult>; /** Drop cached fonts and images. Useful in long-running processes. */
|
|
561
|
+
clearCache(): void;
|
|
562
|
+
};
|
|
563
|
+
declare function createFigmaConverter(config?: FigmaConverterConfig): FigmaConverter;
|
|
564
|
+
//#endregion
|
|
565
|
+
export { CanvasInput, type Classify, ConvertInput, ConvertResult, type ConvertTrace, type ConverterLayout, type ElementKind, type FigmaClipboard, FigmaConverter, FigmaConverterConfig, type FontFile, type FontLoader, type FontProperties, type FontsourceLoaderOptions, FrameInput, type ImageFile, type ImageLoader, type ImageRequest, SingleFrameInput, type TraceEntry, createDirectImageLoader, createFigmaConverter, createFontsourceLoader, defaultClassify };
|
|
566
|
+
//# sourceMappingURL=figma.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figma.d.mts","names":[],"sources":["../src/converter/nodes/image/loader.ts","../src/converter/types/core.ts","../src/converter/types/effects.ts","../src/converter/types/layout.ts","../src/converter/types/paint.ts","../src/converter/types/text.ts","../src/converter/types/node.ts","../src/converter/types/clipboard.ts","../src/converter/nodes/text/primitives/font/loader.ts","../src/converter/classify.ts","../src/converter/trace.ts","../src/converter/walk.ts","../src/figma.ts"],"mappings":"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"}
|