customforge 0.1.0-alpha.2 → 0.1.1

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 (47) hide show
  1. package/CHANGELOG.md +91 -56
  2. package/LICENSES/NunitoSans-OFL.txt +93 -93
  3. package/LICENSES/plain-mug-CC-BY-4.0.txt +11 -0
  4. package/README.md +592 -461
  5. package/README.zh-CN.md +587 -459
  6. package/dist/{ProductCustomizer-rMRyWe7L.js → ProductCustomizer-BnjY3v7d.js} +898 -156
  7. package/dist/ProductCustomizer-BnjY3v7d.js.map +1 -0
  8. package/dist/bridge/TextureBridge.d.ts +1 -1
  9. package/dist/core/api.d.ts +94 -0
  10. package/dist/core/api.d.ts.map +1 -0
  11. package/dist/core/config.d.ts +3 -12
  12. package/dist/core/config.d.ts.map +1 -1
  13. package/dist/core/design.d.ts.map +1 -1
  14. package/dist/core/types.d.ts +183 -5
  15. package/dist/core/types.d.ts.map +1 -1
  16. package/dist/core/uv.d.ts +8 -0
  17. package/dist/core/uv.d.ts.map +1 -0
  18. package/dist/cup_decal_small_margins.glb +0 -0
  19. package/dist/customizer/ProductCustomizer.d.ts +98 -9
  20. package/dist/customizer/ProductCustomizer.d.ts.map +1 -1
  21. package/dist/editor/DesignEditor.d.ts +118 -10
  22. package/dist/editor/DesignEditor.d.ts.map +1 -1
  23. package/dist/editor/uvBounds.d.ts +15 -0
  24. package/dist/editor/uvBounds.d.ts.map +1 -0
  25. package/dist/index.d.ts +4 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/style.css +2120 -1327
  30. package/dist/viewer/ProductViewer.d.ts +37 -6
  31. package/dist/viewer/ProductViewer.d.ts.map +1 -1
  32. package/dist/viewer/uvLayout.d.ts +11 -0
  33. package/dist/viewer/uvLayout.d.ts.map +1 -0
  34. package/dist/workbench/CustomForgeWorkbench.d.ts +85 -8
  35. package/dist/workbench/CustomForgeWorkbench.d.ts.map +1 -1
  36. package/dist/workbench/config.d.ts +42 -1
  37. package/dist/workbench/config.d.ts.map +1 -1
  38. package/dist/workbench/icons.d.ts.map +1 -1
  39. package/dist/workbench/index.d.ts +3 -3
  40. package/dist/workbench/index.d.ts.map +1 -1
  41. package/dist/workbench/template.d.ts.map +1 -1
  42. package/dist/workbench/types.d.ts +261 -13
  43. package/dist/workbench/types.d.ts.map +1 -1
  44. package/dist/workbench.js +1248 -116
  45. package/dist/workbench.js.map +1 -1
  46. package/package.json +27 -20
  47. package/dist/ProductCustomizer-rMRyWe7L.js.map +0 -1
@@ -1,5 +1,6 @@
1
- import { Canvas, FabricImage, Textbox } from 'fabric';
2
- import type { AddImageOptions, AddTextOptions, DesignDocument, DesignObject, HistoryState } from '../core/types';
1
+ import { Canvas } from 'fabric';
2
+ import type { AddImageOptions, AddTextOptions, CanvasBounds, DesignCanvas as DesignCanvasSize, DesignDocument, DesignObject, EditorAppearance, HistoryState, ImageDesignObject, TextDesignObject, UpdateObjectTransformOptions, UpdateTextOptions } from '../core/types';
3
+ import type { UvLayout } from '../core/uv';
3
4
  /** 二维编辑器内部初始化配置 */
