openpencil/packages/scene-graph/src/node-defaults.ts
2026-06-30 10:54:32 +03:00

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'
])