@jetprint/editor-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/assets/perspective.wasm +0 -0
  2. package/dist/assets/wasm_exec.js +553 -0
  3. package/dist/components/Editor/assets/editorIcons.d.ts +32 -0
  4. package/dist/components/Editor/components/CanvasSection.vue.d.ts +253 -0
  5. package/dist/components/Editor/components/CanvasZoomToolbar.vue.d.ts +23 -0
  6. package/dist/components/Editor/components/EditorAddToCartDialog.vue.d.ts +28 -0
  7. package/dist/components/Editor/components/EditorDefaultCanvasAxisLines.vue.d.ts +34 -0
  8. package/dist/components/Editor/components/EditorDefaultCanvasRulers.vue.d.ts +44 -0
  9. package/dist/components/Editor/components/EditorIcon.vue.d.ts +7 -0
  10. package/dist/components/Editor/components/EditorSelectionShortcutFab.vue.d.ts +56 -0
  11. package/dist/components/Editor/components/EditorSidebar.vue.d.ts +548 -0
  12. package/dist/components/Editor/components/EditorTopbar.vue.d.ts +363 -0
  13. package/dist/components/Editor/components/EditorTopbarMockupScope.vue.d.ts +12 -0
  14. package/dist/components/Editor/components/GalleryPanel.vue.d.ts +9 -0
  15. package/dist/components/Editor/components/LiveThreePreviewPane.vue.d.ts +30 -0
  16. package/dist/components/Editor/components/PreviewPanel.vue.d.ts +312 -0
  17. package/dist/components/Editor/components/ShortcutSettingsModal.vue.d.ts +11 -0
  18. package/dist/components/Editor/components/SplitPieceHandAlignPanel.vue.d.ts +14 -0
  19. package/dist/components/Editor/components/TemplateModal.vue.d.ts +35 -0
  20. package/dist/components/Editor/components/Theme1AddTextPanel.vue.d.ts +190 -0
  21. package/dist/components/Editor/components/Theme1UploadPanel.vue.d.ts +120 -0
  22. package/dist/components/Editor/composables/index.d.ts +56 -0
  23. package/dist/components/Editor/composables/useCanvasEventWiring.d.ts +40 -0
  24. package/dist/components/Editor/composables/useCanvasHistory.d.ts +18 -0
  25. package/dist/components/Editor/composables/useCanvasManager.d.ts +29 -0
  26. package/dist/components/Editor/composables/useCanvasObjectHelpers.d.ts +34 -0
  27. package/dist/components/Editor/composables/useCanvasStateByDiecut.d.ts +50 -0
  28. package/dist/components/Editor/composables/useCanvasViewport.d.ts +89 -0
  29. package/dist/components/Editor/composables/useClearCanvas.d.ts +32 -0
  30. package/dist/components/Editor/composables/useCompleteScreenshot.d.ts +68 -0
  31. package/dist/components/Editor/composables/useCopyToDiecuts.d.ts +56 -0
  32. package/dist/components/Editor/composables/useDiecutManager.d.ts +46 -0
  33. package/dist/components/Editor/composables/useDiecutScreenshot.d.ts +50 -0
  34. package/dist/components/Editor/composables/useDownloadPng.d.ts +11 -0
  35. package/dist/components/Editor/composables/useEditorReset.d.ts +21 -0
  36. package/dist/components/Editor/composables/useEditorShortcuts.d.ts +80 -0
  37. package/dist/components/Editor/composables/useEditorTopbarContext.d.ts +3 -0
  38. package/dist/components/Editor/composables/useEditorWatchers.d.ts +99 -0
  39. package/dist/components/Editor/composables/useEventHandlers.d.ts +13 -0
  40. package/dist/components/Editor/composables/useFontLoader.d.ts +8 -0
  41. package/dist/components/Editor/composables/useGuideResources.d.ts +38 -0
  42. package/dist/components/Editor/composables/useImageHandler.d.ts +10 -0
  43. package/dist/components/Editor/composables/useLayerOperations.d.ts +52 -0
  44. package/dist/components/Editor/composables/useLayerSync.d.ts +32 -0
  45. package/dist/components/Editor/composables/useLicense.d.ts +11 -0
  46. package/dist/components/Editor/composables/useObjectAdder.d.ts +76 -0
  47. package/dist/components/Editor/composables/usePatternHandler.d.ts +31 -0
  48. package/dist/components/Editor/composables/usePreviewManager.d.ts +240 -0
  49. package/dist/components/Editor/composables/usePreviewRenderer.d.ts +111 -0
  50. package/dist/components/Editor/composables/usePreviewUpdateQueue.d.ts +62 -0
  51. package/dist/components/Editor/composables/useProductData.d.ts +166 -0
  52. package/dist/components/Editor/composables/useSplitPieceHandTool.d.ts +34 -0
  53. package/dist/components/Editor/composables/useTemplateLoader.d.ts +36 -0
  54. package/dist/components/Editor/composables/useTemplateManager.d.ts +48 -0
  55. package/dist/components/Editor/composables/useTextHandler.d.ts +19 -0
  56. package/dist/components/Editor/composables/useToolState.d.ts +101 -0
  57. package/dist/components/Editor/composables/useToolStateSync.d.ts +49 -0
  58. package/dist/components/Editor/composables/useWorkerManager.d.ts +11 -0
  59. package/dist/components/Editor/config/fontConfig.d.ts +8 -0
  60. package/dist/components/Editor/editorCanvasGuides.d.ts +22 -0
  61. package/dist/components/Editor/fabric/PatternLayer.d.ts +104 -0
  62. package/dist/components/Editor/index.vue.d.ts +167 -0
  63. package/dist/components/Editor/liveRender/ThreeRenderViewer.vue.d.ts +31 -0
  64. package/dist/components/Editor/liveRender/dataAdapter.d.ts +2 -0
  65. package/dist/components/Editor/liveRender/prefetch.worker.d.ts +15 -0
  66. package/dist/components/Editor/liveRender/render.worker.d.ts +1 -0
  67. package/dist/components/Editor/liveRender/types.d.ts +130 -0
  68. package/dist/components/Editor/utils/blob.d.ts +5 -0
  69. package/dist/components/Editor/utils/buildSplitPieceDesignClipBlobs.d.ts +75 -0
  70. package/dist/components/Editor/utils/colorLabels.d.ts +6 -0
  71. package/dist/components/Editor/utils/dataBuilders.d.ts +108 -0
  72. package/dist/components/Editor/utils/designRestoreScale.d.ts +42 -0
  73. package/dist/components/Editor/utils/editorShortcutChord.d.ts +9 -0
  74. package/dist/components/Editor/utils/editorShortcutIds.d.ts +2 -0
  75. package/dist/components/Editor/utils/editorShortcutRegistry.d.ts +15 -0
  76. package/dist/components/Editor/utils/editorSizeOptions.d.ts +27 -0
  77. package/dist/components/Editor/utils/fabricMainCanvasSnapshot.d.ts +48 -0
  78. package/dist/components/Editor/utils/fabricRulerMath.d.ts +35 -0
  79. package/dist/components/Editor/utils/fabricScreenshotToBlob.d.ts +7 -0
  80. package/dist/components/Editor/utils/imageLoader.d.ts +10 -0
  81. package/dist/components/Editor/utils/objectUtils.d.ts +11 -0
  82. package/dist/components/Editor/utils/pattern.d.ts +56 -0
  83. package/dist/components/Editor/utils/scaleSplitClassicGridVisual.d.ts +9 -0
  84. package/dist/components/Editor/utils/screenshot.d.ts +8 -0
  85. package/dist/components/Editor/utils/selectionVisual.d.ts +7 -0
  86. package/dist/components/Editor/utils/tintMaskWithColor.d.ts +4 -0
  87. package/dist/components/Editor/utils/uploadLimit.d.ts +4 -0
  88. package/dist/components/Editor/workers/copyDiecuts.worker.d.ts +38 -0
  89. package/dist/components/Editor/workers/maskWorker.d.ts +13 -0
  90. package/dist/components/Editor/workers/renderWorker.d.ts +1 -0
  91. package/dist/components/Editor/workers/zoneScreenshotWorker.d.ts +49 -0
  92. package/dist/composables/useEditorI18n.d.ts +18 -0
  93. package/dist/copyDiecuts.worker.js +67 -0
  94. package/dist/deform.worker.js +760 -0
  95. package/dist/editor-sdk.es.js +73923 -0
  96. package/dist/index.d.ts +446 -0
  97. package/dist/locales/builtin-messages.d.ts +2 -0
  98. package/dist/locales/editor-locales.d.ts +7 -0
  99. package/dist/locales/en.d.ts +5 -0
  100. package/dist/locales/ja-JP.d.ts +5 -0
  101. package/dist/locales/ko-KR.d.ts +5 -0
  102. package/dist/locales/vi-VN.d.ts +5 -0
  103. package/dist/locales/zh.d.ts +5 -0
  104. package/dist/maskWorker.js +51 -0
  105. package/dist/prefetch.worker.js +16 -0
  106. package/dist/render.worker.js +27266 -0
  107. package/dist/renderWorker.js +40368 -0
  108. package/dist/style.css +1 -0
  109. package/dist/types.d.ts +483 -0
  110. package/dist/utils/backgroundRenderer.d.ts +64 -0
  111. package/dist/utils/encryptJson.d.ts +31 -0
  112. package/dist/utils/environment.d.ts +29 -0
  113. package/dist/utils/errorHandler.d.ts +27 -0
  114. package/dist/utils/fileToken.d.ts +18 -0
  115. package/dist/utils/http.d.ts +31 -0
  116. package/dist/utils/jsonFileCache.d.ts +6 -0
  117. package/dist/utils/license/api.d.ts +74 -0
  118. package/dist/utils/license/deviceId.d.ts +25 -0
  119. package/dist/utils/license/index.d.ts +9 -0
  120. package/dist/utils/license/licenseManager.d.ts +63 -0
  121. package/dist/utils/license/licenseStore.d.ts +17 -0
  122. package/dist/utils/license/retry.d.ts +11 -0
  123. package/dist/utils/license/tokenRefresh.d.ts +34 -0
  124. package/dist/utils/mediaBlobCache.d.ts +6 -0
  125. package/dist/utils/protection/encryptedModules.generated.d.ts +27 -0
  126. package/dist/utils/protection/moduleLoader.d.ts +17 -0
  127. package/dist/utils/renderService/blend.d.ts +4 -0
  128. package/dist/utils/renderService/deform.d.ts +21 -0
  129. package/dist/utils/renderService/deform.worker.d.ts +7 -0
  130. package/dist/utils/renderService/image.d.ts +8 -0
  131. package/dist/utils/renderService/index.d.ts +12 -0
  132. package/dist/utils/renderService/mask.d.ts +13 -0
  133. package/dist/utils/renderService/prepareRenderData.d.ts +2 -0
  134. package/dist/utils/renderService/psdConverter.d.ts +6 -0
  135. package/dist/utils/renderService/render.d.ts +14 -0
  136. package/dist/utils/renderService/render.worker.d.ts +17 -0
  137. package/dist/utils/renderService/types.d.ts +236 -0
  138. package/dist/utils/renderService/workerManager.d.ts +33 -0
  139. package/dist/utils/renderedImagesDB.d.ts +61 -0
  140. package/dist/utils/storage.d.ts +27 -0
  141. package/dist/utils/threeRenderService/index.d.ts +6 -0
  142. package/dist/utils/url.d.ts +39 -0
  143. package/dist/utils/workerBase.d.ts +38 -0
  144. package/dist/utils/workerLoader.d.ts +24 -0
  145. package/dist/wasm/index.d.ts +5 -0
  146. package/dist/wasm/perspectiveLoader.d.ts +70 -0
  147. package/dist/wasm/perspectiveLoader.worker.d.ts +116 -0
  148. package/dist/zoneScreenshotWorker.js +82 -0
  149. package/package.json +54 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Composables 统一导出