4
5
  interface DesignEditorOptions {
5
6
  /** 画布逻辑宽度,单位为像素 */
@@ -8,6 +9,18 @@ interface DesignEditorOptions {
8
9
  height: number;
9
10
  /** 最多保留的撤销步骤数量 */
10
11
  historyLimit: number;
12
+ /** 编辑画布的无障碍名称 */
13
+ ariaLabel?: string;
14
+ /** 未提供内容时添加到画布的默认文字 */
15
+ defaultText?: string;
16
+ /** 空文字对象的默认名称 */
17
+ textObjectName?: string;
18
+ /** 普通图片对象的默认名称 */
19
+ imageObjectName?: string;
20
+ /** 背景图片对象的默认名称 */
21
+ backgroundObjectName?: string;
22
+ /** 选择框、对象控制点和 UV 辅助层外观 */
23
+ appearance?: EditorAppearance;
11
24
  }
12
25
  type RenderListener = () => void;
13
26
  type SelectionListener = (objectIds: string[]) => void;
@@ -15,7 +28,7 @@ type HistoryListener = (state: HistoryState) => void;
15
28
  /**
16
29
  * 基于 Fabric.js 的二维纹理编辑器
17
30
  *
18
- * 负责基础纹理、文字、图片、对象选择和 PNG 导出
31
+ * 负责基础纹理、UV 区域辅助层、文字、图片、对象选择和 PNG 导出
19
32
  * 显示尺寸可以响应容器变化,内部逻辑尺寸保持不变
20
33
  */
21
34
  export declare class DesignEditor {
@@ -24,6 +37,12 @@ export declare class DesignEditor {
24
37
  private readonly host;
25
38
  private readonly width;
26
39
  private readonly height;
40
+ private readonly defaultText;
41
+ private readonly textObjectName;
42
+ private readonly imageObjectName;
43
+ private readonly backgroundObjectName;
44
+ private readonly appearance;
45
+ private editableBounds;
27
46
  private readonly renderListeners;
28
47
  private readonly selectionListeners;
29
48
  private readonly historyListeners;
@@ -36,17 +55,29 @@ export declare class DesignEditor {
36
55
  private readonly imageRoles;
37
56
  private readonly resizeObserver;
38
57
  private readonly history;
58
+ private readonly uvOverlay;
59
+ private readonly textureRenderer;
60
+ private readonly textureCanvasElement;
61
+ private readonly textureContext;
39
62
  private historySignature;
40
63
  private historyTimer?;
41
64
  private historyBusy;
65
+ private renderingTexture;
42
66
  private objectIdSequence;
43
67
  /**
44
68
  * @param host 二维编辑器挂载容器
45
69
  * @param options 画布逻辑尺寸和历史容量
46
70
  */
47
71
  constructor(host: HTMLElement, options: DesignEditorOptions);
48
- /** 供 Three.js 创建 CanvasTexture 的底层 HTML Canvas */
72
+ /** 供 Three.js 创建 CanvasTexture 的纯设计画布,不包含选择框和变换控件 */
49
73
  get textureCanvas(): HTMLCanvasElement;
74
+ /**
75
+ * 在交互画布上显示目标 Mesh 的 UV 可打印区域,但不写入实时纹理或导出图片
76
+ *
77
+ * @param layout 从当前目标 Mesh 提取的 UV 布局
78
+ * @param flipY 是否按照垂直翻转后的纹理方向显示
79
+ */
80
+ setUvLayout(layout: UvLayout, flipY: boolean): void;
50
81
  /** 当前画布中设计对象的数量,不包含产品基础纹理 */
51
82
  get objectCount(): number;
52
83
  /**
@@ -80,6 +111,10 @@ export declare class DesignEditor {
80
111
  * @returns 按画布层级从后到前排列的对象数组
81
112
  */
82
113
  getObjects(): DesignObject[];
114
+ /** 返回当前逻辑画布尺寸 */
115
+ getCanvasSize(): DesignCanvasSize;
116
+ /** 返回当前 UV 可打印区域的独立包围框 */
117
+ getPrintableBounds(): CanvasBounds;
83
118
  /** 当前选中对象的 ID,按画布层级从后到前排列 */
84
119
  getSelectedObjectIds(): string[];
85
120
  /**
@@ -89,6 +124,21 @@ export declare class DesignEditor {
89
124
  * @returns 是否找到并选中了对象
90
125
  */
91
126
  selectObject(id: string): boolean;
127
+ /**
128
+ * 按稳定 ID 同时选中多个可见对象
129
+ *
130
+ * 所有 ID 都必须有效且对象可见,否则保持原选区不变
131
+ *
132
+ * @param ids 对象 ID,空数组表示清除选区
133
+ * @returns 是否应用了请求的选区
134
+ */
135
+ selectObjects(ids: readonly string[]): boolean;
136
+ /**
137
+ * 清除当前画布选区,不修改设计内容或历史记录
138
+ *
139
+ * @returns 清除前是否存在选中对象
140
+ */
141
+ clearSelection(): boolean;
92
142
  /**
93
143
  * 按稳定 ID 删除一个对象
94
144
  *
@@ -104,6 +154,15 @@ export declare class DesignEditor {
104
154
  * @returns 对象层级是否发生变化
105
155
  */
106
156
  moveObject(id: string, index: number): boolean;
157
+ /**
158
+ * 将现有图片转换为铺满当前 UV 可打印区域的设计背景
159
+ *
160
+ * 转换会替换已有设计背景、重置旋转、锁定对象并移动到最底层
161
+ *
162
+ * @param id Design JSON 中的图片对象 ID
163
+ * @returns 是否找到普通图片并完成转换
164
+ */
165
+ setImageAsBackground(id: string): boolean;
107
166
  /**
108
167
  * 修改对象在图层面板中的名称
109
168
  *
@@ -129,7 +188,37 @@ export declare class DesignEditor {
129
188
  */
130
189
  setObjectLocked(id: string, locked: boolean): boolean;
131
190
  /**
132
- * 设置铺满画布的基础纹理,不传地址时恢复默认背景色
191
+ * 更新对象中心位置、缩放、旋转和翻转
192
+ *
193
+ * 对象最终仍会约束在逻辑画布内,连续调用会合并为一个历史步骤
194
+ *
195
+ * @param id Design JSON 中的对象 ID
196
+ * @param options 要更新的变换字段
197
+ * @returns 约束后的对象快照,找不到对象时返回 undefined
198
+ * @throws 数值无效或缩放倍数不大于零时抛出错误
199
+ */
200
+ updateObjectTransform(id: string, options: UpdateObjectTransformOptions): DesignObject | undefined;
201
+ /**
202
+ * 修改已有文字对象的内容和排版样式
203
+ *
204
+ * 连续调用会在短暂空闲后合并为一个历史步骤
205
+ * 字体必须由消费页面提前加载,否则浏览器会使用回退字体
206
+ *
207
+ * @param id Design JSON 中的对象 ID
208
+ * @param options 要修改的文字属性,未传字段保持不变
209
+ * @returns 是否找到并更新了文字对象
210
+ * @throws 字号、行高、字距、字重或 CSS 颜色不符合约束时抛出错误
211
+ */
212
+ updateText(id: string, options: UpdateTextOptions): boolean;
213
+ /**
214
+ * 让一个未锁定文字对象进入画布内联编辑状态
215
+ *
216
+ * @param id Design JSON 中的对象 ID
217
+ * @returns 是否找到文字对象并进入编辑状态
218
+ */
219
+ editText(id: string): boolean;
220
+ /**
221
+ * 设置铺满画布的基础纹理,不传地址时恢复透明背景
133
222
  *
134
223
  * 背景纹理不参与对象选择,但会包含在实时纹理和 PNG 导出中
135
224
  *
@@ -144,22 +233,22 @@ export declare class DesignEditor {
144
233
  * 对象过大时会等比缩小,越界时会自动移回画布
145
234
  *
146
235
  * @param options 文字内容、位置和样式
147
- * @returns 创建的 Fabric Textbox
236
+ * @returns 创建后的可持久化文字对象快照
148
237
  */
149
- addText(options?: AddTextOptions): Textbox;
238
+ addText(options?: AddTextOptions): TextDesignObject;
150
239
  /**
151
240
  * 加载、添加并选中一个图片对象
152
241
  *
153
- * role 为 background 时替换已有设计背景、铺满画布并默认锁定在最底层
242
+ * role 为 background 时替换已有设计背景、铺满当前 UV 可打印区域并默认锁定在最底层
154
243
  * 图片位置使用画布像素坐标,原点位于图片中心
155
244
  * 对象过大时会等比缩小,越界时会自动移回画布
156
245
  * 远程图片必须提供正确的 CORS 响应头才能安全导出 PNG
157
246
  *
158
247
  * @param options 图片地址、中心位置和显示宽度
159
- * @returns 创建的 FabricImage
248
+ * @returns 创建后的可持久化图片对象快照
160
249
  * @throws 图片加载失败或被 CORS 策略阻止时抛出错误
161
250
  */
162
- addImage(options: AddImageOptions): Promise<FabricImage>;
251
+ addImage(options: AddImageOptions): Promise<ImageDesignObject>;
163
252
  /**
164
253
  * 返回与 Fabric.js 无关的当前设计快照
165
254
  *
@@ -206,6 +295,20 @@ export declare class DesignEditor {
206
295
  * @throws 画布被无 CORS 授权的远程图片污染时抛出安全错误
207
296
  */
208
297
  exportTexture(filename?: string): void;
298
+ /**
299
+ * 返回不含选择框和 UV 辅助层的 PNG Data URL
300
+ *
301
+ * @returns 与逻辑画布同尺寸的 PNG Data URL
302
+ * @throws 远程图片污染 Canvas 时抛出安全错误
303
+ */
304
+ getTextureDataUrl(): string;
305
+ /**
306
+ * 异步返回不含选择框和 UV 辅助层的 PNG Blob
307
+ *
308
+ * @returns 与逻辑画布同尺寸的 PNG Blob
309
+ * @throws 远程图片污染 Canvas 或浏览器无法编码时抛出错误
310
+ */
311
+ getTextureBlob(): Promise<Blob>;
209
312
  /** 释放 ResizeObserver、事件监听和 Fabric Canvas */
210
313
  destroy(): void;
211
314
  private addAndSelect;
@@ -226,6 +329,11 @@ export declare class DesignEditor {
226
329
  private notifyHistoryChange;
227
330
  private constrainObjectToCanvas;
228
331
  private resizeDisplay;
332
+ private applySelection;
333
+ private objectControlAppearance;
334
+ private validateTransformOptions;
335
+ private fitImageToEditableBounds;
336
+ private renderTextureCanvas;
229
337
  private markRenderState;
230
338
  }
231
339
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"DesignEditor.d.ts","sourceRoot":"","sources":["../../src/editor/DesignEditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DesignEditor.d.ts","sourceRoot":"","sources":["../../src/editor/DesignEditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { UvLayout } from '../core/uv';
2
+ import type { ObjectBounds } from './objectBounds';
3
+ /**
4
+ * 将 UV 三角形的坐标范围转换为逻辑画布包围框
5
+ *
6
+ * UV 坐标会限制在 0 到 1 之间;布局为空、无效或退化时回退到整张画布
7
+ *
8
+ * @param layout 当前可打印 Mesh 的 UV 布局
9
+ * @param flipY 是否按照垂直翻转后的纹理方向计算
10
+ * @param canvasWidth 逻辑画布宽度
11
+ * @param canvasHeight 逻辑画布高度
12
+ * @returns 当前 UV 可打印区域在逻辑画布中的轴对齐包围框
13
+ */
14
+ export declare function calculateUvCanvasBounds(layout: UvLayout, flipY: boolean, canvasWidth: number, canvasHeight: number): ObjectBounds;
15
+ //# sourceMappingURL=uvBounds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uvBounds.d.ts","sourceRoot":"","sources":["../../src/editor/uvBounds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAMlD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,YAAY,CAmCd"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import './style.css';
2
2
  import { ProductCustomizer } from './customizer/ProductCustomizer';
3
+ import type { ProductCustomizerApi } from './core/api';
3
4
  import type { CustomizerOptions } from './core/types';
4
5
  /**
5
6
  * 创建产品定制器实例并完成模型、编辑器和纹理同步初始化
@@ -24,7 +25,8 @@ import type { CustomizerOptions } from './core/types';
24
25
  * })
25
26
  * ```
26
27
  */
27
- export declare function createCustomizer(options: CustomizerOptions): Promise<ProductCustomizer>;
28
+ export declare function createCustomizer(options: CustomizerOptions): Promise<ProductCustomizerApi>;
28
29
  export { ProductCustomizer };
29
- export type { AddImageOptions, AddTextOptions, CustomizerEventMap, CustomizerOptions, DesignCanvas, DesignDocument, DesignImageRole, DesignObject, DesignObjectState, DesignObjectTransform, ImageDesignObject, HistoryState, ProductConfiguration, TextDesignObject, } from './core/types';
30
+ export type { CustomizerEventListener, ProductCustomizerApi, } from './core/api';
31
+ export type { AddImageOptions, AddTextOptions, CanvasBounds, CustomizerAppearance, CustomizerEventMap, CustomizerEventName, CustomizerOptions, CustomizerState, DesignCanvas, DesignDocument, DesignImageRole, DesignObject, DesignObjectState, DesignObjectTransform, ElementTarget, ImageDesignObject, EditorAppearance, HistoryState, ProductConfiguration, ProductViewState, ResolvedProductConfiguration, TextAlignment, TextDesignObject, TextFontStyle, TextFontWeight, UpdateObjectTransformOptions, UpdateTextOptions, Vector3Value, ViewerAppearance, } from './core/types';
30
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAE5B;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAC5B,YAAY,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAC5B,YAAY,EACV,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,eAAe,EACf,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,EAC5B,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,4BAA4B,EAC5B,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,GACjB,MAAM,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as ProductCustomizer } from "./ProductCustomizer-rMRyWe7L.js";
1
+ import { t as ProductCustomizer } from "./ProductCustomizer-BnjY3v7d.js";
2
2
  //#region src/index.ts
3
3
  /**
4
4
  * 创建产品定制器实例并完成模型、编辑器和纹理同步初始化
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import './style.css'\r\nimport { ProductCustomizer } from './customizer/ProductCustomizer'\r\nimport type { CustomizerOptions } from './core/types'\r\n\r\n/**\r\n * 创建产品定制器实例并完成模型、编辑器和纹理同步初始化\r\n *\r\n * 仅支持浏览器环境,应在 DOM 挂载容器可用后调用\r\n * 编辑器和查看器必须使用两个不同的容器\r\n * 不再使用返回的实例时必须调用 `destroy()` 释放资源\r\n *\r\n * @param options 编辑器容器、查看器容器和产品资源配置\r\n * @returns 初始化完成的产品定制器实例\r\n * @throws DOM 容器不存在、两个容器相同、模型加载失败或目标 Mesh 不存在时抛出错误\r\n *\r\n * @example\r\n * ```ts\r\n * const customizer = await createCustomizer({\r\n * editor: '#editor',\r\n * viewer: '#viewer',\r\n * product: {\r\n * modelUrl: 'https://example.com/product.glb',\r\n * surfaceMesh: 'PrintArea',\r\n * },\r\n * })\r\n * ```\r\n */\r\nexport async function createCustomizer(\r\n options: CustomizerOptions,\r\n): Promise<ProductCustomizer> {\r\n return ProductCustomizer.create(options)\r\n}\r\n\r\nexport { ProductCustomizer }\r\nexport type {\r\n AddImageOptions,\r\n AddTextOptions,\r\n CustomizerEventMap,\r\n CustomizerOptions,\r\n DesignCanvas,\r\n DesignDocument,\r\n DesignImageRole,\r\n DesignObject,\r\n DesignObjectState,\r\n DesignObjectTransform,\r\n ImageDesignObject,\r\n HistoryState,\r\n ProductConfiguration,\r\n TextDesignObject,\r\n} from './core/types'\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,eAAsB,iBACpB,SAC4B;CAC5B,OAAO,kBAAkB,OAAO,OAAO;AACzC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import './style.css'\nimport { ProductCustomizer } from './customizer/ProductCustomizer'\nimport type { ProductCustomizerApi } from './core/api'\nimport type { CustomizerOptions } from './core/types'\n\n/**\n * 创建产品定制器实例并完成模型、编辑器和纹理同步初始化\n *\n * 仅支持浏览器环境,应在 DOM 挂载容器可用后调用\n * 编辑器和查看器必须使用两个不同的容器\n * 不再使用返回的实例时必须调用 `destroy()` 释放资源\n *\n * @param options 编辑器容器、查看器容器和产品资源配置\n * @returns 初始化完成的产品定制器实例\n * @throws DOM 容器不存在、两个容器相同、模型加载失败或目标 Mesh 不存在时抛出错误\n *\n * @example\n * ```ts\n * const customizer = await createCustomizer({\n * editor: '#editor',\n * viewer: '#viewer',\n * product: {\n * modelUrl: 'https://example.com/product.glb',\n * surfaceMesh: 'PrintArea',\n * },\n * })\n * ```\n */\nexport async function createCustomizer(\n options: CustomizerOptions,\n): Promise<ProductCustomizerApi> {\n return ProductCustomizer.create(options)\n}\n\nexport { ProductCustomizer }\nexport type {\n CustomizerEventListener,\n ProductCustomizerApi,\n} from './core/api'\nexport type {\n AddImageOptions,\n AddTextOptions,\n CanvasBounds,\n CustomizerAppearance,\n CustomizerEventMap,\n CustomizerEventName,\n CustomizerOptions,\n CustomizerState,\n DesignCanvas,\n DesignDocument,\n DesignImageRole,\n DesignObject,\n DesignObjectState,\n DesignObjectTransform,\n ElementTarget,\n ImageDesignObject,\n EditorAppearance,\n HistoryState,\n ProductConfiguration,\n ProductViewState,\n ResolvedProductConfiguration,\n TextAlignment,\n TextDesignObject,\n TextFontStyle,\n TextFontWeight,\n UpdateObjectTransformOptions,\n UpdateTextOptions,\n Vector3Value,\n ViewerAppearance,\n} from './core/types'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,eAAsB,iBACpB,SAC+B;CAC/B,OAAO,kBAAkB,OAAO,OAAO;AACzC"}