{"version":3,"file":"index.mjs","sources":["../src/blocks/types.ts","../src/utils/image.ts","../src/blocks/Viewport.ts","../src/blocks/utils.ts","../src/blocks/mixins/hover.ts","../src/blocks/Background.ts","../src/blocks/Image.ts","../src/blocks/WaterMark.ts","../src/blocks/index.ts","../src/core/context.ts","../src/utils/cn.ts","../src/components/Layout.tsx","../src/components/ToolBar.tsx","../src/hooks/useWaterMark.ts","../src/components/common/Canvas.tsx","../src/locale/format.ts","../src/locale/lang/en.ts","../src/locale/lang/ja.ts","../src/locale/index.ts","../src/components/common/UploadBox.tsx","../src/hooks/useDownload.ts","../src/components/common/Operators.tsx","../src/images/redo.svg?react","../src/images/undo.svg?react","../src/components/common/HistoryBtns.tsx","../src/utils/dom.ts","../src/hooks/useImageLoader.ts","../src/utils/eventBus.ts","../src/components/Design.tsx","../src/components/Properties.tsx","../src/components/BlockTree.tsx","../src/tools/types.ts","../src/tools/background/icon.svg?react","../src/tools/background/components/Colours.tsx","../src/tools/background/components/Images.tsx","../src/tools/background/components/Panel.tsx","../src/tools/background/index.tsx","../src/tools/resize/index.tsx","../src/tools/custom/icon.svg?react","../src/tools/custom/index.tsx","../src/utils/scale.ts","../src/core/history.ts","../src/core/reducer.ts","../src/components/Editor.tsx"],"sourcesContent":["import { FabricObjectProps } from 'fabric';\nimport { FabricObject } from 'fabric';\n\ndeclare module 'fabric' {\n\tinterface FabricObject {\n\t\tid?: string;\n\t}\n\tinterface SerializedObjectProps {\n\t\tid?: string;\n\t}\n}\n\nFabricObject.customProperties = ['id'];\n\nexport enum BlockTypes {\n\tViewport = 'viewport',\n\tBackground = 'background',\n\tImage = 'image',\n\tWaterMark = 'waterMark',\n}\n\nexport const IBlockPropKeys = ['blockType'] as const;\n\nexport type IBlock = Pick<\n\tFabricObjectProps,\n\t'left' | 'top' | 'width' | 'height'\n> & {\n\tblockType: BlockTypes;\n\t// move?: (x: number, y: number) => void | Promise<void>;\n\t// resize?: (w: number, h: number) => void | Promise<void>;\n};\n","import { UploadProps } from 'antd';\n\ntype UploadRequestOption = Parameters<\n\tNonNullable<UploadProps['customRequest']>\n>['0'];\n\nexport async function file2Base64URL(file: Blob | File) {\n\treturn new Promise<string>((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.readAsDataURL(file);\n\t\treader.onload = () => resolve(reader.result as string);\n\t\treader.onerror = (error) => reject(error);\n\t});\n}\n\nexport async function getImageSize(url: string) {\n\tconst img = new Image();\n\timg.src = url;\n\tawait img.decode();\n\n\treturn {\n\t\twidth: img.width,\n\t\theight: img.height,\n\t};\n}\n\nexport async function uploadFileByBase64({\n\tfile,\n\tonSuccess,\n\tonError,\n}: UploadRequestOption) {\n\tlet url: string;\n\ttry {\n\t\tif (typeof file === 'string') {\n\t\t\turl = file;\n\t\t} else {\n\t\t\turl = await file2Base64URL(file);\n\t\t}\n\n\t\tconst { width, height } = await getImageSize(url);\n\n\t\tonSuccess?.({\n\t\t\turl,\n\t\t\twidth,\n\t\t\theight,\n\t\t});\n\n\t\treturn {\n\t\t\turl,\n\t\t};\n\t} catch (error) {\n\t\tonError?.(error as Error);\n\t}\n}\n\nexport function getTransparentUnitCanvas(size = 72) {\n\tconst l = size / 2;\n\tconst canvas = window?.OffscreenCanvas\n\t\t? new OffscreenCanvas(size, size)\n\t\t: (() => {\n\t\t\t\tconst canvas = document.createElement('canvas');\n\t\t\t\tcanvas.width = size;\n\t\t\t\tcanvas.height = size;\n\t\t\t\treturn canvas;\n\t\t\t})();\n\tconst ctx = canvas.getContext('2d');\n\tctx!.fillStyle = '#EBEBEB';\n\tctx!.fillRect(0, 0, l, l);\n\tctx!.fillRect(l, l, l, l);\n\tctx!.fillStyle = 'white';\n\tctx!.fillRect(0, l, l, l);\n\tctx!.fillRect(l, 0, l, l);\n\n\treturn canvas;\n}\n","import {\n\tclassRegistry,\n\tObjectEvents,\n\tPattern,\n\tRect,\n\tRectProps,\n\tSerializedRectProps,\n\tTClassProperties,\n\tTFiller,\n\tTOptions,\n} from 'fabric';\nimport { v4 as uuid } from 'uuid';\nimport { BlockTypes, IBlock, IBlockPropKeys } from './types';\nimport { getTransparentUnitCanvas } from '@/utils/image';\n\nexport interface SerializedBlockViewportProps\n\textends SerializedRectProps,\n\t\tIBlock {}\n\nexport interface BlockViewportProps extends RectProps, IBlock {}\n\n/**\n * 画布根块\n * @description 实现背景替换等接口\n */\nexport class BlockViewport<\n\t\tProps extends TOptions<BlockViewportProps> = Partial<BlockViewportProps>,\n\t\tSProps extends SerializedBlockViewportProps = SerializedBlockViewportProps,\n\t\tEventSpec extends ObjectEvents = ObjectEvents,\n\t>\n\textends Rect<Props, SProps, EventSpec>\n\timplements IBlock\n{\n\tdeclare blockType: BlockTypes;\n\n\tconstructor(props?: Props) {\n\t\tsuper(props);\n\n\t\tthis.id = props?.id || uuid();\n\t\tthis.blockType = BlockTypes.Viewport;\n\t\tthis.selectable = false;\n\t\tthis.evented = false;\n\t\tthis.hasControls = false;\n\t}\n\n\tfill: TFiller | string | null = (() => {\n\t\tconst canvas = getTransparentUnitCanvas();\n\n\t\treturn new Pattern({\n\t\t\tsource: canvas,\n\t\t\trepeat: 'repeat',\n\t\t});\n\t})();\n\n\tasync cloneWithoutFill() {\n\t\tconst cloned = await this.clone();\n\t\tcloned.fill = null;\n\n\t\treturn cloned;\n\t}\n\n\ttoObject<\n\t\tT extends Omit<Props & TClassProperties<this>, keyof SProps>,\n\t\tK extends keyof T = never,\n\t>(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n\t\t// @ts-ignore\n\t\treturn super.toObject([...propertiesToInclude, ...IBlockPropKeys]);\n\t}\n}\n\n// to make possible restoring from serialization\nclassRegistry.setClass(BlockViewport, Rect.type);\n// to make block connected to svg Path element\nclassRegistry.setSVGClass(BlockViewport, Rect.type);\n","import { FabricObject } from 'fabric';\nimport { BlockTypes, IBlock } from './types';\n\nexport function isActive(object: FabricObject) {\n\treturn object.canvas?.getActiveObjects().includes(object);\n}\n\nexport function isContentBlock(object: IBlock) {\n\treturn [BlockTypes.Image, BlockTypes.Background].includes(object.blockType);\n}\n","import { FabricObject, InteractiveFabricObject } from 'fabric';\nimport { isActive } from '../utils';\n\nexport function mixinHoverBorder(object: FabricObject) {\n\tobject.on({\n\t\tmouseover: () => {\n\t\t\tconst ctx = object.canvas?.getContext();\n\t\t\tif (object.selectable && !isActive(object) && ctx) {\n\t\t\t\tobject._renderControls(ctx, {\n\t\t\t\t\tcornerSize: 0,\n\t\t\t\t\thasControls: false,\n\t\t\t\t\thasBorders: true,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tmouseout: () => {\n\t\t\tconst ctx = object.canvas?.getContext();\n\t\t\tif (!isActive(object) && ctx) {\n\t\t\t\tobject._renderControls(ctx, {\n\t\t\t\t\thasControls: false,\n\t\t\t\t\thasBorders: false,\n\t\t\t\t\tcornerSize: InteractiveFabricObject.ownDefaults.cornerSize,\n\t\t\t\t});\n\t\t\t\tobject.canvas?.renderAll();\n\t\t\t}\n\t\t},\n\t});\n}\n","import {\n\tclassRegistry,\n\tFabricImage,\n\tFabricObjectProps,\n\tObjectEvents,\n\tPattern,\n\tRect,\n\tRectProps,\n\tSerializedRectProps,\n\tStaticCanvas,\n\tTClassProperties,\n\tTFiller,\n\tTOptions,\n\tTransform,\n\tutil,\n} from 'fabric';\nimport { v4 as uuid } from 'uuid';\nimport { BlockTypes, IBlock, IBlockPropKeys } from './types';\nimport { DEBUG } from '@/utils/consts';\nimport { mixinHoverBorder } from './mixins/hover';\nimport { isActive } from './utils';\n\nexport interface SerializedBlockBackgroundProps\n\textends SerializedRectProps,\n\t\tIBlock {}\n\nexport interface BlockBackgroundProps extends RectProps, IBlock {}\n\n/**\n * 画布根块\n * @description 实现背景替换等接口\n */\nexport class BlockBackground<\n\t\tProps extends\n\t\t\tTOptions<BlockBackgroundProps> = Partial<BlockBackgroundProps>,\n\t\tSProps extends\n\t\t\tSerializedBlockBackgroundProps = SerializedBlockBackgroundProps,\n\t\tEventSpec extends ObjectEvents = ObjectEvents,\n\t>\n\textends Rect<Props, SProps, EventSpec>\n\timplements IBlock\n{\n\tstatic async patternFromURL(\n\t\turl: string,\n\t\tsize: Pick<FabricObjectProps, 'width' | 'height'>,\n\t) {\n\t\tconst img = await FabricImage.fromURL(url);\n\t\tif (img.width > img.height) {\n\t\t\timg.scaleToWidth(size.width);\n\t\t} else {\n\t\t\timg.scaleToHeight(size.height);\n\t\t}\n\t\tconst canvas = new StaticCanvas(undefined, size);\n\t\tcanvas.add(img);\n\t\tcanvas.centerObject(img);\n\t\tcanvas.renderAll();\n\t\treturn new Pattern({\n\t\t\tsource: canvas.toCanvasElement(),\n\t\t\trepeat: 'no-repeat',\n\t\t});\n\t}\n\n\tstatic async fromColour(\n\t\thex: string,\n\t\tsize: Pick<FabricObjectProps, 'width' | 'height'>,\n\t) {\n\t\treturn new BlockBackground({\n\t\t\t...size,\n\t\t\tfill: hex,\n\t\t});\n\t}\n\n\tstatic async fromURL(\n\t\turl: string,\n\t\tsize: Pick<FabricObjectProps, 'width' | 'height'>,\n\t) {\n\t\tconst pattern = await BlockBackground.patternFromURL(url, size);\n\n\t\treturn new BlockBackground({\n\t\t\t...size,\n\t\t\tfill: pattern,\n\t\t});\n\t}\n\n\tdeclare blockType: BlockTypes;\n\n\tdeclare _fill: string | TFiller | null;\n\n\t// @ts-ignore\n\tget fill() {\n\t\treturn this._fill;\n\t}\n\n\tset fill(v: string | TFiller | null) {\n\t\tif (v === this._fill) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst original = {\n\t\t\t...util.saveObjectTransform(this),\n\t\t\toriginX: 0,\n\t\t\toriginY: 0,\n\t\t\tfill:\n\t\t\t\ttypeof this._fill === 'string' ? this._fill : this._fill?.toObject(),\n\t\t};\n\t\tconst { flipX, flipY, fill, top, left, angle, ...rest } = original;\n\t\tthis._fill = v;\n\t\tthis.toggleSelectable();\n\t\tconst options = {\n\t\t\ttarget: this,\n\t\t\ttransform: {\n\t\t\t\ttarget: this,\n\t\t\t\tcorner: '',\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\tex: 0,\n\t\t\t\tey: 0,\n\t\t\t\tlastX: 0,\n\t\t\t\tlastY: 0,\n\t\t\t\tshiftKey: false,\n\t\t\t\taltKey: false,\n\t\t\t\tactionPerformed: true,\n\t\t\t\ttheta: util.degreesToRadians(this.angle),\n\t\t\t\twidth: this.width,\n\t\t\t\theight: this.height,\n\t\t\t\t...rest,\n\t\t\t\toriginal,\n\t\t\t} as Transform,\n\t\t};\n\t\tthis.canvas?.fire('object:modified', options);\n\t\tthis.fire('modified', options);\n\t}\n\n\tconstructor(props?: Props) {\n\t\tsuper(props);\n\n\t\tthis.id = props?.id || uuid();\n\t\tthis.blockType = BlockTypes.Background;\n\t\tthis.toggleSelectable();\n\n\t\tmixinHoverBorder(this);\n\t}\n\n\ttoggleSelectable() {\n\t\tconst controlable = this?.fill instanceof Pattern;\n\t\tthis.selectable = controlable;\n\t\tthis.hoverCursor = controlable ? 'move' : 'default';\n\n\t\tif (!this.selectable && isActive(this)) {\n\t\t\tthis.canvas?.discardActiveObject();\n\t\t\t// this.canvas?.renderAll();\n\t\t}\n\t}\n\n\ttoObject<\n\t\tT extends Omit<Props & TClassProperties<this>, keyof SProps>,\n\t\tK extends keyof T = never,\n\t>(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n\t\t// @ts-ignore\n\t\treturn super.toObject([...propertiesToInclude, ...IBlockPropKeys]);\n\t}\n}\n\n// to make possible restoring from serialization\nclassRegistry.setClass(BlockBackground, Rect.type);\n// to make block connected to svg Path element\nclassRegistry.setSVGClass(BlockBackground, Rect.type);\n","import {\n\tFabricImage,\n\tImageProps,\n\tImageSource,\n\tObjectEvents,\n\tTOptions,\n\tSerializedImageProps,\n\tTClassProperties,\n\tclassRegistry,\n} from 'fabric';\nimport { v4 as uuid } from 'uuid';\nimport { BlockTypes, IBlock, IBlockPropKeys } from './types';\nimport { DEBUG } from '@/utils/consts';\nimport { mixinHoverBorder } from './mixins/hover';\n\nexport interface SerializedBlockImageProps\n\textends SerializedImageProps,\n\t\tIBlock {}\n\nexport interface BlockBackgroundProps extends ImageProps, IBlock {}\n\n/**\n * 图片块\n * @description 实现滤镜、风格话等各种图片操作接口\n */\nexport class BlockImage<\n\t\tProps extends\n\t\t\tTOptions<BlockBackgroundProps> = Partial<BlockBackgroundProps>,\n\t\tSProps extends SerializedBlockImageProps = SerializedBlockImageProps,\n\t\tEventSpec extends ObjectEvents = ObjectEvents,\n\t>\n\textends FabricImage<Props, SProps, EventSpec>\n\timplements IBlock\n{\n\tdeclare blockType: BlockTypes;\n\n\tconstructor(elementId: string, options?: Props);\n\tconstructor(element: ImageSource, options?: Props);\n\tconstructor(s: ImageSource | string, props: Partial<ImageProps>) {\n\t\t// @ts-ignore\n\t\tsuper(s, props);\n\n\t\tthis.id = props?.id || uuid();\n\t\tthis.blockType = BlockTypes.Image;\n\t\tthis.hoverCursor = 'move';\n\n\t\tmixinHoverBorder(this);\n\t}\n\n\ttoObject<\n\t\tT extends Omit<Props & TClassProperties<this>, keyof SProps>,\n\t\tK extends keyof T = never,\n\t>(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n\t\t// @ts-ignore\n\t\treturn super.toObject([...propertiesToInclude, ...IBlockPropKeys]);\n\t}\n}\n\n// to make possible restoring from serialization\nclassRegistry.setClass(BlockImage, FabricImage.type);\n// to make block connected to svg Path element\nclassRegistry.setSVGClass(BlockImage, FabricImage.type);\n","import {\n\tRect,\n\tFabricText,\n\tTextProps,\n\tFabricImage,\n\tImageProps,\n\tPattern,\n\tStaticCanvas,\n\tRectProps,\n\tSerializedRectProps,\n\tObjectEvents,\n\tTOptions,\n\tTClassProperties,\n} from 'fabric';\nimport { v4 as uuid } from 'uuid';\nimport type { Required } from 'utility-types';\nimport { BlockTypes, IBlock, IBlockPropKeys } from './types';\n\nconst defaultOffsetX = 20;\nconst defaultOffsetY = 40;\n\nexport interface WaterMark {\n\tvalue: string;\n\tprops?: Partial<ImageProps> | Partial<TextProps>;\n}\n\nexport interface SerializedBlockWaterMarkProps\n\textends SerializedRectProps,\n\t\tIBlock {\n\tcanvas: StaticCanvas;\n}\n\nexport interface BlockWaterMarkProps extends RectProps, IBlock {}\n\n/**\n * 水印块\n * @description 实现水印等接口\n */\nexport class BlockWaterMark<\n\t\tProps extends Required<\n\t\t\tTOptions<BlockWaterMarkProps>,\n\t\t\t'width' | 'height'\n\t\t> = Required<BlockWaterMarkProps, 'width' | 'height'>,\n\t\tSProps extends\n\t\t\tSerializedBlockWaterMarkProps = SerializedBlockWaterMarkProps,\n\t\tEventSpec extends ObjectEvents = ObjectEvents,\n\t>\n\textends Rect<Props, SProps, EventSpec>\n\timplements IBlock\n{\n\tblockType = BlockTypes.WaterMark;\n\n\tobjectCaching = false;\n\n\tselectable = false;\n\n\tevented = false;\n\n\thasControls = false;\n\n\tstatic async fromURL(\n\t\t{ value, props }: WaterMark,\n\t\trectOpts: Required<Partial<RectProps>, 'width' | 'height'>,\n\t) {\n\t\tconst mark = await FabricImage.fromURL(value, undefined, {\n\t\t\t...props,\n\t\t\tleft: defaultOffsetX,\n\t\t\ttop: defaultOffsetY,\n\t\t});\n\n\t\treturn BlockWaterMark.fromWatermark(mark, rectOpts);\n\t}\n\n\tstatic async fromText(\n\t\t{ value, props }: WaterMark,\n\t\trectOpts: Required<Partial<RectProps>, 'width' | 'height'>,\n\t) {\n\t\tconst text = new FabricText(value, {\n\t\t\tfontFamily: 'Arial',\n\t\t\tfontSize: 12,\n\t\t\tfill: 'rgba(0,0,0,0.3)',\n\t\t\tstroke: 'rgba(255,255,255,0.3)',\n\t\t\tstrokeWidth: 1,\n\t\t\tleft: defaultOffsetX,\n\t\t\ttop: defaultOffsetY,\n\t\t\t...props,\n\t\t});\n\n\t\treturn BlockWaterMark.fromWatermark(text, rectOpts);\n\t}\n\n\tstatic async fromWatermark(\n\t\tobject: FabricImage | FabricText,\n\t\trectOpts: Required<Partial<RectProps>, 'width' | 'height'>,\n\t\toffsetX = defaultOffsetX,\n\t\toffsetY = defaultOffsetY,\n\t) {\n\t\tconst w = object.getScaledWidth();\n\t\tconst h = object.getScaledHeight();\n\t\tconst size = {\n\t\t\twidth: w * 2 + offsetX * 2,\n\t\t\theight: h * 2 + offsetY * 2,\n\t\t};\n\t\tconst cloned = await object.clone();\n\t\tcloned.set({\n\t\t\tleft: w + offsetX * 2,\n\t\t\ttop: h + offsetY * 2,\n\t\t});\n\n\t\tconst patternSourceCanvas = new StaticCanvas(undefined, size);\n\t\tpatternSourceCanvas.add(object, cloned);\n\n\t\treturn new BlockWaterMark({\n\t\t\tcanvas: patternSourceCanvas,\n\t\t\t...rectOpts,\n\t\t});\n\t}\n\n\tconstructor(props: Props) {\n\t\tconst { canvas, fill, width, height } = props;\n\t\tconst pattern =\n\t\t\tfill instanceof Pattern\n\t\t\t\t? fill\n\t\t\t\t: new Pattern({\n\t\t\t\t\t\tsource: canvas.getElement(),\n\t\t\t\t\t\trepeat: 'repeat',\n\t\t\t\t\t});\n\n\t\tsuper({\n\t\t\tangle: 15,\n\t\t\ttop: -height,\n\t\t\t...props,\n\t\t\tcanvas: undefined,\n\t\t\tfill: pattern,\n\t\t\twidth: width * 2,\n\t\t\theight: height * 2,\n\t\t});\n\n\t\tthis.id = props?.id || uuid();\n\t}\n\n\ttoObject<\n\t\tT extends Omit<Props & TClassProperties<this>, keyof SProps>,\n\t\tK extends keyof T = never,\n\t>(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n\t\t// @ts-ignore\n\t\treturn super.toObject([...propertiesToInclude, ...IBlockPropKeys]);\n\t}\n}\n","export * from './types';\nimport { InteractiveFabricObject } from 'fabric';\nimport { BlockViewport } from './Viewport';\nimport { BlockBackground } from './Background';\nimport { BlockImage } from './Image';\nimport { BlockWaterMark } from './WaterMark';\n\nInteractiveFabricObject.ownDefaults = {\n\t...InteractiveFabricObject.ownDefaults,\n\tcornerStyle: 'circle',\n\tborderColor: '#007aff',\n\tborderScaleFactor: 2,\n};\n\nexport type Block =\n\t| BlockViewport\n\t| BlockBackground\n\t| BlockImage\n\t| BlockWaterMark;\n\nexport type Block4Content = BlockBackground | BlockImage;\n\nexport { BlockViewport, BlockBackground, BlockImage, BlockWaterMark };\n","import React from 'react';\nimport { Block, Block4Content, BlockWaterMark } from '../blocks';\nimport { PicexTool } from '@/tools';\nimport { Canvas } from 'fabric';\n\ndeclare global {\n\tinterface Size {\n\t\twidth: number;\n\t\theight: number;\n\t}\n\tinterface IPicexContext {\n\t\tnaturalSize?: Size;\n\t\tdisplaySize?: Size;\n\t\twatermark: string;\n\t\tblocks: Block[];\n\t\ttools: PicexTool[];\n\t\tcurrentBlock: Block | null;\n\t\tfcanvas: Canvas | null;\n\t\terror?: null | Error;\n\t\telMenuWrapper: React.RefObject<null | HTMLElement>;\n\t\telCanvasWrapper: React.RefObject<null | HTMLDivElement>;\n\t\telBlockTreeWrapper: React.RefObject<null | HTMLElement>;\n\t\telPropertiesWrapper: React.RefObject<null | HTMLElement>;\n\t}\n\n\ttype PicexContentActionInit = {\n\t\ttype: 'init';\n\t\timages: Array<\n\t\t\tSize & {\n\t\t\t\turl: string;\n\t\t\t\tloadedImage?: HTMLImageElement;\n\t\t\t}\n\t\t>;\n\t\tnaturalSize?: Size;\n\t\tdisplaySize?: Size;\n\t};\n\ttype PicexContentActionCover = {\n\t\ttype: 'cover';\n\t\tblocks: Block[];\n\t};\n\ttype PicexContentActionMount = {\n\t\ttype: 'mount';\n\t\tfcanvas: Canvas;\n\t};\n\ttype PicexContentActionAddWatermark = {\n\t\ttype: 'addWatermark';\n\t\tblock: BlockWaterMark;\n\t};\n\ttype PicexContentActionAddBlock = {\n\t\ttype: 'addBlock';\n\t\tblock: Block4Content;\n\t};\n\ttype PicexContentActionUpdateBlock = {\n\t\ttype: 'updateBlock';\n\t\tblock: Block;\n\t\tpayload?: Record<string, any>;\n\t};\n\ttype PicexContentActionRemoveBlock = { type: 'removeBlock'; block: Block };\n\ttype PicexContextAction =\n\t\t| PicexContentActionInit\n\t\t| PicexContentActionCover\n\t\t| PicexContentActionMount\n\t\t| PicexContentActionAddWatermark\n\t\t| PicexContentActionAddBlock\n\t\t| PicexContentActionUpdateBlock\n\t\t| PicexContentActionRemoveBlock;\n\n\ttype IPicexDispatch = React.Dispatch<PicexContextAction>;\n}\n\nexport const defaultMaxPort =\n\ttypeof window === 'undefined'\n\t\t? {\n\t\t\t\twidth: 820,\n\t\t\t\theight: 590,\n\t\t\t}\n\t\t: {\n\t\t\t\twidth: (window.innerWidth * 820) / 1192,\n\t\t\t\theight: (window.innerHeight * 590) / 1192,\n\t\t\t};\n\nexport const DefaultPicexContext: IPicexContext = {\n\tnaturalSize: defaultMaxPort,\n\tdisplaySize: defaultMaxPort,\n\twatermark: 'Picex',\n\tblocks: [],\n\ttools: [],\n\tcurrentBlock: null,\n\tfcanvas: null,\n\telMenuWrapper: React.createRef(),\n\telCanvasWrapper: React.createRef(),\n\telBlockTreeWrapper: React.createRef(),\n\telPropertiesWrapper: React.createRef(),\n};\n\nexport const PicexContext =\n\tReact.createContext<IPicexContext>(DefaultPicexContext);\nexport const PicexDispatchContext = React.createContext<IPicexDispatch>(\n\t() => {},\n);\n\nexport const usePicexCtx = () => {\n\treturn React.useContext(PicexContext);\n};\n\nexport const usePicexDispatch = () => {\n\treturn React.useContext(PicexDispatchContext);\n};\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","import { PicexTool } from '@/tools';\nimport { cn } from '@/utils/cn';\nimport React, { PropsWithChildren, ReactNode } from 'react';\n\nexport default function PicexLayout({\n\tleft,\n\tchildren,\n\tright,\n\tleftStyle,\n\trightStyle,\n\tcontentClassName,\n\tleftClassName,\n\trightClassName,\n\tcontentStyle,\n}: PropsWithChildren<{\n\tleft: ReactNode;\n\tright: ReactNode;\n\tleftStyle?: React.CSSProperties;\n\tleftClassName?: string;\n\trightStyle?: React.CSSProperties;\n\trightClassName?: string;\n\tcontentClassName?: string;\n\tcontentStyle?: React.CSSProperties;\n\tselectedTool?: PicexTool;\n}>) {\n\treturn (\n\t\t<section className=\"picex flex flex-col lg:flex-row w-full h-full\">\n\t\t\t<div\n\t\t\t\tclassName={cn('relative md:w-1/3 md:max-w-[396px]', leftClassName)}\n\t\t\t\tstyle={leftStyle}\n\t\t\t>\n\t\t\t\t{left}\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'relative min-w-0 flex-1 bg-[#f8fafc] dark:bg-[#ffffff14]',\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t\tstyle={contentStyle}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn('relative md:max-w-1/5 flex-[0_1_0]', rightClassName)}\n\t\t\t\tstyle={rightStyle}\n\t\t\t>\n\t\t\t\t{right}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n","import { Drawer, Tabs } from 'antd';\nimport { AiOutlineMenuUnfold } from 'react-icons/ai';\nimport React, { useCallback, useState } from 'react';\nimport { useResponsive } from 'ahooks';\nimport { PicexTool } from '../tools/types';\nimport { usePicexCtx, usePicexDispatch } from '../core/context';\nimport './ToolBar.css';\nimport { cn } from '@/utils/cn';\n\nexport interface PicexToolBarProps {\n\ttools: PicexTool[];\n\tvalue?: null | string;\n\tonChange?: (key: string) => void;\n\tstyle?: React.CSSProperties;\n\tclassName?: string;\n\tactiveToolKey?: string;\n}\n\n/**\n * 左侧工具栏\n * @description 根据配置初始化并渲染工具栏\n */\nexport function PicexToolBar({\n\ttools,\n\tvalue,\n\tactiveToolKey,\n\tonChange,\n\tstyle,\n\tclassName,\n}: PicexToolBarProps) {\n\tconst ctx = usePicexCtx();\n\tconst dispatch = usePicexDispatch();\n\tconst sizes = useResponsive();\n\tconst [flags, setFlags] = useState<Record<string, boolean>>({});\n\n\tconst onToolChange = useCallback(\n\t\t(v: string) => {\n\t\t\tonChange?.(v);\n\t\t\tsetFlags((prev) => {\n\t\t\t\treturn {\n\t\t\t\t\t...prev,\n\t\t\t\t\t[v]: true,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\t[onChange],\n\t);\n\n\treturn (\n\t\t<Tabs\n\t\t\tsize=\"small\"\n\t\t\ttype=\"card\"\n\t\t\ttabPosition={sizes.lg ? 'left' : 'top'}\n\t\t\tstyle={style}\n\t\t\tclassName={cn('picex-toolbar w-full h-full', className)}\n\t\t\tonChange={onToolChange}\n\t\t\tactiveKey={activeToolKey}\n\t\t\titems={tools.map((tool) => {\n\t\t\t\treturn {\n\t\t\t\t\tkey: tool.key,\n\t\t\t\t\tlabel: (\n\t\t\t\t\t\t<span className=\"max-w-14 inline-flex flex-col items-center gap-1\">\n\t\t\t\t\t\t\t<i\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'w-12 h-12 rounded-full overflow-hidden flex items-center justify-center',\n\t\t\t\t\t\t\t\t\tactiveToolKey === tool.key\n\t\t\t\t\t\t\t\t\t\t? 'bg-[rgb(31,135,252,0.1)]'\n\t\t\t\t\t\t\t\t\t\t: 'bg-[#d9d9d9] text-[#666666]',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{tool.renderIcon?.({ ctx, dispatch })}\n\t\t\t\t\t\t\t</i>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'text-sm leading-[1] font-medium',\n\t\t\t\t\t\t\t\t\tactiveToolKey !== tool.key && 'text-[#666666]',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{tool.name}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t),\n\t\t\t\t\tchildren: sizes.lg ? (\n\t\t\t\t\t\ttool.renderPanel?.({ ctx, dispatch })\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<aside className=\"absolute z-10 left-0 ml-4 mt-4 md:ml-0\">\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"text-2xl text-[#666] hover:text-[#007AFF] cursor-pointer\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tvalue && setFlags((prev) => ({ ...prev, [value]: true }));\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<AiOutlineMenuUnfold />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</aside>\n\t\t\t\t\t\t\t<Drawer\n\t\t\t\t\t\t\t\tplacement=\"left\"\n\t\t\t\t\t\t\t\twidth=\"67vw\"\n\t\t\t\t\t\t\t\tstyles={{\n\t\t\t\t\t\t\t\t\theader: { padding: 8 },\n\t\t\t\t\t\t\t\t\tbody: { padding: 8 },\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\topen={flags[tool.key]}\n\t\t\t\t\t\t\t\tonClose={() =>\n\t\t\t\t\t\t\t\t\tsetFlags((prev) => ({ ...prev, [tool.key]: false }))\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{tool.renderPanel?.({ ctx, dispatch })}\n\t\t\t\t\t\t\t</Drawer>\n\t\t\t\t\t\t</>\n\t\t\t\t\t),\n\t\t\t\t\tdisabled: tool.disabled,\n\t\t\t\t};\n\t\t\t})}\n\t\t/>\n\t);\n}\n","import { BlockViewport, BlockWaterMark } from '@/blocks';\nimport { WaterMark } from '@/blocks/WaterMark';\nimport { usePicexCtx, usePicexDispatch } from '@/core/context';\nimport { useEffect, useMemo } from 'react';\n\nexport function useWaterMark(input?: WaterMark) {\n\tconst state = usePicexCtx();\n\tconst watermark = useMemo(() => input, [JSON.stringify(input)]);\n\tconst dispatch = usePicexDispatch();\n\n\tuseEffect(() => {\n\t\tconst root = state.blocks[0] as undefined | BlockViewport;\n\t\tconst flag = state.blocks.some((x) => x instanceof BlockWaterMark);\n\t\tconst width = root?.width;\n\t\tconst height = root?.height;\n\t\t// console.log('>>> ', width, height, watermark?.value, !flag, state.blocks);\n\t\tif (width && height && watermark?.value && !flag) {\n\t\t\tconst { value, props } = watermark;\n\t\t\tconst options = {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t};\n\n\t\t\t(value.startsWith('http')\n\t\t\t\t? BlockWaterMark.fromURL({ value, props }, options)\n\t\t\t\t: BlockWaterMark.fromText({ value, props }, options)\n\t\t\t).then((block) => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'addWatermark',\n\t\t\t\t\tblock,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}, [watermark, state.blocks]);\n}\n","import React, { PropsWithChildren, useEffect, useRef } from 'react';\nimport { usePicexCtx, usePicexDispatch } from '@/core/context';\nimport { Canvas } from 'fabric';\nimport { Block, BlockTypes, BlockWaterMark } from '@/blocks';\nimport { isContentBlock } from '@/blocks/utils';\n// import 'fabric-history/src/index';\n\nexport function PicexCanvas({ children }: PropsWithChildren) {\n\tconst ctx = usePicexCtx();\n\tconst dispatch = usePicexDispatch();\n\tconst { elCanvasWrapper } = ctx;\n\tconst elCanvas = useRef<HTMLCanvasElement>(null);\n\tconst refCanvas = useRef<Canvas>(null);\n\n\tuseEffect(() => {\n\t\tif (refCanvas.current) {\n\t\t\treturn;\n\t\t}\n\t\tconst fcanvas = new Canvas(elCanvas.current!, {\n\t\t\twidth: window.innerWidth,\n\t\t\theight: window.innerHeight,\n\t\t\tbackgroundColor: 'transparent',\n\t\t\thoverCursor: 'default',\n\t\t\t// clip时忽略controls部分\n\t\t\tcontrolsAboveOverlay: true,\n\t\t\t// control时保持对象层级\n\t\t\tpreserveObjectStacking: true,\n\t\t});\n\n\t\trefCanvas.current = fcanvas;\n\n\t\tdispatch({\n\t\t\ttype: 'mount',\n\t\t\tfcanvas,\n\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!elCanvas.current) {\n\t\t\treturn;\n\t\t}\n\t\tconst fcanvas = ctx.fcanvas || refCanvas.current;\n\t\tconst { blocks: nextBlocks } = ctx;\n\t\tif (!fcanvas || !nextBlocks.length) {\n\t\t\treturn;\n\t\t}\n\t\tconst currBlocks = [...(fcanvas._objects as Block[])];\n\t\tconst isInit =\n\t\t\t!currBlocks.length || currBlocks[0]?.id !== nextBlocks[0]?.id;\n\t\t// const isAddOrRemove =\n\t\t// \t!isInit &&\n\t\t// \t!fcanvas.history?.isProcessing() &&\n\t\t// \t(nextBlocks.some(\n\t\t// \t\t(block) => !currBlocks.includes(block) && isContentBlock(block),\n\t\t// \t) ||\n\t\t// \t\tcurrBlocks.some(\n\t\t// \t\t\t(block) => !nextBlocks.includes(block) && isContentBlock(block),\n\t\t// \t\t));\n\t\t// const getHistroyAction = (prev: Block[], next: Block[]) => async () => {\n\t\t// \tdispatch({\n\t\t// \t\ttype: 'cover',\n\t\t// \t\tblocks: prev,\n\t\t// \t});\n\t\t// \treturn getHistroyAction(next, prev);\n\t\t// };\n\n\t\tif (isInit) {\n\t\t\tfcanvas.history?.disable();\n\t\t}\n\n\t\t// fcanvas.clear();\n\t\tcurrBlocks.forEach((block) => {\n\t\t\tif (!nextBlocks.includes(block)) {\n\t\t\t\tfcanvas.remove(block);\n\t\t\t}\n\t\t});\n\t\tnextBlocks.forEach((block, i) => {\n\t\t\t// should check if same id because of block clone cache by history\n\t\t\tconst isAdd = !currBlocks.some(\n\t\t\t\t(item) => item === block || item.id === block.id,\n\t\t\t);\n\t\t\tif (isAdd) {\n\t\t\t\tfcanvas.insertAt(i, block);\n\t\t\t\tfcanvas.centerObject(block);\n\t\t\t} else {\n\t\t\t\tfcanvas.moveObjectTo(block, i);\n\t\t\t}\n\t\t\tif (block instanceof BlockWaterMark) {\n\t\t\t\t// not renderred occasionally with cache\n\t\t\t\tblock.dirty = true;\n\t\t\t}\n\t\t});\n\t\tfcanvas.clipPath = nextBlocks[0];\n\t\tfcanvas.renderAll();\n\t\t//通过调用多次，解决水印偶现不加载问题\n\t\trequestAnimationFrame(() => {\n\t\t\tfcanvas.renderAll();\n\t\t});\n\n\t\tif (isInit) {\n\t\t\tfcanvas.history?.enable();\n\t\t\tfcanvas.history?.clear();\n\t\t}\n\t\t// if (isAddOrRemove) {\n\t\t// \tPromise.all(currBlocks.map((x) => x.clone())).then((prevBlocks) => {\n\t\t// \t\tfcanvas.history?.append(getHistroyAction(prevBlocks, nextBlocks));\n\t\t// \t});\n\t\t// }\n\t}, [ctx]);\n\n\treturn (\n\t\t<div\n\t\t\tref={elCanvasWrapper}\n\t\t\tclassName=\"picex-canvas w-full h-full overflow-hidden flex justify-center items-center\"\n\t\t>\n\t\t\t<canvas ref={elCanvas} />\n\t\t</div>\n\t);\n}\n","/**\n *  String format template\n *  - Inspired:\n *    https://github.com/Matt-Esch/string-template/index.js\n */\n// @ts-nocheck\n\nconst RE_NARGS = /(%|)\\{([0-9a-zA-Z_]+)\\}/g;\n\n/**\n * format\n *\n * @param {String} string\n * @param {Array} ...args\n * @return {String}\n */\n\nexport default function (string, ...args) {\n\tif (args.length === 1 && typeof args[0] === 'object') {\n\t\targs = args[0];\n\t}\n\n\tif (!args || !args.hasOwnProperty) {\n\t\targs = {};\n\t}\n\n\treturn string.replace(RE_NARGS, (match, prefix, i, index) => {\n\t\tlet result;\n\n\t\tif (string[index - 1] === '{' && string[index + match.length] === '}') {\n\t\t\treturn i;\n\t\t} else {\n\t\t\tresult = Object.prototype.hasOwnProperty.call(args, i) ? args[i] : null;\n\t\t\tif (result === null || result === undefined) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t});\n}\n","export default {\n\tuploadNewImage: 'Upload a new image',\n\tdownload: 'Download',\n\tbackground: {\n\t\ttitle: 'Background',\n\t\tpanel: {\n\t\t\tcolour: 'Colour',\n\t\t\timage: 'Image',\n\t\t\tconfirm: 'Confirm',\n\t\t\tupload: 'Upload',\n\t\t},\n\t},\n\tuploadTip: 'Upload your image here',\n};\n","export default {\n\tuploadNewImage: '新しい画像をアップロード',\n\tdownload: 'ダウンロード',\n\tbackground: {\n\t\ttitle: '背景',\n\t\tpanel: {\n\t\t\tcolour: '色',\n\t\t\timage: '画像',\n\t\t\tconfirm: '確認',\n\t\t\tupload: 'アップロード',\n\t\t},\n\t},\n\tuploadTip: '画像をアップロードしてください',\n};\n","//@ts-nocheck\n\nimport format from './format.ts';\nimport enLang from './lang/en.ts';\nimport jaLang from './lang/ja.ts';\nlet _lang = enLang;\n\nconst locale = {\n\ten: enLang,\n\tja: jaLang,\n};\n\nfunction use(lang) {\n\t_lang = locale[lang] || enLang;\n}\n\nfunction t(path?: string, options?: any) {\n\tconst array = path?.split('.');\n\tlet current = _lang;\n\n\tif (array) {\n\t\tfor (let i = 0, j = array.length; i < j; i++) {\n\t\t\tconst property = array[i];\n\t\t\tconst value = current[property];\n\t\t\tif (i === j - 1) return format(value, options);\n\t\t\tif (!value) return '';\n\t\t\tcurrent = value;\n\t\t}\n\t}\n\treturn '';\n}\n\nexport default {\n\tuse,\n\tt,\n};\n","import React from 'react';\nimport { Spin, Typography, Upload, UploadProps } from 'antd';\nimport { RcFile, UploadChangeParam, UploadFile } from 'antd/es/upload';\nimport { FiPlusCircle } from 'react-icons/fi';\nimport { useRequest } from 'ahooks';\nimport { cn } from '../../utils/cn';\nimport { uploadFileByBase64 } from '@/utils/image';\nimport locale from '@/locale';\n\nconst { Text } = Typography;\n\nexport type UploadFileAttrs = {\n\turl: string;\n\twidth: number;\n\theight: number;\n};\n\nexport type UploadChangeInfo = UploadChangeParam<UploadFile<UploadFileAttrs>>;\n\nexport type UploadRequestOption = Parameters<\n\tNonNullable<UploadProps<UploadFileAttrs>['customRequest']>\n>['0'];\n\nexport type UploadBoxProps = Omit<\n\tPartial<UploadProps<UploadFileAttrs>>,\n\t'children'\n> & {\n\terr?: React.ReactNode;\n\tvisible?: boolean;\n\thidden?: boolean;\n\ticon?: React.ReactNode;\n\ticonClassName?: string;\n\twordings?: React.ReactNode;\n\twordingsClassName?: string;\n\tclassName?: string;\n\tchildren?: (x: { loading: boolean; error: Error | null }) => React.ReactNode;\n};\n\nexport function UploadBox({\n\tchildren,\n\terr,\n\ticon,\n\ticonClassName,\n\twordings,\n\twordingsClassName,\n\tclassName,\n\tbeforeUpload,\n\tcustomRequest = uploadFileByBase64,\n\t...rest\n}: UploadBoxProps) {\n\tconst { runAsync: check, error: e1 } = useRequest(\n\t\tasync (file: RcFile) => {\n\t\t\treturn beforeUpload?.(file, [file]) ?? true;\n\t\t},\n\t\t{\n\t\t\tmanual: true,\n\t\t},\n\t);\n\tconst {\n\t\trunAsync: upload,\n\t\terror: e2,\n\t\tloading,\n\t} = useRequest(\n\t\tasync (params: UploadRequestOption) => {\n\t\t\tif (loading) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait customRequest?.(params);\n\t\t},\n\t\t{\n\t\t\tmanual: true,\n\t\t},\n\t);\n\tconst e = e1 || e2;\n\tconst UploadWrapper = children ? Upload : Upload.Dragger;\n\tconst node = children?.({ loading, error: e || null });\n\n\treturn (\n\t\t<UploadWrapper\n\t\t\tclassName=\"h-full\"\n\t\t\t{...rest}\n\t\t\tbeforeUpload={check}\n\t\t\tcustomRequest={upload}\n\t\t\tshowUploadList={false}\n\t\t>\n\t\t\t{node || (\n\t\t\t\t<>\n\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t<Spin />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'mb-4 text-[#007AFF] flex items-center justify-center text-[40px]',\n\t\t\t\t\t\t\t\t\ticonClassName,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{icon ?? <FiPlusCircle />}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className={cn('text-lg font-medium', wordingsClassName)}>\n\t\t\t\t\t\t\t\t{wordings ?? locale.t('uploadTip')}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{err || e ? (\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\ttype=\"danger\"\n\t\t\t\t\t\t\tclassName=\"absolute top-full left-0 py-2\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{err || e?.message}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</UploadWrapper>\n\t);\n}\n","import { Block, BlockViewport } from '@/blocks';\nimport { BlockWaterMark } from '@/blocks';\nimport { usePicexCtx } from '@/core/context';\nimport { scaleToFitSize } from '@/utils/scale';\nimport { useRequest } from 'ahooks';\nimport type { Options as UseRequestOptions } from 'ahooks/lib/useRequest/src/types';\nimport download from 'downloadjs';\nimport { ImageFormat, StaticCanvas } from 'fabric';\n\nexport function useDownload(\n\topts?: UseRequestOptions<boolean, [ImageFormat, string | undefined]>,\n) {\n\tconst { fcanvas, blocks, naturalSize } = usePicexCtx();\n\n\treturn useRequest(\n\t\tasync (type: ImageFormat, filename = `${Date.now()}`) => {\n\t\t\tif (!fcanvas || !blocks.length) {\n\t\t\t\tthrow new Error('No valid image to download');\n\t\t\t}\n\t\t\tconst [root, ...others] = blocks;\n\t\t\tconst viewport = root as BlockViewport;\n\t\t\tconst size = naturalSize ?? {\n\t\t\t\twidth: viewport.width,\n\t\t\t\theight: viewport.height,\n\t\t\t};\n\n\t\t\tconsole.log(fcanvas, 'fcanvas');\n\n\t\t\tconst objects = (await Promise.all(\n\t\t\t\tfcanvas\n\t\t\t\t\t.getObjects()\n\t\t\t\t\t.filter((block) => !(block instanceof BlockWaterMark))\n\t\t\t\t\t.map((x) => x.clone()),\n\t\t\t)) as Exclude<Block, BlockViewport>[];\n\t\t\t// const viewport = (root as BlockViewport).cloneWithoutFill();\n\t\t\tlet dataURL: string;\n\t\t\tconst opts = {\n\t\t\t\tformat: type,\n\t\t\t\tmultiplier: 1,\n\t\t\t\t...size,\n\t\t\t};\n\n\t\t\t// viewport size has same ratio with natural size\n\t\t\tconst canvas = new StaticCanvas(undefined, size);\n\t\t\tconst scaleX = size.width / viewport.width;\n\t\t\tconst scaleY = size.height / viewport.height;\n\t\t\tobjects.map((x) => {\n\t\t\t\tx.left -= viewport.getX();\n\t\t\t\tx.left *= scaleX;\n\t\t\t\tx.top -= viewport.getY();\n\t\t\t\tx.top *= scaleY;\n\t\t\t\tx.scaleX *= scaleX;\n\t\t\t\tx.scaleY *= scaleY;\n\t\t\t\tcanvas.add(x);\n\t\t\t});\n\t\t\tcanvas.renderAll();\n\t\t\tdataURL = canvas.toDataURL(opts);\n\n\t\t\treturn download(dataURL, filename) as boolean;\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\trefreshDeps: [blocks, naturalSize],\n\t\t\tmanual: true,\n\t\t},\n\t);\n}\n","import { Button, Tooltip } from 'antd';\nimport { UploadBox, UploadBoxProps, UploadChangeInfo } from './UploadBox';\nimport { Block } from '@/index';\nimport { useDownload } from '@/hooks/useDownload';\nimport { cn } from '@/utils/cn';\nimport { ImageFormat } from 'fabric';\nimport locale from '@/locale';\n\nexport type DownloadProps = {\n\tformat?: ImageFormat;\n\tfilename?: string;\n};\n\nexport function Operators({\n\tblocks,\n\tuploadProps,\n\tdownloadProps,\n\tonChange,\n\tclassName,\n}: {\n\tblocks: Block[];\n\tuploadProps?: UploadBoxProps;\n\tdownloadProps?: DownloadProps;\n\tonChange: (info: UploadChangeInfo) => void;\n\tclassName?: string;\n}) {\n\tconst { visible = !!blocks.length, hidden = false } = uploadProps || {};\n\tconst { format = 'png', filename } = downloadProps || {};\n\tconst { run: download, loading: downloading } = useDownload();\n\n\treturn (\n\t\t<aside\n\t\t\tclassName={cn(\n\t\t\t\t'absolute top-4 right-4 lg:top-8 lg:right-8 flex items-center justify-end gap-2',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{visible || !hidden ? (\n\t\t\t\t<UploadBox\n\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\tmultiple={false}\n\t\t\t\t\t{...uploadProps}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t>\n\t\t\t\t\t{({ loading, error }) => {\n\t\t\t\t\t\tconst btn = (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t\t\tshape=\"round\"\n\t\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{locale.t('uploadNewImage')}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn !error ? (\n\t\t\t\t\t\t\tbtn\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\topen\n\t\t\t\t\t\t\t\tplacement=\"bottomLeft\"\n\t\t\t\t\t\t\t\ttitle={error?.message}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{btn}\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t);\n\t\t\t\t\t}}\n\t\t\t\t</UploadBox>\n\t\t\t) : null}\n\t\t\t<Button\n\t\t\t\tclassName=\"w-24\"\n\t\t\t\tsize=\"small\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\tshape=\"round\"\n\t\t\t\tdisabled={!blocks.length}\n\t\t\t\tloading={downloading}\n\t\t\t\tonClick={() => download(format, filename)}\n\t\t\t>\n\t\t\t\t{locale.t('download')}\n\t\t\t</Button>\n\t\t</aside>\n\t);\n}\n","import * as React from \"react\";\nconst SvgRedo = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 28, height: 28, viewBox: \"0 0 28 28\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M17.1146 15.927L20.9727 12.069L17.1146 8.21094M20.9727 12.069H10.3631C9.33988 12.069 8.35857 12.4754 7.63505 13.199C6.91153 13.9225 6.50506 14.9038 6.50506 15.927C6.50506 16.9502 6.91153 17.9315 7.63505 18.655C8.35857 19.3785 9.33988 19.785 10.3631 19.785H11.3276\", stroke: \"#494949\", strokeWidth: 2.77778, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgRedo;\n","import * as React from \"react\";\nconst SvgUndo = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 28, height: 28, viewBox: \"0 0 28 28\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M10.8854 15.927L7.02734 12.069L10.8854 8.21094M7.02734 12.069H17.6369C18.6601 12.069 19.6414 12.4754 20.3649 13.199C21.0885 13.9225 21.4949 14.9038 21.4949 15.927C21.4949 16.9502 21.0885 17.9315 20.3649 18.655C19.6414 19.3785 18.6601 19.785 17.6369 19.785H16.6724\", stroke: \"#494949\", strokeWidth: 2.77778, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgUndo;\n","import { Button } from 'antd';\nimport Redo from '@/images/redo.svg?react';\nimport Undo from '@/images/undo.svg?react';\nimport { usePicexCtx } from '@/core/context';\nimport { useEffect, useState } from 'react';\nimport { cn } from '@/utils/cn';\n\nconst events = [\n\t'history:append',\n\t'history:undo',\n\t'history:redo',\n\t'history:clear',\n] as const;\n\nexport function HistoryBtns({ maxport }: { maxport?: Size }) {\n\tconst [count, setCount] = useState(0);\n\tconst { fcanvas } = usePicexCtx();\n\tconst { historyUndo = [], historyRedo = [] } = fcanvas?.history ?? {};\n\n\tuseEffect(() => {\n\t\tconst canvas = fcanvas;\n\t\tconst handler = () => {\n\t\t\t// 避免\n\t\t\t// Cannot update a component (`HistoryBtns`) while rendering a different component (`PicexEditor`)\n\t\t\trequestIdleCallback(() => {\n\t\t\t\tsetCount((prev) => prev + 1);\n\t\t\t});\n\t\t};\n\t\tevents.forEach((event) => {\n\t\t\tcanvas?.on(event, handler);\n\t\t});\n\n\t\treturn () => {\n\t\t\tevents.forEach((event) => {\n\t\t\t\tcanvas?.off(event, handler);\n\t\t\t});\n\t\t};\n\t}, [fcanvas]);\n\n\tconst btnCls =\n\t\t'w-[3.125rem] h-[3.125rem] p-0 flex items-center justify-center border-none rounded-lg';\n\n\treturn (\n\t\t<aside\n\t\t\tclassName=\"absolute z-10 -mt-4 top-6 lg:top-12 left-1/2 -translate-x-1/2 -translate-y-full flex items-center justify-start gap-2\"\n\t\t\tstyle={{\n\t\t\t\ttop: maxport ? `calc(50% - ${maxport.height / 2}px)` : undefined,\n\t\t\t}}\n\t\t>\n\t\t\t<div className=\"flex items-center gap-4\">\n\t\t\t\t<Button\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\tclassName={cn(btnCls)}\n\t\t\t\t\tdisabled={!historyUndo?.length}\n\t\t\t\t\tonClick={() => fcanvas?.history?.undo()}\n\t\t\t\t>\n\t\t\t\t\t<Undo />\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\tclassName={btnCls}\n\t\t\t\t\tdisabled={!historyRedo?.length}\n\t\t\t\t\tonClick={() => fcanvas?.history?.redo()}\n\t\t\t\t>\n\t\t\t\t\t<Redo />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</aside>\n\t);\n}\n","/**\n * 判断两个 URL 的后两个域名段（SLD + TLD）是否一致。\n * 例如：\n *  - \"a.example.com\"        → \"example.com\"\n *  - \"b.test.example.co.uk\" → \"co.uk\"\n *\n * @param url1 - 第一个 URL 字符串\n * @param url2 - 第二个 URL 字符串\n * @returns 如果两者最后两个域名段相同返回 true，否则返回 false\n */\nexport function isSameSecondLevelDomain(url1: string, url2: string): boolean {\n\tconst extractLastTwo = (url: string): string | null => {\n\t\ttry {\n\t\t\t// 解析并小写化 hostname\n\t\t\tconst host: string = new URL(url).hostname.toLowerCase();\n\t\t\t// 正则捕获最后两段，例如 \"example.com\" 或 \"co.uk\"\n\t\t\tconst match: RegExpMatchArray | null = host.match(/([^.]+\\.[^.]+)$/);\n\t\t\treturn match?.[1] ?? null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tconst d1: string | null = extractLastTwo(url1);\n\tconst d2: string | null = extractLastTwo(url2);\n\n\treturn d1 !== null && d1 === d2;\n}\n","import { useCallback } from 'react';\nimport { isSameSecondLevelDomain } from '@/utils/dom';\ninterface ImageInfo {\n\turl: string;\n\twidth: number;\n\theight: number;\n}\n\nexport const useImageLoader = () => {\n\tconst loadImage = useCallback(\n\t\t(imageInfo: ImageInfo): Promise<HTMLImageElement> => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst img = new Image();\n\t\t\t\tif (isSameSecondLevelDomain(imageInfo.url, window.location.origin)) {\n\t\t\t\t\timg.crossOrigin = 'use-credentials';\n\t\t\t\t} else {\n\t\t\t\t\timg.crossOrigin = 'anonymous';\n\t\t\t\t}\n\t\t\t\timg.onload = () => resolve(img);\n\t\t\t\timg.onerror = reject;\n\t\t\t\timg.src = imageInfo.url;\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst loadImages = useCallback(\n\t\t(images: ImageInfo[]): Promise<HTMLImageElement[]> => {\n\t\t\treturn Promise.all(images.map(loadImage));\n\t\t},\n\t\t[loadImage],\n\t);\n\n\treturn { loadImage, loadImages };\n};\n","import { EventEmitter } from 'eventemitter3';\n\nconst eventBus = new EventEmitter();\n\nexport default eventBus;\n","import React, {\n\tFragment,\n\tPropsWithChildren,\n\tuseCallback,\n\tuseEffect,\n} from 'react';\nimport { WaterMark } from '@/blocks/WaterMark';\nimport { useWaterMark } from '@/hooks/useWaterMark';\nimport { usePicexCtx, usePicexDispatch } from '@/core/context';\nimport { cn } from '@/utils/cn';\nimport { PicexCanvas } from './common/Canvas';\nimport { DownloadProps, Operators } from './common/Operators';\nimport {\n\tUploadBox,\n\tUploadBoxProps,\n\tUploadChangeInfo,\n} from './common/UploadBox';\nimport { HistoryBtns } from './common/HistoryBtns';\nimport { useImageLoader } from '@/hooks/useImageLoader';\nimport eventBus from '@/utils/eventBus';\n\nimport './Design.css';\nexport interface DesignProps {\n\tviewport?: Size;\n\tmaxport?: Size;\n\timages?: PicexContentActionInit['images'];\n\twatermark?: WaterMark;\n\thistorable?: boolean;\n\tuploadProps?: UploadBoxProps;\n\tdownloadProps?: DownloadProps;\n\tenableOperators?: boolean;\n\tchildrenZeroBlock?: React.ReactNode;\n\tonlyChildren?: boolean;\n\tlang?: string;\n\tchildNode?: { [key: string]: React.ReactNode };\n\tactiveToolKey?: string;\n}\n\n/**\n * 主区域画布\n * @description\n * 1. 根据配置初始化并渲染画布\n * 2. 根据Blocks树渲染画布内容\n */\nexport function PicexDesign({\n\tviewport,\n\tmaxport,\n\timages,\n\twatermark,\n\thistorable = true,\n\tuploadProps,\n\tdownloadProps,\n\tchildren,\n\tchildrenZeroBlock,\n\tenableOperators = true,\n\tonlyChildren = false,\n\tchildNode,\n\tactiveToolKey,\n}: PropsWithChildren<DesignProps>) {\n\tconst { blocks } = usePicexCtx();\n\tconst dispatch = usePicexDispatch();\n\tconst { loadImages } = useImageLoader();\n\t// const [loadedImagesState, setLoadedImagesState] = useState(null);\n\t// const el = useRef<HTMLDivElement>(null);\n\t// const size = useSize(el);\n\tconst onChange = useCallback(\n\t\t(info: UploadChangeInfo) => {\n\t\t\tconst { fileList } = info;\n\t\t\tif (\n\t\t\t\tfileList.length &&\n\t\t\t\tfileList.every((x) => x.status === 'done' && x.response)\n\t\t\t) {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'init',\n\t\t\t\t\tnaturalSize: viewport,\n\t\t\t\t\tdisplaySize: maxport,\n\t\t\t\t\timages: fileList.map(({ response }) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\turl: response!.url,\n\t\t\t\t\t\t\twidth: response!.width,\n\t\t\t\t\t\t\theight: response!.height,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[dispatch],\n\t);\n\n\tuseEffect(() => {\n\t\tif (images?.length && viewport) {\n\t\t\t// 先加载图片，然后再初始化\n\t\t\tloadImages(images)\n\t\t\t\t.then((loadedImages) => {\n\t\t\t\t\tconsole.log(loadedImages, 'loadedImages');\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'init',\n\t\t\t\t\t\timages: images.map((img, index) => ({\n\t\t\t\t\t\t\t...img,\n\t\t\t\t\t\t\tloadedImage: loadedImages[index],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tnaturalSize: viewport,\n\t\t\t\t\t\tdisplaySize: maxport,\n\t\t\t\t\t});\n\t\t\t\t\t//增加eventbus\n\t\t\t\t\teventBus.emit('reset-state');\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Failed to load images:', error);\n\t\t\t\t\t// 如果加载失败，仍然使用原始图片进行初始化\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'init',\n\t\t\t\t\t\timages,\n\t\t\t\t\t\tnaturalSize: viewport,\n\t\t\t\t\t\tdisplaySize: maxport,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t} else {\n\t\t\tdispatch({\n\t\t\t\ttype: 'cover',\n\t\t\t\tblocks: [],\n\t\t\t});\n\t\t}\n\t}, [\n\t\timages,\n\t\tviewport?.width,\n\t\tviewport?.height,\n\t\tmaxport?.width,\n\t\tmaxport?.height,\n\t]);\n\tuseWaterMark(watermark);\n\n\tconst Box = (onlyChildren\n\t\t? childrenZeroBlock\n\t\t: (childrenZeroBlock ?? children)) ?? (\n\t\t<UploadBox\n\t\t\taccept=\"image/*\"\n\t\t\tmultiple={false}\n\t\t\t{...uploadProps}\n\t\t\tonChange={onChange}\n\t\t/>\n\t);\n\n\treturn (\n\t\t<div className=\"picex-design h-full\">\n\t\t\t<div className={cn('h-full', { hidden: onlyChildren })}>\n\t\t\t\t{enableOperators ? (\n\t\t\t\t\t<Operators\n\t\t\t\t\t\tclassName=\"z-10\"\n\t\t\t\t\t\tblocks={blocks}\n\t\t\t\t\t\tuploadProps={uploadProps}\n\t\t\t\t\t\tdownloadProps={downloadProps}\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t{historable ? (\n\t\t\t\t\t<HistoryBtns maxport={blocks[0] || maxport || viewport} />\n\t\t\t\t) : null}\n\t\t\t\t<div\n\t\t\t\t\t// ref={el}\n\t\t\t\t\tclassName=\"picex-design-content h-full flex items-center justify-center\"\n\t\t\t\t>\n\t\t\t\t\t{!blocks.length ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'w-full text-center max-w-[422px] aspect-[422/553]',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{Box}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<PicexCanvas />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{/* 全部渲染子节点 但是只显示activeToolKey的子节点 */}\n\t\t\t<div className={cn('h-full', { hidden: !onlyChildren })}>\n\t\t\t\t{Object.entries(childNode ?? {}).map(([key, value]) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tclassName={cn({ hidden: key !== activeToolKey })}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import React, { PropsWithChildren } from 'react';\n\n/**\n * Block属性面板\n * @description 根据当前选中Block渲染属性，并提供操作\n */\nexport function PicexProperties(props: PropsWithChildren<{}>) {\n\treturn <div className=\"\"></div>;\n}\n","import React, { PropsWithChildren } from 'react';\n\n/**\n * 右侧块树\n * @description 根据Block树渲染块节点树\n */\nexport function PicexBlockTree(props: PropsWithChildren<{}>) {\n\treturn <div className=\"\"></div>;\n}\n","import { ReactNode } from 'react';\n\nexport type IPicexToolRenderParams = {\n\tctx: IPicexContext;\n\tdispatch: IPicexDispatch;\n\ttool?: PicexTool;\n};\n\nexport abstract class PicexTool {\n\tabstract key: string;\n\tabstract name: string;\n\tabstract visible: boolean;\n\tabstract disabled: boolean;\n\n\ttoggle(v = !this.visible) {\n\t\tthis.visible = v;\n\t}\n\n\ttoggleDisabled(v = !this.disabled) {\n\t\tthis.disabled = v;\n\t}\n\n\tabstract renderIcon(params: IPicexToolRenderParams): ReactNode;\n\n\tabstract renderPanel(params: IPicexToolRenderParams): ReactNode;\n\n\trenderOutput?(params: IPicexToolRenderParams): ReactNode;\n}\n","import * as React from \"react\";\nconst SvgIcon = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 22, height: 22, viewBox: \"0 0 22 22\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M19.3036 0.324219H2.69579C1.39089 0.324219 0.323242 1.39187 0.323242 2.69677V19.3046C0.323242 20.6095 1.39089 21.6772 2.69579 21.6772H19.3036C20.6085 21.6772 21.6762 20.6095 21.6762 19.3046V2.69677C21.6762 1.39187 20.6085 0.324219 19.3036 0.324219ZM1.98403 4.65412L4.65314 1.985C4.8904 1.74775 5.24628 1.74775 5.48354 1.985L6.31393 2.8154C6.55118 3.05265 6.55118 3.40853 6.31393 3.64579L3.64481 6.31491C3.40756 6.55216 3.05167 6.55216 2.81442 6.31491L1.98403 5.48451C1.74677 5.30657 1.74677 4.89138 1.98403 4.65412ZM2.28059 11.2379L10.8811 2.63745C11.1183 2.4002 11.4742 2.4002 11.7115 2.63745L12.5419 3.46785C12.7791 3.7051 12.7791 4.06098 12.5419 4.29824L3.94138 12.8987C3.70412 13.136 3.34824 13.136 3.11099 12.8987L2.28059 12.0683C2.04334 11.8311 2.04334 11.4752 2.28059 11.2379ZM3.40756 19.4232L2.57716 18.5928C2.33991 18.3556 2.33991 17.9997 2.57716 17.7625L17.7022 2.63745C17.9394 2.4002 18.2953 2.4002 18.5326 2.63745L19.3629 3.46785C19.6002 3.7051 19.6002 4.06098 19.3629 4.29824L4.29726 19.4232C4.06001 19.6605 3.64481 19.6605 3.40756 19.4232ZM9.69481 19.8977L8.86442 19.0674C8.62716 18.8301 8.62716 18.4742 8.86442 18.237L17.8801 9.22128C18.1174 8.98402 18.4732 8.98402 18.7105 9.22128L19.5409 10.0517C19.7781 10.2889 19.7781 10.6448 19.5409 10.8821L10.5252 19.8977C10.2879 20.135 9.93207 20.135 9.69481 19.8977ZM20.0747 17.0507L17.5835 19.5419C17.3463 19.7791 16.9904 19.7791 16.7531 19.5419L15.9228 18.7115C15.6855 18.4742 15.6855 18.1183 15.9228 17.8811L18.4139 15.3899C18.6512 15.1526 19.0071 15.1526 19.2443 15.3899L20.0747 16.2203C20.312 16.3982 20.312 16.8134 20.0747 17.0507Z\", fill: \"currentColor\" }));\nexport default SvgIcon;\n","import { BlockBackground } from '@/blocks/Background';\n// import Sketch from '@uiw/react-color-sketch';\nimport Sketch, { ChromeInputType } from '@uiw/react-color-chrome';\nimport Wheel from '@uiw/react-color-wheel';\nimport { hexToRgba, HsvaColor, hsvaToHexa } from '@uiw/color-convert';\nimport { useControllableValue, useLocalStorageState } from 'ahooks';\nimport { Typography, Popover } from 'antd';\nimport { AiFillCloseCircle } from 'react-icons/ai';\nimport clsx from 'clsx';\nimport React, { useMemo, useState } from 'react';\nimport locale from '@/locale';\nconst { Link, Text } = Typography;\n\nfunction Colours({\n\tmaxColours,\n\tctx,\n\tdispatch,\n\tblock,\n\tsetBlock,\n}: {\n\tmaxColours?: number;\n\tctx: IPicexContext;\n\tdispatch: IPicexDispatch;\n\tblock: null | BlockBackground;\n\tsetBlock: (block: BlockBackground) => void;\n}) {\n\tconst viewport = ctx.blocks[0];\n\tconst value = block?.fill;\n\n\tconst [hsva, setV] = useState<HsvaColor>();\n\tconst v = useMemo(() => (hsva ? hsvaToHexa(hsva) : 'transparent'), [hsva]);\n\tconst [open, setOpen] = useState(false);\n\tconst [hex, setHex] = useControllableValue({\n\t\tvalue: typeof value === 'string' && value ? value : 'transparent',\n\t\tonChange: (fill) => {\n\t\t\tif (!viewport) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (block) {\n\t\t\t\tblock.setX(viewport.getX());\n\t\t\t\tblock.setY(viewport.getY());\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'updateBlock',\n\t\t\t\t\tblock,\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tfill: fill,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tBlockBackground.fromColour(fill, {\n\t\t\t\t\twidth: viewport?.width,\n\t\t\t\t\theight: viewport?.height,\n\t\t\t\t}).then((newBlock) => {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'addBlock',\n\t\t\t\t\t\tblock: newBlock,\n\t\t\t\t\t});\n\t\t\t\t\tsetBlock(newBlock);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t});\n\tconst [localHexes, setLocalHexes] = useLocalStorageState(\n\t\t'picex-background-colors',\n\t\t{\n\t\t\tdefaultValue: [] as string[],\n\t\t},\n\t);\n\n\treturn (\n\t\t<div>\n\t\t\t<ul className=\"flex flex-wrap gap-4\">\n\t\t\t\t{[\n\t\t\t\t\t{ colour: 'transparent', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#fff', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#ab3638', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#f49c46', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#ffe629', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#1abf0b', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#d5ee62', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#007aff', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#d555dc', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#9720d7', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#d9d9d9', border: '#d9d9d9' },\n\t\t\t\t\t{ colour: '#000000' },\n\t\t\t\t].map(({ colour, border }) => (\n\t\t\t\t\t<ColourItem\n\t\t\t\t\t\tkey={colour}\n\t\t\t\t\t\thex={hex}\n\t\t\t\t\t\tcolour={colour}\n\t\t\t\t\t\tborder={border}\n\t\t\t\t\t\tsetHex={setHex}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t\t<hr className=\"my-[18px]\" />\n\t\t\t<ul className=\"flex flex-wrap gap-4\">\n\t\t\t\t<Popover\n\t\t\t\t\topen={open}\n\t\t\t\t\tonOpenChange={setOpen}\n\t\t\t\t\tcontent={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Sketch\n\t\t\t\t\t\t\t\tcolor={hsva}\n\t\t\t\t\t\t\t\tinputType={ChromeInputType.HEXA}\n\t\t\t\t\t\t\t\tplacement={null as any}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t// presetColors={false}\n\t\t\t\t\t\t\t\tonChange={(color) => setV(color.hsva)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"flex justify-end gap-4\">\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t\t\t\t\tonClick={() => setOpen(false)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetHex(v);\n\t\t\t\t\t\t\t\t\t\tsetLocalHexes((prev) =>\n\t\t\t\t\t\t\t\t\t\t\t(prev?.includes(v) ? prev : [v, ...(prev ?? [])]).slice(\n\t\t\t\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t\t\t\tmaxColours,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{locale.t('background.panel.confirm')}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\tplacement=\"bottomLeft\"\n\t\t\t\t>\n\t\t\t\t\t<li\n\t\t\t\t\t\tclassName={`overflow-hidden relative w-[35px] h-[35px] rounded-xl cursor-pointer`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"pointer-events-none absolute w-[130%] h-[130%] -left-[15%] -top-[15%]\">\n\t\t\t\t\t\t\t<Wheel\n\t\t\t\t\t\t\t\tclassName=\"!w-full !h-full\"\n\t\t\t\t\t\t\t\tpointer={() => null}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</li>\n\t\t\t\t</Popover>\n\t\t\t\t{localHexes?.map((localHex) => (\n\t\t\t\t\t<ColourItem\n\t\t\t\t\t\tremovable\n\t\t\t\t\t\tkey={localHex}\n\t\t\t\t\t\thex={hex}\n\t\t\t\t\t\tcolour={localHex}\n\t\t\t\t\t\tborder={'#d9d9d9'}\n\t\t\t\t\t\tsetHex={setHex}\n\t\t\t\t\t\tonRemove={() => {\n\t\t\t\t\t\t\tsetLocalHexes((prev) =>\n\t\t\t\t\t\t\t\t!prev ? [] : prev.filter((v) => v !== localHex),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n\nfunction ColourItem({\n\thex,\n\tcolour,\n\tborder,\n\tsetHex,\n\tremovable,\n\tonRemove,\n}: {\n\thex: string;\n\tcolour: string;\n\tborder?: string;\n\tsetHex: (hex: string) => void;\n\tremovable?: boolean;\n\tonRemove?: (hex: string) => void;\n}) {\n\treturn (\n\t\t<li\n\t\t\tkey={colour}\n\t\t\tclassName={clsx(\n\t\t\t\t`group relative w-[35px] h-[35px] rounded-xl cursor-pointer`,\n\t\t\t\t{\n\t\t\t\t\t'shadow-[0_0_0_1px_#007aff]': hex === colour,\n\t\t\t\t},\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\tboxShadow: border && hex !== colour ? `0 0 0 1px ${border}` : undefined,\n\t\t\t\tbackground: `url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==)`,\n\t\t\t\tbackgroundColor:\n\t\t\t\t\tcolour === 'transparent' || hexToRgba(colour).a === 0\n\t\t\t\t\t\t? '#fff'\n\t\t\t\t\t\t: undefined,\n\t\t\t}}\n\t\t\tonClick={() => {\n\t\t\t\tsetHex(colour);\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"w-full h-full rounded-xl\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: colour,\n\t\t\t\t}}\n\t\t\t></div>\n\t\t\t{removable ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"transition-opacity opacity-0 group-hover:opacity-100 absolute top-0 right-0 ml-1 mt-1 translate-x-1/2 -translate-y-1/2 text-xl hover:text-[#007AFF]\"\n\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tonRemove?.(hex);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<AiFillCloseCircle />\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</li>\n\t);\n}\n\nexport default Colours;\n","import type { UploadFileAttrs } from '@/components/common/UploadBox';\nimport { BlockViewport } from '@/blocks/Viewport';\nimport { FabricImage } from 'fabric';\nimport { useLocalStorageState } from 'ahooks';\nimport { AiFillCloseCircle, AiOutlineUpload } from 'react-icons/ai';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { Upload, UploadProps } from 'antd';\nimport { uploadFileByBase64 } from '@/utils/image';\nimport { cn } from '@/utils/cn';\nimport { BlockBackground } from '@/blocks/Background';\nimport locale from '@/locale';\n\nfunction Images({\n\tmaxImages,\n\tblock,\n\tsetBlock,\n\tctx,\n\tdispatch,\n\tcustomRequest = uploadFileByBase64,\n\t...rest\n}: Partial<UploadProps> & {\n\tmaxImages?: number;\n\tblock: null | BlockBackground;\n\tsetBlock: (block: BlockBackground) => void;\n\tctx: IPicexContext;\n\tdispatch: IPicexDispatch;\n}) {\n\tconst viewport = ctx.blocks[0];\n\tconst lastestBg = useRef('');\n\tconst [bgImage, setBgImage] = useState('');\n\tconst setBgImage4Root = useCallback(\n\t\t(v: string) => {\n\t\t\tif (!viewport) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastestBg.current = v;\n\t\t\tsetBgImage(v);\n\n\t\t\tconst size = {\n\t\t\t\twidth: viewport?.width,\n\t\t\t\theight: viewport?.height,\n\t\t\t};\n\t\t\tblock && ctx.blocks.includes(block)\n\t\t\t\t? BlockBackground.patternFromURL(v, size).then((pattern) => {\n\t\t\t\t\t\tif (lastestBg.current !== v) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\ttype: 'updateBlock',\n\t\t\t\t\t\t\tblock,\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tfill: pattern,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t: BlockBackground.fromURL(v, size).then((newBlock) => {\n\t\t\t\t\t\tif (lastestBg.current !== v) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\ttype: 'addBlock',\n\t\t\t\t\t\t\tblock: newBlock,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tsetBlock(newBlock);\n\t\t\t\t\t});\n\t\t},\n\t\t[viewport, setBgImage, block, setBlock, dispatch],\n\t);\n\n\tconst [bgImages, setBgImages] = useLocalStorageState<Array<UploadFileAttrs>>(\n\t\t'picex-background-images',\n\t\t{\n\t\t\tdefaultValue: [],\n\t\t},\n\t);\n\n\treturn (\n\t\t<div>\n\t\t\t<ul className=\"flex flex-wrap gap-5\">\n\t\t\t\t<li className=\"w-[5.375rem] aspect-[86/108]\">\n\t\t\t\t\t<Upload<UploadFileAttrs>\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\tclassName=\"w-full h-full\"\n\t\t\t\t\t\tlistType=\"picture-card\"\n\t\t\t\t\t\tmultiple={false}\n\t\t\t\t\t\tshowUploadList={false}\n\t\t\t\t\t\tcustomRequest={customRequest}\n\t\t\t\t\t\tonChange={({ file }) => {\n\t\t\t\t\t\t\tif (file.response?.url && file.status === 'done') {\n\t\t\t\t\t\t\t\tsetBgImages((prev = []) =>\n\t\t\t\t\t\t\t\t\t(prev.some((x) => x.url === file.response!.url)\n\t\t\t\t\t\t\t\t\t\t? prev\n\t\t\t\t\t\t\t\t\t\t: [file.response!, ...(prev || [])]\n\t\t\t\t\t\t\t\t\t).slice(0, maxImages),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tsetBgImage4Root(file.response!.url);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"inline-flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t'text-[#007AFF] flex items-center justify-center text-[30px]'\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<AiOutlineUpload />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className={'text-sm font-medium'}>\n\t\t\t\t\t\t\t\t{locale.t('background.panel.upload')}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Upload>\n\t\t\t\t</li>\n\t\t\t\t{bgImages?.map((file) =>\n\t\t\t\t\t!file?.url ? null : (\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tkey={file.url}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'group relative cursor-pointer',\n\t\t\t\t\t\t\t\t'w-[5.375rem] aspect-[86/108] border border-solid rounded-2xl',\n\t\t\t\t\t\t\t\tfile.url === bgImage ? 'border-[#007AFF]' : 'border-[#D9D9D9]',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tbackground: `url(${file.url}) no-repeat center center / cover`,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tsetBgImage4Root(file.url);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"transition-opacity opacity-0 group-hover:opacity-100 absolute top-0 right-0 ml-1 mt-1 translate-x-1/2 -translate-y-1/2 text-xl hover:text-[#007AFF]\"\n\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\tsetBgImages((prev) =>\n\t\t\t\t\t\t\t\t\t\t!prev ? [] : prev.filter((x) => x.url !== file.url),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<AiFillCloseCircle />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t),\n\t\t\t\t)}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n\nexport default Images;\n","import { IPicexToolRenderParams } from '../../types';\nimport React, { useState, useEffect } from 'react';\nimport Colours from './Colours';\nimport Images from './Images';\nimport { Segmented } from 'antd';\nimport { UploadBoxProps } from '@/components/common/UploadBox';\nimport { BlockBackground } from '@/blocks/Background';\nimport locale from '@/locale';\nimport EventBus from '@/utils/eventBus';\nimport { usePicexCtx, usePicexDispatch } from '@/core/context';\nfunction Panel({\n\tconfig,\n\t...props\n}: IPicexToolRenderParams & { config?: UploadBoxProps }) {\n\tconst Tabs = {\n\t\tColour: locale.t('background.panel.colour'),\n\t\tImage: locale.t('background.panel.image'),\n\t};\n\tconst dispatch = usePicexDispatch();\n\n\tconst [tab, setTab] = useState(Tabs.Colour);\n\tconst [block, setBlock] = useState<BlockBackground | null>(null);\n\n\tuseEffect(() => {\n\t\tconst resetStateListener = () => {\n\t\t\tsetBlock(null);\n\t\t};\n\t\tconst backgroundRemoveListener = (targetBlock: BlockBackground) => {\n\t\t\tif (targetBlock) {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'removeBlock',\n\t\t\t\t\tblock: targetBlock,\n\t\t\t\t});\n\t\t\t}\n\t\t\tsetBlock(null);\n\t\t};\n\t\tconst historyOperationListener = (operation: {\n\t\t\tundoing: boolean;\n\t\t\taction: any;\n\t\t}) => {\n\t\t\tconsole.log(operation, 'operation');\n\t\t};\n\t\tEventBus.on('reset-state', resetStateListener);\n\t\tEventBus.on('background:remove', backgroundRemoveListener);\n\t\tEventBus.on('history:operation', historyOperationListener);\n\t\treturn () => {\n\t\t\tEventBus.off('reset-state', resetStateListener);\n\t\t\tEventBus.off('background:remove', backgroundRemoveListener);\n\t\t\tEventBus.off('history:operation', historyOperationListener);\n\t\t};\n\t}, []);\n\n\tlet node;\n\tswitch (tab) {\n\t\tcase Tabs.Colour:\n\t\t\tnode = (\n\t\t\t\t<Colours\n\t\t\t\t\t{...props}\n\t\t\t\t\t{...config}\n\t\t\t\t\tblock={block}\n\t\t\t\t\tsetBlock={setBlock}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase Tabs.Image:\n\t\t\tnode = (\n\t\t\t\t<Images\n\t\t\t\t\t{...props}\n\t\t\t\t\t{...config}\n\t\t\t\t\tchildren={null}\n\t\t\t\t\tblock={block}\n\t\t\t\t\tsetBlock={setBlock}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<div className=\"pb-4 pt-5 overflow-y-auto h-full\">\n\t\t\t<div className=\"picex-plugin-background h-full flex flex-col\">\n\t\t\t\t<div className=\"px-4\">\n\t\t\t\t\t<Segmented<string>\n\t\t\t\t\t\tblock\n\t\t\t\t\t\tclassName=\"rounded-lg text-base leading-10\"\n\t\t\t\t\t\toptions={Object.values(Tabs)}\n\t\t\t\t\t\tonChange={setTab}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"pt-4 pl-4 flex-1 min-h-0 overflow-y-auto picex-scrollbar\">\n\t\t\t\t\t{node}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport default Panel;\n","import { IPicexToolRenderParams, PicexTool } from '../types';\nimport Icon from './icon.svg?react';\nimport Panel from './components/Panel';\nimport './index.css';\nimport { PicexToolBackgroundProps } from './types';\nimport locale from '@/locale';\n\nexport class PicexToolBackground extends PicexTool {\n\tkey = 'background';\n\tname = locale.t('background.title');\n\tvisible = true;\n\tdisabled = false;\n\n\tconstructor(protected props?: PicexToolBackgroundProps) {\n\t\tsuper();\n\n\t\tthis.name = props?.name || this.name;\n\t\tthis.disabled = props?.disabled || this.disabled;\n\t}\n\n\trenderIcon() {\n\t\treturn <Icon />;\n\t}\n\t/**\n\t * 实现更改BlockCanvas纯色背景、图片背景的功能\n\t */\n\trenderPanel({ ctx, dispatch }: IPicexToolRenderParams) {\n\t\treturn (\n\t\t\t<Panel\n\t\t\t\tconfig={this.props}\n\t\t\t\tctx={ctx}\n\t\t\t\tdispatch={dispatch}\n\t\t\t/>\n\t\t);\n\t}\n}\n","import { PicexTool } from '../types';\n\nexport class PicexToolResize extends PicexTool {\n\tkey = 'resize';\n\ticon = 'resize';\n\tname = 'Resize';\n\tvisible = true;\n\tdisabled = false;\n\n\trenderIcon() {\n\t\treturn null;\n\t}\n\t/**\n\t * 实现更改BlockCanvas大小的功能\n\t */\n\trenderPanel() {\n\t\treturn null;\n\t}\n}\n","import * as React from \"react\";\nconst SvgIcon = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 21, height: 23, viewBox: \"0 0 21 23\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M18.5577 8.12364H20.1868V21.64C20.1868 22.3587 19.5859 22.9328 18.8451 22.9328H1.97082C1.2329 22.9328 0.62915 22.3578 0.62915 21.6419V3.60989C0.62915 2.89594 1.23386 2.31998 1.96698 2.31998H14.1321V3.94914H2.25832V21.3036H18.5577V8.12364ZM3.30098 15.6782H9.21965V17.5891H3.30098V15.6782ZM3.30098 11.6714H13.2274V13.5823H3.30098V11.6714ZM15.6587 9.51994C15.5272 9.72098 15.3238 9.86413 15.0902 9.92006C14.8566 9.976 14.6104 9.94048 14.4022 9.82078C14.1939 9.70109 14.0393 9.50628 13.97 9.27627C13.9007 9.04626 13.922 8.79846 14.0295 8.58364L18.0603 1.13356C18.1922 0.931563 18.3966 0.78794 18.6314 0.732354C18.8662 0.676768 19.1133 0.713464 19.3218 0.834864C19.5303 0.956264 19.6842 1.15309 19.7517 1.3847C19.8192 1.61631 19.7952 1.86501 19.6847 2.07944L15.6597 9.51994H15.6587Z\", fill: \"currentColor\" }));\nexport default SvgIcon;\n","import { IPicexToolRenderParams, PicexTool } from '../types';\nimport Icon from './icon.svg?react';\nimport { PicexToolCustomProps } from './types';\n\nexport class PicexToolCustom extends PicexTool {\n\tkey = 'Custom';\n\tname = 'Edit';\n\tvisible = true;\n\tdisabled = false;\n\n\tconstructor(protected props?: PicexToolCustomProps) {\n\t\tsuper();\n\t\tthis.key = props?.key || this.key;\n\t\tthis.name = props?.name || this.name;\n\t\tthis.disabled = props?.disabled || this.disabled;\n\t\tthis.visible = props?.visible || this.visible;\n\t}\n\n\trenderIcon() {\n\t\treturn this.props?.icon || <Icon />;\n\t}\n\trenderPanel({ ctx, dispatch }: IPicexToolRenderParams) {\n\t\treturn <>{this.props?.panelChildren}</>;\n\t}\n}\n","import { FabricObject } from 'fabric';\n\nexport function scaleToFitSize(\n\tobject: FabricObject,\n\tsize: { width: number; height: number },\n\tforcing = false,\n) {\n\tconst { width, height } = object;\n\tif (!forcing && width <= size.width && height <= size.height) {\n\t\treturn;\n\t}\n\tconst widthRatio = size.width / width;\n\tconst heightRatio = size.height / height;\n\tif (widthRatio < heightRatio) {\n\t\tobject.scaleToWidth(size.width);\n\t} else {\n\t\tobject.scaleToHeight(size.height);\n\t}\n}\n\nexport function getScaledFitSize(\n\tviewport: { width: number; height: number },\n\tsize: { width: number; height: number },\n) {\n\tconst { width, height } = viewport;\n\tif (width <= size.width && height <= size.height) {\n\t\treturn viewport;\n\t}\n\tconst widthRatio = size.width / width;\n\tconst heightRatio = size.height / height;\n\tif (widthRatio < heightRatio) {\n\t\treturn {\n\t\t\twidth: size.width,\n\t\t\theight: widthRatio * height,\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\twidth: heightRatio * width,\n\t\t\theight: size.height,\n\t\t};\n\t}\n}\n","import { IBlock } from '@/blocks';\nimport * as fabric from 'fabric';\nimport { SerializedObjectProps } from 'fabric';\nimport { Reducer } from 'react';\nimport EventBus from '@/utils/eventBus';\nimport { BlockTypes } from '@/blocks/types';\nimport eventBus from '@/utils/eventBus';\n\ndeclare module 'fabric' {\n\tinterface Canvas {\n\t\thistory?: FabricHistory;\n\t\t// historyUndo?: unknown[];\n\t\t// historyRedo?: unknown[];\n\t\t// undo(): void;\n\t\t// redo(): void;\n\t\t// clearHistory(): void;\n\t\t// onHistory(): void;\n\t\t// offHistory(): void;\n\t}\n\n\tinterface CanvasEvents {\n\t\t'history:append': () => void;\n\t\t'history:clear': () => void;\n\t\t'history:undo': () => void;\n\t\t'history:redo': () => void;\n\t}\n}\n\nenum HistoryTypes {\n\tADDED,\n\tREMOVED,\n\tMODIFIED,\n}\ntype HistoryAction = () => HistoryAction | Promise<HistoryAction>;\ntype HistoryItem =\n\t| {\n\t\t\ttype: HistoryTypes;\n\t\t\t//扩展属性 object.blockType为BlockTypes\n\t\t\tobject: fabric.FabricObject & { blockType: BlockTypes };\n\t\t\tdata: ReturnType<fabric.FabricObject['toObject']>;\n\t\t\tindex: number;\n\t  }\n\t| HistoryAction;\n\nclass FabricHistory {\n\thistoryUndo: HistoryItem[] = [];\n\n\thistoryRedo: HistoryItem[] = [];\n\n\tprotected _historyProcessing = false;\n\tprotected _historyDisabled = false;\n\n\tconstructor(private canvas: fabric.Canvas) {\n\t\tthis.canvas.on({\n\t\t\t'object:added': (e) => this._saveHistory(e, HistoryTypes.ADDED),\n\t\t\t'object:removed': (e) => this._saveHistory(e, HistoryTypes.REMOVED),\n\t\t\t'object:modified': (e) => this._saveHistory(e, HistoryTypes.MODIFIED),\n\t\t\t'text:changed': (e) => this._saveHistory(e, HistoryTypes.MODIFIED),\n\t\t\t// maybe path support in future\n\t\t});\n\t}\n\n\tisProcessing() {\n\t\treturn this._historyProcessing;\n\t}\n\n\tdisable() {\n\t\tthis._historyDisabled = true;\n\t}\n\n\tenable() {\n\t\tthis._historyDisabled = false;\n\t}\n\n\tasync undo() {\n\t\tthis._historyProcessing = true;\n\n\t\tconst p = this.historyUndo.pop();\n\t\tif (p) {\n\t\t\tthis._saveReverse(p, true);\n\t\t\tconst action = await this._applyState(p);\n\t\t\tif (action) {\n\t\t\t\tthis.append(action, true);\n\t\t\t}\n\n\t\t\tthis.canvas.fire('history:undo');\n\t\t}\n\n\t\tthis._historyProcessing = false;\n\t}\n\n\tasync redo() {\n\t\tthis._historyProcessing = true;\n\n\t\tconst p = this.historyRedo.pop();\n\t\tif (p) {\n\t\t\tthis._saveReverse(p);\n\t\t\tconst action = await this._applyState(p);\n\t\t\tif (action) {\n\t\t\t\tthis.append(action);\n\t\t\t}\n\n\t\t\tthis.canvas.fire('history:redo');\n\t\t}\n\n\t\tthis._historyProcessing = false;\n\t}\n\n\tappend(item: HistoryItem, undoing = false) {\n\t\tif (this._historyDisabled) return;\n\n\t\tif (undoing) {\n\t\t\tthis.historyRedo.push(item);\n\t\t} else {\n\t\t\tthis.historyUndo.push(item);\n\t\t\tif (!this._historyProcessing) {\n\t\t\t\tthis.historyRedo = [];\n\t\t\t}\n\t\t}\n\t\teventBus.emit('history:operation', {\n\t\t\tundoing,\n\t\t\taction: item,\n\t\t});\n\t\tthis.canvas.fire('history:append');\n\t}\n\n\tclear() {\n\t\tthis.historyUndo = [];\n\t\tthis.historyRedo = [];\n\t\tthis.canvas.fire('history:clear');\n\t}\n\n\t_saveReverse(item: HistoryItem, undoing = false) {\n\t\tif (typeof item === 'function') {\n\t\t\treturn;\n\t\t}\n\t\tconst { object, data, type } = item;\n\t\tconst snapshot = {\n\t\t\ttype: {\n\t\t\t\t[HistoryTypes.REMOVED]: HistoryTypes.ADDED,\n\t\t\t\t[HistoryTypes.ADDED]: HistoryTypes.REMOVED,\n\t\t\t\t[HistoryTypes.MODIFIED]: HistoryTypes.MODIFIED,\n\t\t\t}[type],\n\t\t\tobject,\n\t\t\tindex: this.canvas.getObjects().indexOf(object),\n\t\t\tdata: type === HistoryTypes.MODIFIED ? object.toObject() : data,\n\t\t};\n\n\t\tthis.append(snapshot, undoing);\n\t}\n\n\t_saveHistory(\n\t\t{\n\t\t\ttarget,\n\t\t\ttransform,\n\t\t}: {\n\t\t\ttarget: fabric.FabricObject & { blockType: BlockTypes };\n\t\t\ttransform?: {\n\t\t\t\toriginal?: fabric.Transform['original'];\n\t\t\t};\n\t\t},\n\t\ttype: HistoryTypes,\n\t) {\n\t\tif (this._historyProcessing || !target || !target.evented) return;\n\n\t\tconst data = transform?.original ?? target.toObject();\n\t\t// 对象原originXY是left,top，但缩放后original里是right,bottom（非预期）\n\t\t// 这两个属性会影响缩放后中心点的计算，先移除\n\t\tconst { originX, originY, ...rest } = data;\n\t\tconst snapshot = {\n\t\t\ttype,\n\t\t\tobject: target,\n\t\t\tindex: this.canvas.getObjects().indexOf(target),\n\t\t\tdata: rest,\n\t\t};\n\n\t\tthis.append(snapshot);\n\t}\n\n\tasync _applyState(snapshot: HistoryItem) {\n\t\tif (typeof snapshot === 'function') {\n\t\t\treturn snapshot();\n\t\t}\n\n\t\tconst { object, type, data, index } = snapshot;\n\t\tswitch (type) {\n\t\t\tcase HistoryTypes.ADDED:\n\t\t\t\tif (object.blockType === BlockTypes.Background) {\n\t\t\t\t\tEventBus.emit('background:remove', object);\n\t\t\t\t}\n\t\t\t\tthis.canvas.remove(object);\n\t\t\t\tbreak;\n\t\t\tcase HistoryTypes.REMOVED:\n\t\t\t\tthis.canvas.add(object);\n\t\t\t\t//Background移除后重新添加到画布上，位置为数组第二个\n\t\t\t\tif (object.blockType === BlockTypes.Background) {\n\t\t\t\t\tthis.canvas.moveObjectTo(object, 1);\n\t\t\t\t} else {\n\t\t\t\t\tthis.canvas.moveObjectTo(object, index);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase HistoryTypes.MODIFIED:\n\t\t\t\tconst target = this.canvas._objects.find(\n\t\t\t\t\t(x) => x === object || x.id === object.id,\n\t\t\t\t);\n\t\t\t\tif (target) {\n\t\t\t\t\tconst options = await fabric.util.enlivenObjectEnlivables(data);\n\t\t\t\t\ttarget.set(options);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\tobject.setCoords();\n\t\tthis.canvas.renderAll();\n\t}\n}\n\nexport function wrapHistory(\n\treducer: Reducer<IPicexContext, PicexContextAction>,\n) {\n\treturn (state: IPicexContext, action: PicexContextAction) => {\n\t\tconst { fcanvas } = state;\n\n\t\t// const { blocks } = fcanvas;\n\t\tconst nextState = reducer(state, action);\n\t\t// const { blocks: nextBlocks } = nextState;\n\n\t\tif (fcanvas && !fcanvas?.history) {\n\t\t\tfcanvas.history = new FabricHistory(fcanvas);\n\t\t}\n\n\t\t// if (!fcanvas?._objects.length || !fcanvas?.contains(nextBlocks[0]!)) {\n\t\t// \tfcanvas?.history?.clear();\n\t\t// }\n\n\t\treturn nextState;\n\t};\n}\n","import { BlockViewport, BlockImage, BlockWaterMark } from '@/blocks';\nimport { getScaledFitSize, scaleToFitSize } from '@/utils/scale';\nimport { wrapHistory } from './history';\nimport { isSameSecondLevelDomain } from '@/utils/dom';\nexport const reducer = wrapHistory(\n\t(state: IPicexContext, action: PicexContextAction) => {\n\t\tswitch (action.type) {\n\t\t\tcase 'init':\n\t\t\t\treturn init(state, action);\n\t\t\tcase 'cover':\n\t\t\t\treturn cover(state, action);\n\t\t\tcase 'mount':\n\t\t\t\treturn mount(state, action);\n\t\t\tcase 'addWatermark':\n\t\t\t\treturn addWatermark(state, action);\n\t\t\tcase 'addBlock':\n\t\t\t\treturn addBlock(state, action);\n\t\t\tcase 'updateBlock':\n\t\t\t\treturn updateBlock(state, action);\n\t\t\tcase 'removeBlock':\n\t\t\t\treturn removeBlock(state, action);\n\t\t\tdefault:\n\t\t\t\treturn state;\n\t\t}\n\t},\n);\n\nconst init = (state: IPicexContext, action: PicexContentActionInit) => {\n\tconst {\n\t\timages,\n\t\tnaturalSize: size,\n\t\tdisplaySize: maxSize = state.displaySize,\n\t} = action;\n\t// const width = Math.max(...images.map((image) => image.width));\n\t// const height = Math.max(...images.map((image) => image.height));\n\tconst viewport = !size ? maxSize! : getScaledFitSize(size, maxSize!);\n\tconst blockViewport = new BlockViewport(viewport);\n\n\tconst nextBlocks = [\n\t\tblockViewport,\n\t\t...images.map(({ url, width, height, loadedImage }) => {\n\t\t\tconst img = loadedImage || new Image();\n\t\t\tif (!loadedImage) {\n\t\t\t\tif (isSameSecondLevelDomain(url, window.location.origin)) {\n\t\t\t\t\timg.crossOrigin = 'use-credentials';\n\t\t\t\t} else {\n\t\t\t\t\timg.crossOrigin = 'anonymous';\n\t\t\t\t}\n\t\t\t\timg.src = url;\n\t\t\t}\n\n\t\t\tconst block = new BlockImage(img, {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t});\n\n\t\t\tscaleToFitSize(block, viewport);\n\t\t\treturn block;\n\t\t}),\n\t];\n\n\treturn {\n\t\t...state,\n\t\tnaturalSize: size,\n\t\tdisplaySize: maxSize,\n\t\tblocks: nextBlocks,\n\t};\n};\n\nconst cover = (state: IPicexContext, action: PicexContentActionCover) => {\n\tconst { blocks } = action;\n\n\treturn {\n\t\t...state,\n\t\tblocks,\n\t};\n};\n\nconst mount = (state: IPicexContext, action: PicexContentActionMount) => {\n\tconst { fcanvas } = action;\n\n\treturn {\n\t\t...state,\n\t\tfcanvas,\n\t};\n};\n\nconst addWatermark = (\n\tstate: IPicexContext,\n\taction: PicexContentActionAddWatermark,\n) => {\n\tconst { blocks } = state;\n\tconst { block: blockWaterMark } = action;\n\tconst lastBlock = blocks[blocks.length - 1];\n\tconst nextBlocks = [\n\t\t...(lastBlock instanceof BlockWaterMark ? blocks.slice(0, -1) : blocks),\n\t\tblockWaterMark,\n\t];\n\n\treturn {\n\t\t...state,\n\t\tblocks: nextBlocks,\n\t};\n};\n\nconst addBlock = (state: IPicexContext, action: PicexContentActionAddBlock) => {\n\tconst { blocks = [] } = state;\n\tconst { block } = action;\n\n\tconst [viewport, ...rest] = blocks;\n\n\treturn {\n\t\t...state,\n\t\tblocks: viewport ? [viewport, block, ...rest] : blocks,\n\t};\n};\n\nconst updateBlock = (\n\tstate: IPicexContext,\n\taction: PicexContentActionUpdateBlock,\n) => {\n\tconst { blocks } = state;\n\tconst { block, payload } = action;\n\tif (payload) {\n\t\tblock.set(payload);\n\t\tblock.setCoords();\n\t}\n\n\treturn {\n\t\t...state,\n\t\tblocks: [...blocks],\n\t};\n};\n\nconst removeBlock = (\n\tstate: IPicexContext,\n\taction: PicexContentActionRemoveBlock,\n) => {\n\tconst { blocks } = state;\n\tconst { block: removedBlock } = action;\n\tconst nextBlocks = blocks.filter((block) => block !== removedBlock);\n\n\treturn {\n\t\t...state,\n\t\tblocks: nextBlocks,\n\t};\n};\n","import React, { PropsWithChildren, useReducer, useState } from 'react';\nimport PicexLayout from './Layout';\nimport { PicexToolBar } from './ToolBar';\nimport { DesignProps, PicexDesign } from './Design';\nimport { PicexProperties } from './Properties';\nimport { PicexBlockTree } from './BlockTree';\nimport { PicexTool, PicexToolBackground } from '@/tools';\nimport {\n\tDefaultPicexContext,\n\tPicexContext,\n\tPicexDispatchContext,\n} from '@/core/context';\nimport { reducer } from '@/core/reducer';\nimport locale from '@/locale';\n\nexport function PicexEditor({\n\ttools = [new PicexToolBackground()],\n\tinitialSelectedTool,\n\tactiveToolKey,\n\tmultiple = false,\n\thistorable = true,\n\timages,\n\twatermark,\n\tviewport,\n\tchildren,\n\tchildrenZeroBlock,\n\tleft,\n\tright,\n\tlayout,\n\tuploadProps,\n\tdownloadProps,\n\tonlyChildren = false,\n\tonToolChange,\n\tlang = 'en',\n\tchildNode,\n}: DesignProps &\n\tPropsWithChildren<{\n\t\tlang?: string;\n\t\ttools?: PicexTool[];\n\t\tmultiple?: boolean;\n\t\tinitialSelectedTool?: string;\n\t\tactiveToolKey?: string;\n\t\tonToolChange?: (key: string) => void;\n\t\tleft?: PropsWithChildren<{\n\t\t\tstyle?: React.CSSProperties;\n\t\t\tclassName?: string;\n\t\t}>;\n\t\tright?: PropsWithChildren<{\n\t\t\tstyle?: React.CSSProperties;\n\t\t\tclassName?: string;\n\t\t}>;\n\t\tlayout?: {\n\t\t\tleftStyle?: React.CSSProperties;\n\t\t\trightStyle?: React.CSSProperties;\n\t\t\tcontentStyle?: React.CSSProperties;\n\t\t\tleftClassName?: string;\n\t\t\trightClassName?: string;\n\t\t\tcontentClassName?: string;\n\t\t};\n\t\tchildNode?: { [key: string]: React.ReactNode };\n\t}>) {\n\tconst [state, dispatch] = useReducer(reducer, DefaultPicexContext);\n\tconst [selectedTool, setSelectedTool] = useState<string | null>(\n\t\tinitialSelectedTool || tools[0]?.key || null,\n\t);\n\tconst { children: leftChildren, ...leftProps } = left ?? {};\n\tconst { children: rightChildren, ...rightProps } = right ?? {};\n\n\tlocale.use(lang);\n\n\treturn (\n\t\t<PicexContext.Provider value={state}>\n\t\t\t<PicexDispatchContext.Provider value={dispatch}>\n\t\t\t\t<PicexLayout\n\t\t\t\t\tleft={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<PicexToolBar\n\t\t\t\t\t\t\t\t{...leftProps}\n\t\t\t\t\t\t\t\ttools={tools}\n\t\t\t\t\t\t\t\tvalue={selectedTool}\n\t\t\t\t\t\t\t\tactiveToolKey={activeToolKey}\n\t\t\t\t\t\t\t\tonChange={(key: string) => {\n\t\t\t\t\t\t\t\t\tsetSelectedTool(key);\n\t\t\t\t\t\t\t\t\tonToolChange?.(key);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{leftChildren}\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t\tright={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<PicexProperties />\n\t\t\t\t\t\t\t<PicexBlockTree />\n\t\t\t\t\t\t\t{rightChildren}\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t\tselectedTool={\n\t\t\t\t\t\tselectedTool\n\t\t\t\t\t\t\t? tools.find((tool) => tool.key === selectedTool)\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\t{...layout}\n\t\t\t\t>\n\t\t\t\t\t<PicexDesign\n\t\t\t\t\t\tactiveToolKey={activeToolKey}\n\t\t\t\t\t\tonlyChildren={onlyChildren}\n\t\t\t\t\t\tchildNode={childNode}\n\t\t\t\t\t\tchildrenZeroBlock={childrenZeroBlock}\n\t\t\t\t\t\timages={images}\n\t\t\t\t\t\twatermark={watermark}\n\t\t\t\t\t\tviewport={viewport}\n\t\t\t\t\t\thistorable={historable}\n\t\t\t\t\t\tuploadProps={{\n\t\t\t\t\t\t\t...uploadProps,\n\t\t\t\t\t\t\tmultiple,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdownloadProps={downloadProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</PicexDesign>\n\t\t\t\t</PicexLayout>\n\t\t\t</PicexDispatchContext.Provider>\n\t\t</PicexContext.Provider>\n\t);\n}\n"],"names":["FabricObject","BlockTypes","IBlockPropKeys","file2Base64URL","file","resolve","reject","reader","error","getImageSize","url","img","uploadFileByBase64","onSuccess","onError","width","height","getTransparentUnitCanvas","size","l","canvas","ctx","BlockViewport","Rect","props","Pattern","uuid","cloned","propertiesToInclude","classRegistry","isActive","object","_a","mixinHoverBorder","InteractiveFabricObject","_b","BlockBackground","FabricImage","StaticCanvas","hex","pattern","v","original","util","flipX","flipY","fill","top","left","angle","rest","options","controlable","BlockImage","s","defaultOffsetX","defaultOffsetY","BlockWaterMark","value","rectOpts","mark","text","FabricText","offsetX","offsetY","w","h","patternSourceCanvas","defaultMaxPort","DefaultPicexContext","React","PicexContext","PicexDispatchContext","usePicexCtx","usePicexDispatch","cn","inputs","twMerge","clsx","PicexLayout","children","right","leftStyle","rightStyle","contentClassName","leftClassName","rightClassName","contentStyle","jsxs","jsx","PicexToolBar","tools","activeToolKey","onChange","style","className","dispatch","sizes","useResponsive","flags","setFlags","useState","onToolChange","useCallback","prev","Tabs","tool","Fragment","AiOutlineMenuUnfold","Drawer","_c","useWaterMark","input","state","watermark","useMemo","useEffect","root","flag","x","block","PicexCanvas","elCanvasWrapper","elCanvas","useRef","refCanvas","fcanvas","Canvas","nextBlocks","currBlocks","isInit","i","item","_d","_e","RE_NARGS","format","string","args","match","prefix","index","result","enLang","jaLang","_lang","locale","use","lang","t","path","array","current","j","property","locale$1","Text","Typography","UploadBox","err","icon","iconClassName","wordings","wordingsClassName","beforeUpload","customRequest","check","e1","useRequest","upload","e2","loading","params","e","UploadWrapper","Upload","node","Spin","FiPlusCircle","useDownload","opts","blocks","naturalSize","type","filename","others","viewport","objects","dataURL","scaleX","scaleY","download","Operators","uploadProps","downloadProps","visible","hidden","downloading","btn","Button","Tooltip","SvgRedo","SvgUndo","events","HistoryBtns","maxport","count","setCount","historyUndo","historyRedo","handler","event","btnCls","Undo","Redo","isSameSecondLevelDomain","url1","url2","extractLastTwo","d1","d2","useImageLoader","loadImage","imageInfo","loadImages","images","eventBus","EventEmitter","PicexDesign","historable","childrenZeroBlock","enableOperators","onlyChildren","childNode","info","fileList","response","loadedImages","Box","key","PicexProperties","PicexBlockTree","PicexTool","SvgIcon","Link","Colours","maxColours","setBlock","hsva","setV","hsvaToHexa","open","setOpen","setHex","useControllableValue","newBlock","localHexes","setLocalHexes","useLocalStorageState","colour","border","ColourItem","Popover","Sketch","ChromeInputType","color","Wheel","localHex","removable","onRemove","hexToRgba","AiFillCloseCircle","Images","maxImages","lastestBg","bgImage","setBgImage","setBgImage4Root","bgImages","setBgImages","AiOutlineUpload","Panel","config","tab","setTab","resetStateListener","backgroundRemoveListener","targetBlock","historyOperationListener","operation","EventBus","Segmented","PicexToolBackground","Icon","PicexToolResize","PicexToolCustom","scaleToFitSize","forcing","widthRatio","heightRatio","getScaledFitSize","FabricHistory","p","action","undoing","data","snapshot","target","transform","originX","originY","fabric","wrapHistory","reducer","nextState","init","cover","mount","addWatermark","addBlock","updateBlock","removeBlock","maxSize","loadedImage","blockWaterMark","payload","removedBlock","PicexEditor","initialSelectedTool","multiple","layout","useReducer","selectedTool","setSelectedTool","leftChildren","leftProps","rightChildren","rightProps"],"mappings":"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"}