3
+ */
4
+ export { useLicense } from './useLicense';
5
+ export { useFontLoader, loadFont } from './useFontLoader';
6
+ export { useProductData } from './useProductData';
7
+ export { useToolState } from './useToolState';
8
+ export { useTemplateManager } from './useTemplateManager';
9
+ export { useCanvasManager } from './useCanvasManager';
10
+ export { useLayerManager } from './useLayerManager';
11
+ export { useImageHandler } from './useImageHandler';
12
+ export { useTextHandler } from './useTextHandler';
13
+ export { useDiecutManager } from './useDiecutManager';
14
+ export { useTemplateLoader } from './useTemplateLoader';
15
+ export { usePreviewManager } from './usePreviewManager';
16
+ export { usePreviewRenderer } from './usePreviewRenderer';
17
+ export { useCompleteScreenshot } from './useCompleteScreenshot';
18
+ export { usePreviewUpdateQueue } from './usePreviewUpdateQueue';
19
+ export type { QueuePreviewUpdateMeta } from './usePreviewUpdateQueue';
20
+ export { useWorkerManager } from './useWorkerManager';
21
+ export { useEventHandlers } from './useEventHandlers';
22
+ export { useDiecutScreenshot, type TryBuildZoneInverseMaskBlobs } from './useDiecutScreenshot';
23
+ export { useCanvasStateByDiecut } from './useCanvasStateByDiecut';
24
+ export { useCanvasViewport, CANVAS_LOGICAL_HEIGHT, CANVAS_VIEWPORT_ZOOM_MIN, CANVAS_VIEWPORT_ZOOM_MAX, computeLogicalCanvasSizeFromWrapClientSize, } from './useCanvasViewport';
25
+ export type { TemplateItem, UseTemplateLoaderOptions } from './useTemplateLoader';
26
+ export { useObjectAdder } from './useObjectAdder';
27
+ export type { UseObjectAdderOptions, FabricImageInstance } from './useObjectAdder';
28
+ export { useLayerOperations } from './useLayerOperations';
29
+ export type { UseLayerOperationsOptions } from './useLayerOperations';
30
+ export type { UseWorkerManagerOptions } from './useWorkerManager';
31
+ export { useCanvasEventWiring } from './useCanvasEventWiring';
32
+ export { useGuideResources } from './useGuideResources';
33
+ export { usePatternHandler } from './usePatternHandler';
34
+ export { useToolStateSync } from './useToolStateSync';
35
+ export { useLayerSync } from './useLayerSync';
36
+ export { useCanvasObjectHelpers } from './useCanvasObjectHelpers';
37
+ export { useEditorWatchers } from './useEditorWatchers';
38
+ export type { UseEditorWatchersOptions } from './useEditorWatchers';
39
+ export { useCopyToDiecuts } from './useCopyToDiecuts';
40
+ export type { UseCopyToDiecutsOptions } from './useCopyToDiecuts';
41
+ export { useClearCanvas } from './useClearCanvas';
42
+ export type { UseClearCanvasOptions } from './useClearCanvas';
43
+ export { useEditorReset } from './useEditorReset';
44
+ export type { UseEditorResetOptions } from './useEditorReset';
45
+ export { useDownloadPng } from './useDownloadPng';
46
+ export type { UseDownloadPngOptions } from './useDownloadPng';
47
+ export { useCanvasHistory } from './useCanvasHistory';
48
+ export type { UseCanvasHistoryOptions, UseCanvasHistoryReturn } from './useCanvasHistory';
49
+ export { useEditorShortcuts } from './useEditorShortcuts';
50
+ export type { EditorShortcutsController } from './useEditorShortcuts';
51
+ export { useEditorI18n, getEditorI18nKeys, defaultZh, defaultEn } from '../../../composables/useEditorI18n';
52
+ export { useEditorTopbarContext, useEditorTopbarContextOptional, } from './useEditorTopbarContext';
53
+ export type { Layer } from './useLayerManager';
54
+ export type { LayerItem } from './useLayerSync';
55
+ export type { DiecutResource, DiecutGroup, DiecutOption } from './useDiecutManager';
56
+ export type { CanvasStateOptions } from './useCanvasStateByDiecut';
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Editor Canvas 事件绑定(抽离 index.vue 中的复杂事件逻辑)
3
+ * 拖拽结束:入队 queuePreviewUpdate(可 debounce,管道内 saveCanvasState 落盘 diecutStateMap),
4
+ * 并跳过紧随的 object:modified,避免与松手入队重复触发。
5
+ */
6
+ import type { Canvas } from 'fabric';
7
+ export declare function useCanvasEventWiring(options: {
8
+ getCanvas: () => Canvas | null;
9
+ guideResourceRole: string;
10
+ insertBelowGuideLayers: (obj: any) => void;
11
+ bringGuideLayersToFront: () => void;
12
+ syncLayers: () => void;
13
+ updateActive: (autoSwitchTab?: boolean) => void;
14
+ shouldAutoSwitchTabOnSelection?: () => boolean;
15
+ /** mouse:up 且本轮曾处于拖拽态:松手后触发(如 COMPLETE 分片全量预览) */
16
+ onCanvasDragInteractionEnd?: () => void;
17
+ /** 松手后重放拖拽期间延迟的预览更新(在 onCanvasDragInteractionEnd 之后调用) */
18
+ flushDeferredPreviewAfterDrag?: () => void;
19
+ /** object:moving 期间触发(用于轻量实时预览) */
20
+ onCanvasDragging?: (target?: any) => void;
21
+ handleObjectModified: (reason: string) => void;
22
+ getSelectedDiecutId: () => string;
23
+ saveCanvasState: (diecutId: string) => Promise<void>;
24
+ notifyObjectModified: () => void;
25
+ queuePreviewUpdate: (reason: string, meta?: {
26
+ source?: string;
27
+ startTime?: number;
28
+ immediate?: boolean;
29
+ commitHd?: boolean;
30
+ }) => void;
31
+ getIsDraggingObject: () => boolean;
32
+ setIsDraggingObject: (v: boolean, target?: any, moveEvent?: any) => void;
33
+ getHasPendingDragUpdate: () => boolean;
34
+ setHasPendingDragUpdate: (v: boolean) => void;
35
+ setSkipNextObjectModified: (v: boolean) => void;
36
+ /** loadDesignStateMap 等批量回放:勿在 object:added 里 insertBelow,避免与回放末尾 bringToFront 栈序冲突 */
37
+ skipObjectAddedGuideReorder?: () => boolean;
38
+ }): {
39
+ setup: () => () => void;
40
+ };
@@ -0,0 +1,18 @@
1
+ export interface UseCanvasHistoryOptions {
2
+ maxSteps?: number;
3
+ getHistoryKey: () => string;
4
+ captureState: () => Promise<unknown | null>;
5
+ applyState: (state: unknown) => Promise<void>;
6
+ isEnabled?: () => boolean;
7
+ }
8
+ export declare function useCanvasHistory(options: UseCanvasHistoryOptions): {
9
+ canUndo: import("vue").ComputedRef<boolean>;
10
+ canRedo: import("vue").ComputedRef<boolean>;
11
+ isApplyingHistory: import("vue").ComputedRef<boolean>;
12
+ record: () => Promise<boolean>;
13
+ ensureBaseline: () => Promise<void>;
14
+ undo: () => Promise<boolean>;
15
+ redo: () => Promise<boolean>;
16
+ clear: (key?: string) => void;
17
+ };
18
+ export type UseCanvasHistoryReturn = ReturnType<typeof useCanvasHistory>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Canvas 管理 Composable
3
+ * 负责 Canvas 初始化、缩放、调整大小等核心功能
4
+ */
5
+ import { type Ref } from 'vue';
6
+ import { Canvas } from 'fabric';
7
+ export declare function useCanvasManager(enableGrid?: boolean): {
8
+ canvasEl: Ref<HTMLCanvasElement | null, HTMLCanvasElement | null>;
9
+ canvasWrap: Ref<HTMLElement | null, HTMLElement | null>;
10
+ showGrid: Ref<boolean, boolean>;
11
+ zoom: Ref<number, number>;
12
+ getCanvas: () => Canvas | null;
13
+ getCanvasSize: () => {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ handleCanvasReady: ({ canvasEl: el, canvasWrap: wrap }: {
18
+ canvasEl: HTMLCanvasElement;
19
+ canvasWrap: HTMLElement;
20
+ }) => void;
21
+ setZoom: (value: number) => void;
22
+ zoomIn: () => void;
23
+ zoomOut: () => void;
24
+ fitCanvas: () => void;
25
+ toggleGrid: () => void;
26
+ clearCanvas: () => void;
27
+ renderAll: () => void;
28
+ cleanup: () => void;
29
+ };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 画布对象操作辅助 Composable
3
+ * bringObjectToFront / insertBelowGuideLayers / insertBelowGuideLayersTopMost / bringGuideLayersToFront / scaleResourceToCanvas / loadFabricImage
4
+ */
5
+ import { Image as FabricImage } from 'fabric';
6
+ export type FabricImageInstance = InstanceType<typeof FabricImage> & {
7
+ customData?: Record<string, unknown>;
8
+ };
9
+ /** 画布上最靠前的 guide / guide-resource 索引;无则 -1 */
10
+ export declare function getMinGuideLayerIndex(canvas: any, guideResourceRole?: string, guideRole?: string): number;
11
+ /** 替换对象时恢复到原栈位,且不超过 guide 层之下 */
12
+ export declare function resolvePreservedStackIndex(originalIndex: number, minGuideIndex: number): number;
13
+ export declare function isGuideLikeCanvasObject(obj: any, guideResourceRole?: string, guideRole?: string): boolean;
14
+ /** 对象在可编辑图层中的序号(不含 guide / guide-resource) */
15
+ export declare function getEditableOrdinalInStack(objects: any[], obj: any, isGuide?: (o: any) => boolean): number;
16
+ /** 将可编辑层序号映射为 canvas 绝对 index(须在 bringGuideLayersToFront 之后调用) */
17
+ export declare function resolveAbsoluteIndexForEditableOrdinal(objects: any[], editableOrdinal: number, isGuide?: (o: any) => boolean): number;
18
+ export declare function moveObjectToStackIndex(canvas: any, obj: any, targetIndex: number): void;
19
+ export interface UseCanvasObjectHelpersOptions {
20
+ getCanvas: () => any;
21
+ resolveImageUrl: (src: string) => Promise<string | null>;
22
+ guideResourceRole?: string;
23
+ guideRole?: string;
24
+ }
25
+ export declare function useCanvasObjectHelpers(options: UseCanvasObjectHelpersOptions): {
26
+ bringObjectToFront: (obj: any) => void;
27
+ insertBelowGuideLayers: (obj: any) => void;
28
+ insertBelowGuideLayersTopMost: (obj: any) => void;
29
+ bringGuideLayersToFront: () => void;
30
+ scaleResourceToCanvas: (img: any, resource: any) => void;
31
+ loadFabricImage: (src: string, callback: (img: FabricImageInstance) => void, opts?: {
32
+ crossOrigin?: string;
33
+ }) => Promise<void>;
34
+ };
@@ -0,0 +1,50 @@
1
+ import type { Canvas } from 'fabric';
2
+ export interface CanvasStateOptions {
3
+ getCanvas: () => Canvas | null;
4
+ syncLayers: () => void;
5
+ notifyObjectModified?: () => void;
6
+ buildMaskGroups: () => Array<{
7
+ id: string;
8
+ name: string;
9
+ mask?: {
10
+ url?: string;
11
+ width?: number;
12
+ height?: number;
13
+ };
14
+ }>;
15
+ diecutOptions: () => Array<{
16
+ id: string;
17
+ name: string;
18
+ }>;
19
+ convertImageUrlToBase64: (url: string) => Promise<string | null>;
20
+ guideResourceRole: string;
21
+ /** 当前尺码:使 per-分片画布状态按 diecutId+尺码 分桶,避免不同尺码共用 groupId 互相覆盖(修跨尺码串图) */
22
+ getSelectedSize?: () => string;
23
+ /** 加载 JSON 完成后调用,用于从 customData 重建图案矩形 fill(Fabric 序列化会丢失 Pattern source) */
24
+ afterLoadCanvasJson?: (canvas: any) => void | Promise<void>;
25
+ /** 将 HTTP 图片 URL 解析为 blob URL(通过 fetchWithFileToken 加载),用于 loadFromJSON 前预处理 */
26
+ resolveImageUrl?: (url: string) => Promise<string>;
27
+ }
28
+ export declare function useCanvasStateByDiecut(options: CanvasStateOptions): {
29
+ exportCanvasState: () => Promise<any>;
30
+ saveCanvasState: (diecutId: string, sizeOverride?: string) => Promise<void>;
31
+ restoreCanvasState: (diecutId: string) => boolean;
32
+ restoreCanvasStateAsync: (diecutId: string) => Promise<boolean>;
33
+ restoreCanvasStateAsyncNoWait: (diecutId: string) => Promise<boolean>;
34
+ loadCanvasJson: (json: any, onDone?: () => void | Promise<void>, loadOptions?: {
35
+ skipRender?: boolean;
36
+ }) => Promise<void>;
37
+ filterUserContent: (fabricJson: any) => any;
38
+ getAllDiecutFabricData: () => Promise<{
39
+ version: string;
40
+ diecuts: Record<string, unknown>;
41
+ }>;
42
+ getDiecutStateMap: () => Record<string, unknown>;
43
+ getDesignedSizes: () => Set<string>;
44
+ clearAllStates: () => void;
45
+ clearState: (diecutId: string) => void;
46
+ getState: (diecutId: string) => {} | null;
47
+ getStateForSize: (diecutId: string, size: string) => {} | null;
48
+ setState: (diecutId: string, state: unknown) => void;
49
+ setStates: (updates: Record<string, unknown>) => void;
50
+ };
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Canvas Viewport 管理 Composable
3
+ * 负责 Canvas 的 viewport transform 缩放、适配、resize 等
4
+ */
5
+ import { type Ref } from 'vue';
6
+ import type { Canvas } from 'fabric';
7
+ export interface CanvasViewportOptions {
8
+ getCanvas: () => Canvas | null;
9
+ canvasWrap: Ref<HTMLElement | null>;
10
+ refreshGuideResources?: () => void;
11
+ /** 视口矩阵提交后调用(缩放/平移);勿在此做全量引导重载,fitCanvas 末尾仍会调 refreshGuideResources */
12
+ onViewportCommitted?: () => void;
13
+ /** 返回当前 PSD 画布尺寸,用于 contain-fit 映射实现对象与蒙版同步缩放 */
14
+ getGuidelinePsdSize?: () => {
15
+ width: number;
16
+ height: number;
17
+ } | null;
18
+ /** SPLIT 当前分片蒙版在指定逻辑画布尺寸下的图稿矩形;优先用于与遮罩完全同源缩放 */
19
+ getSplitPieceMaskRect?: (canvasWidth: number, canvasHeight: number) => {
20
+ left: number;
21
+ top: number;
22
+ width: number;
23
+ height: number;
24
+ } | null;
25
+ /** 当前模板模式;Classic(SPLIT)下 fitCanvas 固定为工具栏显示 100% 的内部 zoom */
26
+ getSelectedMode?: () => string;
27
+ }
28
+ /** 主画布视口缩放百分比范围(工具栏 / 滚轮 / fitCanvas 共用) */
29
+ export declare const CANVAS_VIEWPORT_ZOOM_MIN = 10;
30
+ export declare const CANVAS_VIEWPORT_ZOOM_MAX = 400;
31
+ /**
32
+ * 实际视口缩放 = (界面 zoom% / 100) × 该系数。
33
+ * 界面默认显示 100% 时,内容相对旧版「100%=满基准」为 0.8。
34
+ */
35
+ export declare const CANVAS_VIEWPORT_INITIAL_ZOOM_RATIO = 0.8;
36
+ /** Classic 默认内部 zoom(工具栏展示为 100%) */
37
+ export declare const CLASSIC_DEFAULT_INTERNAL_ZOOM: number;
38
+ /**
39
+ * 工具栏展示的缩放百分比(仅 UI)。
40
+ * Classic(SPLIT):内部 zoom 经 INITIAL_ZOOM_RATIO 后再 fit 时常为 80,对用户显示为 100。
41
+ * Zone(COMPLETE)及其它:与内部 zoom 一致。
42
+ */
43
+ export declare function toToolbarZoomPercent(zoom: number, selectedMode: string): number;
44
+ /** 画布逻辑高度(逻辑像素固定);宽度在 resizeCanvasLogicalToWrap 中按与展示框相同的宽高比计算 */
45
+ export declare const CANVAS_LOGICAL_HEIGHT = 1600;
46
+ /**
47
+ * 逻辑画布尺寸:高度固定为 CANVAS_LOGICAL_HEIGHT,宽度 = CANVAS_LOGICAL_HEIGHT × (展示宽 / 展示高),
48
+ * 展示宽高与 resizeCanvasCssToWrap 一致(容器 client 尺寸 capped),避免位图与 CSS 框宽高比不一致导致非等比变形。
49
+ */
50
+ export declare function computeLogicalCanvasSizeFromWrapClientSize(ww: number, wh: number): {
51
+ width: number;
52
+ height: number;
53
+ };
54
+ /** Classic = SPLIT,Zone = COMPLETE */
55
+ export type EditorTemplateViewportMode = 'SPLIT' | 'COMPLETE';
56
+ export declare function useCanvasViewport(options: CanvasViewportOptions): {
57
+ zoom: Ref<number, number>;
58
+ getCanvasSize: () => {
59
+ width: number;
60
+ height: number;
61
+ };
62
+ resizeCanvasCssToWrap: () => void;
63
+ resizeCanvasLogicalToWrap: () => boolean;
64
+ commitViewportTransform: () => void;
65
+ applyPanDelta: (dx: number, dy: number) => void;
66
+ resetViewportPan: () => void;
67
+ applyViewportZoom: (value: number) => void;
68
+ setZoom: (value: number) => void;
69
+ zoomIn: () => void;
70
+ zoomOut: () => void;
71
+ fitCanvas: () => void;
72
+ handleWrapResize: () => void;
73
+ refreshGuideResourcesCentered: () => void;
74
+ setupWindowResize: () => void;
75
+ removeWindowResize: () => void;
76
+ focusSceneRect: (rect: {
77
+ left: number;
78
+ top: number;
79
+ width: number;
80
+ height: number;
81
+ }, paddingVp?: number, options?: {
82
+ lockZoom?: boolean;
83
+ }) => void;
84
+ focusViewportOnFabricObject: (obj: any, paddingVp?: number) => void;
85
+ initTemplateViewportMode: (mode: string) => void;
86
+ switchTemplateViewportMode: (mode: string) => void;
87
+ resetTemplateViewportByMode: () => void;
88
+ applyClassicDefaultToolbarZoom: () => void;
89
+ };
@@ -0,0 +1,32 @@
1
+ import type { Ref } from 'vue';
2
+ export interface UseClearCanvasOptions {
3
+ getCanvas: () => any;
4
+ syncLayers: () => void;
5
+ syncImageToolState: (active?: any, autoSwitchTab?: boolean) => void;
6
+ syncLayerToolState: (active?: any) => void;
7
+ syncTextToolState: (active?: any, autoSwitchTab?: boolean) => void;
8
+ queuePreviewUpdate: (reason: string) => void;
9
+ /** 当前模板模式(例如 COMPLETE / SPLIT),可选传入 */
10
+ getSelectedMode?: () => string | null;
11
+ /** 清空所有分片状态(多片模式下一起清) */
12
+ clearAllDiecutStates?: () => void;
13
+ /** 多片模式下刷新所有分片预览(可选) */
14
+ refreshAllDiecutPreviews?: () => void | Promise<void>;
15
+ /** 单片模式下立即刷新预览(可选,不依赖 queue 延迟) */
16
+ refreshPreviewImmediate?: () => void | Promise<void>;
17
+ /** 清空所有分片相关缓存(状态、截图、预览大图等) */
18
+ clearAllSplitCaches?: () => void;
19
+ /** 判断当前操作是否有可清空内容;SPLIT 下可包含其他分片的已保存状态 */
20
+ hasClearableContent?: () => boolean;
21
+ /** 画布上无可清空元素时调用(不打开确认弹窗) */
22
+ onNoContentToClear?: () => void;
23
+ /** 清空完成后调用,用于记录历史栈等收尾 */
24
+ onAfterClear?: () => void | Promise<void>;
25
+ }
26
+ export declare function useClearCanvas(options: UseClearCanvasOptions): {
27
+ showClearConfirm: Ref<boolean, boolean>;
28
+ doClearCanvas: () => Promise<void>;
29
+ clearCanvas: () => void;
30
+ confirmClearCanvas: () => Promise<void>;
31
+ cancelClearCanvas: () => void;
32
+ };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * 单片模式(COMPLETE):fabricScreenshotList
3
+ * SPLIT 每片小 MASK + 可选 DOTTED_LINE,按 Guideline bounds 从主画布位图裁切并行生成。
4
+ */
5
+ import { Canvas } from 'fabric';
6
+ import type { IFabricScreenshot } from '../../../utils/renderService';
7
+ import { type FabricMainCanvasSnapshotOptions } from '../utils/fabricMainCanvasSnapshot';
8
+ type ZoneScreenshotBuildOptions = {
9
+ forceFreshBase?: boolean;
10
+ /** quick 构建时仅处理这些分片 id(拖动态只更新 armed 分片) */
11
+ onlyZoneIds?: Array<string | number>;
12
+ };
13
+ /** 调试:打印 fabricScreenshotList 各条 url 与构建耗时(ms) */
14
+ export declare function logFabricScreenshotListDebug(source: string, list: IFabricScreenshot[], startedAt: number): void;
15
+ export declare function useCompleteScreenshot(options: {
16
+ getCanvas: () => Canvas | null;
17
+ toProxyUrl: (url: string) => string;
18
+ loadImage: (url: string) => Promise<HTMLImageElement>;
19
+ guideResourceRole?: string;
20
+ /** 编辑区域宽度,用作合成图基准尺寸;未传时回退 660 */
21
+ getEditorAreaWidth?: () => number;
22
+ /** 当前选中尺码,多尺码时用于取对应 COMPLETE 的 groupId,使 fabricScreenshotList id 与 psdJson 一致 */
23
+ getSelectedSize?: () => string;
24
+ /** 用户拖动分片后内存中的 Guideline;有则不再 fetch SPLIT 的 jsonURL */
25
+ getCachedSplitGuidelineJson?: (templateJsonUrl: string) => Record<string, unknown> | null | undefined;
26
+ /** Zone 模式下分片实时位置与对应 MASK,优先用它生成 fabricScreenshotList(对齐 dev-29-new) */
27
+ getZonesForScreenshot?: () => Array<{
28
+ id: number;
29
+ name?: string;
30
+ placed: {
31
+ left: number;
32
+ top: number;
33
+ width: number;
34
+ height: number;
35
+ };
36
+ maskUrl: string;
37
+ }>;
38
+ }): {
39
+ buildCompleteFabricScreenshotList: (diecutData: any, selectedSize?: string, baseBlob?: Blob | null) => Promise<IFabricScreenshot[]>;
40
+ getCanvasBaseScreenshot: (snapshotOpts?: FabricMainCanvasSnapshotOptions) => Promise<Blob | null>;
41
+ buildZoneFabricScreenshotList: (zones: Array<{
42
+ id: number;
43
+ name?: string;
44
+ placed: {
45
+ left: number;
46
+ top: number;
47
+ width: number;
48
+ height: number;
49
+ };
50
+ maskUrl: string;
51
+ }>, baseBlob?: Blob | null) => Promise<IFabricScreenshot[]>;
52
+ buildZoneFabricScreenshotListQuick: (zones: Array<{
53
+ id: number;
54
+ name?: string;
55
+ placed: {
56
+ left: number;
57
+ top: number;
58
+ width: number;
59
+ height: number;
60
+ };
61
+ maskUrl: string;
62
+ }>, buildOptions?: ZoneScreenshotBuildOptions) => Promise<IFabricScreenshot[]>;
63
+ prewarmZoneQuickBaseScreenshot: (target?: any) => Promise<void>;
64
+ endZoneQuickDragPreview: () => void;
65
+ clearZoneScreenshotCache: () => void;
66
+ disposeZoneScreenshotWorker: () => void;
67
+ };
68
+ export {};
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 复制当前画布内容到其他刀板(Worker 或降级克隆)
3
+ * 支持「跨尺码」复制:目标用 { id, size } 标识,按复合键 `${id}::${size}` 写入状态 Map。
4
+ * 几何换算只依赖「当前画布尺寸(各尺码一致,视口决定)+ 目标分片在目标尺码下的遮罩尺寸」,
5
+ * 因此为其他尺码计算出的坐标在切到该尺码时按 mask-anchored 恢复为恒等映射(不会二次缩放)。
6
+ */
7
+ import type { Ref } from 'vue';
8
+ /** 复制目标:分片 id + 状态键尺码维度(SIZE_SPECIFIC 为 S/M/L;COMMON 为 '') */
9
+ export interface CopyTarget {
10
+ id: string;
11
+ size: string;
12
+ }
13
+ export interface UseCopyToDiecutsOptions {
14
+ getCanvas: () => any;
15
+ selectedDiecutId: Ref<string>;
16
+ /** 当前状态键尺码(stateSizeKey():SIZE_SPECIFIC=当前尺码 / COMMON='') */
17
+ selectedSize: Ref<string>;
18
+ objectIndex: Ref<number>;
19
+ incrementObjectIndex: () => void;
20
+ copyToDiecutsInWorker: (payload: {
21
+ sourceObjects: any[];
22
+ targetJsonMap: Record<string, any>;
23
+ objectIndex: number;
24
+ targetScaleMap?: Record<string, number>;
25
+ sourceCenter?: {
26
+ x: number;
27
+ y: number;
28
+ };
29
+ targetCenterMap?: Record<string, {
30
+ x: number;
31
+ y: number;
32
+ }>;
33
+ canvasCenter?: {
34
+ x: number;
35
+ y: number;
36
+ };
37
+ }) => Promise<{
38
+ updates?: Record<string, any>;
39
+ nextObjectIndex?: number;
40
+ } | void>;
41
+ notifyObjectModified: () => void;
42
+ queuePreviewUpdate: (reason: string) => void;
43
+ isCopyableJsonObject: (obj: any) => boolean;
44
+ /** 取分片遮罩尺寸;size 为空/不传则用当前尺码(与截图管线一致) */
45
+ getDiecutDimensions: (diecutId: string, size?: string) => {
46
+ width: number;
47
+ height: number;
48
+ } | null;
49
+ /** 读取「指定尺码」下分片的现有状态(复合键 `${id}::${size}`,不回退当前尺码) */
50
+ getStateForSize: (diecutId: string, size: string) => any;
51
+ /** 批量写入状态:键为复合键 `${id}::${size}`,原样写入不再追加尺码 */
52
+ setStates: (updates: Record<string, any>) => void;
53
+ }
54
+ export declare function useCopyToDiecuts(options: UseCopyToDiecutsOptions): {
55
+ copyToDiecuts: (targets?: CopyTarget[]) => Promise<void>;
56
+ };
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 刀板管理 Composable
3
+ * 负责刀板数据、切换、状态保存和恢复
4
+ */
5
+ import { type Ref } from 'vue';
6
+ import type { DiecutResponse } from '../../../types';
7
+ export interface DiecutResource {
8
+ groupId?: string;
9
+ groupName?: string;
10
+ url?: string;
11
+ type?: string;
12
+ width?: number;
13
+ height?: number;
14
+ }
15
+ export interface DiecutGroup {
16
+ id: string;
17
+ name: string;
18
+ mask: DiecutResource | null;
19
+ dotted: DiecutResource | null;
20
+ resources: DiecutResource[];
21
+ }
22
+ export interface DiecutOption {
23
+ id: string;
24
+ name: string;
25
+ url: string;
26
+ }
27
+ export declare function useDiecutManager(effectiveDiecutData: () => DiecutResponse | null,
28
+ /** 与 buildMaskGroups 一致:当前尺码(可复选)下的 SPLIT */
29
+ getSelectedSize?: () => string | string[]): {
30
+ selectedDiecutId: Ref<string, string>;
31
+ diecutResourceMap: import("vue").ComputedRef<Map<string, DiecutGroup>>;
32
+ diecutOptions: import("vue").ComputedRef<{
33
+ id: string;
34
+ name: string;
35
+ url: string;
36
+ }[]>;
37
+ selectedDiecut: import("vue").ComputedRef<DiecutGroup | null>;
38
+ getDiecutResources: (diecutId: string) => DiecutResource[];
39
+ getDiecutMask: (diecutId: string) => DiecutResource | null;
40
+ saveDiecutState: (diecutId: string, state: unknown) => void;
41
+ getDiecutState: (diecutId: string) => unknown | null;
42
+ clearDiecutState: (diecutId: string) => void;
43
+ clearAllDiecutStates: () => void;
44
+ getAllDiecutStates: () => Record<string, unknown>;
45
+ isGuideResource: (resource: any) => boolean;
46
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 刀板遮罩截图 Composable
3
+ * 负责生成每个刀板的遮罩截图,并提供 URL 查询与资源释放
4
+ */
5
+ import { Canvas } from 'fabric';
6
+ import type { DiecutResource } from './useDiecutManager';
7
+ import { type FabricMainCanvasSnapshotOptions } from '../utils/fabricMainCanvasSnapshot';
8
+ type MaskGroup = {
9
+ id: string;
10
+ name: string;
11
+ mask?: DiecutResource | null;
12
+ };
13
+ export type RenderMaskInWorker = (payload: {
14
+ baseBlob: Blob;
15
+ maskBlob: Blob;
16
+ maskWidth: number;
17
+ maskHeight: number;
18
+ left: number;
19
+ top: number;
20
+ canvasWidth: number;
21
+ canvasHeight: number;
22
+ }) => Promise<Blob | null>;
23
+ export type TryBuildZoneInverseMaskBlobs = (ctx: {
24
+ baseBlob: Blob;
25
+ snapshotOpts?: FabricMainCanvasSnapshotOptions;
26
+ diecutIds?: string[];
27
+ }) => Promise<Map<string, Blob> | null>;
28
+ export declare function useDiecutScreenshot(options: {
29
+ getCanvas: () => Canvas | null;
30
+ buildMaskGroups: () => MaskGroup[];
31
+ loadImage: (url: string) => Promise<HTMLImageElement>;
32
+ renderMaskInWorker?: RenderMaskInWorker;
33
+ guideResourceRole?: string;
34
+ /** 当前尺码:使设计截图缓存按 groupId+尺码 分桶,避免不同尺码(含复制到其他分片后)共用 groupId 互相覆盖 */
35
+ getSelectedSize?: () => string;
36
+ /**
37
+ * SPLIT + Zone 管线:用与预览相同的分片裁切生成各 groupId 的 inverse mask Blob;
38
+ * 返回 null 或缺某 id 时回退居中 mask 方案。
39
+ */
40
+ tryBuildZoneInverseMaskBlobs?: TryBuildZoneInverseMaskBlobs;
41
+ }): {
42
+ generateDiecutScreenshot: (diecutId: string, snapshotOpts?: FabricMainCanvasSnapshotOptions, precapturedBaseBlob?: Blob | null) => Promise<void>;
43
+ generateDiecutScreenshotsForIds: (diecutIds: string[]) => Promise<void>;
44
+ getInverseMaskUrl: (groupId: string) => string;
45
+ getInverseMaskBlob: (groupId: string) => Blob | undefined;
46
+ getInverseMaskVersion: (groupId: string) => number;
47
+ clearCache: () => void;
48
+ dispose: () => void;
49
+ };
50
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 将当前画布导出为 PNG 并触发下载
3
+ */
4
+ export interface UseDownloadPngOptions {
5
+ getCanvas: () => any;
6
+ canvasToBlob: (el: HTMLCanvasElement, type: string) => Promise<Blob>;
7
+ filename?: string;
8
+ }
9
+ export declare function useDownloadPng(options: UseDownloadPngOptions): {
10
+ downloadPng: () => Promise<void>;
11
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 产品切换时重置画布与选中状态
3
+ */
4
+ import type { Ref } from 'vue';
5
+ export interface UseEditorResetOptions {
6
+ getCanvas: () => any;
7
+ resetForProductChange: () => void;
8
+ clearAllDiecutStates: () => void;
9
+ resetCanvasForTemplate: () => void;
10
+ syncLayers: () => void;
11
+ syncImageToolState: (active?: any, autoSwitchTab?: boolean) => void;
12
+ syncLayerToolState: (active?: any) => void;
13
+ syncTextToolState: (active?: any, autoSwitchTab?: boolean) => void;
14
+ previewRenderData: Ref<any>;
15
+ selectedDiecutId: Ref<string>;
16
+ selectedTemplateIndex: Ref<number>;
17
+ previewTemplateIndex: Ref<number>;
18
+ }
19
+ export declare function useEditorReset(options: UseEditorResetOptions): {
20
+ doResetForProduct: () => void;
21
+ };