165 lines
3.9 KiB
TypeScript
165 lines
3.9 KiB
TypeScript
import { BLACK, DEFAULT_FONT_FAMILY, DEFAULT_STROKE_MITER_LIMIT } from './constants'
|
|
import type { NodeType, SceneNode } from './types'
|
|
|
|
export function createDefaultNode(
|
|
generateId: () => string,
|
|
type: NodeType,
|
|
overrides: Partial<SceneNode> = {}
|
|
): SceneNode {
|
|
return {
|
|
id: generateId(),
|
|
type,
|
|
name: type.charAt(0) + type.slice(1).toLowerCase(),
|
|
parentId: null,
|
|
childIds: [],
|
|
x: 0,
|
|
y: 0,
|
|
width: 100,
|
|
height: 100,
|
|
rotation: 0,
|
|
source: {
|
|
format: null,
|
|
id: null,
|
|
orderKey: null,
|
|
fig: {
|
|
rawSize: null,
|
|
rawTransform: null,
|
|
rawNodeFields: {},
|
|
layout: null,
|
|
symbolOverrides: [],
|
|
componentPropAssignments: [],
|
|
derivedSymbolData: [],
|
|
derivedSymbolDataLayoutVersion: null,
|
|
uniformScaleFactor: null
|
|
}
|
|
},
|
|
figmaDerivedLayout: null,
|
|
fills:
|
|
type === 'TEXT' ? [{ type: 'SOLID' as const, color: BLACK, opacity: 1, visible: true }] : [],
|
|
strokes: [],
|
|
effects: [],
|
|
opacity: 1,
|
|
cornerRadius: 0,
|
|
topLeftRadius: 0,
|
|
topRightRadius: 0,
|
|
bottomRightRadius: 0,
|
|
bottomLeftRadius: 0,
|
|
independentCorners: false,
|
|
cornerSmoothing: 0,
|
|
visible: true,
|
|
locked: false,
|
|
clipsContent: false,
|
|
text: '',
|
|
fontSize: 14,
|
|
fontFamily: DEFAULT_FONT_FAMILY,
|
|
fontWeight: 400,
|
|
italic: false,
|
|
textAlignHorizontal: 'LEFT',
|
|
textDirection: 'AUTO',
|
|
leadingTrim: 'NONE',
|
|
lineHeight: null,
|
|
letterSpacing: 0,
|
|
layoutMode: 'NONE',
|
|
layoutDirection: 'AUTO',
|
|
layoutWrap: 'NO_WRAP',
|
|
primaryAxisAlign: 'MIN',
|
|
counterAxisAlign: 'MIN',
|
|
primaryAxisSizing: 'FIXED',
|
|
counterAxisSizing: 'FIXED',
|
|
itemSpacing: 0,
|
|
counterAxisSpacing: 0,
|
|
paddingTop: 0,
|
|
paddingRight: 0,
|
|
paddingBottom: 0,
|
|
paddingLeft: 0,
|
|
blendMode: 'PASS_THROUGH',
|
|
layoutPositioning: 'AUTO',
|
|
layoutGrow: 0,
|
|
layoutAlignSelf: 'AUTO',
|
|
vectorNetwork: null,
|
|
fillGeometry: [],
|
|
strokeGeometry: [],
|
|
arcData: null,
|
|
textAlignVertical: 'TOP',
|
|
textAutoResize: 'NONE',
|
|
textCase: 'ORIGINAL',
|
|
textDecoration: 'NONE',
|
|
textDecorationStyle: 'SOLID',
|
|
textDecorationThickness: null,
|
|
textDecorationFills: [],
|
|
textDecorationSkipInk: true,
|
|
textUnderlineOffset: null,
|
|
maxLines: null,
|
|
styleRuns: [],
|
|
fontVariations: [],
|
|
fontFeatures: [],
|
|
horizontalConstraint: 'MIN',
|
|
verticalConstraint: 'MIN',
|
|
strokeCap: 'NONE',
|
|
strokeJoin: 'MITER',
|
|
dashPattern: [],
|
|
borderTopWeight: 0,
|
|
borderRightWeight: 0,
|
|
borderBottomWeight: 0,
|
|
borderLeftWeight: 0,
|
|
independentStrokeWeights: false,
|
|
strokeMiterLimit: DEFAULT_STROKE_MITER_LIMIT,
|
|
minWidth: null,
|
|
maxWidth: null,
|
|
minHeight: null,
|
|
maxHeight: null,
|
|
isMask: false,
|
|
maskType: 'ALPHA',
|
|
maskIsOutline: false,
|
|
gridTemplateColumns: [],
|
|
gridTemplateRows: [],
|
|
gridColumnGap: 0,
|
|
gridRowGap: 0,
|
|
gridPosition: null,
|
|
counterAxisAlignContent: 'AUTO',
|
|
itemReverseZIndex: false,
|
|
strokesIncludedInLayout: false,
|
|
expanded: true,
|
|
textTruncation: 'DISABLED',
|
|
autoRename: true,
|
|
pointCount: 5,
|
|
starInnerRadius: 0.38,
|
|
componentId: null,
|
|
overrides: {},
|
|
componentPropertyDefinitions: [],
|
|
componentPropertyValues: {},
|
|
componentKey: null,
|
|
sourceLibraryKey: null,
|
|
publishId: null,
|
|
overrideKey: null,
|
|
sharedSymbolVersion: null,
|
|
publishedVersion: null,
|
|
isPublishable: false,
|
|
isSymbolPublishable: false,
|
|
symbolDescription: '',
|
|
symbolLinks: [],
|
|
variantPropSpecs: [],
|
|
boundVariables: {},
|
|
exportSettings: [],
|
|
pluginData: [],
|
|
pluginRelaunchData: [],
|
|
internalOnly: false,
|
|
flipX: false,
|
|
flipY: false,
|
|
textPicture: null,
|
|
figmaDerivedTextGlyphs: null,
|
|
...overrides
|
|
}
|
|
}
|
|
|
|
export const CONTAINER_TYPES = new Set<NodeType>([
|
|
'CANVAS',
|
|
'FRAME',
|
|
'GROUP',
|
|
'BOOLEAN_OPERATION',
|
|
'SECTION',
|
|
'COMPONENT',
|
|
'COMPONENT_SET',
|
|
'INSTANCE'
|
|
])
|