@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,240 @@
1
+ /**
2
+ * 预览管理 Composable
3
+ * 负责预览数据生成、渲染队列管理
4
+ */
5
+ import { type Ref } from 'vue';
6
+ import type { Canvas } from 'fabric';
7
+ import type { IRenderByJson } from '../../../utils/renderService';
8
+ export declare function usePreviewManager(getCanvas: () => Canvas | null, fileBaseUrl?: string): {
9
+ previewRenderData: Ref<{
10
+ psdJson: {
11
+ canvasWidth: number;
12
+ canvasHeight: number;
13
+ layerList: {
14
+ name: string;
15
+ type: import("../../..").PsdLayerType;
16
+ blendMode?: string | undefined;
17
+ bounds?: {
18
+ top: number;
19
+ left: number;
20
+ bottom?: number | undefined;
21
+ right?: number | undefined;
22
+ width: number;
23
+ height: number;
24
+ } | undefined;
25
+ layerOrder?: number | undefined;
26
+ imagePath?: string | undefined;
27
+ vectorMask?: {
28
+ paths: {
29
+ open: boolean;
30
+ knots: {
31
+ linked: boolean;
32
+ points: number[];
33
+ }[];
34
+ fillRule?: string | undefined;
35
+ operation?: string | undefined;
36
+ }[];
37
+ points?: {
38
+ x: number;
39
+ y: number;
40
+ type?: number | undefined;
41
+ }[] | undefined;
42
+ invert?: boolean | undefined;
43
+ notLink?: boolean | undefined;
44
+ disable?: boolean | undefined;
45
+ fillStartsWithAllPixels?: boolean | undefined;
46
+ } | undefined;
47
+ children?: /*elided*/ any[] | undefined;
48
+ isSmartObject?: boolean | undefined;
49
+ size?: {
50
+ width: number;
51
+ height: number;
52
+ } | undefined;
53
+ placedLayer?: {
54
+ width: number;
55
+ height: number;
56
+ } | undefined;
57
+ originalWidth?: number | undefined;
58
+ originalHeight?: number | undefined;
59
+ meshPoints?: {
60
+ x: number;
61
+ y: number;
62
+ type?: number | undefined;
63
+ }[] | undefined;
64
+ transform?: number[] | undefined;
65
+ quiltSliceX?: number[] | undefined;
66
+ quiltSliceY?: number[] | undefined;
67
+ filterList?: {
68
+ type: string;
69
+ enabled: boolean;
70
+ filter?: {
71
+ puppetShapeList?: {
72
+ originalVertexArray: {
73
+ x: number;
74
+ y: number;
75
+ type?: number | undefined;
76
+ }[];
77
+ deformedVertexArray: {
78
+ x: number;
79
+ y: number;
80
+ type?: number | undefined;
81
+ }[];
82
+ indexArray: number[];
83
+ }[] | undefined;
84
+ } | undefined;
85
+ }[] | undefined;
86
+ id?: number | undefined;
87
+ opacity?: number | undefined;
88
+ clipping?: boolean | undefined;
89
+ }[];
90
+ };
91
+ materialList: {
92
+ layerName: string;
93
+ url: string;
94
+ sourceName?: string | undefined;
95
+ }[];
96
+ fabricScreenshotList: {
97
+ id: number;
98
+ name?: string | undefined;
99
+ url: string;
100
+ designImage?: {
101
+ readonly height: number;
102
+ readonly width: number;
103
+ close: {
104
+ (): void;
105
+ (): void;
106
+ };
107
+ } | undefined;
108
+ contentVersion?: number | string | undefined;
109
+ }[];
110
+ width?: number | undefined;
111
+ height?: number | undefined;
112
+ baseUrl?: string | undefined;
113
+ previewTier?: "fast" | "hd" | undefined;
114
+ hasPendingHdFollowup?: boolean | undefined;
115
+ maxImageSize?: number | undefined;
116
+ previewQuality?: "quick" | "normal" | undefined;
117
+ skipDeform?: boolean | undefined;
118
+ selectedColor?: string | undefined;
119
+ } | null, IRenderByJson | {
120
+ psdJson: {
121
+ canvasWidth: number;
122
+ canvasHeight: number;
123
+ layerList: {
124
+ name: string;
125
+ type: import("../../..").PsdLayerType;
126
+ blendMode?: string | undefined;
127
+ bounds?: {
128
+ top: number;
129
+ left: number;
130
+ bottom?: number | undefined;
131
+ right?: number | undefined;
132
+ width: number;
133
+ height: number;
134
+ } | undefined;
135
+ layerOrder?: number | undefined;
136
+ imagePath?: string | undefined;
137
+ vectorMask?: {
138
+ paths: {
139
+ open: boolean;
140
+ knots: {
141
+ linked: boolean;
142
+ points: number[];
143
+ }[];
144
+ fillRule?: string | undefined;
145
+ operation?: string | undefined;
146
+ }[];
147
+ points?: {
148
+ x: number;
149
+ y: number;
150
+ type?: number | undefined;
151
+ }[] | undefined;
152
+ invert?: boolean | undefined;
153
+ notLink?: boolean | undefined;
154
+ disable?: boolean | undefined;
155
+ fillStartsWithAllPixels?: boolean | undefined;
156
+ } | undefined;
157
+ children?: /*elided*/ any[] | undefined;
158
+ isSmartObject?: boolean | undefined;
159
+ size?: {
160
+ width: number;
161
+ height: number;
162
+ } | undefined;
163
+ placedLayer?: {
164
+ width: number;
165
+ height: number;
166
+ } | undefined;
167
+ originalWidth?: number | undefined;
168
+ originalHeight?: number | undefined;
169
+ meshPoints?: {
170
+ x: number;
171
+ y: number;
172
+ type?: number | undefined;
173
+ }[] | undefined;
174
+ transform?: number[] | undefined;
175
+ quiltSliceX?: number[] | undefined;
176
+ quiltSliceY?: number[] | undefined;
177
+ filterList?: {
178
+ type: string;
179
+ enabled: boolean;
180
+ filter?: {
181
+ puppetShapeList?: {
182
+ originalVertexArray: {
183
+ x: number;
184
+ y: number;
185
+ type?: number | undefined;
186
+ }[];
187
+ deformedVertexArray: {
188
+ x: number;
189
+ y: number;
190
+ type?: number | undefined;
191
+ }[];
192
+ indexArray: number[];
193
+ }[] | undefined;
194
+ } | undefined;
195
+ }[] | undefined;
196
+ id?: number | undefined;
197
+ opacity?: number | undefined;
198
+ clipping?: boolean | undefined;
199
+ }[];
200
+ };
201
+ materialList: {
202
+ layerName: string;
203
+ url: string;
204
+ sourceName?: string | undefined;
205
+ }[];
206
+ fabricScreenshotList: {
207
+ id: number;
208
+ name?: string | undefined;
209
+ url: string;
210
+ designImage?: {
211
+ readonly height: number;
212
+ readonly width: number;
213
+ close: {
214
+ (): void;
215
+ (): void;
216
+ };
217
+ } | undefined;
218
+ contentVersion?: number | string | undefined;
219
+ }[];
220
+ width?: number | undefined;
221
+ height?: number | undefined;
222
+ baseUrl?: string | undefined;
223
+ previewTier?: "fast" | "hd" | undefined;
224
+ hasPendingHdFollowup?: boolean | undefined;
225
+ maxImageSize?: number | undefined;
226
+ previewQuality?: "quick" | "normal" | undefined;
227
+ skipDeform?: boolean | undefined;
228
+ selectedColor?: string | undefined;
229
+ } | null>;
230
+ previewTitle: Ref<string, string>;
231
+ queuePreviewUpdate: (reason: string) => void;
232
+ buildInitialPreviewRenderData: () => Promise<void>;
233
+ getRenderDataForIndex: (index: number) => Promise<IRenderByJson | null>;
234
+ clearPreviewCache: () => void;
235
+ getPreviewCacheStats: () => {
236
+ bitmaps: number;
237
+ blobUrls: number;
238
+ screenshots: number;
239
+ };
240
+ };
@@ -0,0 +1,111 @@
1
+ /**
2
+ * 预览渲染 Composable
3
+ * 抽离 buildInitialPreviewRenderData / getRenderDataForIndex / renderAllTemplates
4
+ * 多图(SPLIT):默认 buildMaskGroups + getInverseMaskUrl;若启用 Zone 截图管线且有分片 mask 则与 COMPLETE 同裁切路径。
5
+ * 单片(COMPLETE):SPLIT 分片 MASK+DOTTED 按 bounds 裁切,或 Zone 管线。
6
+ */
7
+ import { type Ref } from 'vue';
8
+ import type { IRenderByJson, IMaterial } from '../../../utils/renderService';
9
+ import { type SplitPieceDesignClipBlob } from '../utils/buildSplitPieceDesignClipBlobs';
10
+ type TemplateItem = {
11
+ jsonURL?: string;
12
+ resources?: any[];
13
+ };
14
+ type MaskGroup = {
15
+ id: string;
16
+ name: string;
17
+ };
18
+ type PreviewBuildOptions = {
19
+ commitHd?: boolean;
20
+ useCachedSplitScreenshotsOnly?: boolean;
21
+ };
22
+ type RenderDataForIndexOptions = {
23
+ skipSaveAndScreenshot?: boolean;
24
+ resetCompleteBatchCache?: boolean;
25
+ useCachedSplitScreenshotsOnly?: boolean;
26
+ };
27
+ export declare function usePreviewRenderer(options: {
28
+ usePreviewEffect: () => boolean;
29
+ templateItems: Ref<TemplateItem[]>;
30
+ previewTemplateIndex: Ref<number>;
31
+ selectedDiecutId: Ref<string>;
32
+ selectedMode: Ref<string>;
33
+ selectedColor: Ref<string>;
34
+ previewRenderData: Ref<IRenderByJson | null>;
35
+ toProxyUrl: (url: string) => string;
36
+ buildMaterialList: (resources?: any[]) => IMaterial[];
37
+ collectGroupIdByName: (layersList: any[], map?: Map<string, number>) => Map<string, number>;
38
+ buildMaskGroups: () => MaskGroup[];
39
+ getInverseMaskUrl: (groupId: string) => string;
40
+ /** 当前尺码下该分片设计截图的内容版本号:写入 fabricScreenshot.contentVersion,供预览签名区分尺码/检测改动 */
41
+ getInverseMaskVersion?: (groupId: string) => number;
42
+ getCanvas: () => any;
43
+ getEffectiveDiecutData: () => any;
44
+ loadImage: (url: string) => Promise<HTMLImageElement>;
45
+ guideResourceRole?: string;
46
+ /** 编辑区域宽度,用于单片合成图基准尺寸 */
47
+ getEditorAreaWidth?: () => number;
48
+ /** 当前选中尺码,多尺码时使 fabricScreenshotList id 与 psdJson 一致 */
49
+ getSelectedSize?: () => string;
50
+ saveCanvasState: (diecutId: string) => Promise<void>;
51
+ generateDiecutScreenshot: (diecutId: string, opts?: {
52
+ multiplier?: number;
53
+ useIdentityViewport?: boolean;
54
+ }) => Promise<void>;
55
+ /**
56
+ * 从 diecut 的「已保存 JSON 状态」生成该 diecut 的 inverse mask blob。
57
+ * 修复 H22:buildInitialPreviewRenderData 在 SPLIT 模式发现缺失分片时,原 fallback
58
+ * 用当前画布生成(只含 active 分片内容)会污染其他分片的 inverse mask 为空。
59
+ * 改用此 API 时,会用该分片自己保存的 JSON 状态离屏渲染再裁切,保证内容正确。
60
+ */
61
+ generateDiecutScreenshotFromSavedState?: (diecutId: string) => Promise<boolean>;
62
+ /** 与下载按钮相同的拿图逻辑,供 renderAllTemplates 复用 */
63
+ getPreviewImageBlobs?: () => Promise<Array<{
64
+ index: number;
65
+ blob: Blob;
66
+ }>>;
67
+ /** 分片 Guideline 内存副本(拖动后已写回 bounds),供截图与导出与画布一致 */
68
+ getCachedSplitGuidelineJson?: (templateJsonUrl: string) => Record<string, unknown> | null | undefined;
69
+ /** Zone 模式下分片实时位置与对应 MASK,供 COMPLETE 走实时裁切生成 fabricScreenshotList */
70
+ getZonesForScreenshot?: () => Array<{
71
+ id: number;
72
+ name?: string;
73
+ placed: {
74
+ left: number;
75
+ top: number;
76
+ width: number;
77
+ height: number;
78
+ };
79
+ maskUrl: string;
80
+ }>;
81
+ /** 为 true 时走 Zone 裁切 fabric 列表(COMPLETE 与 SPLIT 在开启 completeUsesZoneModel 时均可) */
82
+ isZonesMode?: () => boolean;
83
+ /**
84
+ * COMPLETE 拖动态:仅重建该 groupId 的 live 裁切,其余分片沿用 previewRenderData 中已有项。
85
+ */
86
+ getDraggingLiveZoneGroupId?: () => string | null;
87
+ /** 画布对象拖动中:禁止 refreshZonesPreviewQuick(含 debounce timer 触发的二次调用) */
88
+ getIsDraggingObject?: () => boolean;
89
+ }): {
90
+ buildInitialPreviewRenderData: (buildOpts?: PreviewBuildOptions) => Promise<void>;
91
+ getRenderDataForIndex: (index: number, opts?: RenderDataForIndexOptions) => Promise<IRenderByJson | null>;
92
+ renderAllTemplates: () => Promise<Array<{
93
+ index: number;
94
+ bitmap: ImageBitmap | null;
95
+ blob?: Blob;
96
+ }>>;
97
+ resetCompleteModeBatchCache: () => void;
98
+ refreshCompletePreviewFromDesignClipBlobs: (clips: SplitPieceDesignClipBlob[]) => void;
99
+ refreshZonesPreviewQuick: (quickOpts?: {
100
+ /** 松手后拖动态已结束,用此 id 仅更新当前分片 */
101
+ focusZoneId?: string | null;
102
+ /** 为 true 时跳过低清预览最小间隔(松手尽快出图) */
103
+ skipMinInterval?: boolean;
104
+ }) => Promise<void>;
105
+ prewarmZonesPreviewQuick: (target?: any) => Promise<void>;
106
+ endZonesPreviewQuick: () => void;
107
+ clearZoneScreenshotCache: () => void;
108
+ disposeZoneScreenshotWorker: () => void;
109
+ getPreviewBuildInFlight: () => Promise<void> | null;
110
+ };
111
+ export {};
@@ -0,0 +1,62 @@
1
+ /**
2
+ * 预览更新队列(默认 debounce;可选 immediate 立即执行完整管道)
3
+ * 负责 queuePreviewUpdate:保存当前 diecut 状态 -> 生成遮罩截图 -> 刷新预览 renderData
4
+ */
5
+ export type QueuePreviewUpdateMeta = {
6
+ /** 日志 / 调试来源标识 */
7
+ source?: string;
8
+ startTime?: number;
9
+ /** 为 true 时跳过 debounce,立即执行保存 / 截图 / build(仍会取消尚未执行的 debounce 任务) */
10
+ immediate?: boolean;
11
+ /** 拖动中入队时保留:松手后由 flushDeferredPreviewAfterDrag 重放 */
12
+ deferredFromDrag?: boolean;
13
+ /** 为 false 时仅提交 quick preview renderData,不做 HD 预览构建 */
14
+ commitHd?: boolean;
15
+ /** 为 true 时不触发 generateDiecutScreenshot(极速松手已用 refreshZonesPreviewQuick 出图) */
16
+ skipDiecutScreenshot?: boolean;
17
+ /** 为 true 时不执行 buildInitialPreviewRenderData(避免松手后再跑一遍 Three) */
18
+ skipBuildPreview?: boolean;
19
+ };
20
+ type PreviewBuildOptions = {
21
+ commitHd?: boolean;
22
+ skipDiecutScreenshot?: boolean;
23
+ skipBuildPreview?: boolean;
24
+ };
25
+ export declare function usePreviewUpdateQueue(options: {
26
+ getSelectedDiecutId: () => string;
27
+ getHasCanvas: () => boolean;
28
+ saveCanvasState: (diecutId: string) => Promise<void>;
29
+ generateDiecutScreenshot: (diecutId: string, precapturedBaseBlob?: Blob | null) => Promise<void>;
30
+ /**
31
+ * 后台截图前先同步捕获当前主画布像素。否则 generateDiecutScreenshot 内部 idle capture
32
+ * 可能晚于分片切换,导致用下一分片画布内容写入上一分片缓存。
33
+ */
34
+ captureMainBaseBlob?: () => Promise<Blob | null>;
35
+ buildInitialPreviewRenderData: (opts?: PreviewBuildOptions) => Promise<void> | void;
36
+ delay?: number;
37
+ /** 为 true 时不入队(如批量还原设计时暂停预览刷新) */
38
+ shouldSkip?: () => boolean;
39
+ /**
40
+ * 为 true 时跳过 generateDiecutScreenshot(如 COMPLETE:预览 fabric 列表由 buildCompleteFabricScreenshotList 生成,不依赖 getInverseMaskUrl)
41
+ */
42
+ shouldSkipDiecutScreenshot?: () => boolean;
43
+ /**
44
+ * generateDiecutScreenshot 成功后清除该 diecut 的 dirty 标记。
45
+ * 关键优化:user 改了 prev 分片后,queuePreviewUpdate 会异步触发 generateDiecutScreenshot 并 commit
46
+ * inverse-mask blob。如果不清 dirty,切换分片时 useEditorWatchers 内 isDiecutDirty(prev)=true
47
+ * 会触发第二次截图(冗余 1-2.5s)。
48
+ */
49
+ consumeDiecutDirty?: (id: string) => void;
50
+ /** 画布对象拖动中:不入队执行截图/build,合并为松手后一次 */
51
+ getIsDraggingObject?: () => boolean;
52
+ /**
53
+ * 松手重放 `deferredWhileDrag` 时调用(与外层 `queuePreviewUpdateRef` 等包装层一致,例如统一注入 commitHd)
54
+ */
55
+ replayDeferred?: (reason: string, meta?: QueuePreviewUpdateMeta) => void;
56
+ }): {
57
+ queuePreviewUpdate: (reason: string, meta?: QueuePreviewUpdateMeta) => void;
58
+ clearPending: () => void;
59
+ dispose: () => void;
60
+ flushDeferredPreviewAfterDrag: () => void;
61
+ };
62
+ export {};
@@ -0,0 +1,166 @@
1
+ import type { ProductItem, BasicInfo, DiecutResponse, DeformationResponse, ProductListApi, ProductDetailApi } from '../../../types';
2
+ export declare function useProductData(props: any, options?: {
3
+ productListApi?: ProductListApi;
4
+ productDetailApi?: ProductDetailApi;
5
+ productListPageSize?: number;
6
+ productListInitialPage?: number;
7
+ /** 仅当该 ID 在第一页列表中时才选中,否则 selectedProductIndex 设为 -1 */
8
+ initialProductId?: string | number;
9
+ }): {
10
+ isListMode: import("vue").ComputedRef<boolean>;
11
+ productItemsState: import("vue").Ref<{
12
+ id?: number | string | undefined;
13
+ name?: string | undefined;
14
+ description?: string | undefined;
15
+ coverImg?: string | undefined;
16
+ }[], ProductItem[] | {
17
+ id?: number | string | undefined;
18
+ name?: string | undefined;
19
+ description?: string | undefined;
20
+ coverImg?: string | undefined;
21
+ }[]>;
22
+ productTotal: import("vue").Ref<number, number>;
23
+ productPage: import("vue").Ref<number, number>;
24
+ productPageSize: import("vue").Ref<number, number>;
25
+ selectedProductIndex: import("vue").Ref<number, number>;
26
+ basicInfoState: import("vue").Ref<{
27
+ id?: number | string | undefined;
28
+ name?: string | undefined;
29
+ description?: string | undefined;
30
+ sizes?: string[] | undefined;
31
+ colors?: string[] | undefined;
32
+ colorNamesZh?: string[] | undefined;
33
+ colorNamesEn?: string[] | undefined;
34
+ colorsZh?: string[] | undefined;
35
+ coverImg?: string | undefined;
36
+ sku?: string | undefined;
37
+ } | null, BasicInfo | {
38
+ id?: number | string | undefined;
39
+ name?: string | undefined;
40
+ description?: string | undefined;
41
+ sizes?: string[] | undefined;
42
+ colors?: string[] | undefined;
43
+ colorNamesZh?: string[] | undefined;
44
+ colorNamesEn?: string[] | undefined;
45
+ colorsZh?: string[] | undefined;
46
+ coverImg?: string | undefined;
47
+ sku?: string | undefined;
48
+ } | null>;
49
+ diecutDataState: import("vue").Ref<{
50
+ msg?: string | undefined;
51
+ code?: number | undefined;
52
+ data?: {
53
+ jsonURL?: string | null | undefined;
54
+ size?: string | undefined;
55
+ type?: string | undefined;
56
+ resources?: {
57
+ groupId?: string | undefined;
58
+ groupName?: string | undefined;
59
+ fileName?: string | undefined;
60
+ url?: string | undefined;
61
+ type?: string | undefined;
62
+ width?: number | undefined;
63
+ height?: number | undefined;
64
+ }[] | null | undefined;
65
+ sizeMode?: string | undefined;
66
+ }[] | undefined;
67
+ } | null, DiecutResponse | {
68
+ msg?: string | undefined;
69
+ code?: number | undefined;
70
+ data?: {
71
+ jsonURL?: string | null | undefined;
72
+ size?: string | undefined;
73
+ type?: string | undefined;
74
+ resources?: {
75
+ groupId?: string | undefined;
76
+ groupName?: string | undefined;
77
+ fileName?: string | undefined;
78
+ url?: string | undefined;
79
+ type?: string | undefined;
80
+ width?: number | undefined;
81
+ height?: number | undefined;
82
+ }[] | null | undefined;
83
+ sizeMode?: string | undefined;
84
+ }[] | undefined;
85
+ } | null>;
86
+ deformationDataState: import("vue").Ref<{
87
+ msg?: string | undefined;
88
+ code?: number | undefined;
89
+ data?: {
90
+ size?: string | undefined;
91
+ sizeMode?: string | undefined;
92
+ infos?: {
93
+ name?: string | undefined;
94
+ jsonURL?: string | undefined;
95
+ sort?: number | undefined;
96
+ resources?: {
97
+ name?: string | undefined;
98
+ url?: string | undefined;
99
+ }[] | undefined;
100
+ }[] | null | undefined;
101
+ }[] | {
102
+ color?: string | undefined;
103
+ sizes?: {
104
+ size?: string | undefined;
105
+ sizeMode?: string | undefined;
106
+ infos?: {
107
+ name?: string | undefined;
108
+ jsonURL?: string | undefined;
109
+ sort?: number | undefined;
110
+ resources?: {
111
+ name?: string | undefined;
112
+ url?: string | undefined;
113
+ }[] | undefined;
114
+ }[] | null | undefined;
115
+ }[] | undefined;
116
+ }[] | undefined;
117
+ } | null, DeformationResponse | {
118
+ msg?: string | undefined;
119
+ code?: number | undefined;
120
+ data?: {
121
+ size?: string | undefined;
122
+ sizeMode?: string | undefined;
123
+ infos?: {
124
+ name?: string | undefined;
125
+ jsonURL?: string | undefined;
126
+ sort?: number | undefined;
127
+ resources?: {
128
+ name?: string | undefined;
129
+ url?: string | undefined;
130
+ }[] | undefined;
131
+ }[] | null | undefined;
132
+ }[] | {
133
+ color?: string | undefined;
134
+ sizes?: {
135
+ size?: string | undefined;
136
+ sizeMode?: string | undefined;
137
+ infos?: {
138
+ name?: string | undefined;
139
+ jsonURL?: string | undefined;
140
+ sort?: number | undefined;
141
+ resources?: {
142
+ name?: string | undefined;
143
+ url?: string | undefined;
144
+ }[] | undefined;
145
+ }[] | null | undefined;
146
+ }[] | undefined;
147
+ }[] | undefined;
148
+ } | null>;
149
+ lastProductKey: import("vue").Ref<string | null, string | null>;
150
+ effectiveBasicInfo: import("vue").ComputedRef<any>;
151
+ effectiveDiecutData: import("vue").ComputedRef<any>;
152
+ effectiveDeformationData: import("vue").ComputedRef<any>;
153
+ productItems: import("vue").ComputedRef<ProductItem[]>;
154
+ selectedProduct: import("vue").ComputedRef<ProductItem | undefined>;
155
+ hasProductTotal: import("vue").ComputedRef<boolean>;
156
+ totalProducts: import("vue").ComputedRef<number>;
157
+ totalPages: import("vue").ComputedRef<number>;
158
+ hasPrevPage: import("vue").ComputedRef<boolean>;
159
+ hasNextPage: import("vue").ComputedRef<boolean>;
160
+ loadProductList: (page?: number) => Promise<void>;
161
+ loadProductDetails: (productId: number | string) => Promise<void>;
162
+ changeProductPage: (nextPage: number) => Promise<void>;
163
+ getCurrentProductKey: (product: ProductItem | null, basicInfo: BasicInfo | null) => string | null;
164
+ hasProductChanged: (product: ProductItem | null, basicInfo: BasicInfo | null) => boolean;
165
+ resetForProductChange: () => void;
166
+ };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * COMPLETE 分片蒙版「抓手模式」:关闭时不可拖;开启后双击某片进入可拖状态,再双击同一蒙版仅卸武装(不关闭抓手);Esc 退出抓手模式。
3
+ */
4
+ import { type Ref } from 'vue';
5
+ import { type Canvas } from 'fabric';
6
+ export declare function useSplitPieceHandTool(options: {
7
+ getCanvas: () => Canvas | null;
8
+ isReadOnly: () => boolean;
9
+ /** 分片 Guideline 与画布蒙版同步中:勿因 selection 瞬态 disarm(applyEditorGuideLayers 会移除对象触发 cleared) */
10
+ shouldSuppressSelectionDisarm?: () => boolean;
11
+ /**
12
+ * 双击分片蒙版(或虚线映射到蒙版)时聚焦视口;抓手关闭时蒙版 evented:false,仍用几何命中。
13
+ * 抓手开启且本次双击为「退出武装」时不调用。
14
+ */
15
+ onSplitMaskDoubleClickFocus?: (maskObject: any) => void;
16
+ /** 双击画布空白区域(非对象)时回调,可用于恢复视口与清理焦点提示 */
17
+ onCanvasBlankDoubleClick?: () => void;
18
+ /** 鼠标悬浮在分片(含虚线层)上时回调,用于显示交互提示 */
19
+ onSplitMaskHoverChange?: (payload: {
20
+ groupId: string;
21
+ partName: string;
22
+ clientX: number;
23
+ clientY: number;
24
+ } | null) => void;
25
+ }): {
26
+ handToolActive: Ref<boolean, boolean>;
27
+ applyMaskInteractionPolicy: () => void;
28
+ restoreArmedSplitMaskSelection: () => void;
29
+ isArmedMaskActiveOnCanvas: () => boolean;
30
+ getArmedGroupId: () => string | null;
31
+ attachToCanvas: () => void;
32
+ detachFromCanvas: () => void;
33
+ resetForNewCanvas: () => void;
34
+ };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 模板加载/模式切换管理 Composable
3
+ * 负责模板 JSON 加载、画布重置、模式配置获取等
4
+ */
5
+ import type { Canvas } from 'fabric';
6
+ import type { Ref, ComputedRef } from 'vue';
7
+ export interface TemplateItem {
8
+ jsonURL?: string;
9
+ resources?: any[];
10
+ type?: string;
11
+ size?: string;
12
+ }
13
+ export interface UseTemplateLoaderOptions {
14
+ getCanvas: () => Canvas | null;
15
+ toProxyUrl: (url: string) => string;
16
+ templateModeOptions: ComputedRef<TemplateItem[]>;
17
+ selectedSize: Ref<string>;
18
+ selectedMode: Ref<string>;
19
+ setLoadingTemplate: (loading: boolean) => void;
20
+ templateError: Ref<string>;
21
+ loadCanvasJson: (json: any, onDone?: () => void | Promise<void>) => Promise<void>;
22
+ clearGuideResources: () => void;
23
+ renderGuideResources: (resources: any[]) => void;
24
+ /** 若提供则在 loadTemplateJson 完成后调用(如单片分片可拖动蒙版),否则仍用 renderGuideResources */
25
+ applyGuideLayers?: (filteredTemplateGuideResources: any[]) => void | Promise<void>;
26
+ isGuideResource: (resource: any) => boolean;
27
+ setZoom: (value: number) => void;
28
+ zoom: Ref<number>;
29
+ /** 模板 JSON 拉取成功后回调(用于保存快照时把 jsonURL 替换为解析对象) */
30
+ onTemplateJsonLoaded?: (jsonURL: string, json: unknown) => void;
31
+ }
32
+ export declare function useTemplateLoader(options: UseTemplateLoaderOptions): {
33
+ resetCanvasForTemplate: () => void;
34
+ getModeConfig: () => TemplateItem | null;
35
+ loadTemplateJson: (jsonURL: string, resources?: any[]) => Promise<void>;
36
+ };