@bylqwjc/media-editor-server 1.0.10
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.
- package/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/adapters/express.cjs +1 -0
- package/dist/adapters/express.d.ts +30 -0
- package/dist/adapters/express.js +1 -0
- package/dist/adapters/web.cjs +1 -0
- package/dist/adapters/web.d.ts +15 -0
- package/dist/adapters/web.js +1 -0
- package/dist/handler-DL4Inp7o.d.ts +47 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.js +4 -0
- package/node_modules/@media-editor/core/LICENSE +21 -0
- package/node_modules/@media-editor/core/README.md +14 -0
- package/node_modules/@media-editor/core/dist/browser.cjs +1 -0
- package/node_modules/@media-editor/core/dist/browser.d.ts +100 -0
- package/node_modules/@media-editor/core/dist/browser.js +3 -0
- package/node_modules/@media-editor/core/dist/chunk-MGKYVYOH.js +1 -0
- package/node_modules/@media-editor/core/dist/chunk-USY6UDGL.js +1 -0
- package/node_modules/@media-editor/core/dist/chunk-XCBM7P7N.js +1 -0
- package/node_modules/@media-editor/core/dist/engine.cjs +1 -0
- package/node_modules/@media-editor/core/dist/engine.d.ts +359 -0
- package/node_modules/@media-editor/core/dist/engine.js +1 -0
- package/node_modules/@media-editor/core/dist/filerobot.cjs +1 -0
- package/node_modules/@media-editor/core/dist/filerobot.d.ts +88 -0
- package/node_modules/@media-editor/core/dist/filerobot.js +1 -0
- package/node_modules/@media-editor/core/dist/index.cjs +1 -0
- package/node_modules/@media-editor/core/dist/index.d.ts +264 -0
- package/node_modules/@media-editor/core/dist/index.js +1 -0
- package/node_modules/@media-editor/core/dist/platform-presets-B-o4C6uY.d.ts +80 -0
- package/node_modules/@media-editor/core/dist/state-B85vkf7_.d.ts +1027 -0
- package/node_modules/@media-editor/core/node_modules/zod/LICENSE +21 -0
- package/node_modules/@media-editor/core/node_modules/zod/README.md +208 -0
- package/node_modules/@media-editor/core/node_modules/zod/index.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/index.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/index.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/package.json +76 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.d.cts +164 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/errors.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/errors.d.cts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/errors.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/external.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/external.d.cts +6 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/external.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.js +0 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.js +0 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.js +0 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.d.cts +85 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/index.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/index.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/index.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.d.cts +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.d.cts +102 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.js +0 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/types.cjs +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/types.d.cts +1031 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/types.js +1 -0
- package/node_modules/@media-editor/core/package.json +42 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var c={"tool.trim":"\u526A\u8F91","tool.crop":"\u88C1\u526A","tool.tune":"\u8C03\u8272","tool.filter":"\u6EE4\u955C","tool.annotate":"\u6807\u6CE8","tool.sticker":"\u8D34\u7EB8","tool.resize":"\u6BD4\u4F8B","tune.brightness":"\u4EAE\u5EA6","tune.contrast":"\u5BF9\u6BD4","tune.saturation":"\u9971\u548C","tune.gamma":"Gamma","overlay.select":"\u9009\u62E9","overlay.pen":"\u753B\u7B14","overlay.eraser":"\u6A61\u76AE","overlay.line":"\u76F4\u7EBF","overlay.arrow":"\u7BAD\u5934","overlay.rect":"\u77E9\u5F62","overlay.ellipse":"\u692D\u5706","overlay.text":"\u6587\u5B57","overlay.color":"\u7EBF\u8272","overlay.width":"\u7EBF\u5BBD","overlay.copySelected":"\u590D\u5236","overlay.delSelected":"\u5220\u9664\u9009\u4E2D","overlay.editSelected":"\u7F16\u8F91","overlay.pickImage":"\u9009\u62E9\u56FE\u7247","overlay.hint":"\u70B9 emoji/\u56FE\u7247\u6DFB\u52A0 \u2192 \u753B\u5E03\u4E0A\u62D6\u52A8\u6446\u4F4D,\u62D6\u53F3\u4E0B\u89D2\u7D2B\u8272\u628A\u624B\u7F29\u653E","overlay.textPlaceholder":"\u8F93\u5165\u6587\u5B57,\u56DE\u8F66\u786E\u8BA4","filter.none":"\u539F\u56FE","filter.bw":"\u9ED1\u767D","filter.sepia":"\u590D\u53E4","filter.warm":"\u6696\u9633","filter.cool":"\u51B7\u8C03","filter.vivid":"\u9C9C\u8273","ratio.orig":"\u539F\u59CB","ratio.free":"\u81EA\u7531\u6BD4\u4F8B","ratio.9:16":"\u7AD6\u5C4F 9:16","ratio.16:9":"\u6A2A\u5C4F 16:9","ratio.1:1":"\u65B9\u5F62 1:1","ratio.4:5":"\u7AD6\u56FE 4:5","act.fit":"\u9002\u5E94","act.zoomFit":"\u7F29\u653E\u81F3\u9002\u5F53\u5927\u5C0F","act.zoomTo":"\u7F29\u653E\u81F3 {value}%","act.split":"\u5206\u5272","act.copy":"\u590D\u5236","act.delete":"\u5220\u9664","act.restore":"\u8FD8\u539F","act.deleteMusic":"\u5220\u9664\u97F3\u4E50","act.cancel":"\u53D6\u6D88","act.exportPoster":"\u5BFC\u51FA\u5C01\u9762","act.exporting":"\u5BFC\u51FA\u4E2D\u2026","act.poster":"\u{1F5BC} \u5C01\u9762","act.again":"\u518D\u6B21\u4E0B\u8F7D","act.saveDrive":"\u5B58\u7F51\u76D8","act.changeImage":"\u2190 \u6362\u4E00\u5F20","act.changeVideo":"\u2190 \u6362\u4E00\u4E2A","crop.rotateLeft":"\u21BA \u5411\u5DE6\u65CB\u8F6C","crop.flipX":"\u21CB \u6C34\u5E73\u7FFB\u8F6C","crop.flipY":"\u21F5 \u5782\u76F4\u7FFB\u8F6C","crop.rotateLeftShort":"\u5DE6\u8F6C","crop.flipXShort":"\u6A2A\u7FFB","crop.flipYShort":"\u7AD6\u7FFB","tip.close":"\u5173\u95ED(\u6362\u6587\u4EF6)","tip.undo":"\u64A4\u9500","tip.redo":"\u91CD\u505A","tip.resetOpened":"\u91CD\u7F6E\u5230\u6253\u5F00\u6587\u4EF6\u65F6","tip.previewZoom":"\u9884\u89C8\u7F29\u653E\u6BD4\u4F8B","tip.previewZoomOut":"\u7F29\u5C0F\u9884\u89C8","tip.previewZoomIn":"\u653E\u5927\u9884\u89C8","tip.previewZoomFit":"\u9002\u5E94\u9884\u89C8","tip.previewPointer":"\u6307\u9488\u5DE5\u5177","tip.previewPan":"\u624B\u5DE5\u5177\uFF1A\u62D6\u52A8\u753B\u9762","tip.poster":"\u9884\u89C8\u5E76\u9009\u62E9\u5C01\u9762\u5E27","tip.keepAudio":"\u539F\u89C6\u9891\u58F0\u97F3\u5F00\u5173(\u4E0E\u97F3\u4E50\u6DF7\u97F3;\u9884\u89C8\u540C\u6B65)","tip.split":"\u5728\u64AD\u653E\u5934\u5904\u628A\u5F53\u524D\u7247\u6BB5\u4E00\u5206\u4E3A\u4E8C","tip.zoomOut":"\u7F29\u5C0F\u65F6\u95F4\u8F74(Ctrl+\u6EDA\u8F6E)","tip.zoomIn":"\u653E\u5927\u65F6\u95F4\u8F74(Ctrl+\u6EDA\u8F6E)","tip.fit":"\u7F29\u653E\u5230\u9002\u5E94\u5BBD\u5EA6","tip.addVideo":"\u6DFB\u52A0\u89C6\u9891\u7247\u6BB5","tip.addAudio":"\u6DFB\u52A0\u97F3\u4E50(\u97F3\u9891\u6587\u4EF6,\u6216\u9009\u542B\u58F0\u97F3\u7684\u89C6\u9891\u81EA\u52A8\u63D0\u53D6\u97F3\u8F68;\u4E0E\u539F\u58F0\u6DF7\u97F3)","tip.dupClip":"\u590D\u5236\u8BE5\u7247\u6BB5(\u63D2\u5230\u5176\u540E)","tip.delClip":"\u5220\u9664\u8BE5\u7247\u6BB5","tip.lockAspect":"\u9501\u5B9A\u7EB5\u6A2A\u6BD4","tip.dblConfirm":"\u53CC\u51FB\u786E\u8BA4\u88C1\u526A","err.notVideo":"\u8BF7\u9009\u62E9\u89C6\u9891\u6587\u4EF6","err.maxVideo":"\u6700\u591A {max} \u4E2A\u89C6\u9891\u7D20\u6750","err.videoLoad":"\u89C6\u9891\u52A0\u8F7D\u5931\u8D25,\u8BF7\u6362\u4E00\u4E2A\u6587\u4EF6","err.notAudio":"\u8BF7\u9009\u62E9\u97F3\u9891\u6587\u4EF6(mp3/wav/m4a),\u6216\u542B\u58F0\u97F3\u7684\u89C6\u9891(\u81EA\u52A8\u63D0\u53D6\u97F3\u8F68)","err.maxAudio":"\u6700\u591A {max} \u4E2A\u97F3\u9891\u7D20\u6750","err.audioLoad":"\u97F3\u9891\u52A0\u8F7D\u5931\u8D25,\u8BF7\u6362\u4E00\u4E2A\u6587\u4EF6","err.processFailed":"\u5904\u7406\u5931\u8D25","err.posterFailed":"\u5C01\u9762\u6E32\u67D3\u5931\u8D25","err.canvas":"canvas \u4E0D\u53EF\u7528","err.imageRead":"\u56FE\u7247\u8BFB\u53D6\u5931\u8D25,\u8BF7\u6362\u4E00\u5F20","err.notImage":"\u8BF7\u9009\u62E9\u56FE\u7247\u6587\u4EF6","err.fileType":"\u53EA\u652F\u6301\u56FE\u7247\u6216\u89C6\u9891\u6587\u4EF6","err.saveDrive":"\u5B58\u7F51\u76D8\u5931\u8D25","msg.processing":"\u6B63\u5728\u5BFC\u51FA\u4E2D\u2026","msg.exportingHint":"\u8BF7\u7A0D\u5019\uFF0C\u5BFC\u51FA\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u8FD4\u56DE\u7ED3\u679C\u3002","msg.done":"\u5B8C\u6210 \u2713","msg.loading":"\u7D20\u6750\u52A0\u8F7D\u4E2D\u2026","msg.exported":"\u5DF2\u5BFC\u51FA\uFF1A","msg.saving":"\u5B58\u7F51\u76D8\u4E2D\u2026","msg.saved":"\u5DF2\u5B58\u5230\u7F51\u76D8 \u2713","lbl.ratioSection":"\u753B\u9762\u6BD4\u4F8B(\u88C1\u526A,\u4E0D\u53D8\u5F62)","lbl.dragToReposition":"\u2194 \u62D6\u52A8\u9884\u89C8\u53EF\u8C03\u6574\u88C1\u526A\u4F4D\u7F6E","lbl.sizeSection":"\u5BFC\u51FA\u5C3A\u5BF8(\u50CF\u7D20;\u6BD4\u4F8B\u4E0D\u7B26\u65F6 cover \u5C45\u4E2D\u88C1\u526A)","lbl.currentOut":"\u5F53\u524D\u8F93\u51FA","lbl.zoomSize":"\u5927\u5C0F","lbl.noScale":"(\u672A\u7F29\u653E)","lbl.coverNote":"\xB7 \u6BD4\u4F8B\u4E0D\u4E00\u81F4\u65F6\u5C45\u4E2D\u88C1\u526A(cover),\u4E0D\u53D8\u5F62","lbl.audioTrackHint":"\u266A \u97F3\u9891\u8F68(\u53F3\u4FA7 \uFF0B \u6DFB\u52A0\u97F3\u4E50,\u4E0E\u539F\u58F0\u6DF7\u97F3)","lbl.volume":"\u97F3\u91CF","lbl.volNote":"(\u9884\u89C8\u6700\u5927 100%,\u5BFC\u51FA\u6309\u8BBE\u5B9A\u503C)","lbl.music":"\u97F3\u4E50","kbd.fit":"\u21E7 F","poster.title":"\u9009\u62E9\u5C01\u9762\u5E27","panel.title":"\u5A92\u4F53\u7F16\u8F91\u5668","panel.subtitle":"\u4E0A\u4F20\u56FE\u7247 / \u89C6\u9891\uFF0C\u88C1\u526A \xB7 \u6EE4\u955C \xB7 \u6587\u5B57 \xB7 \u5BFC\u51FA","panel.pick":"\u70B9\u51FB\u9009\u62E9\u56FE\u7247\u6216\u89C6\u9891","panel.pickHint":"\u56FE\u7247\u7528 Filerobot \xB7 \u89C6\u9891\u53EF\u88C1\u526A/\u9759\u97F3/\u5C01\u9762"},B={"tool.trim":"Trim","tool.crop":"Crop","tool.tune":"Tune","tool.filter":"Filters","tool.annotate":"Annotate","tool.sticker":"Stickers","tool.resize":"Ratio","tune.brightness":"Brightness","tune.contrast":"Contrast","tune.saturation":"Saturation","tune.gamma":"Gamma","overlay.select":"Select","overlay.pen":"Pen","overlay.eraser":"Eraser","overlay.line":"Line","overlay.arrow":"Arrow","overlay.rect":"Rect","overlay.ellipse":"Ellipse","overlay.text":"Text","overlay.color":"Color","overlay.width":"Width","overlay.copySelected":"Copy","overlay.delSelected":"Delete selected","overlay.editSelected":"Edit","overlay.pickImage":"Pick image","overlay.hint":"Tap emoji/image to add \u2192 drag to place, drag the purple corner handle to scale","overlay.textPlaceholder":"Type text, Enter to confirm","filter.none":"Original","filter.bw":"B&W","filter.sepia":"Sepia","filter.warm":"Warm","filter.cool":"Cool","filter.vivid":"Vivid","ratio.orig":"Original","ratio.free":"Free ratio","ratio.9:16":"Portrait 9:16","ratio.16:9":"Landscape 16:9","ratio.1:1":"Square 1:1","ratio.4:5":"Vertical 4:5","act.fit":"Fit","act.zoomFit":"Zoom to fit","act.zoomTo":"Zoom to {value}%","act.split":"Split","act.copy":"Copy","act.delete":"Delete","act.restore":"Reset","act.deleteMusic":"Remove music","act.cancel":"Cancel","act.exportPoster":"Export cover","act.exporting":"Exporting\u2026","act.poster":"\u{1F5BC} Cover","act.again":"Download again","act.saveDrive":"Save to drive","act.changeImage":"\u2190 Change image","act.changeVideo":"\u2190 Change file","crop.rotateLeft":"\u21BA Rotate left","crop.flipX":"\u21CB Flip horizontal","crop.flipY":"\u21F5 Flip vertical","crop.rotateLeftShort":"Rot","crop.flipXShort":"Flip","crop.flipYShort":"Flip","tip.close":"Close (change file)","tip.undo":"Undo","tip.redo":"Redo","tip.resetOpened":"Reset to opened file","tip.previewZoom":"Preview zoom","tip.previewZoomOut":"Zoom out preview","tip.previewZoomIn":"Zoom in preview","tip.previewZoomFit":"Fit preview","tip.previewPointer":"Pointer tool","tip.previewPan":"Hand tool: pan canvas","tip.poster":"Preview and pick a cover frame","tip.keepAudio":"Original audio on/off (mixed with music; preview follows)","tip.split":"Split the current clip at the playhead","tip.zoomOut":"Zoom out timeline (Ctrl+wheel)","tip.zoomIn":"Zoom in timeline (Ctrl+wheel)","tip.fit":"Fit to width","tip.addVideo":"Add video clip","tip.addAudio":"Add music (audio file, or a video with sound to extract its track; mixed with original)","tip.dupClip":"Duplicate clip (insert after)","tip.delClip":"Delete clip","tip.lockAspect":"Lock aspect ratio","tip.dblConfirm":"Double-click to confirm crop","err.notVideo":"Please choose a video file","err.maxVideo":"Up to {max} video sources","err.videoLoad":"Failed to load video, try another file","err.notAudio":"Choose an audio file (mp3/wav/m4a), or a video with sound (audio auto-extracted)","err.maxAudio":"Up to {max} audio sources","err.audioLoad":"Failed to load audio, try another file","err.processFailed":"Processing failed","err.posterFailed":"Failed to render cover","err.canvas":"Canvas unavailable","err.imageRead":"Failed to read image, try another","err.notImage":"Please choose an image file","err.fileType":"Only image or video files are supported","err.saveDrive":"Failed to save to drive","msg.processing":"Exporting\u2026","msg.exportingHint":"Please wait. The result will be returned automatically when export finishes.","msg.done":"Done \u2713","msg.loading":"Loading media\u2026","msg.exported":"Exported: ","msg.saving":"Saving\u2026","msg.saved":"Saved to drive \u2713","lbl.ratioSection":"Frame ratio (crop, no distortion)","lbl.dragToReposition":"\u2194 Drag the preview to reposition the crop","lbl.sizeSection":"Export size (px; cover center-crop when ratios differ)","lbl.currentOut":"Output","lbl.zoomSize":"Size","lbl.noScale":"(no scaling)","lbl.coverNote":"\xB7 center-cropped (cover) when ratios differ, no distortion","lbl.audioTrackHint":"\u266A Audio track (\uFF0B on the right to add music, mixed with original)","lbl.volume":"Volume","lbl.volNote":"(preview caps at 100%, export uses the set value)","lbl.music":"Music","kbd.fit":"\u21E7 F","poster.title":"Pick a cover frame","panel.title":"Media Editor","panel.subtitle":"Upload an image / video \u2014 crop \xB7 filters \xB7 text \xB7 export","panel.pick":"Click to choose an image or video","panel.pickHint":"Images via Filerobot \xB7 videos: trim/mute/cover"},A={"tool.trim":"Editar","tool.crop":"Recortar","tool.tune":"Ajustar color","tool.filter":"Filtros","tool.annotate":"Anotar","tool.sticker":"Stickers","tool.resize":"Proporci\xF3n","tune.brightness":"Brillo","tune.contrast":"Contraste","tune.saturation":"Saturaci\xF3n","tune.gamma":"Gamma","overlay.select":"Seleccionar","overlay.pen":"Pincel","overlay.eraser":"Borrador","overlay.line":"L\xEDnea","overlay.arrow":"Flecha","overlay.rect":"Rect\xE1ngulo","overlay.ellipse":"Elipse","overlay.text":"Texto","overlay.color":"Color","overlay.width":"Grosor","overlay.copySelected":"Copiar","overlay.delSelected":"Eliminar seleccionado","overlay.editSelected":"Editar","overlay.pickImage":"Elegir imagen","overlay.hint":"Toca un emoji/imagen para a\xF1adirlo \u2192 arrastra para colocarlo, arrastra el tirador morado para escalar","overlay.textPlaceholder":"Escribe texto, Enter para confirmar","filter.none":"Original","filter.bw":"Blanco y negro","filter.sepia":"Sepia","filter.warm":"C\xE1lido","filter.cool":"Fr\xEDo","filter.vivid":"Intenso","ratio.orig":"Original","ratio.free":"Libre","ratio.9:16":"Vertical 9:16","ratio.16:9":"Horizontal 16:9","ratio.1:1":"Cuadrado 1:1","ratio.4:5":"Vertical 4:5","act.fit":"Ajustar","act.zoomFit":"Ajustar a pantalla","act.zoomTo":"Zoom al {value}%","act.split":"Dividir","act.copy":"Copiar","act.delete":"Eliminar","act.restore":"Restablecer","act.deleteMusic":"Quitar m\xFAsica","act.cancel":"Cancelar","act.exportPoster":"Exportar portada","act.exporting":"Exportando\u2026","act.poster":"\u{1F5BC} Portada","act.again":"Descargar de nuevo","act.saveDrive":"Guardar en disco","act.changeImage":"\u2190 Cambiar imagen","act.changeVideo":"\u2190 Cambiar archivo","crop.rotateLeft":"\u21BA Girar a la izquierda","crop.flipX":"\u21CB Voltear horizontal","crop.flipY":"\u21F5 Voltear vertical","crop.rotateLeftShort":"Giro","crop.flipXShort":"Flip","crop.flipYShort":"Flip","tip.close":"Cerrar (cambiar archivo)","tip.undo":"Deshacer","tip.redo":"Rehacer","tip.resetOpened":"Restablecer al archivo abierto","tip.previewZoom":"Zoom de vista previa","tip.previewZoomOut":"Reducir vista previa","tip.previewZoomIn":"Ampliar vista previa","tip.previewZoomFit":"Ajustar vista previa","tip.previewPointer":"Herramienta de puntero","tip.previewPan":"Mano: desplazar lienzo","tip.poster":"Previsualizar y elegir portada","tip.keepAudio":"Activar/desactivar audio original (mezclado con m\xFAsica; la vista previa lo refleja)","tip.split":"Dividir el clip actual en el cursor","tip.zoomOut":"Reducir l\xEDnea de tiempo (Ctrl+rueda)","tip.zoomIn":"Ampliar l\xEDnea de tiempo (Ctrl+rueda)","tip.fit":"Ajustar al ancho","tip.addVideo":"A\xF1adir clip de v\xEDdeo","tip.addAudio":"A\xF1adir m\xFAsica (archivo de audio o v\xEDdeo con sonido para extraer la pista; se mezcla con el original)","tip.dupClip":"Duplicar clip (insertar despu\xE9s)","tip.delClip":"Eliminar clip","tip.lockAspect":"Bloquear proporci\xF3n","tip.dblConfirm":"Doble clic para confirmar recorte","err.notVideo":"Elige un archivo de v\xEDdeo","err.maxVideo":"M\xE1ximo {max} v\xEDdeos","err.videoLoad":"No se pudo cargar el v\xEDdeo, prueba con otro archivo","err.notAudio":"Elige un audio (mp3/wav/m4a) o un v\xEDdeo con sonido (se extrae autom\xE1ticamente)","err.maxAudio":"M\xE1ximo {max} audios","err.audioLoad":"No se pudo cargar el audio, prueba con otro archivo","err.processFailed":"Error de procesamiento","err.posterFailed":"No se pudo renderizar la portada","err.canvas":"Canvas no disponible","err.imageRead":"No se pudo leer la imagen, prueba con otra","err.notImage":"Elige un archivo de imagen","err.fileType":"Solo se admiten archivos de imagen o v\xEDdeo","err.saveDrive":"No se pudo guardar en disco","msg.processing":"Exportando\u2026","msg.exportingHint":"Espera un momento. El resultado se devolver\xE1 autom\xE1ticamente al finalizar.","msg.done":"Listo \u2713","msg.loading":"Cargando medios\u2026","msg.exported":"Exportado: ","msg.saving":"Guardando\u2026","msg.saved":"Guardado en disco \u2713","lbl.ratioSection":"Proporci\xF3n de imagen (recorte, sin deformar)","lbl.dragToReposition":"\u2194 Arrastra la vista previa para reposicionar el recorte","lbl.sizeSection":"Tama\xF1o de exportaci\xF3n (px; recorte cover centrado si la proporci\xF3n difiere)","lbl.currentOut":"Salida","lbl.zoomSize":"Tama\xF1o","lbl.noScale":"(sin escala)","lbl.coverNote":"\xB7 recorte centrado (cover) cuando la proporci\xF3n difiere, sin deformar","lbl.audioTrackHint":"\u266A Pista de audio (\uFF0B a la derecha para a\xF1adir m\xFAsica, mezclada con el original)","lbl.volume":"Volumen","lbl.volNote":"(la vista previa limita a 100%, la exportaci\xF3n usa el valor definido)","lbl.music":"M\xFAsica","kbd.fit":"\u21E7 F","poster.title":"Elegir portada","panel.title":"Editor multimedia","panel.subtitle":"Sube una imagen / v\xEDdeo \u2014 recorta \xB7 filtros \xB7 texto \xB7 exporta","panel.pick":"Haz clic para elegir una imagen o v\xEDdeo","panel.pickHint":"Im\xE1genes con Filerobot \xB7 v\xEDdeos: cortar/silenciar/portada"},D={\u7B80:"\u7C21",\u4F53:"\u9AD4",\u56FE:"\u5716",\u9891:"\u983B",\u89C6:"\u8996",\u8F91:"\u8F2F",\u8C03:"\u8ABF",\u6EE4:"\u6FFE",\u6807:"\u6A19",\u6CE8:"\u8A3B",\u8D34:"\u8CBC",\u9009:"\u9078",\u62E9:"\u64C7",\u7EBF:"\u7DDA",\u7BAD:"\u7BAD",\u5934:"\u982D",\u590D:"\u8907",\u5220:"\u522A",\u9664:"\u9664",\u7F16:"\u7DE8",\u8FB9:"\u908A",\u8F93:"\u8F38",\u5165:"\u5165",\u786E:"\u78BA",\u8BA4:"\u8A8D",\u9971:"\u98FD",\u5BF9:"\u5C0D",\u6696:"\u6696",\u9633:"\u967D",\u51B7:"\u51B7",\u7EB5:"\u7E31",\u6A2A:"\u6A6B",\u9002:"\u9069",\u5E94:"\u61C9",\u7F29:"\u7E2E",\u5B9E:"\u5BE6",\u9645:"\u969B",\u5BFC:"\u5C0E",\u51FA:"\u51FA",\u5C01:"\u5C01",\u9762:"\u9762",\u6362:"\u63DB",\u5F20:"\u5F35",\u9884:"\u9810",\u89C8:"\u89BD",\u52A8:"\u52D5",\u58F0:"\u8072",\u5F00:"\u958B",\u5173:"\u95DC",\u4E0E:"\u8207",\u4E50:"\u6A02",\u6DF7:"\u6DF7",\u5904:"\u8655",\u8F7D:"\u8F09",\u9519:"\u932F",\u8BEF:"\u8AA4",\u8BFB:"\u8B80",\u4EC5:"\u50C5",\u7EC8:"\u7D42",\u7A0D:"\u7A0D",\u5019:"\u5019",\u8FD4\u56DE:"\u8FD4\u56DE",\u5F53\u524D:"\u76EE\u524D",\u8F93\u51FA:"\u8F38\u51FA",\u753B:"\u756B",\u53D8:"\u8B8A",\u97F3\u9891:"\u97F3\u8A0A",\u97F3\u8F68:"\u97F3\u8ECC",\u6DFB\u52A0:"\u65B0\u589E",\u5220\u9664:"\u522A\u9664",\u4FDD\u5B58:"\u5132\u5B58",\u52A0\u8F7D:"\u8F09\u5165",\u7F51\u76D8:"\u7DB2\u76E4"},d=t=>{let u=t;for(const[o,e]of Object.entries(D).sort((a,i)=>i[0].length-a[0].length))u=u.replaceAll(o,e);return u},f=Object.fromEntries(Object.entries(c).map(([t,u])=>[t,d(u)])),n={zh:c,en:B,es:A,"zh-Hant":f};function g(t,u,o){let e=n[t]?.[u]??n.zh[u]??u;if(o)for(const[a,i]of Object.entries(o))e=e.replaceAll(`{${a}}`,String(i));return e}var l=[{platform:"tiktok",postType:"video",label:"TikTok Video",shortLabel:"TT\xB7Video",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"post",label:"Instagram Post",shortLabel:"IG\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"instagram",postType:"reels",label:"Instagram Reels",shortLabel:"IG\xB7Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"story",label:"Instagram Story",shortLabel:"IG\xB7Story",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"facebook",postType:"post",label:"Facebook Post",shortLabel:"FB\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"facebook",postType:"reels",label:"Facebook Reels",shortLabel:"FB\xB7Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"youtube",postType:"video",label:"YouTube Video",shortLabel:"YT\xB7Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"youtube",postType:"shorts",label:"YouTube Shorts",shortLabel:"YT\xB7Shorts",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"pinterest",postType:"pin",label:"Pinterest Pin",shortLabel:"PIN",ratio:"2:3",imageSize:"1664x2496",videoRatio:"9:16",videoResolution:"720p"},{platform:"x",postType:"post",label:"X Post",shortLabel:"X\xB7Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"},{platform:"linkedin",postType:"post",label:"LinkedIn Post",shortLabel:"LI\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"linkedin",postType:"video",label:"LinkedIn Video",shortLabel:"LI\xB7Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"threads",postType:"post",label:"Threads Post",shortLabel:"TH\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"telegram",postType:"post",label:"Telegram Post",shortLabel:"TG\xB7Post",ratio:"1:1",imageSize:"2048x2048",videoRatio:"9:16",videoResolution:"720p"},{platform:"reddit",postType:"post",label:"Reddit Post",shortLabel:"RD\xB7Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"}],x={"1:1":"\u65B9\u5F62 1:1","4:5":"\u7AD6\u56FE 4:5","3:4":"\u7AD6\u56FE 3:4","9:16":"\u7AD6\u5C4F 9:16","16:9":"\u6A2A\u5C4F 16:9","2:3":"\u7AD6\u56FE 2:3","1.91:1":"\u6A2A\u5E45 1.91:1"};function r(t){const[u,o]=t.split(":").map(Number);return!u||!o?1:u/o}function F(t){const u=new Set,o=[];for(const e of t)!e||u.has(e)||(u.add(e),o.push({ratio:e,value:r(e),label:x[e]??e}));return o}var C=F(["1:1","4:5","3:4","2:3","9:16","16:9","1.91:1"]),b=F(["9:16","16:9","1:1","4:5"]);function m(t=l){const u=new Set,o=[];for(const e of t){if(!e.videoRatio)continue;const a=`${e.platform}:${e.postType}:${e.videoRatio}`;if(u.has(a))continue;u.add(a);const i=e.label.split(" ").slice(0,-1).join(" ")||e.label;o.push({platform:e.platform,postType:e.postType,label:`${i} ${e.videoRatio}`,ratio:e.videoRatio,value:r(e.videoRatio)})}return o}var h=m();function v(t=l){const u=new Map;for(const o of t){const e=u.get(o.platform);(!e||e.postType!=="post"&&o.postType==="post")&&u.set(o.platform,o)}return Array.from(u.values()).map(o=>{const[e,a]=o.imageSize.split("x").map(Number),i=o.label.split(" ").slice(0,-1).join(" ")||o.label;return{platform:o.platform,label:`${i} ${o.ratio}`,ratio:o.ratio,value:r(o.ratio),w:e,h:a}})}var y=v();function S(t,u){return t>=1?{w:Math.round(u*t/2)*2,h:u}:{w:u,h:Math.round(u/t/2)*2}}function E(t=l){const u=new Set,o=[];for(const e of t){if(!e.videoRatio||!e.videoResolution)continue;const a=e.videoResolution==="1080p"?1080:720,{w:i,h:p}=S(r(e.videoRatio),a),s=`${i}x${p}`;u.has(s)||(u.add(s),o.push({label:`${e.shortLabel} ${i}\xD7${p}`,w:i,h:p}))}return o}var R=E();function T(t,u){if(t.isDuplicated)return{};if((t.rotation??0)!==0)return{};const o=u.adjustments?.rotation??0;return o?{rotation:-o}:{}}export{l as DEFAULT_PLATFORM_TARGETS,n as EDITOR_MESSAGES,y as IMAGE_PLATFORM_PRESETS,C as IMAGE_RATIO_PRESETS,h as VIDEO_PLATFORM_RATIO_PRESETS,b as VIDEO_RATIO_PRESETS,R as VIDEO_SIZE_PRESETS,v as buildImagePlatformPresets,m as buildVideoPlatformRatioPresets,E as buildVideoSizePresets,T as compensateAnnotationRotation,r as parseRatio,g as tEditor,d as toHant};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var r=require("zod"),p={color:r.z.string().max(32),width:r.z.number().positive().max(200)},u={rotation:r.z.number().min(-180).max(180).optional()},A=r.z.discriminatedUnion("type",[r.z.object({type:r.z.literal("pen"),points:r.z.array(r.z.number()).min(4),...p,...u}),r.z.object({type:r.z.literal("line"),x1:r.z.number(),y1:r.z.number(),x2:r.z.number(),y2:r.z.number(),...p,...u}),r.z.object({type:r.z.literal("arrow"),x1:r.z.number(),y1:r.z.number(),x2:r.z.number(),y2:r.z.number(),...p,...u}),r.z.object({type:r.z.literal("rect"),x:r.z.number(),y:r.z.number(),w:r.z.number(),h:r.z.number(),...p,...u}),r.z.object({type:r.z.literal("ellipse"),x:r.z.number(),y:r.z.number(),w:r.z.number(),h:r.z.number(),...p,...u}),r.z.object({type:r.z.literal("text"),x:r.z.number(),y:r.z.number(),text:r.z.string().max(500),color:r.z.string().max(32),fontSize:r.z.number().positive().max(512),...u}),r.z.object({type:r.z.literal("sticker"),x:r.z.number(),y:r.z.number(),w:r.z.number().positive(),h:r.z.number().positive(),emoji:r.z.string().max(16).optional(),src:r.z.string().optional(),...u})]),B=r.z.object({srcIdx:r.z.number().int().min(0).max(7),in:r.z.number().min(0),out:r.z.number().min(0)}),I=r.z.object({srcIdx:r.z.number().int().min(0).max(2),startAt:r.z.number().min(0),in:r.z.number().min(0),out:r.z.number().min(0),volume:r.z.number().min(0).max(2)}),w=r.z.object({type:r.z.enum(["none","fade","slide","wipe","flip","clockWipe","star","circle","rectangle"]).default("none"),duration:r.z.number().min(0).max(2).default(.4)}),E=r.z.object({clips:r.z.array(B).min(1).max(50),audioClips:r.z.array(I).max(8).default([]),canvas:r.z.object({w:r.z.number().int().min(2).max(4096),h:r.z.number().int().min(2).max(4096)}),crop:r.z.object({x:r.z.number().min(0),y:r.z.number().min(0),width:r.z.number().positive(),height:r.z.number().positive()}).optional(),scale:r.z.object({width:r.z.number().positive(),height:r.z.number().positive(),fit:r.z.enum(["contain","cover","force"])}).optional(),rotation:r.z.number().min(-180).max(180).default(0),flipX:r.z.boolean().default(!1),flipY:r.z.boolean().default(!1),filters:r.z.object({brightness:r.z.number().min(-1).max(1),contrast:r.z.number().min(-1).max(1),saturation:r.z.number().min(-1).max(1),gamma:r.z.number().min(-1).max(1).default(0)}).default({brightness:0,contrast:0,saturation:0,gamma:0}),filterPreset:r.z.string().max(32).optional(),overlays:r.z.array(A).max(200).optional(),transitions:r.z.array(w).max(49).default([]),keepAudio:r.z.boolean().default(!0),poster:r.z.object({time:r.z.number().min(0)}).optional()}).superRefine((t,e)=>{t.clips.forEach((i,n)=>{i.out<=i.in&&e.addIssue({code:r.z.ZodIssueCode.custom,message:`clips[${n}].out \u5FC5\u987B\u5927\u4E8E in`,path:["clips",n,"out"]})}),t.audioClips?.forEach((i,n)=>{i.out<=i.in&&e.addIssue({code:r.z.ZodIssueCode.custom,message:`audioClips[${n}].out \u5FC5\u987B\u5927\u4E8E in`,path:["audioClips",n,"out"]})}),(t.canvas.w%2!==0||t.canvas.h%2!==0)&&e.addIssue({code:r.z.ZodIssueCode.custom,message:"canvas \u5BBD\u9AD8\u5FC5\u987B\u4E3A\u5076\u6570",path:["canvas"]})});function m(){return{clips:[],audioClips:[],canvas:{w:2,h:2},rotation:0,flipX:!1,flipY:!1,filters:{brightness:0,contrast:0,saturation:0,gamma:0},transitions:[],keepAudio:!0}}var j=100;function d(t){return{past:[],present:t,future:[]}}function f(t,e){if(e===t.present)return t;const i=[...t.past,t.present];return i.length>j&&i.shift(),{past:i,present:e,future:[]}}function y(t,e){return e===t.present?t:{...t,present:e}}function z(t){return t.past.length>0}function b(t){return t.future.length>0}function P(t){return z(t)?{past:t.past.slice(0,-1),present:t.past[t.past.length-1],future:[t.present,...t.future]}:t}function D(t){if(!b(t))return t;const[e,...i]=t.future;return{past:[...t.past,t.present],present:e,future:i}}var l=.1;function v(t){return t.out-t.in}function c(t){return t.reduce((e,i)=>e+v(i),0)}function x(t,e){if(!t.length||e<0)return null;let i=0;for(let n=0;n<t.length;n++){const s=v(t[n]);if(e<i+s)return{idx:n,srcTime:t[n].in+(e-i)};i+=s}if(Math.abs(e-i)<1e-9||e<=i){const n=t.length-1;return{idx:n,srcTime:t[n].out}}return null}function V(t,e){const i=x(t,e);if(!i)return t;const n=t[i.idx];return i.srcTime<n.in+l||i.srcTime>n.out-l?t:[...t.slice(0,i.idx),{...n,out:i.srcTime},{...n,in:i.srcTime},...t.slice(i.idx+1)]}function O(t,e){return t.length<=1||!t[e]?t:t.filter((i,n)=>n!==e)}function F(t,e){const i=t[e];return i?[...t.slice(0,e+1),{...i},...t.slice(e+1)]:t}function T(t,e,i){if(e===i||!t[e]||i<0||i>=t.length)return t;const n=[...t],[s]=n.splice(e,1);return n.splice(i,0,s),n}function k(t,e,i,n,s){if(!t[e])return t;const a=t.map(h=>({...h}));return i==="in"?a[e].in=Math.min(Math.max(n,0),a[e].out-l):a[e].out=Math.max(Math.min(n,s),a[e].in+l),a}function M(t,e,i){const n=Math.max(Math.min(t.out,e),l),s=Math.min(Math.max(t.in,0),n-l),o=Math.min(Math.max(t.startAt,0),Math.max(0,i-l));return{...t,in:s,out:n,startAt:o}}function R(t,e=[]){const i=c(t),n=e.reduce((s,o)=>Math.max(s,o.startAt+(o.out-o.in)),0);return Math.max(i,n)}function g(t){return[...new Set(t.map(e=>e.srcIdx))].sort((e,i)=>e-i)}function X(t,e){const i=new Map(e.map((n,s)=>[n,s]));return t.map(n=>({...n,srcIdx:i.get(n.srcIdx)??0}))}function C(t){const e=Math.min(Math.max(Math.round(t),2),4096);return e%2===0?e:e-1}var S=t=>Math.min(Math.max(t,-180),180),Y=class{constructor(t=m()){this.videoSources=[],this.audioSources=[],this.listeners=new Set,this.transientBase=null,this.getSnapshot=()=>this.history.present,this.subscribe=e=>(this.listeners.add(e),()=>this.listeners.delete(e)),this.history=d(t)}getState(){return this.history.present}emit(){const t=this.history.present;for(const e of this.listeners)e(t)}canUndo(){return z(this.history)}canRedo(){return b(this.history)}undo(){this.transientBase=null,this.history=P(this.history),this.emit()}redo(){this.transientBase=null,this.history=D(this.history),this.emit()}applyMut(t,e=!1){if(e)this.transientBase===null&&(this.transientBase=this.history.present),this.history=y(this.history,t(this.transientBase));else{const i=this.transientBase??this.history.present,n=t(i),s=this.transientBase?{...this.history,present:this.transientBase}:this.history;this.history=f(s,n),this.transientBase=null}this.emit()}registerVideoSource(t){const e=this.videoSources.length;this.videoSources.push(t);const i={srcIdx:e,in:0,out:t.duration};return e===0||this.history.present.clips.length===0?(this.transientBase=null,this.history=d({...m(),clips:[i],canvas:{w:C(t.width),h:C(t.height)},poster:{time:Math.min(1,t.duration/2)}}),this.emit()):this.applyMut(n=>({...n,clips:[...n.clips,i]})),e}registerAudioSource(t){const e=this.audioSources.length;return this.audioSources.push(t),this.applyMut(i=>{const n=M({srcIdx:e,startAt:0,in:0,out:t.duration,volume:1},t.duration,c(i.clips));return{...i,audioClips:[...i.audioClips,n]}}),e}getVideoSource(t){return this.videoSources[t]}getAudioSource(t){return this.audioSources[t]}addClipFromSource(t){const e=this.videoSources[t];e&&this.applyMut(i=>({...i,clips:[...i.clips,{srcIdx:t,in:0,out:e.duration}]}))}splitAtPlayhead(t){this.applyMut(e=>({...e,clips:V(e.clips,t)}))}removeClip(t){this.applyMut(e=>({...e,clips:O(e.clips,t)}))}duplicateClip(t){this.applyMut(e=>({...e,clips:F(e.clips,t)}))}reorderClips(t,e){this.applyMut(i=>({...i,clips:T(i.clips,t,e)}))}trimClip(t,e,i,n){this.applyMut(s=>{const o=s.clips[t];if(!o)return s;const a=this.videoSources[o.srcIdx]?.duration??o.out;return{...s,clips:k(s.clips,t,e,i,a)}},n?.transient)}moveAudioClip(t,e,i){this.applyMut(n=>this.patchAudio(n,t,s=>({...s,startAt:e})),i?.transient)}trimAudioClip(t,e,i,n){this.applyMut(s=>this.patchAudio(s,t,o=>{if(e==="in"){const a=i-o.in;return{...o,in:i,startAt:o.startAt+a}}return{...o,out:i}}),n?.transient)}setAudioVolume(t,e,i){this.applyMut(n=>this.patchAudio(n,t,s=>({...s,volume:e}),!1),i?.transient)}removeAudioClip(t){this.applyMut(e=>({...e,audioClips:e.audioClips.filter((i,n)=>n!==t)}))}patchAudio(t,e,i,n=!0){const s=t.audioClips[e];if(!s)return t;let o=i(s);if(n){const a=this.audioSources[s.srcIdx]?.duration??s.out;o=M(o,a,c(t.clips))}return{...t,audioClips:t.audioClips.map((a,h)=>h===e?o:a)}}setCrop(t,e){this.applyMut(i=>({...i,crop:t}),e?.transient)}clearCrop(){this.applyMut(t=>({...t,crop:void 0}))}setScale(t){this.applyMut(e=>({...e,scale:t}))}clearScale(){this.applyMut(t=>({...t,scale:void 0}))}setRotation(t,e){this.applyMut(i=>({...i,rotation:S(t)}),e?.transient)}rotateBy(t){this.applyMut(e=>{let i=e.rotation+t;return i>180&&(i-=360),i<-180&&(i+=360),{...e,rotation:S(i)}})}flipX(){this.applyMut(t=>({...t,flipX:!t.flipX}))}flipY(){this.applyMut(t=>({...t,flipY:!t.flipY}))}setFilter(t,e,i){this.applyMut(n=>({...n,filters:{...n.filters,[t]:e}}),i?.transient)}setFilters(t,e){this.applyMut(i=>({...i,filters:{...i.filters,...t}}),e?.transient)}setFilterPreset(t){this.applyMut(e=>({...e,filterPreset:t}))}addOverlay(t){this.applyMut(e=>({...e,overlays:[...e.overlays??[],t]}))}updateOverlay(t,e,i){this.applyMut(n=>{const s=n.overlays??[];return s[t]?{...n,overlays:s.map((o,a)=>a===t?{...o,...e}:o)}:n},i?.transient)}removeOverlay(t){this.applyMut(e=>({...e,overlays:(e.overlays??[]).filter((i,n)=>n!==t)}))}patch(t,e){e?.transient?(this.transientBase===null&&(this.transientBase=this.history.present),this.history=y(this.history,{...this.transientBase,...t}),this.emit()):this.commit(t)}commit(t){const e=t?{...this.history.present,...t}:this.history.present,i=this.transientBase;this.transientBase=null,this.history=f(i?{...this.history,present:i}:this.history,e),this.emit()}setKeepAudio(t){this.applyMut(e=>({...e,keepAudio:t}))}setPoster(t){this.applyMut(e=>({...e,poster:{time:Math.max(0,t)}}))}totalDuration(){return c(this.history.present.clips)}contentDuration(){const t=this.history.present;return R(t.clips,t.audioClips)}locate(t){return x(this.history.present.clips,t)}usedVideoSources(){return g(this.history.present.clips)}getExportPlan(){const t=this.history.present,e=g(t.clips),i=[...new Set(t.audioClips.map(s=>s.srcIdx))].sort((s,o)=>s-o),n=new Map(i.map((s,o)=>[s,o]));return{state:{...t,clips:X(t.clips,e),audioClips:t.audioClips.map(s=>({...s,srcIdx:n.get(s.srcIdx)??0}))},videoSrcOrder:e,audioSrcOrder:i}}validate(){return E.safeParse(this.getExportPlan().state)}reset(t=m()){this.transientBase=null,this.history=d(t),this.emit()}};exports.VideoEditorEngine=Y;
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import * as zod from 'zod';
|
|
2
|
+
import { V as VideoEditStateT, O as OverlayT } from './state-B85vkf7_.js';
|
|
3
|
+
|
|
4
|
+
type TransitionT = {
|
|
5
|
+
type: 'none' | 'fade' | 'slide' | 'wipe' | 'flip' | 'clockWipe' | 'star' | 'circle' | 'rectangle';
|
|
6
|
+
duration: number;
|
|
7
|
+
};
|
|
8
|
+
type VideoEditStateWithTransitions = VideoEditStateT & {
|
|
9
|
+
transitions?: TransitionT[];
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/** 视频源元数据(File/objectURL 是运行时的事,不进引擎;引擎只认 srcIdx + 元数据) */
|
|
13
|
+
interface VideoSourceMeta {
|
|
14
|
+
duration: number;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
}
|
|
18
|
+
/** 音频源元数据 */
|
|
19
|
+
interface AudioSourceMeta {
|
|
20
|
+
duration: number;
|
|
21
|
+
}
|
|
22
|
+
interface MutOpts {
|
|
23
|
+
/** true = 瞬时(拖拽中间帧,不入 undo 栈) */
|
|
24
|
+
transient?: boolean;
|
|
25
|
+
}
|
|
26
|
+
type FilterKey = 'brightness' | 'contrast' | 'saturation' | 'temperature' | 'tint' | 'vibrance' | 'gamma' | 'highlights' | 'shadows' | 'whites' | 'blacks' | 'lightSense' | 'sharpen' | 'clarity' | 'grain' | 'fade' | 'vignette';
|
|
27
|
+
type EngineListener = (state: VideoEditStateWithTransitions) => void;
|
|
28
|
+
/** 导出计划:压缩后的状态 + 上传槽位映射(slot i 对应原 srcIdx = order[i]) */
|
|
29
|
+
interface ExportPlan {
|
|
30
|
+
state: VideoEditStateWithTransitions;
|
|
31
|
+
videoSrcOrder: number[];
|
|
32
|
+
audioSrcOrder: number[];
|
|
33
|
+
}
|
|
34
|
+
declare class VideoEditorEngine {
|
|
35
|
+
private history;
|
|
36
|
+
private videoSources;
|
|
37
|
+
private audioSources;
|
|
38
|
+
private listeners;
|
|
39
|
+
/** 瞬时拖拽序列的起始 base(拖拽前的提交态);null = 不在拖拽中 */
|
|
40
|
+
private transientBase;
|
|
41
|
+
constructor(initial?: VideoEditStateWithTransitions);
|
|
42
|
+
/** 当前编辑状态(引用稳定:仅在变更时换新对象,适配 useSyncExternalStore) */
|
|
43
|
+
getState(): VideoEditStateWithTransitions;
|
|
44
|
+
/** useSyncExternalStore 用别名 */
|
|
45
|
+
getSnapshot: () => VideoEditStateWithTransitions;
|
|
46
|
+
subscribe: (fn: EngineListener) => (() => void);
|
|
47
|
+
private emit;
|
|
48
|
+
canUndo(): boolean;
|
|
49
|
+
canRedo(): boolean;
|
|
50
|
+
undo(): void;
|
|
51
|
+
redo(): void;
|
|
52
|
+
/**
|
|
53
|
+
* 全部变更的唯一入口。mut 接收「计算基准态」返回新态。
|
|
54
|
+
* 瞬时:基准恒为 transientBase(拖拽前态),replacePresent;
|
|
55
|
+
* 提交:基准为 transientBase ?? present;若刚结束一段瞬时,先把 present 还原回 base 再 push,
|
|
56
|
+
* 使整段拖拽只占一步 undo。
|
|
57
|
+
*/
|
|
58
|
+
private applyMut;
|
|
59
|
+
/**
|
|
60
|
+
* 登记一个视频源并入时间轴。首源:用其分辨率初始化 canvas 并重建 history(清空 undo);
|
|
61
|
+
* 后续源:追加整段 clip(pushHistory)。
|
|
62
|
+
*/
|
|
63
|
+
registerVideoSource(meta: VideoSourceMeta): number;
|
|
64
|
+
/** 登记一个音频源并入音轨(整段、volume=1、startAt=0,clamp 后 push) */
|
|
65
|
+
registerAudioSource(meta: AudioSourceMeta): number;
|
|
66
|
+
getVideoSource(idx: number): VideoSourceMeta | undefined;
|
|
67
|
+
getAudioSource(idx: number): AudioSourceMeta | undefined;
|
|
68
|
+
/** 把已登记源再追加一段整段 clip(同源可多次引用) */
|
|
69
|
+
addClipFromSource(srcIdx: number): void;
|
|
70
|
+
splitAtPlayhead(outputTime: number): void;
|
|
71
|
+
removeClip(idx: number): void;
|
|
72
|
+
duplicateClip(idx: number): void;
|
|
73
|
+
reorderClips(from: number, to: number): void;
|
|
74
|
+
/** 拖把手改 in/out 到源时刻 srcT;拖拽中传 {transient:true},松手再调一次提交 */
|
|
75
|
+
trimClip(idx: number, edge: 'in' | 'out', srcT: number, opts?: MutOpts): void;
|
|
76
|
+
moveAudioClip(idx: number, startAt: number, opts?: MutOpts): void;
|
|
77
|
+
trimAudioClip(idx: number, edge: 'in' | 'out', t: number, opts?: MutOpts): void;
|
|
78
|
+
setAudioVolume(idx: number, volume: number, opts?: MutOpts): void;
|
|
79
|
+
removeAudioClip(idx: number): void;
|
|
80
|
+
/** 改一条音频片段并 clamp(volume 改动不需 clamp 几何,clampGeom=false 跳过) */
|
|
81
|
+
private patchAudio;
|
|
82
|
+
setCrop(crop: NonNullable<VideoEditStateWithTransitions['crop']>, opts?: MutOpts): void;
|
|
83
|
+
clearCrop(): void;
|
|
84
|
+
setScale(scale: NonNullable<VideoEditStateWithTransitions['scale']>): void;
|
|
85
|
+
clearScale(): void;
|
|
86
|
+
setRotation(deg: number, opts?: MutOpts): void;
|
|
87
|
+
/** 90° 步进(顺时针正);结果钳到 [-180,180] */
|
|
88
|
+
rotateBy(step: number): void;
|
|
89
|
+
flipX(): void;
|
|
90
|
+
flipY(): void;
|
|
91
|
+
setFilter(key: FilterKey, value: number, opts?: MutOpts): void;
|
|
92
|
+
setFilters(partial: Partial<VideoEditStateWithTransitions['filters']>, opts?: MutOpts): void;
|
|
93
|
+
setFilterPreset(id: string | undefined): void;
|
|
94
|
+
addOverlay(o: OverlayT): void;
|
|
95
|
+
updateOverlay(idx: number, patch: Partial<OverlayT>, opts?: MutOpts): void;
|
|
96
|
+
removeOverlay(idx: number): void;
|
|
97
|
+
/**
|
|
98
|
+
* 通用补丁:把 partial 浅合并进状态(UI 一次改多字段,如旋转同时重置 crop)。
|
|
99
|
+
* - `{transient:true}`:拖拽中间帧,基于拖拽前 base 合并、replacePresent,不入栈(= 原 patchLive)。
|
|
100
|
+
* - 默认:一次性提交(= commit(partial))。
|
|
101
|
+
*/
|
|
102
|
+
patch(partial: Partial<VideoEditStateWithTransitions>, opts?: MutOpts): void;
|
|
103
|
+
/**
|
|
104
|
+
* 定格当前态为一步 undo(= 原 commit):保留 present(含拖拽末值),可再合并 partial;
|
|
105
|
+
* 若处于瞬时序列,先把 past 接到拖拽前 base 上,使整段拖拽只占一步。
|
|
106
|
+
*/
|
|
107
|
+
commit(partial?: Partial<VideoEditStateWithTransitions>): void;
|
|
108
|
+
setKeepAudio(keep: boolean): void;
|
|
109
|
+
setPoster(time: number): void;
|
|
110
|
+
totalDuration(): number;
|
|
111
|
+
contentDuration(): number;
|
|
112
|
+
/** 输出时刻 → 所属片段与源内时刻(播放头定位) */
|
|
113
|
+
locate(outputTime: number): {
|
|
114
|
+
idx: number;
|
|
115
|
+
srcTime: number;
|
|
116
|
+
} | null;
|
|
117
|
+
usedVideoSources(): number[];
|
|
118
|
+
/**
|
|
119
|
+
* 生成导出计划:剔除未引用源、把 clips/audioClips 的 srcIdx 重映射到 [0..n),
|
|
120
|
+
* 返回压缩后的状态与上传槽位顺序(framework 按 order 取 File 上传)。
|
|
121
|
+
*/
|
|
122
|
+
getExportPlan(): ExportPlan;
|
|
123
|
+
/** 校验当前(导出)状态是否符合 schema —— 提交前兜底 */
|
|
124
|
+
validate(): zod.SafeParseReturnType<{
|
|
125
|
+
clips: {
|
|
126
|
+
srcIdx: number;
|
|
127
|
+
in: number;
|
|
128
|
+
out: number;
|
|
129
|
+
}[];
|
|
130
|
+
canvas: {
|
|
131
|
+
w: number;
|
|
132
|
+
h: number;
|
|
133
|
+
};
|
|
134
|
+
rotation?: number | undefined;
|
|
135
|
+
audioClips?: {
|
|
136
|
+
srcIdx: number;
|
|
137
|
+
in: number;
|
|
138
|
+
out: number;
|
|
139
|
+
startAt: number;
|
|
140
|
+
volume: number;
|
|
141
|
+
}[] | undefined;
|
|
142
|
+
crop?: {
|
|
143
|
+
width: number;
|
|
144
|
+
x: number;
|
|
145
|
+
y: number;
|
|
146
|
+
height: number;
|
|
147
|
+
} | undefined;
|
|
148
|
+
scale?: {
|
|
149
|
+
width: number;
|
|
150
|
+
height: number;
|
|
151
|
+
fit: "contain" | "cover" | "force";
|
|
152
|
+
} | undefined;
|
|
153
|
+
flipX?: boolean | undefined;
|
|
154
|
+
flipY?: boolean | undefined;
|
|
155
|
+
filters?: {
|
|
156
|
+
brightness: number;
|
|
157
|
+
contrast: number;
|
|
158
|
+
saturation: number;
|
|
159
|
+
temperature?: number | undefined;
|
|
160
|
+
tint?: number | undefined;
|
|
161
|
+
vibrance?: number | undefined;
|
|
162
|
+
gamma?: number | undefined;
|
|
163
|
+
highlights?: number | undefined;
|
|
164
|
+
shadows?: number | undefined;
|
|
165
|
+
whites?: number | undefined;
|
|
166
|
+
blacks?: number | undefined;
|
|
167
|
+
lightSense?: number | undefined;
|
|
168
|
+
sharpen?: number | undefined;
|
|
169
|
+
clarity?: number | undefined;
|
|
170
|
+
grain?: number | undefined;
|
|
171
|
+
fade?: number | undefined;
|
|
172
|
+
vignette?: number | undefined;
|
|
173
|
+
} | undefined;
|
|
174
|
+
filterPreset?: string | undefined;
|
|
175
|
+
overlays?: ({
|
|
176
|
+
type: "pen";
|
|
177
|
+
points: number[];
|
|
178
|
+
color: string;
|
|
179
|
+
width: number;
|
|
180
|
+
rotation?: number | undefined;
|
|
181
|
+
} | {
|
|
182
|
+
type: "line";
|
|
183
|
+
color: string;
|
|
184
|
+
width: number;
|
|
185
|
+
x1: number;
|
|
186
|
+
y1: number;
|
|
187
|
+
x2: number;
|
|
188
|
+
y2: number;
|
|
189
|
+
rotation?: number | undefined;
|
|
190
|
+
} | {
|
|
191
|
+
type: "arrow";
|
|
192
|
+
color: string;
|
|
193
|
+
width: number;
|
|
194
|
+
x1: number;
|
|
195
|
+
y1: number;
|
|
196
|
+
x2: number;
|
|
197
|
+
y2: number;
|
|
198
|
+
rotation?: number | undefined;
|
|
199
|
+
} | {
|
|
200
|
+
type: "rect";
|
|
201
|
+
color: string;
|
|
202
|
+
width: number;
|
|
203
|
+
x: number;
|
|
204
|
+
y: number;
|
|
205
|
+
w: number;
|
|
206
|
+
h: number;
|
|
207
|
+
rotation?: number | undefined;
|
|
208
|
+
} | {
|
|
209
|
+
type: "ellipse";
|
|
210
|
+
color: string;
|
|
211
|
+
width: number;
|
|
212
|
+
x: number;
|
|
213
|
+
y: number;
|
|
214
|
+
w: number;
|
|
215
|
+
h: number;
|
|
216
|
+
rotation?: number | undefined;
|
|
217
|
+
} | {
|
|
218
|
+
type: "text";
|
|
219
|
+
color: string;
|
|
220
|
+
x: number;
|
|
221
|
+
y: number;
|
|
222
|
+
text: string;
|
|
223
|
+
fontSize: number;
|
|
224
|
+
rotation?: number | undefined;
|
|
225
|
+
} | {
|
|
226
|
+
type: "sticker";
|
|
227
|
+
x: number;
|
|
228
|
+
y: number;
|
|
229
|
+
w: number;
|
|
230
|
+
h: number;
|
|
231
|
+
rotation?: number | undefined;
|
|
232
|
+
emoji?: string | undefined;
|
|
233
|
+
src?: string | undefined;
|
|
234
|
+
})[] | undefined;
|
|
235
|
+
keepAudio?: boolean | undefined;
|
|
236
|
+
poster?: {
|
|
237
|
+
time: number;
|
|
238
|
+
} | undefined;
|
|
239
|
+
}, {
|
|
240
|
+
rotation: number;
|
|
241
|
+
clips: {
|
|
242
|
+
srcIdx: number;
|
|
243
|
+
in: number;
|
|
244
|
+
out: number;
|
|
245
|
+
}[];
|
|
246
|
+
audioClips: {
|
|
247
|
+
srcIdx: number;
|
|
248
|
+
in: number;
|
|
249
|
+
out: number;
|
|
250
|
+
startAt: number;
|
|
251
|
+
volume: number;
|
|
252
|
+
}[];
|
|
253
|
+
canvas: {
|
|
254
|
+
w: number;
|
|
255
|
+
h: number;
|
|
256
|
+
};
|
|
257
|
+
flipX: boolean;
|
|
258
|
+
flipY: boolean;
|
|
259
|
+
filters: {
|
|
260
|
+
brightness: number;
|
|
261
|
+
contrast: number;
|
|
262
|
+
saturation: number;
|
|
263
|
+
temperature: number;
|
|
264
|
+
tint: number;
|
|
265
|
+
vibrance: number;
|
|
266
|
+
gamma: number;
|
|
267
|
+
highlights: number;
|
|
268
|
+
shadows: number;
|
|
269
|
+
whites: number;
|
|
270
|
+
blacks: number;
|
|
271
|
+
lightSense: number;
|
|
272
|
+
sharpen: number;
|
|
273
|
+
clarity: number;
|
|
274
|
+
grain: number;
|
|
275
|
+
fade: number;
|
|
276
|
+
vignette: number;
|
|
277
|
+
};
|
|
278
|
+
keepAudio: boolean;
|
|
279
|
+
crop?: {
|
|
280
|
+
width: number;
|
|
281
|
+
x: number;
|
|
282
|
+
y: number;
|
|
283
|
+
height: number;
|
|
284
|
+
} | undefined;
|
|
285
|
+
scale?: {
|
|
286
|
+
width: number;
|
|
287
|
+
height: number;
|
|
288
|
+
fit: "contain" | "cover" | "force";
|
|
289
|
+
} | undefined;
|
|
290
|
+
filterPreset?: string | undefined;
|
|
291
|
+
overlays?: ({
|
|
292
|
+
type: "pen";
|
|
293
|
+
points: number[];
|
|
294
|
+
color: string;
|
|
295
|
+
width: number;
|
|
296
|
+
rotation?: number | undefined;
|
|
297
|
+
} | {
|
|
298
|
+
type: "line";
|
|
299
|
+
color: string;
|
|
300
|
+
width: number;
|
|
301
|
+
x1: number;
|
|
302
|
+
y1: number;
|
|
303
|
+
x2: number;
|
|
304
|
+
y2: number;
|
|
305
|
+
rotation?: number | undefined;
|
|
306
|
+
} | {
|
|
307
|
+
type: "arrow";
|
|
308
|
+
color: string;
|
|
309
|
+
width: number;
|
|
310
|
+
x1: number;
|
|
311
|
+
y1: number;
|
|
312
|
+
x2: number;
|
|
313
|
+
y2: number;
|
|
314
|
+
rotation?: number | undefined;
|
|
315
|
+
} | {
|
|
316
|
+
type: "rect";
|
|
317
|
+
color: string;
|
|
318
|
+
width: number;
|
|
319
|
+
x: number;
|
|
320
|
+
y: number;
|
|
321
|
+
w: number;
|
|
322
|
+
h: number;
|
|
323
|
+
rotation?: number | undefined;
|
|
324
|
+
} | {
|
|
325
|
+
type: "ellipse";
|
|
326
|
+
color: string;
|
|
327
|
+
width: number;
|
|
328
|
+
x: number;
|
|
329
|
+
y: number;
|
|
330
|
+
w: number;
|
|
331
|
+
h: number;
|
|
332
|
+
rotation?: number | undefined;
|
|
333
|
+
} | {
|
|
334
|
+
type: "text";
|
|
335
|
+
color: string;
|
|
336
|
+
x: number;
|
|
337
|
+
y: number;
|
|
338
|
+
text: string;
|
|
339
|
+
fontSize: number;
|
|
340
|
+
rotation?: number | undefined;
|
|
341
|
+
} | {
|
|
342
|
+
type: "sticker";
|
|
343
|
+
x: number;
|
|
344
|
+
y: number;
|
|
345
|
+
w: number;
|
|
346
|
+
h: number;
|
|
347
|
+
rotation?: number | undefined;
|
|
348
|
+
emoji?: string | undefined;
|
|
349
|
+
src?: string | undefined;
|
|
350
|
+
})[] | undefined;
|
|
351
|
+
poster?: {
|
|
352
|
+
time: number;
|
|
353
|
+
} | undefined;
|
|
354
|
+
}>;
|
|
355
|
+
/** 重置为给定状态(清空 history、源登记保留) */
|
|
356
|
+
reset(state?: VideoEditStateWithTransitions): void;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export { type AudioSourceMeta, type EngineListener, type ExportPlan, type FilterKey, type MutOpts, TransitionT, VideoEditStateWithTransitions, VideoEditorEngine, type VideoSourceMeta };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHistory as h,defaultVideoEditState as p,canUndo as f,canRedo as v,undo as S,redo as C,replacePresent as c,pushHistory as l,clampAudioClip as d,totalDuration as u,splitAtOutput as A,removeClip as B,duplicateClip as g,reorderClips as x,trimClipEdge as I,contentDuration as P,locateOutput as V,usedVideoSrcIndices as y,remapSrcIndices as k,VideoEditState as w}from"./chunk-MGKYVYOH.js";function M(t){const i=Math.min(Math.max(Math.round(t),2),4096);return i%2===0?i:i-1}var m=t=>Math.min(Math.max(t,-180),180),E=class{constructor(t=p()){this.videoSources=[],this.audioSources=[],this.listeners=new Set,this.transientBase=null,this.getSnapshot=()=>this.history.present,this.subscribe=i=>(this.listeners.add(i),()=>this.listeners.delete(i)),this.history=h(t)}getState(){return this.history.present}emit(){const t=this.history.present;for(const i of this.listeners)i(t)}canUndo(){return f(this.history)}canRedo(){return v(this.history)}undo(){this.transientBase=null,this.history=S(this.history),this.emit()}redo(){this.transientBase=null,this.history=C(this.history),this.emit()}applyMut(t,i=!1){if(i)this.transientBase===null&&(this.transientBase=this.history.present),this.history=c(this.history,t(this.transientBase));else{const s=this.transientBase??this.history.present,r=t(s),e=this.transientBase?{...this.history,present:this.transientBase}:this.history;this.history=l(e,r),this.transientBase=null}this.emit()}registerVideoSource(t){const i=this.videoSources.length;this.videoSources.push(t);const s={srcIdx:i,in:0,out:t.duration};return i===0||this.history.present.clips.length===0?(this.transientBase=null,this.history=h({...p(),clips:[s],canvas:{w:M(t.width),h:M(t.height)},poster:{time:Math.min(1,t.duration/2)}}),this.emit()):this.applyMut(r=>({...r,clips:[...r.clips,s]})),i}registerAudioSource(t){const i=this.audioSources.length;return this.audioSources.push(t),this.applyMut(s=>{const r=new Set((s.audioClips??[]).map((n,a)=>Number.isInteger(n?.track)&&n.track>=0?n.track:a));let e=0;for(;r.has(e);)e+=1;const o=d({srcIdx:i,track:e,startAt:0,in:0,out:t.duration,volume:1},t.duration,u(s.clips));return{...s,audioClips:[...s.audioClips,o]}}),i}getVideoSource(t){return this.videoSources[t]}getAudioSource(t){return this.audioSources[t]}addClipFromSource(t){const i=this.videoSources[t];i&&this.applyMut(s=>({...s,clips:[...s.clips,{srcIdx:t,in:0,out:i.duration}]}))}splitAtPlayhead(t){this.applyMut(i=>({...i,clips:A(i.clips,t)}))}removeClip(t){this.applyMut(i=>({...i,clips:B(i.clips,t)}))}duplicateClip(t){this.applyMut(i=>({...i,clips:g(i.clips,t)}))}reorderClips(t,i){this.applyMut(s=>({...s,clips:x(s.clips,t,i)}))}trimClip(t,i,s,r){this.applyMut(e=>{const o=e.clips[t];if(!o)return e;const n=this.videoSources[o.srcIdx]?.duration??o.out;return{...e,clips:I(e.clips,t,i,s,n)}},r?.transient)}moveAudioClip(t,i,s){this.applyMut(r=>this.patchAudio(r,t,e=>({...e,startAt:i})),s?.transient)}trimAudioClip(t,i,s,r){this.applyMut(e=>this.patchAudio(e,t,o=>{if(i==="in"){const n=s-o.in;return{...o,in:s,startAt:o.startAt+n}}return{...o,out:s}}),r?.transient)}setAudioVolume(t,i,s){this.applyMut(r=>this.patchAudio(r,t,e=>({...e,volume:i}),!1),s?.transient)}removeAudioClip(t){this.applyMut(i=>({...i,audioClips:i.audioClips.filter((s,r)=>r!==t)}))}patchAudio(t,i,s,r=!0){const e=t.audioClips[i];if(!e)return t;let o=s(e);if(r){const n=this.audioSources[e.srcIdx]?.duration??e.out;o=d(o,n,u(t.clips))}return{...t,audioClips:t.audioClips.map((n,a)=>a===i?o:n)}}setCrop(t,i){this.applyMut(s=>({...s,crop:t}),i?.transient)}clearCrop(){this.applyMut(t=>({...t,crop:void 0}))}setScale(t){this.applyMut(i=>({...i,scale:t}))}clearScale(){this.applyMut(t=>({...t,scale:void 0}))}setRotation(t,i){this.applyMut(s=>({...s,rotation:m(t)}),i?.transient)}rotateBy(t){this.applyMut(i=>{let s=i.rotation+t;return s>180&&(s-=360),s<-180&&(s+=360),{...i,rotation:m(s)}})}flipX(){this.applyMut(t=>({...t,flipX:!t.flipX}))}flipY(){this.applyMut(t=>({...t,flipY:!t.flipY}))}setFilter(t,i,s){this.applyMut(r=>({...r,filters:{...r.filters,[t]:i}}),s?.transient)}setFilters(t,i){this.applyMut(s=>({...s,filters:{...s.filters,...t}}),i?.transient)}setFilterPreset(t){this.applyMut(i=>({...i,filterPreset:t}))}addOverlay(t){this.applyMut(i=>({...i,overlays:[...i.overlays??[],t]}))}updateOverlay(t,i,s){this.applyMut(r=>{const e=r.overlays??[];return e[t]?{...r,overlays:e.map((o,n)=>n===t?{...o,...i}:o)}:r},s?.transient)}removeOverlay(t){this.applyMut(i=>({...i,overlays:(i.overlays??[]).filter((s,r)=>r!==t)}))}patch(t,i){i?.transient?(this.transientBase===null&&(this.transientBase=this.history.present),this.history=c(this.history,{...this.transientBase,...t}),this.emit()):this.commit(t)}commit(t){const i=t?{...this.history.present,...t}:this.history.present,s=this.transientBase;this.transientBase=null,this.history=s?l({...this.history,present:s},i):l(this.history,i),this.emit()}setKeepAudio(t){this.applyMut(i=>({...i,keepAudio:t}))}setPoster(t){this.applyMut(i=>({...i,poster:{time:Math.max(0,t)}}))}totalDuration(){return u(this.history.present.clips)}contentDuration(){const t=this.history.present;return P(t.clips,t.audioClips,t.overlays)}locate(t){return V(this.history.present.clips,t)}usedVideoSources(){return y(this.history.present.clips)}getExportPlan(){const t=this.history.present,i=y(t.clips),s=[...new Set(t.audioClips.map(e=>e.srcIdx))].sort((e,o)=>e-o),r=new Map(s.map((e,o)=>[e,o]));return{state:{...t,clips:k(t.clips,i),audioClips:t.audioClips.map(e=>({...e,srcIdx:r.get(e.srcIdx)??0}))},videoSrcOrder:i,audioSrcOrder:s}}validate(){return w.safeParse(this.getExportPlan().state)}reset(t=p()){this.transientBase=null,this.history=h(t),this.emit()}};export{E as VideoEditorEngine};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var T={"tool.trim":"\u526A\u8F91","tool.crop":"\u88C1\u526A","tool.tune":"\u8C03\u8272","tool.filter":"\u6EE4\u955C","tool.annotate":"\u6807\u6CE8","tool.sticker":"\u8D34\u7EB8","tool.resize":"\u6BD4\u4F8B","tune.brightness":"\u4EAE\u5EA6","tune.contrast":"\u5BF9\u6BD4","tune.saturation":"\u9971\u548C","tune.gamma":"Gamma","overlay.select":"\u9009\u62E9","overlay.pen":"\u753B\u7B14","overlay.eraser":"\u6A61\u76AE","overlay.line":"\u76F4\u7EBF","overlay.arrow":"\u7BAD\u5934","overlay.rect":"\u77E9\u5F62","overlay.ellipse":"\u692D\u5706","overlay.text":"\u6587\u5B57","overlay.color":"\u7EBF\u8272","overlay.width":"\u7EBF\u5BBD","overlay.copySelected":"\u590D\u5236","overlay.delSelected":"\u5220\u9664\u9009\u4E2D","overlay.editSelected":"\u7F16\u8F91","overlay.pickImage":"\u9009\u62E9\u56FE\u7247","overlay.hint":"\u70B9 emoji/\u56FE\u7247\u6DFB\u52A0 \u2192 \u753B\u5E03\u4E0A\u62D6\u52A8\u6446\u4F4D,\u62D6\u53F3\u4E0B\u89D2\u7D2B\u8272\u628A\u624B\u7F29\u653E","overlay.textPlaceholder":"\u8F93\u5165\u6587\u5B57,\u56DE\u8F66\u786E\u8BA4","filter.none":"\u539F\u56FE","filter.bw":"\u9ED1\u767D","filter.sepia":"\u590D\u53E4","filter.warm":"\u6696\u9633","filter.cool":"\u51B7\u8C03","filter.vivid":"\u9C9C\u8273","ratio.orig":"\u539F\u59CB","ratio.free":"\u81EA\u7531\u6BD4\u4F8B","ratio.9:16":"\u7AD6\u5C4F 9:16","ratio.16:9":"\u6A2A\u5C4F 16:9","ratio.1:1":"\u65B9\u5F62 1:1","ratio.4:5":"\u7AD6\u56FE 4:5","act.fit":"\u9002\u5E94","act.zoomFit":"\u7F29\u653E\u81F3\u9002\u5F53\u5927\u5C0F","act.zoomTo":"\u7F29\u653E\u81F3 {value}%","act.split":"\u5206\u5272","act.copy":"\u590D\u5236","act.delete":"\u5220\u9664","act.restore":"\u8FD8\u539F","act.deleteMusic":"\u5220\u9664\u97F3\u4E50","act.cancel":"\u53D6\u6D88","act.exportPoster":"\u5BFC\u51FA\u5C01\u9762","act.exporting":"\u5BFC\u51FA\u4E2D\u2026","act.poster":"\u{1F5BC} \u5C01\u9762","act.again":"\u518D\u6B21\u4E0B\u8F7D","act.saveDrive":"\u5B58\u7F51\u76D8","act.changeImage":"\u2190 \u6362\u4E00\u5F20","act.changeVideo":"\u2190 \u6362\u4E00\u4E2A","crop.rotateLeft":"\u21BA \u5411\u5DE6\u65CB\u8F6C","crop.flipX":"\u21CB \u6C34\u5E73\u7FFB\u8F6C","crop.flipY":"\u21F5 \u5782\u76F4\u7FFB\u8F6C","crop.rotateLeftShort":"\u5DE6\u8F6C","crop.flipXShort":"\u6A2A\u7FFB","crop.flipYShort":"\u7AD6\u7FFB","tip.close":"\u5173\u95ED(\u6362\u6587\u4EF6)","tip.undo":"\u64A4\u9500","tip.redo":"\u91CD\u505A","tip.resetOpened":"\u91CD\u7F6E\u5230\u6253\u5F00\u6587\u4EF6\u65F6","tip.previewZoom":"\u9884\u89C8\u7F29\u653E\u6BD4\u4F8B","tip.previewZoomOut":"\u7F29\u5C0F\u9884\u89C8","tip.previewZoomIn":"\u653E\u5927\u9884\u89C8","tip.previewZoomFit":"\u9002\u5E94\u9884\u89C8","tip.previewPointer":"\u6307\u9488\u5DE5\u5177","tip.previewPan":"\u624B\u5DE5\u5177\uFF1A\u62D6\u52A8\u753B\u9762","tip.poster":"\u9884\u89C8\u5E76\u9009\u62E9\u5C01\u9762\u5E27","tip.keepAudio":"\u539F\u89C6\u9891\u58F0\u97F3\u5F00\u5173(\u4E0E\u97F3\u4E50\u6DF7\u97F3;\u9884\u89C8\u540C\u6B65)","tip.split":"\u5728\u64AD\u653E\u5934\u5904\u628A\u5F53\u524D\u7247\u6BB5\u4E00\u5206\u4E3A\u4E8C","tip.zoomOut":"\u7F29\u5C0F\u65F6\u95F4\u8F74(Ctrl+\u6EDA\u8F6E)","tip.zoomIn":"\u653E\u5927\u65F6\u95F4\u8F74(Ctrl+\u6EDA\u8F6E)","tip.fit":"\u7F29\u653E\u5230\u9002\u5E94\u5BBD\u5EA6","tip.addVideo":"\u6DFB\u52A0\u89C6\u9891\u7247\u6BB5","tip.addAudio":"\u6DFB\u52A0\u97F3\u4E50(\u97F3\u9891\u6587\u4EF6,\u6216\u9009\u542B\u58F0\u97F3\u7684\u89C6\u9891\u81EA\u52A8\u63D0\u53D6\u97F3\u8F68;\u4E0E\u539F\u58F0\u6DF7\u97F3)","tip.dupClip":"\u590D\u5236\u8BE5\u7247\u6BB5(\u63D2\u5230\u5176\u540E)","tip.delClip":"\u5220\u9664\u8BE5\u7247\u6BB5","tip.lockAspect":"\u9501\u5B9A\u7EB5\u6A2A\u6BD4","tip.dblConfirm":"\u53CC\u51FB\u786E\u8BA4\u88C1\u526A","err.notVideo":"\u8BF7\u9009\u62E9\u89C6\u9891\u6587\u4EF6","err.maxVideo":"\u6700\u591A {max} \u4E2A\u89C6\u9891\u7D20\u6750","err.videoLoad":"\u89C6\u9891\u52A0\u8F7D\u5931\u8D25,\u8BF7\u6362\u4E00\u4E2A\u6587\u4EF6","err.notAudio":"\u8BF7\u9009\u62E9\u97F3\u9891\u6587\u4EF6(mp3/wav/m4a),\u6216\u542B\u58F0\u97F3\u7684\u89C6\u9891(\u81EA\u52A8\u63D0\u53D6\u97F3\u8F68)","err.maxAudio":"\u6700\u591A {max} \u4E2A\u97F3\u9891\u7D20\u6750","err.audioLoad":"\u97F3\u9891\u52A0\u8F7D\u5931\u8D25,\u8BF7\u6362\u4E00\u4E2A\u6587\u4EF6","err.processFailed":"\u5904\u7406\u5931\u8D25","err.posterFailed":"\u5C01\u9762\u6E32\u67D3\u5931\u8D25","err.canvas":"canvas \u4E0D\u53EF\u7528","err.imageRead":"\u56FE\u7247\u8BFB\u53D6\u5931\u8D25,\u8BF7\u6362\u4E00\u5F20","err.notImage":"\u8BF7\u9009\u62E9\u56FE\u7247\u6587\u4EF6","err.fileType":"\u53EA\u652F\u6301\u56FE\u7247\u6216\u89C6\u9891\u6587\u4EF6","err.saveDrive":"\u5B58\u7F51\u76D8\u5931\u8D25","msg.processing":"\u6B63\u5728\u5BFC\u51FA\u4E2D\u2026","msg.exportingHint":"\u8BF7\u7A0D\u5019\uFF0C\u5BFC\u51FA\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u8FD4\u56DE\u7ED3\u679C\u3002","msg.done":"\u5B8C\u6210 \u2713","msg.loading":"\u7D20\u6750\u52A0\u8F7D\u4E2D\u2026","msg.exported":"\u5DF2\u5BFC\u51FA\uFF1A","msg.saving":"\u5B58\u7F51\u76D8\u4E2D\u2026","msg.saved":"\u5DF2\u5B58\u5230\u7F51\u76D8 \u2713","lbl.ratioSection":"\u753B\u9762\u6BD4\u4F8B(\u88C1\u526A,\u4E0D\u53D8\u5F62)","lbl.dragToReposition":"\u2194 \u62D6\u52A8\u9884\u89C8\u53EF\u8C03\u6574\u88C1\u526A\u4F4D\u7F6E","lbl.sizeSection":"\u5BFC\u51FA\u5C3A\u5BF8(\u50CF\u7D20;\u6BD4\u4F8B\u4E0D\u7B26\u65F6 cover \u5C45\u4E2D\u88C1\u526A)","lbl.currentOut":"\u5F53\u524D\u8F93\u51FA","lbl.zoomSize":"\u5927\u5C0F","lbl.noScale":"(\u672A\u7F29\u653E)","lbl.coverNote":"\xB7 \u6BD4\u4F8B\u4E0D\u4E00\u81F4\u65F6\u5C45\u4E2D\u88C1\u526A(cover),\u4E0D\u53D8\u5F62","lbl.audioTrackHint":"\u266A \u97F3\u9891\u8F68(\u53F3\u4FA7 \uFF0B \u6DFB\u52A0\u97F3\u4E50,\u4E0E\u539F\u58F0\u6DF7\u97F3)","lbl.volume":"\u97F3\u91CF","lbl.volNote":"(\u9884\u89C8\u6700\u5927 100%,\u5BFC\u51FA\u6309\u8BBE\u5B9A\u503C)","lbl.music":"\u97F3\u4E50","kbd.fit":"\u21E7 F","poster.title":"\u9009\u62E9\u5C01\u9762\u5E27","panel.title":"\u5A92\u4F53\u7F16\u8F91\u5668","panel.subtitle":"\u4E0A\u4F20\u56FE\u7247 / \u89C6\u9891\uFF0C\u88C1\u526A \xB7 \u6EE4\u955C \xB7 \u6587\u5B57 \xB7 \u5BFC\u51FA","panel.pick":"\u70B9\u51FB\u9009\u62E9\u56FE\u7247\u6216\u89C6\u9891","panel.pickHint":"\u56FE\u7247\u7528 Filerobot \xB7 \u89C6\u9891\u53EF\u88C1\u526A/\u9759\u97F3/\u5C01\u9762"},h={\u7B80:"\u7C21",\u4F53:"\u9AD4",\u56FE:"\u5716",\u9891:"\u983B",\u89C6:"\u8996",\u8F91:"\u8F2F",\u8C03:"\u8ABF",\u6EE4:"\u6FFE",\u6807:"\u6A19",\u6CE8:"\u8A3B",\u8D34:"\u8CBC",\u9009:"\u9078",\u62E9:"\u64C7",\u7EBF:"\u7DDA",\u7BAD:"\u7BAD",\u5934:"\u982D",\u590D:"\u8907",\u5220:"\u522A",\u9664:"\u9664",\u7F16:"\u7DE8",\u8FB9:"\u908A",\u8F93:"\u8F38",\u5165:"\u5165",\u786E:"\u78BA",\u8BA4:"\u8A8D",\u9971:"\u98FD",\u5BF9:"\u5C0D",\u6696:"\u6696",\u9633:"\u967D",\u51B7:"\u51B7",\u7EB5:"\u7E31",\u6A2A:"\u6A6B",\u9002:"\u9069",\u5E94:"\u61C9",\u7F29:"\u7E2E",\u5B9E:"\u5BE6",\u9645:"\u969B",\u5BFC:"\u5C0E",\u51FA:"\u51FA",\u5C01:"\u5C01",\u9762:"\u9762",\u6362:"\u63DB",\u5F20:"\u5F35",\u9884:"\u9810",\u89C8:"\u89BD",\u52A8:"\u52D5",\u58F0:"\u8072",\u5F00:"\u958B",\u5173:"\u95DC",\u4E0E:"\u8207",\u4E50:"\u6A02",\u6DF7:"\u6DF7",\u5904:"\u8655",\u8F7D:"\u8F09",\u9519:"\u932F",\u8BEF:"\u8AA4",\u8BFB:"\u8B80",\u4EC5:"\u50C5",\u7EC8:"\u7D42",\u7A0D:"\u7A0D",\u5019:"\u5019",\u8FD4\u56DE:"\u8FD4\u56DE",\u5F53\u524D:"\u76EE\u524D",\u8F93\u51FA:"\u8F38\u51FA",\u753B:"\u756B",\u53D8:"\u8B8A",\u97F3\u9891:"\u97F3\u8A0A",\u97F3\u8F68:"\u97F3\u8ECC",\u6DFB\u52A0:"\u65B0\u589E",\u5220\u9664:"\u522A\u9664",\u4FDD\u5B58:"\u5132\u5B58",\u52A0\u8F7D:"\u8F09\u5165",\u7F51\u76D8:"\u7DB2\u76E4"},m=u=>{let o=u;for(const[a,e]of Object.entries(h).sort((t,i)=>i[0].length-t[0].length))o=o.replaceAll(a,e);return o};Object.fromEntries(Object.entries(T).map(([u,o])=>[u,m(o)]));var c=[{platform:"tiktok",postType:"video",label:"TikTok Video",shortLabel:"TT\xB7Video",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"post",label:"Instagram Post",shortLabel:"IG\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"instagram",postType:"reels",label:"Instagram Reels",shortLabel:"IG\xB7Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"story",label:"Instagram Story",shortLabel:"IG\xB7Story",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"facebook",postType:"post",label:"Facebook Post",shortLabel:"FB\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"facebook",postType:"reels",label:"Facebook Reels",shortLabel:"FB\xB7Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"youtube",postType:"video",label:"YouTube Video",shortLabel:"YT\xB7Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"youtube",postType:"shorts",label:"YouTube Shorts",shortLabel:"YT\xB7Shorts",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"pinterest",postType:"pin",label:"Pinterest Pin",shortLabel:"PIN",ratio:"2:3",imageSize:"1664x2496",videoRatio:"9:16",videoResolution:"720p"},{platform:"x",postType:"post",label:"X Post",shortLabel:"X\xB7Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"},{platform:"linkedin",postType:"post",label:"LinkedIn Post",shortLabel:"LI\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"linkedin",postType:"video",label:"LinkedIn Video",shortLabel:"LI\xB7Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"threads",postType:"post",label:"Threads Post",shortLabel:"TH\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"telegram",postType:"post",label:"Telegram Post",shortLabel:"TG\xB7Post",ratio:"1:1",imageSize:"2048x2048",videoRatio:"9:16",videoResolution:"720p"},{platform:"reddit",postType:"post",label:"Reddit Post",shortLabel:"RD\xB7Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"}],x={"1:1":"\u65B9\u5F62 1:1","4:5":"\u7AD6\u56FE 4:5","3:4":"\u7AD6\u56FE 3:4","9:16":"\u7AD6\u5C4F 9:16","16:9":"\u6A2A\u5C4F 16:9","2:3":"\u7AD6\u56FE 2:3","1.91:1":"\u6A2A\u5E45 1.91:1"};function s(u){const[o,a]=u.split(":").map(Number);return!o||!a?1:o/a}function B(u){const o=new Set,a=[];for(const e of u)!e||o.has(e)||(o.add(e),a.push({ratio:e,value:s(e),label:x[e]??e}));return a}B(["1:1","4:5","3:4","2:3","9:16","16:9","1.91:1"]),B(["9:16","16:9","1:1","4:5"]);function y(u=c){const o=new Set,a=[];for(const e of u){if(!e.videoRatio)continue;const t=`${e.platform}:${e.postType}:${e.videoRatio}`;if(o.has(t))continue;o.add(t);const i=e.label.split(" ").slice(0,-1).join(" ")||e.label;a.push({platform:e.platform,postType:e.postType,label:`${i} ${e.videoRatio}`,ratio:e.videoRatio,value:s(e.videoRatio)})}return a}y();function R(u=c){const o=new Map;for(const a of u){const e=o.get(a.platform);(!e||e.postType!=="post"&&a.postType==="post")&&o.set(a.platform,a)}return Array.from(o.values()).map(a=>{const[e,t]=a.imageSize.split("x").map(Number),i=a.label.split(" ").slice(0,-1).join(" ")||a.label;return{platform:a.platform,label:`${i} ${a.ratio}`,ratio:a.ratio,value:s(a.ratio),w:e,h:t}})}var E=R();function I(u,o){return u>=1?{w:Math.round(o*u/2)*2,h:o}:{w:o,h:Math.round(o/u/2)*2}}function S(u=c){const o=new Set,a=[];for(const e of u){if(!e.videoRatio||!e.videoResolution)continue;const t=e.videoResolution==="1080p"?1080:720,{w:i,h:r}=I(s(e.videoRatio),t),l=`${i}x${r}`;o.has(l)||(o.add(l),a.push({label:`${e.shortLabel} ${i}\xD7${r}`,w:i,h:r}))}return a}S();function z(u,o){if(u.isDuplicated)return{};if((u.rotation??0)!==0)return{};const a=o.adjustments?.rotation??0;return a?{rotation:-a}:{}}var A={"txt-primary":"#f1f1f4","txt-secondary":"#b6bac4","txt-secondary-invert":"#14141a","txt-placeholder":"#7c818c","txt-warning":"#fbbf24","txt-error":"#f87171","txt-info":"#7cc4f5","icon-primary":"#d6d8e0","icons-secondary":"#9aa0ac","icons-muted":"#7c818c","icons-placeholder":"#3a3a44","icons-invert":"#14141a","icons-primary-hover":"#ffffff","icons-secondary-hover":"#d6d8e0","bg-primary":"#14141a","bg-primary-light":"#1a1a22","bg-primary-hover":"#20202a","bg-primary-active":"#2a2a38","bg-primary-stateless":"#20202a","bg-secondary":"#1a1a22","bg-stateless":"#1a1a22","bg-active":"#262633","bg-hover":"#20202a","bg-grey":"#23232e","bg-base-light":"#23232e","bg-base-medium":"#2a2a38","bg-tooltip":"#2a2a33","accent-primary":"#7C7CF0","accent-primary-hover":"#8F8FF5","accent-primary-active":"#6A6AE8","accent-stateless":"#7C7CF0","btn-primary-text":"#ffffff","btn-secondary-text":"#f1f1f4","btn-disabled-text":"#6a6a72","link-primary":"#c4c4cc","link-stateless":"#c4c4cc","link-hover":"#ffffff","link-active":"#ffffff","borders-primary":"#2e2e3a","borders-primary-hover":"#4a4a58","borders-secondary":"#26262f","borders-strong":"#3a3a46","borders-invert":"#d6d8e0","borders-item":"#26262f","borders-button":"#3a3a46","active-secondary":"#1f1f29","active-secondary-hover":"rgba(124,124,240,0.16)",tag:"#9aa0ac","light-shadow":"rgba(0,0,0,0.4)","medium-shadow":"rgba(0,0,0,0.5)"},D={"txt-primary":"#0a0a0a","txt-secondary":"#52525b","txt-secondary-invert":"#ffffff","txt-placeholder":"#a1a1aa","txt-warning":"#b45309","txt-error":"#dc2626","txt-info":"#2563eb","icon-primary":"#3f3f46","icons-secondary":"#71717a","icons-muted":"#a1a1aa","icons-placeholder":"#d4d4d8","icons-invert":"#ffffff","icons-primary-hover":"#0a0a0a","icons-secondary-hover":"#3f3f46","bg-primary":"#ffffff","bg-primary-light":"#fafafa","bg-primary-hover":"#f4f4f5","bg-primary-active":"#e4e4e7","bg-primary-stateless":"#f4f4f5","bg-secondary":"#fafafa","bg-stateless":"#fafafa","bg-active":"#ededfb","bg-hover":"#f4f4f5","bg-grey":"#f1f1f3","bg-base-light":"#f4f4f5","bg-base-medium":"#e4e4e7","bg-tooltip":"#18181b","accent-primary":"#5B5BD6","accent-primary-hover":"#4F4FC9","accent-primary-active":"#4444B8","accent-stateless":"#5B5BD6","btn-primary-text":"#ffffff","btn-secondary-text":"#0a0a0a","btn-disabled-text":"#a1a1aa","link-primary":"#5B5BD6","link-stateless":"#5B5BD6","link-hover":"#4444B8","link-active":"#4444B8","borders-primary":"#e6e6e8","borders-primary-hover":"#d4d4d8","borders-secondary":"#ededf0","borders-strong":"#d4d4d8","borders-invert":"#3f3f46","borders-item":"#ededf0","borders-button":"#d4d4d8","active-secondary":"#ededfb","active-secondary-hover":"rgba(91,91,214,0.10)",tag:"#71717a","light-shadow":"rgba(0,0,0,0.06)","medium-shadow":"rgba(0,0,0,0.12)"},p={name:"\u540D\u79F0",save:"\u4FDD\u5B58",saveAs:"\u53E6\u5B58\u4E3A",back:"\u8FD4\u56DE",loading:"\u52A0\u8F7D\u4E2D\u2026",resetOperations:"\u91CD\u7F6E/\u6E05\u9664\u5168\u90E8\u64CD\u4F5C",changesLoseWarningHint:"\u6309\u4E0B\u300C\u91CD\u7F6E\u300D\u5C06\u4E22\u5931\u6240\u6709\u4FEE\u6539,\u786E\u5B9A\u7EE7\u7EED\u5417?",discardChangesWarningHint:"\u5173\u95ED\u5F39\u7A97\u540E,\u6700\u540E\u7684\u4FEE\u6539\u5C06\u4E0D\u4F1A\u4FDD\u5B58\u3002",cancel:"\u53D6\u6D88",apply:"\u5E94\u7528",warning:"\u8B66\u544A",confirm:"\u786E\u8BA4",discardChanges:"\u653E\u5F03\u4FEE\u6539",undoTitle:"\u64A4\u9500\u4E0A\u4E00\u6B65",redoTitle:"\u91CD\u505A\u4E0A\u4E00\u6B65",showImageTitle:"\u663E\u793A\u539F\u56FE",zoomInTitle:"\u653E\u5927",fitTitle:"\u9002\u5E94",zoomOutTitle:"\u7F29\u5C0F",toggleZoomMenuTitle:"\u7F29\u653E\u83DC\u5355",pointerToolTitle:"\u6307\u9488\u5DE5\u5177",panToolTitle:"\u624B\u5DE5\u5177\uFF1A\u62D6\u52A8\u753B\u9762",adjustTab:"\u8C03\u6574",finetuneTab:"\u5FAE\u8C03",filtersTab:"\u6EE4\u955C",watermarkTab:"\u6C34\u5370",annotateTabLabel:"\u6807\u6CE8",resize:"\u8C03\u6574\u5C3A\u5BF8",resizeTab:"\u5C3A\u5BF8",imageName:"\u56FE\u7247\u540D\u79F0",invalidImageError:"\u63D0\u4F9B\u7684\u56FE\u7247\u65E0\u6548\u3002",uploadImageError:"\u4E0A\u4F20\u56FE\u7247\u51FA\u9519\u3002",areNotImages:"\u4E0D\u662F\u56FE\u7247",isNotImage:"\u4E0D\u662F\u56FE\u7247",toBeUploaded:"\u5F85\u4E0A\u4F20",cropTool:"\u88C1\u526A",original:"\u539F\u59CB",custom:"\u81EA\u5B9A\u4E49",square:"\u65B9\u5F62",landscape:"\u6A2A\u5411",portrait:"\u7EB5\u5411",ellipse:"\u692D\u5706",classicTv:"\u7ECF\u5178\u7535\u89C6",cinemascope:"\u5BBD\u94F6\u5E55",arrowTool:"\u7BAD\u5934",blurTool:"\u6A21\u7CCA",brightnessTool:"\u4EAE\u5EA6",contrastTool:"\u5BF9\u6BD4\u5EA6",ellipseTool:"\u692D\u5706",unFlipX:"\u53D6\u6D88\u6C34\u5E73\u7FFB\u8F6C",flipX:"\u6C34\u5E73\u7FFB\u8F6C",unFlipY:"\u53D6\u6D88\u5782\u76F4\u7FFB\u8F6C",flipY:"\u5782\u76F4\u7FFB\u8F6C",hsvTool:"HSV",hue:"\u8272\u76F8",brightness:"\u4EAE\u5EA6",saturation:"\u9971\u548C\u5EA6",value:"\u660E\u5EA6",imageTool:"\u56FE\u7247",importing:"\u5BFC\u5165\u4E2D\u2026",addImage:"\u6DFB\u52A0\u56FE\u7247",uploadImage:"\u4E0A\u4F20\u56FE\u7247",fromGallery:"\u4ECE\u56FE\u5E93",lineTool:"\u76F4\u7EBF",penTool:"\u753B\u7B14",polygonTool:"\u591A\u8FB9\u5F62",sides:"\u8FB9\u6570",rectangleTool:"\u77E9\u5F62",cornerRadius:"\u5706\u89D2",resizeWidthTitle:"\u5BBD\u5EA6(\u50CF\u7D20)",resizeHeightTitle:"\u9AD8\u5EA6(\u50CF\u7D20)",toggleRatioLockTitle:"\u9501\u5B9A/\u89E3\u9501\u6BD4\u4F8B",resetSize:"\u91CD\u7F6E\u4E3A\u539F\u56FE\u5C3A\u5BF8",rotateTool:"\u65CB\u8F6C",textTool:"\u6587\u5B57",textSpacings:"\u6587\u5B57\u95F4\u8DDD",textAlignment:"\u6587\u5B57\u5BF9\u9F50",fontFamily:"\u5B57\u4F53",size:"\u5927\u5C0F",letterSpacing:"\u5B57\u95F4\u8DDD",lineHeight:"\u884C\u9AD8",warmthTool:"\u8272\u6E29",addWatermark:"\u6DFB\u52A0\u6C34\u5370",addTextWatermark:"\u6DFB\u52A0\u6587\u5B57\u6C34\u5370",addWatermarkTitle:"\u9009\u62E9\u6C34\u5370\u7C7B\u578B",uploadWatermark:"\u4E0A\u4F20\u6C34\u5370",addWatermarkAsText:"\u4EE5\u6587\u5B57\u6DFB\u52A0",padding:"\u5185\u8FB9\u8DDD",paddings:"\u5185\u8FB9\u8DDD",shadow:"\u9634\u5F71",horizontal:"\u6C34\u5E73",vertical:"\u5782\u76F4",blur:"\u6A21\u7CCA",opacity:"\u4E0D\u900F\u660E\u5EA6",transparency:"\u900F\u660E\u5EA6",position:"\u4F4D\u7F6E",stroke:"\u63CF\u8FB9",saveAsModalTitle:"\u53E6\u5B58\u4E3A",extension:"\u6269\u5C55\u540D",format:"\u683C\u5F0F",nameIsRequired:"\u540D\u79F0\u5FC5\u586B\u3002",quality:"\u8D28\u91CF",imageDimensionsHoverTitle:"\u4FDD\u5B58\u56FE\u7247\u5C3A\u5BF8(\u5BBD \xD7 \u9AD8)",cropSizeLowerThanResizedWarning:"\u6CE8\u610F:\u6240\u9009\u88C1\u526A\u533A\u57DF\u5C0F\u4E8E\u5DF2\u5E94\u7528\u7684\u8C03\u6574\u5C3A\u5BF8,\u53EF\u80FD\u5BFC\u81F4\u753B\u8D28\u4E0B\u964D",actualSize:"\u5B9E\u9645\u5927\u5C0F(100%)",fitSize:"\u9002\u5E94\u5927\u5C0F",addImageTitle:"\u9009\u62E9\u8981\u6DFB\u52A0\u7684\u56FE\u7247\u2026",mutualizedFailedToLoadImg:"\u56FE\u7247\u52A0\u8F7D\u5931\u8D25\u3002",tabsMenu:"\u83DC\u5355",download:"\u4E0B\u8F7D",width:"\u5BBD\u5EA6",height:"\u9AD8\u5EA6",cropItemNoEffect:"\u8BE5\u88C1\u526A\u9879\u65E0\u9884\u89C8",px:"px",invalidTextContent:"\u6587\u5B57\u5185\u5BB9\u65E0\u6548",baselineShift:"\u57FA\u7EBF\u504F\u79FB",aiTab:"AI \u5DE5\u5177",objectRemovalTool:"\u5BF9\u8C61\u79FB\u9664",objectRemovalBrushSize:"\u753B\u7B14\u5927\u5C0F(px)",objectRemovalApplyButton:"\u5E94\u7528",objectRemovalBrushMode:"\u753B\u7B14\u6A21\u5F0F",objectRemovalBrushCircleType:"\u5706\u5F62\u753B\u7B14",objectRemovalBrushSquareType:"\u65B9\u5F62\u753B\u7B14",objectRemovalApplyingText:"\u6B63\u5728\u79FB\u9664\u6240\u9009\u533A\u57DF",objectRemovalMarkModeTooltip:"\u6807\u8BB0\u6A21\u5F0F",objectRemovalUnMarkModeTooltip:"\u53D6\u6D88\u6807\u8BB0\u6A21\u5F0F",objectRemovalCancelConfirmationTitle:"\u53D6\u6D88\u5904\u7406",objectRemovalCancelConfirmationHint:"\u786E\u5B9A\u8981\u53D6\u6D88\u79FB\u9664\u4EE5\u4E0B\u7D20\u6750\u4E2D\u7684\u5BF9\u8C61:",objectRemovalCancelConfirmationHintCompletion:"?",theKeyword:"\u8BE5"},f={name:"Nombre",save:"Guardar",saveAs:"Guardar como",back:"Volver",loading:"Cargando\u2026",resetOperations:"Restablecer / borrar cambios",changesLoseWarningHint:"Al pulsar \u201CRestablecer\u201D se perder\xE1n todos los cambios. \xBFContinuar?",discardChangesWarningHint:"Al cerrar el cuadro, los \xFAltimos cambios no se guardar\xE1n.",cancel:"Cancelar",apply:"Aplicar",warning:"Advertencia",confirm:"Confirmar",discardChanges:"Descartar cambios",undoTitle:"Deshacer",redoTitle:"Rehacer",showImageTitle:"Mostrar original",zoomInTitle:"Ampliar",fitTitle:"Ajustar",zoomOutTitle:"Reducir",toggleZoomMenuTitle:"Men\xFA de zoom",pointerToolTitle:"Herramienta de puntero",panToolTitle:"Mano: desplazar lienzo",adjustTab:"Ajustar",finetuneTab:"Ajustes finos",filtersTab:"Filtros",watermarkTab:"Marca de agua",annotateTabLabel:"Anotar",resize:"Redimensionar",resizeTab:"Tama\xF1o",imageName:"Nombre de imagen",invalidImageError:"La imagen proporcionada no es v\xE1lida.",uploadImageError:"Error al subir la imagen.",areNotImages:"No son im\xE1genes",isNotImage:"No es una imagen",toBeUploaded:"Pendiente de subir",cropTool:"Recortar",original:"Original",custom:"Personalizado",square:"Cuadrado",landscape:"Horizontal",portrait:"Vertical",ellipse:"Elipse",classicTv:"TV cl\xE1sica",cinemascope:"Cinemascope",arrowTool:"Flecha",blurTool:"Desenfoque",brightnessTool:"Brillo",contrastTool:"Contraste",ellipseTool:"Elipse",unFlipX:"Quitar volteo horizontal",flipX:"Voltear horizontal",unFlipY:"Quitar volteo vertical",flipY:"Voltear vertical",hsvTool:"HSV",hue:"Matiz",brightness:"Brillo",saturation:"Saturaci\xF3n",value:"Valor",imageTool:"Imagen",importing:"Importando\u2026",addImage:"A\xF1adir imagen",uploadImage:"Subir imagen",fromGallery:"Desde galer\xEDa",lineTool:"L\xEDnea",penTool:"Pincel",polygonTool:"Pol\xEDgono",sides:"Lados",rectangleTool:"Rect\xE1ngulo",cornerRadius:"Radio de esquina",resizeWidthTitle:"Ancho (px)",resizeHeightTitle:"Alto (px)",toggleRatioLockTitle:"Bloquear/desbloquear proporci\xF3n",resetSize:"Restablecer tama\xF1o original",rotateTool:"Rotar",textTool:"Texto",textSpacings:"Espaciado de texto",textAlignment:"Alineaci\xF3n de texto",fontFamily:"Fuente",size:"Tama\xF1o",letterSpacing:"Espaciado",lineHeight:"Altura de l\xEDnea",warmthTool:"Temperatura",addWatermark:"A\xF1adir marca de agua",addTextWatermark:"A\xF1adir marca de texto",addWatermarkTitle:"Elegir tipo de marca",uploadWatermark:"Subir marca de agua",addWatermarkAsText:"A\xF1adir como texto",padding:"Relleno",paddings:"Relleno",shadow:"Sombra",horizontal:"Horizontal",vertical:"Vertical",blur:"Desenfoque",opacity:"Opacidad",transparency:"Transparencia",position:"Posici\xF3n",stroke:"Trazo",saveAsModalTitle:"Guardar como",extension:"Extensi\xF3n",format:"Formato",nameIsRequired:"El nombre es obligatorio.",quality:"Calidad",imageDimensionsHoverTitle:"Tama\xF1o guardado (ancho \xD7 alto)",cropSizeLowerThanResizedWarning:"Nota: el \xE1rea recortada es menor que el tama\xF1o ajustado y puede reducir la calidad",actualSize:"Tama\xF1o real (100%)",fitSize:"Ajustar tama\xF1o",addImageTitle:"Elegir imagen para a\xF1adir\u2026",mutualizedFailedToLoadImg:"No se pudo cargar la imagen.",tabsMenu:"Men\xFA",download:"Descargar",width:"Ancho",height:"Alto",cropItemNoEffect:"Este recorte no tiene vista previa",px:"px",invalidTextContent:"Contenido de texto no v\xE1lido",baselineShift:"Desplazamiento de l\xEDnea base",aiTab:"Herramientas IA",objectRemovalTool:"Eliminar objeto",objectRemovalBrushSize:"Tama\xF1o de pincel (px)",objectRemovalApplyButton:"Aplicar",objectRemovalBrushMode:"Modo pincel",objectRemovalBrushCircleType:"Pincel circular",objectRemovalBrushSquareType:"Pincel cuadrado",objectRemovalApplyingText:"Eliminando el \xE1rea seleccionada",objectRemovalMarkModeTooltip:"Modo marcar",objectRemovalUnMarkModeTooltip:"Modo desmarcar",objectRemovalCancelConfirmationTitle:"Cancelar proceso",objectRemovalCancelConfirmationHint:"\xBFSeguro que quieres cancelar la eliminaci\xF3n del objeto en:",objectRemovalCancelConfirmationHintCompletion:"?",theKeyword:"este"},b=Object.fromEntries(Object.entries(p).map(([u,o])=>[u,m(o)])),k={zh:p,es:f,"zh-Hant":b},g=["Adjust","Annotate","Watermark","Filters","Finetune","Resize"];function C(u=E,o){return u.map((a,e)=>{const t={titleKey:a.label,descriptionKey:a.ratio,ratio:a.value+(e+1)*1e-6};return o&&(t.icon=o(a.value)),t})}function v(u,o=E,a={}){return{...a,...Object.fromEntries(o.flatMap(e=>[[e.label,e.label],[e.ratio,e.ratio]])),...k[u]??{}}}function P(u){const o=u.locale??"zh",a=u.platformPresets??E,e=v(o,a,u.baseTranslations),t=u.themeMode??"dark",i=t==="light"?D:A,r=i["accent-primary"],l=t==="light"?"#18181b":"#ffffff",F={fill:t==="light"?"rgba(91,91,214,0.28)":"rgba(124,124,240,0.35)",stroke:r,strokeWidth:2},d={stroke:r,strokeWidth:4},n={useBackendTranslations:!1,source:u.source,tabsIds:[...g],defaultTabId:"Adjust",defaultToolId:"Crop",Crop:{presetsItems:C(a,u.renderRatioIcon)},savingPixelRatio:u.savingPixelRatio??4,previewPixelRatio:u.previewPixelRatio??2,language:"en",translations:e,defaultSavedImageType:"jpeg",defaultSavedImageQuality:.92,defaultSavedImageName:"image",onBeforeSave:()=>!1,annotationsCommon:{fill:l},Rect:{...F},Ellipse:{...F},Polygon:{...F},Text:{fontSize:30},Line:{...d},Arrow:{...d},Pen:{...d},theme:{palette:{...i,...u.theme?.palette},typography:{fontFamily:'-apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif',...u.theme?.typography}},onAnnotationAdd:z};return u.loadableDesignState!==void 0&&(n.loadableDesignState=u.loadableDesignState),u.onSave&&(n.onSave=u.onSave),u.onClose&&(n.onClose=u.onClose),n}exports.FIE_ES=f,exports.FIE_ZH=p,exports.FIE_ZH_HANT=b,exports.IMAGE_EDITOR_DARK_PALETTE=A,exports.IMAGE_EDITOR_LIGHT_PALETTE=D,exports.IMAGE_EDITOR_TABS=g,exports.buildCropPresetItems=C,exports.buildImageEditorTranslations=v,exports.createImageEditorConfig=P;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { E as EditorLocale, P as PlatformPreset } from './platform-presets-B-o4C6uY.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Filerobot 图片编辑器「配置工厂」—— 纯 TS,零 React / 零 DOM。
|
|
5
|
+
*
|
|
6
|
+
* 从 SocialEcho ImageEditor.tsx 抽取「配置」这一层(不抽 React 渲染层):产出一个普通对象,
|
|
7
|
+
* 由框架无关运行时 @media-editor/image 透传给 <FilerobotImageEditor>。
|
|
8
|
+
*
|
|
9
|
+
* 两处「天然属于 React/Filerobot」的东西用依赖注入留给运行时,以保 core 零框架:
|
|
10
|
+
* - 裁剪预设的 icon 是 React 组件 → 运行时传 renderRatioIcon;
|
|
11
|
+
* - 内核英文默认词典 FIE_DEFAULTS → 运行时传 baseTranslations(从 filerobot 包深路径取)。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 暗色 palette 覆盖。键名取自 @scaleflex/ui 的权威枚举(theme/roots/palette)。
|
|
16
|
+
* 默认是亮色主题:文字/图标都是深色,在深色底上看不清 → 这里把「文字/图标/边框」翻浅、背景翻深。
|
|
17
|
+
* 易踩键:主图标键是 'icon-primary'(单数);'btn-secondary-text' 默认黑、'active-secondary' 默认白,都要改。
|
|
18
|
+
*/
|
|
19
|
+
declare const IMAGE_EDITOR_DARK_PALETTE: Record<string, string>;
|
|
20
|
+
/**
|
|
21
|
+
* 亮色 palette —— 同键集的浅色档(Vercel/Linear 亮色:近纯白底、发丝边框、靛蓝强调)。
|
|
22
|
+
* 与暗色档一一对应,createImageEditorConfig 按 themeMode 选用。
|
|
23
|
+
*/
|
|
24
|
+
declare const IMAGE_EDITOR_LIGHT_PALETTE: Record<string, string>;
|
|
25
|
+
/**
|
|
26
|
+
* Filerobot 内核文案中文全量覆盖(与包内 defaultTranslations.js 同序,便于升级时 diff;en 模式用其内置英文)。
|
|
27
|
+
* 升级 Filerobot 后用 defaultTranslations.js 复核键集。
|
|
28
|
+
*/
|
|
29
|
+
declare const FIE_ZH: Record<string, string>;
|
|
30
|
+
declare const FIE_ES: Record<string, string>;
|
|
31
|
+
declare const FIE_ZH_HANT: Record<string, string>;
|
|
32
|
+
/** 进入编辑器的标签页顺序(Filerobot tabsIds 字面量) */
|
|
33
|
+
declare const IMAGE_EDITOR_TABS: readonly ["Adjust", "Annotate", "Watermark", "Filters", "Finetune", "Resize"];
|
|
34
|
+
/** 单个裁剪预设项(对齐 Filerobot Crop.presetsItems[i]);icon 由运行时按 renderRatioIcon 注入 */
|
|
35
|
+
interface CropPresetItem {
|
|
36
|
+
titleKey: string;
|
|
37
|
+
descriptionKey: string;
|
|
38
|
+
ratio: number;
|
|
39
|
+
icon?: unknown;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 平台比例 → Filerobot 裁剪预设项。
|
|
43
|
+
* Filerobot 用 ratio 数值当流内条目的 React key/选中态 —— 内置项与各平台同比例项会撞 key,
|
|
44
|
+
* 故每项微扰 +(i+1)e-6(裁剪几何影响 <0.001px)。icon 仅在 renderRatioIcon 提供时附加。
|
|
45
|
+
*/
|
|
46
|
+
declare function buildCropPresetItems(presets?: PlatformPreset[], renderRatioIcon?: (value: number) => unknown): CropPresetItem[];
|
|
47
|
+
/**
|
|
48
|
+
* 合并出传给 Filerobot 的 translations:
|
|
49
|
+
* 先铺内核英文默认(baseTranslations,运行时注入 FIE_DEFAULTS)——全局字典只增不删,EN 模式必须显式回灌英文;
|
|
50
|
+
* 再加平台标签自映射(titleKey/descriptionKey 缺翻译时兜底显示自身);非 en 模式叠加 FIE_* 覆盖内核可见面。
|
|
51
|
+
*/
|
|
52
|
+
declare function buildImageEditorTranslations(locale: EditorLocale, presets?: PlatformPreset[], baseTranslations?: Record<string, string>): Record<string, string>;
|
|
53
|
+
interface ImageEditorConfigOptions {
|
|
54
|
+
/** 图片来源:dataURL 或 objectURL */
|
|
55
|
+
source: string;
|
|
56
|
+
/** 文案语言,默认 'zh' */
|
|
57
|
+
locale?: EditorLocale;
|
|
58
|
+
/** 上次保存的 designState(二次编辑回填) */
|
|
59
|
+
loadableDesignState?: unknown;
|
|
60
|
+
/** 保存回调:(savedImageData, designState) */
|
|
61
|
+
onSave?: (editedImageObject: unknown, designState: unknown) => void;
|
|
62
|
+
/** 关闭回调 */
|
|
63
|
+
onClose?: () => void;
|
|
64
|
+
/** 保存像素密度,默认 4(只提密度不膨胀输出尺寸) */
|
|
65
|
+
savingPixelRatio?: number;
|
|
66
|
+
/** 预览像素密度,默认 1;运行时按 window.devicePixelRatio 填 */
|
|
67
|
+
previewPixelRatio?: number;
|
|
68
|
+
/** 明暗档,默认 'dark';选用对应 palette 与标注/形状默认色('auto' 由运行时解析后传入) */
|
|
69
|
+
themeMode?: 'light' | 'dark';
|
|
70
|
+
/** 平台裁剪预设,默认内置全量 */
|
|
71
|
+
platformPresets?: PlatformPreset[];
|
|
72
|
+
/** 内核英文默认词典(运行时注入 FIE_DEFAULTS) */
|
|
73
|
+
baseTranslations?: Record<string, string>;
|
|
74
|
+
/** 裁剪预设比例图标工厂(运行时注入 React 组件) */
|
|
75
|
+
renderRatioIcon?: (value: number) => unknown;
|
|
76
|
+
/** 主题覆盖(palette/typography 浅合并到暗色默认之上) */
|
|
77
|
+
theme?: {
|
|
78
|
+
palette?: Record<string, string>;
|
|
79
|
+
typography?: Record<string, unknown>;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 产出传给 <FilerobotImageEditor> 的 props 对象(普通 JS,零 React/DOM)。
|
|
84
|
+
* 返回 Record<string, unknown> 而非 Filerobot 类型,避免 core 依赖 react-filerobot-image-editor。
|
|
85
|
+
*/
|
|
86
|
+
declare function createImageEditorConfig(opts: ImageEditorConfigOptions): Record<string, unknown>;
|
|
87
|
+
|
|
88
|
+
export { type CropPresetItem, FIE_ES, FIE_ZH, FIE_ZH_HANT, IMAGE_EDITOR_DARK_PALETTE, IMAGE_EDITOR_LIGHT_PALETTE, IMAGE_EDITOR_TABS, type ImageEditorConfigOptions, buildCropPresetItems, buildImageEditorTranslations, createImageEditorConfig };
|