@bylqwjc/media-editor-image 1.0.26

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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/dist/chunk-5TBO732O.js +1 -0
  4. package/dist/index-CU3vkvDR.d.ts +44 -0
  5. package/dist/index.css +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +36 -0
  8. package/dist/lazy.css +1 -0
  9. package/dist/lazy.d.ts +8 -0
  10. package/dist/lazy.js +1 -0
  11. package/node_modules/@media-editor/core/LICENSE +21 -0
  12. package/node_modules/@media-editor/core/README.md +14 -0
  13. package/node_modules/@media-editor/core/dist/browser.cjs +1 -0
  14. package/node_modules/@media-editor/core/dist/browser.d.ts +117 -0
  15. package/node_modules/@media-editor/core/dist/browser.js +1 -0
  16. package/node_modules/@media-editor/core/dist/chunk-7D4QE3R2.js +1 -0
  17. package/node_modules/@media-editor/core/dist/chunk-7PSQLYXL.js +1 -0
  18. package/node_modules/@media-editor/core/dist/chunk-FAFKY4LX.js +1 -0
  19. package/node_modules/@media-editor/core/dist/chunk-VDEZTXEA.js +1 -0
  20. package/node_modules/@media-editor/core/dist/engine.cjs +1 -0
  21. package/node_modules/@media-editor/core/dist/engine.d.ts +663 -0
  22. package/node_modules/@media-editor/core/dist/engine.js +1 -0
  23. package/node_modules/@media-editor/core/dist/filerobot.cjs +1 -0
  24. package/node_modules/@media-editor/core/dist/filerobot.d.ts +88 -0
  25. package/node_modules/@media-editor/core/dist/filerobot.js +1 -0
  26. package/node_modules/@media-editor/core/dist/index.cjs +1 -0
  27. package/node_modules/@media-editor/core/dist/index.d.ts +250 -0
  28. package/node_modules/@media-editor/core/dist/index.js +1 -0
  29. package/node_modules/@media-editor/core/dist/platform-presets-Ca2LbKQ3.d.ts +80 -0
  30. package/node_modules/@media-editor/core/dist/state-D2oM5s1a.d.ts +2098 -0
  31. package/node_modules/@media-editor/core/node_modules/zod/LICENSE +21 -0
  32. package/node_modules/@media-editor/core/node_modules/zod/README.md +208 -0
  33. package/node_modules/@media-editor/core/node_modules/zod/index.cjs +1 -0
  34. package/node_modules/@media-editor/core/node_modules/zod/index.d.cts +4 -0
  35. package/node_modules/@media-editor/core/node_modules/zod/index.js +1 -0
  36. package/node_modules/@media-editor/core/node_modules/zod/package.json +76 -0
  37. package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.cjs +1 -0
  38. package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.d.cts +164 -0
  39. package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.js +1 -0
  40. package/node_modules/@media-editor/core/node_modules/zod/v3/errors.cjs +1 -0
  41. package/node_modules/@media-editor/core/node_modules/zod/v3/errors.d.cts +5 -0
  42. package/node_modules/@media-editor/core/node_modules/zod/v3/errors.js +1 -0
  43. package/node_modules/@media-editor/core/node_modules/zod/v3/external.cjs +1 -0
  44. package/node_modules/@media-editor/core/node_modules/zod/v3/external.d.cts +6 -0
  45. package/node_modules/@media-editor/core/node_modules/zod/v3/external.js +1 -0
  46. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.cjs +1 -0
  47. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
  48. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.js +1 -0
  49. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.cjs +1 -0
  50. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
  51. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.js +1 -0
  52. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.cjs +1 -0
  53. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
  54. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.js +1 -0
  55. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.cjs +1 -0
  56. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
  57. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.js +1 -0
  58. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.cjs +1 -0
  59. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
  60. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.js +1 -0
  61. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.cjs +1 -0
  62. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.d.cts +85 -0
  63. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.js +1 -0
  64. package/node_modules/@media-editor/core/node_modules/zod/v3/index.cjs +1 -0
  65. package/node_modules/@media-editor/core/node_modules/zod/v3/index.d.cts +4 -0
  66. package/node_modules/@media-editor/core/node_modules/zod/v3/index.js +1 -0
  67. package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.cjs +1 -0
  68. package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.d.cts +3 -0
  69. package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.js +1 -0
  70. package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.cjs +1 -0
  71. package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.d.cts +102 -0
  72. package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.js +1 -0
  73. package/node_modules/@media-editor/core/node_modules/zod/v3/types.cjs +1 -0
  74. package/node_modules/@media-editor/core/node_modules/zod/v3/types.d.cts +1031 -0
  75. package/node_modules/@media-editor/core/node_modules/zod/v3/types.js +1 -0
  76. package/node_modules/@media-editor/core/package.json +42 -0
  77. package/package.json +34 -0
@@ -0,0 +1 @@
1
+ "use strict";var zh={"tool.trim":"剪辑","tool.crop":"裁剪","tool.tune":"调色","tool.filter":"滤镜","tool.annotate":"标注","tool.sticker":"贴纸","tool.resize":"比例","tune.brightness":"亮度","tune.contrast":"对比","tune.saturation":"饱和","tune.gamma":"Gamma","tune.temperature":"色温","tune.tint":"色调","tune.vibrance":"自然饱和","tune.highlights":"高光","tune.shadows":"阴影","tune.whites":"白色","tune.blacks":"黑色","tune.lightSense":"光感","tune.sharpen":"锐化","tune.clarity":"清晰度","tune.grain":"颗粒","tune.fade":"褪色","tune.vignette":"暗角","overlay.select":"选择","overlay.pen":"画笔","overlay.eraser":"橡皮","overlay.line":"直线","overlay.arrow":"箭头","overlay.rect":"矩形","overlay.ellipse":"椭圆","overlay.text":"文字","overlay.color":"线色","overlay.width":"线宽","overlay.fontSize":"字号","overlay.font":"字体","overlay.align":"对齐","overlay.background":"背景","overlay.copySelected":"复制","overlay.delSelected":"删除选中","overlay.editSelected":"编辑","overlay.pickImage":"选择图片","overlay.hint":"点 emoji/图片添加 → 画布上拖动摆位,拖右下角紫色把手缩放","overlay.textPlaceholder":"输入文字,回车确认","filter.none":"原图","filter.bw":"黑白","filter.sepia":"复古","filter.warm":"暖阳","filter.cool":"冷调","filter.vivid":"鲜艳","ratio.orig":"原始","ratio.free":"自由比例","ratio.9:16":"竖屏 9:16","ratio.16:9":"横屏 16:9","ratio.1:1":"方形 1:1","ratio.4:5":"竖图 4:5","ratio.3:4":"竖图 3:4","ratio.2:3":"竖图 2:3","ratio.1.91:1":"横幅 1.91:1","act.fit":"适应","act.zoomFit":"缩放至适当大小","act.zoomTo":"缩放至 {value}%","act.split":"分割","act.copy":"复制","act.delete":"删除","act.restore":"还原","act.deleteMusic":"删除音乐","act.cancel":"取消","act.exportPoster":"导出封面","act.exporting":"导出中…","act.poster":"🖼 封面","act.again":"再次下载","act.saveDrive":"存网盘","act.changeImage":"← 换一张","act.changeVideo":"← 换一个","crop.rotateLeft":"↺ 向左旋转","crop.flipX":"⇋ 水平翻转","crop.flipY":"⇵ 垂直翻转","crop.rotateLeftShort":"左转","crop.flipXShort":"横翻","crop.flipYShort":"竖翻","tip.close":"关闭(换文件)","tip.undo":"撤销","tip.redo":"重做","tip.resetOpened":"重置到打开文件时","tip.previewZoom":"预览缩放比例","tip.previewZoomOut":"缩小预览","tip.previewZoomIn":"放大预览","tip.previewZoomFit":"适应预览","tip.previewPointer":"指针工具","tip.previewPan":"手工具:拖动画面","tip.poster":"预览并选择封面帧","tip.keepAudio":"原视频声音开关(与音乐混音;预览同步)","tip.split":"在播放头处把当前片段一分为二","tip.zoomOut":"缩小时间轴(Ctrl+滚轮)","tip.zoomIn":"放大时间轴(Ctrl+滚轮)","tip.fit":"缩放到适应宽度","tip.addVideo":"添加视频片段","tip.addAudio":"添加音乐(音频文件,或选含声音的视频自动提取音轨;与原声混音)","tip.dupClip":"复制该片段(插到其后)","tip.delClip":"删除该片段","tip.lockAspect":"锁定纵横比","tip.dblConfirm":"双击确认裁剪","err.notVideo":"请选择视频文件","err.maxVideo":"最多 {max} 个视频素材","err.videoLoad":"视频加载失败,请换一个文件","err.notAudio":"请选择音频文件(mp3/wav/m4a),或含声音的视频(自动提取音轨)","err.maxAudio":"最多 {max} 个音频素材","err.audioLoad":"音频加载失败,请换一个文件","err.processFailed":"处理失败","err.posterFailed":"封面渲染失败","err.canvas":"canvas 不可用","err.imageRead":"图片读取失败,请换一张","err.notImage":"请选择图片文件","err.fileType":"只支持图片或视频文件","err.saveDrive":"存网盘失败","msg.processing":"正在导出中…","msg.exportPrepare":"正在准备素材…","msg.exportUpload":"正在上传素材…","msg.exportEncode":"正在编码视频…","msg.exportDownload":"正在接收结果…","msg.exportingHint":"请稍候,导出完成后会自动返回结果。","msg.done":"完成 ✓","msg.loading":"素材加载中…","msg.exported":"已导出:","msg.saving":"存网盘中…","msg.saved":"已存到网盘 ✓","lbl.ratioSection":"画面比例(裁剪,不变形)","lbl.dragToReposition":"↔ 拖动预览可调整裁剪位置","lbl.sizeSection":"导出尺寸(像素;比例不符时 cover 居中裁剪)","lbl.currentOut":"当前输出","lbl.zoomSize":"大小","lbl.noScale":"(未缩放)","lbl.coverNote":"· 比例不一致时居中裁剪(cover),不变形","lbl.audioTrackHint":"♪ 音频轨(右侧 + 添加音乐,与原声混音)","lbl.volume":"音量","lbl.volNote":"(预览最大 100%,导出按设定值)","lbl.music":"音乐","kbd.fit":"⇧ F","poster.title":"选择封面帧","panel.title":"媒体编辑器","panel.subtitle":"上传图片 / 视频,裁剪 · 滤镜 · 文字 · 导出","panel.pick":"点击选择图片或视频","panel.pickHint":"图片用 Filerobot · 视频可裁剪/静音/封面"},ZH_HANT_MAP={"简":"簡","体":"體","图":"圖","频":"頻","视":"視","辑":"輯","调":"調","滤":"濾","标":"標","注":"註","贴":"貼","选":"選","择":"擇","线":"線","箭":"箭","头":"頭","复":"複","删":"刪","除":"除","编":"編","边":"邊","输":"輸","入":"入","确":"確","认":"認","饱":"飽","对":"對","暖":"暖","阳":"陽","冷":"冷","纵":"縱","横":"橫","适":"適","应":"應","缩":"縮","实":"實","际":"際","导":"導","出":"出","封":"封","面":"面","换":"換","张":"張","预":"預","览":"覽","动":"動","声":"聲","开":"開","关":"關","与":"與","乐":"樂","混":"混","处":"處","载":"載","错":"錯","误":"誤","读":"讀","仅":"僅","终":"終","稍":"稍","候":"候","返回":"返回","当前":"目前","输出":"輸出","画":"畫","变":"變","音频":"音訊","音轨":"音軌","添加":"新增","删除":"刪除","保存":"儲存","加载":"載入","网盘":"網盤"},toHant=e=>{let a=e;for(const[e,o]of Object.entries(ZH_HANT_MAP).sort((e,a)=>a[0].length-e[0].length))a=a.replaceAll(e,o);return a};Object.fromEntries(Object.entries(zh).map(([e,a])=>[e,toHant(a)]));var DEFAULT_PLATFORM_TARGETS=[{platform:"tiktok",postType:"video",label:"TikTok Video",shortLabel:"TT·Video",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"post",label:"Instagram Post",shortLabel:"IG·Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"instagram",postType:"reels",label:"Instagram Reels",shortLabel:"IG·Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"story",label:"Instagram Story",shortLabel:"IG·Story",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"facebook",postType:"post",label:"Facebook Post",shortLabel:"FB·Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"facebook",postType:"reels",label:"Facebook Reels",shortLabel:"FB·Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"youtube",postType:"video",label:"YouTube Video",shortLabel:"YT·Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"youtube",postType:"shorts",label:"YouTube Shorts",shortLabel:"YT·Shorts",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·Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"},{platform:"linkedin",postType:"post",label:"LinkedIn Post",shortLabel:"LI·Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"linkedin",postType:"video",label:"LinkedIn Video",shortLabel:"LI·Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"threads",postType:"post",label:"Threads Post",shortLabel:"TH·Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"telegram",postType:"post",label:"Telegram Post",shortLabel:"TG·Post",ratio:"1:1",imageSize:"2048x2048",videoRatio:"9:16",videoResolution:"720p"},{platform:"reddit",postType:"post",label:"Reddit Post",shortLabel:"RD·Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"}],RATIO_LABEL={"1:1":"方形 1:1","4:5":"竖图 4:5","3:4":"竖图 3:4","9:16":"竖屏 9:16","16:9":"横屏 16:9","2:3":"竖图 2:3","1.91:1":"横幅 1.91:1"};function parseRatio(e){const[a,o]=e.split(":").map(Number);return a&&o?a/o:1}function dedupePresets(e){const a=new Set,o=[];for(const t of e)t&&!a.has(t)&&(a.add(t),o.push({ratio:t,value:parseRatio(t),label:RATIO_LABEL[t]??t}));return o}function buildVideoPlatformRatioPresets(e=DEFAULT_PLATFORM_TARGETS){const a=new Set,o=[];for(const t of e){if(!t.videoRatio)continue;const e=`${t.platform}:${t.postType}:${t.videoRatio}`;if(a.has(e))continue;a.add(e);const i=t.label.split(" ").slice(0,-1).join(" ")||t.label;o.push({platform:t.platform,postType:t.postType,label:`${i} ${t.videoRatio}`,ratio:t.videoRatio,value:parseRatio(t.videoRatio)})}return o}function buildImagePlatformPresets(e=DEFAULT_PLATFORM_TARGETS){const a=new Map;for(const o of e){const e=a.get(o.platform);(!e||"post"!==e.postType&&"post"===o.postType)&&a.set(o.platform,o)}return Array.from(a.values()).map(e=>{const[a,o]=e.imageSize.split("x").map(Number),t=e.label.split(" ").slice(0,-1).join(" ")||e.label;return{platform:e.platform,label:`${t} ${e.ratio}`,ratio:e.ratio,value:parseRatio(e.ratio),w:a,h:o}})}dedupePresets(["1:1","4:5","3:4","2:3","9:16","16:9","1.91:1"]),dedupePresets(["9:16","16:9","1:1","4:5","3:4","2:3","1.91:1"]),buildVideoPlatformRatioPresets();var IMAGE_PLATFORM_PRESETS=buildImagePlatformPresets();function sizeOf(e,a){return e>=1?{w:2*Math.round(a*e/2),h:a}:{w:a,h:2*Math.round(a/e/2)}}function buildVideoSizePresets(e=DEFAULT_PLATFORM_TARGETS){const a=new Set,o=[];for(const t of e){if(!t.videoRatio||!t.videoResolution)continue;const e="1080p"===t.videoResolution?1080:720,{w:i,h:r}=sizeOf(parseRatio(t.videoRatio),e),l=`${i}x${r}`;a.has(l)||(a.add(l),o.push({label:`${t.shortLabel} ${i}×${r}`,w:i,h:r}))}return o}function compensateAnnotationRotation(e,a){if(e.isDuplicated)return{};if(0!==(e.rotation??0))return{};const o=a.adjustments?.rotation??0;return o?{rotation:-o}:{}}buildVideoSizePresets();var IMAGE_EDITOR_DARK_PALETTE={"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)"},IMAGE_EDITOR_LIGHT_PALETTE={"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)"},FIE_ZH={name:"名称",save:"保存",saveAs:"另存为",back:"返回",loading:"加载中…",resetOperations:"重置/清除全部操作",changesLoseWarningHint:"按下「重置」将丢失所有修改,确定继续吗?",discardChangesWarningHint:"关闭弹窗后,最后的修改将不会保存。",cancel:"取消",apply:"应用",warning:"警告",confirm:"确认",discardChanges:"放弃修改",undoTitle:"撤销上一步",redoTitle:"重做上一步",showImageTitle:"显示原图",zoomInTitle:"放大",fitTitle:"适应",zoomOutTitle:"缩小",toggleZoomMenuTitle:"缩放菜单",pointerToolTitle:"指针工具",panToolTitle:"手工具:拖动画面",adjustTab:"调整",finetuneTab:"微调",filtersTab:"滤镜",watermarkTab:"水印",annotateTabLabel:"标注",resize:"调整尺寸",resizeTab:"尺寸",imageName:"图片名称",invalidImageError:"提供的图片无效。",uploadImageError:"上传图片出错。",areNotImages:"不是图片",isNotImage:"不是图片",toBeUploaded:"待上传",cropTool:"裁剪",original:"原始",custom:"自定义",square:"方形",landscape:"横向",portrait:"纵向",ellipse:"椭圆",classicTv:"经典电视",cinemascope:"宽银幕",arrowTool:"箭头",blurTool:"模糊",brightnessTool:"亮度",contrastTool:"对比度",ellipseTool:"椭圆",unFlipX:"取消水平翻转",flipX:"水平翻转",unFlipY:"取消垂直翻转",flipY:"垂直翻转",hsvTool:"HSV",hue:"色相",brightness:"亮度",saturation:"饱和度",value:"明度",imageTool:"图片",importing:"导入中…",addImage:"添加图片",uploadImage:"上传图片",fromGallery:"从图库",lineTool:"直线",penTool:"画笔",polygonTool:"多边形",sides:"边数",rectangleTool:"矩形",cornerRadius:"圆角",resizeWidthTitle:"宽度(像素)",resizeHeightTitle:"高度(像素)",toggleRatioLockTitle:"锁定/解锁比例",resetSize:"重置为原图尺寸",rotateTool:"旋转",textTool:"文字",textSpacings:"文字间距",textAlignment:"文字对齐",fontFamily:"字体",size:"大小",letterSpacing:"字间距",lineHeight:"行高",warmthTool:"色温",addWatermark:"添加水印",addTextWatermark:"添加文字水印",addWatermarkTitle:"选择水印类型",uploadWatermark:"上传水印",addWatermarkAsText:"以文字添加",padding:"内边距",paddings:"内边距",shadow:"阴影",horizontal:"水平",vertical:"垂直",blur:"模糊",opacity:"不透明度",transparency:"透明度",position:"位置",stroke:"描边",saveAsModalTitle:"另存为",extension:"扩展名",format:"格式",nameIsRequired:"名称必填。",quality:"质量",imageDimensionsHoverTitle:"保存图片尺寸(宽 × 高)",cropSizeLowerThanResizedWarning:"注意:所选裁剪区域小于已应用的调整尺寸,可能导致画质下降",actualSize:"实际大小(100%)",fitSize:"适应大小",addImageTitle:"选择要添加的图片…",mutualizedFailedToLoadImg:"图片加载失败。",tabsMenu:"菜单",download:"下载",width:"宽度",height:"高度",cropItemNoEffect:"该裁剪项无预览",px:"px",invalidTextContent:"文字内容无效",baselineShift:"基线偏移",aiTab:"AI 工具",objectRemovalTool:"对象移除",objectRemovalBrushSize:"画笔大小(px)",objectRemovalApplyButton:"应用",objectRemovalBrushMode:"画笔模式",objectRemovalBrushCircleType:"圆形画笔",objectRemovalBrushSquareType:"方形画笔",objectRemovalApplyingText:"正在移除所选区域",objectRemovalMarkModeTooltip:"标记模式",objectRemovalUnMarkModeTooltip:"取消标记模式",objectRemovalCancelConfirmationTitle:"取消处理",objectRemovalCancelConfirmationHint:"确定要取消移除以下素材中的对象:",objectRemovalCancelConfirmationHintCompletion:"?",theKeyword:"该"},FIE_ES={name:"Nombre",save:"Guardar",saveAs:"Guardar como",back:"Volver",loading:"Cargando…",resetOperations:"Restablecer / borrar cambios",changesLoseWarningHint:"Al pulsar “Restablecer” se perderán todos los cambios. ¿Continuar?",discardChangesWarningHint:"Al cerrar el cuadro, los últimos cambios no se guardarán.",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ú 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ño",imageName:"Nombre de imagen",invalidImageError:"La imagen proporcionada no es válida.",uploadImageError:"Error al subir la imagen.",areNotImages:"No son imágenes",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ásica",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ón",value:"Valor",imageTool:"Imagen",importing:"Importando…",addImage:"Añadir imagen",uploadImage:"Subir imagen",fromGallery:"Desde galería",lineTool:"Línea",penTool:"Pincel",polygonTool:"Polígono",sides:"Lados",rectangleTool:"Rectángulo",cornerRadius:"Radio de esquina",resizeWidthTitle:"Ancho (px)",resizeHeightTitle:"Alto (px)",toggleRatioLockTitle:"Bloquear/desbloquear proporción",resetSize:"Restablecer tamaño original",rotateTool:"Rotar",textTool:"Texto",textSpacings:"Espaciado de texto",textAlignment:"Alineación de texto",fontFamily:"Fuente",size:"Tamaño",letterSpacing:"Espaciado",lineHeight:"Altura de línea",warmthTool:"Temperatura",addWatermark:"Añadir marca de agua",addTextWatermark:"Añadir marca de texto",addWatermarkTitle:"Elegir tipo de marca",uploadWatermark:"Subir marca de agua",addWatermarkAsText:"Añadir como texto",padding:"Relleno",paddings:"Relleno",shadow:"Sombra",horizontal:"Horizontal",vertical:"Vertical",blur:"Desenfoque",opacity:"Opacidad",transparency:"Transparencia",position:"Posición",stroke:"Trazo",saveAsModalTitle:"Guardar como",extension:"Extensión",format:"Formato",nameIsRequired:"El nombre es obligatorio.",quality:"Calidad",imageDimensionsHoverTitle:"Tamaño guardado (ancho × alto)",cropSizeLowerThanResizedWarning:"Nota: el área recortada es menor que el tamaño ajustado y puede reducir la calidad",actualSize:"Tamaño real (100%)",fitSize:"Ajustar tamaño",addImageTitle:"Elegir imagen para añadir…",mutualizedFailedToLoadImg:"No se pudo cargar la imagen.",tabsMenu:"Menú",download:"Descargar",width:"Ancho",height:"Alto",cropItemNoEffect:"Este recorte no tiene vista previa",px:"px",invalidTextContent:"Contenido de texto no válido",baselineShift:"Desplazamiento de línea base",aiTab:"Herramientas IA",objectRemovalTool:"Eliminar objeto",objectRemovalBrushSize:"Tamaño de pincel (px)",objectRemovalApplyButton:"Aplicar",objectRemovalBrushMode:"Modo pincel",objectRemovalBrushCircleType:"Pincel circular",objectRemovalBrushSquareType:"Pincel cuadrado",objectRemovalApplyingText:"Eliminando el área seleccionada",objectRemovalMarkModeTooltip:"Modo marcar",objectRemovalUnMarkModeTooltip:"Modo desmarcar",objectRemovalCancelConfirmationTitle:"Cancelar proceso",objectRemovalCancelConfirmationHint:"¿Seguro que quieres cancelar la eliminación del objeto en:",objectRemovalCancelConfirmationHintCompletion:"?",theKeyword:"este"},FIE_ZH_HANT=Object.fromEntries(Object.entries(FIE_ZH).map(([e,a])=>[e,toHant(a)])),FIE_LOCALE_TRANSLATIONS={zh:FIE_ZH,es:FIE_ES,"zh-Hant":FIE_ZH_HANT},IMAGE_EDITOR_TABS=["Adjust","Annotate","Watermark","Filters","Finetune","Resize"];function buildCropPresetItems(e=IMAGE_PLATFORM_PRESETS,a){return e.map((e,o)=>{const t={titleKey:e.label,descriptionKey:e.ratio,ratio:e.value+1e-6*(o+1)};return a&&(t.icon=a(e.value)),t})}function buildImageEditorTranslations(e,a=IMAGE_PLATFORM_PRESETS,o={}){return{...o,...Object.fromEntries(a.flatMap(e=>[[e.label,e.label],[e.ratio,e.ratio]])),...FIE_LOCALE_TRANSLATIONS[e]??{}}}function createImageEditorConfig(e){const a=e.locale??"zh",o=e.platformPresets??IMAGE_PLATFORM_PRESETS,t=buildImageEditorTranslations(a,o,e.baseTranslations),i=e.themeMode??"dark",r="light"===i?IMAGE_EDITOR_LIGHT_PALETTE:IMAGE_EDITOR_DARK_PALETTE,l=r["accent-primary"],n="light"===i?"#18181b":"#ffffff",s={fill:"light"===i?"rgba(91,91,214,0.28)":"rgba(124,124,240,0.35)",stroke:l,strokeWidth:2},d={stroke:l,strokeWidth:4},p={useBackendTranslations:!1,source:e.source,tabsIds:[...IMAGE_EDITOR_TABS],defaultTabId:"Adjust",defaultToolId:"Crop",Crop:{presetsItems:buildCropPresetItems(o,e.renderRatioIcon)},savingPixelRatio:e.savingPixelRatio??4,previewPixelRatio:e.previewPixelRatio??2,language:"en",translations:t,defaultSavedImageType:"jpeg",defaultSavedImageQuality:.92,defaultSavedImageName:"image",onBeforeSave:()=>!1,annotationsCommon:{fill:n},Rect:{...s},Ellipse:{...s},Polygon:{...s},Text:{fontSize:30},Line:{...d},Arrow:{...d},Pen:{...d},theme:{palette:{...r,...e.theme?.palette},typography:{fontFamily:'-apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif',...e.theme?.typography}},onAnnotationAdd:compensateAnnotationRotation};return void 0!==e.loadableDesignState&&(p.loadableDesignState=e.loadableDesignState),e.onSave&&(p.onSave=e.onSave),e.onClose&&(p.onClose=e.onClose),p}exports.FIE_ES=FIE_ES,exports.FIE_ZH=FIE_ZH,exports.FIE_ZH_HANT=FIE_ZH_HANT,exports.IMAGE_EDITOR_DARK_PALETTE=IMAGE_EDITOR_DARK_PALETTE,exports.IMAGE_EDITOR_LIGHT_PALETTE=IMAGE_EDITOR_LIGHT_PALETTE,exports.IMAGE_EDITOR_TABS=IMAGE_EDITOR_TABS,exports.buildCropPresetItems=buildCropPresetItems,exports.buildImageEditorTranslations=buildImageEditorTranslations,exports.createImageEditorConfig=createImageEditorConfig;
@@ -0,0 +1,88 @@
1
+ import { E as EditorLocale, P as PlatformPreset } from './platform-presets-Ca2LbKQ3.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 };
@@ -0,0 +1 @@
1
+ import{toHant as e,IMAGE_PLATFORM_PRESETS as a,compensateAnnotationRotation as o}from"./chunk-FAFKY4LX.js";var r={"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)"},t={"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)"},i={name:"名称",save:"保存",saveAs:"另存为",back:"返回",loading:"加载中…",resetOperations:"重置/清除全部操作",changesLoseWarningHint:"按下「重置」将丢失所有修改,确定继续吗?",discardChangesWarningHint:"关闭弹窗后,最后的修改将不会保存。",cancel:"取消",apply:"应用",warning:"警告",confirm:"确认",discardChanges:"放弃修改",undoTitle:"撤销上一步",redoTitle:"重做上一步",showImageTitle:"显示原图",zoomInTitle:"放大",fitTitle:"适应",zoomOutTitle:"缩小",toggleZoomMenuTitle:"缩放菜单",pointerToolTitle:"指针工具",panToolTitle:"手工具:拖动画面",adjustTab:"调整",finetuneTab:"微调",filtersTab:"滤镜",watermarkTab:"水印",annotateTabLabel:"标注",resize:"调整尺寸",resizeTab:"尺寸",imageName:"图片名称",invalidImageError:"提供的图片无效。",uploadImageError:"上传图片出错。",areNotImages:"不是图片",isNotImage:"不是图片",toBeUploaded:"待上传",cropTool:"裁剪",original:"原始",custom:"自定义",square:"方形",landscape:"横向",portrait:"纵向",ellipse:"椭圆",classicTv:"经典电视",cinemascope:"宽银幕",arrowTool:"箭头",blurTool:"模糊",brightnessTool:"亮度",contrastTool:"对比度",ellipseTool:"椭圆",unFlipX:"取消水平翻转",flipX:"水平翻转",unFlipY:"取消垂直翻转",flipY:"垂直翻转",hsvTool:"HSV",hue:"色相",brightness:"亮度",saturation:"饱和度",value:"明度",imageTool:"图片",importing:"导入中…",addImage:"添加图片",uploadImage:"上传图片",fromGallery:"从图库",lineTool:"直线",penTool:"画笔",polygonTool:"多边形",sides:"边数",rectangleTool:"矩形",cornerRadius:"圆角",resizeWidthTitle:"宽度(像素)",resizeHeightTitle:"高度(像素)",toggleRatioLockTitle:"锁定/解锁比例",resetSize:"重置为原图尺寸",rotateTool:"旋转",textTool:"文字",textSpacings:"文字间距",textAlignment:"文字对齐",fontFamily:"字体",size:"大小",letterSpacing:"字间距",lineHeight:"行高",warmthTool:"色温",addWatermark:"添加水印",addTextWatermark:"添加文字水印",addWatermarkTitle:"选择水印类型",uploadWatermark:"上传水印",addWatermarkAsText:"以文字添加",padding:"内边距",paddings:"内边距",shadow:"阴影",horizontal:"水平",vertical:"垂直",blur:"模糊",opacity:"不透明度",transparency:"透明度",position:"位置",stroke:"描边",saveAsModalTitle:"另存为",extension:"扩展名",format:"格式",nameIsRequired:"名称必填。",quality:"质量",imageDimensionsHoverTitle:"保存图片尺寸(宽 × 高)",cropSizeLowerThanResizedWarning:"注意:所选裁剪区域小于已应用的调整尺寸,可能导致画质下降",actualSize:"实际大小(100%)",fitSize:"适应大小",addImageTitle:"选择要添加的图片…",mutualizedFailedToLoadImg:"图片加载失败。",tabsMenu:"菜单",download:"下载",width:"宽度",height:"高度",cropItemNoEffect:"该裁剪项无预览",px:"px",invalidTextContent:"文字内容无效",baselineShift:"基线偏移",aiTab:"AI 工具",objectRemovalTool:"对象移除",objectRemovalBrushSize:"画笔大小(px)",objectRemovalApplyButton:"应用",objectRemovalBrushMode:"画笔模式",objectRemovalBrushCircleType:"圆形画笔",objectRemovalBrushSquareType:"方形画笔",objectRemovalApplyingText:"正在移除所选区域",objectRemovalMarkModeTooltip:"标记模式",objectRemovalUnMarkModeTooltip:"取消标记模式",objectRemovalCancelConfirmationTitle:"取消处理",objectRemovalCancelConfirmationHint:"确定要取消移除以下素材中的对象:",objectRemovalCancelConfirmationHintCompletion:"?",theKeyword:"该"},n={name:"Nombre",save:"Guardar",saveAs:"Guardar como",back:"Volver",loading:"Cargando…",resetOperations:"Restablecer / borrar cambios",changesLoseWarningHint:"Al pulsar “Restablecer” se perderán todos los cambios. ¿Continuar?",discardChangesWarningHint:"Al cerrar el cuadro, los últimos cambios no se guardarán.",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ú 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ño",imageName:"Nombre de imagen",invalidImageError:"La imagen proporcionada no es válida.",uploadImageError:"Error al subir la imagen.",areNotImages:"No son imágenes",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ásica",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ón",value:"Valor",imageTool:"Imagen",importing:"Importando…",addImage:"Añadir imagen",uploadImage:"Subir imagen",fromGallery:"Desde galería",lineTool:"Línea",penTool:"Pincel",polygonTool:"Polígono",sides:"Lados",rectangleTool:"Rectángulo",cornerRadius:"Radio de esquina",resizeWidthTitle:"Ancho (px)",resizeHeightTitle:"Alto (px)",toggleRatioLockTitle:"Bloquear/desbloquear proporción",resetSize:"Restablecer tamaño original",rotateTool:"Rotar",textTool:"Texto",textSpacings:"Espaciado de texto",textAlignment:"Alineación de texto",fontFamily:"Fuente",size:"Tamaño",letterSpacing:"Espaciado",lineHeight:"Altura de línea",warmthTool:"Temperatura",addWatermark:"Añadir marca de agua",addTextWatermark:"Añadir marca de texto",addWatermarkTitle:"Elegir tipo de marca",uploadWatermark:"Subir marca de agua",addWatermarkAsText:"Añadir como texto",padding:"Relleno",paddings:"Relleno",shadow:"Sombra",horizontal:"Horizontal",vertical:"Vertical",blur:"Desenfoque",opacity:"Opacidad",transparency:"Transparencia",position:"Posición",stroke:"Trazo",saveAsModalTitle:"Guardar como",extension:"Extensión",format:"Formato",nameIsRequired:"El nombre es obligatorio.",quality:"Calidad",imageDimensionsHoverTitle:"Tamaño guardado (ancho × alto)",cropSizeLowerThanResizedWarning:"Nota: el área recortada es menor que el tamaño ajustado y puede reducir la calidad",actualSize:"Tamaño real (100%)",fitSize:"Ajustar tamaño",addImageTitle:"Elegir imagen para añadir…",mutualizedFailedToLoadImg:"No se pudo cargar la imagen.",tabsMenu:"Menú",download:"Descargar",width:"Ancho",height:"Alto",cropItemNoEffect:"Este recorte no tiene vista previa",px:"px",invalidTextContent:"Contenido de texto no válido",baselineShift:"Desplazamiento de línea base",aiTab:"Herramientas IA",objectRemovalTool:"Eliminar objeto",objectRemovalBrushSize:"Tamaño de pincel (px)",objectRemovalApplyButton:"Aplicar",objectRemovalBrushMode:"Modo pincel",objectRemovalBrushCircleType:"Pincel circular",objectRemovalBrushSquareType:"Pincel cuadrado",objectRemovalApplyingText:"Eliminando el área seleccionada",objectRemovalMarkModeTooltip:"Modo marcar",objectRemovalUnMarkModeTooltip:"Modo desmarcar",objectRemovalCancelConfirmationTitle:"Cancelar proceso",objectRemovalCancelConfirmationHint:"¿Seguro que quieres cancelar la eliminación del objeto en:",objectRemovalCancelConfirmationHintCompletion:"?",theKeyword:"este"},l=Object.fromEntries(Object.entries(i).map(([a,o])=>[a,e(o)])),s={zh:i,es:n,"zh-Hant":l},d=["Adjust","Annotate","Watermark","Filters","Finetune","Resize"];function c(e=a,o){return e.map((e,a)=>{const r={titleKey:e.label,descriptionKey:e.ratio,ratio:e.value+1e-6*(a+1)};return o&&(r.icon=o(e.value)),r})}function m(e,o=a,r={}){return{...r,...Object.fromEntries(o.flatMap(e=>[[e.label,e.label],[e.ratio,e.ratio]])),...s[e]??{}}}function p(e){const i=e.locale??"zh",n=e.platformPresets??a,l=m(i,n,e.baseTranslations),s=e.themeMode??"dark",p="light"===s?t:r,g=p["accent-primary"],b="light"===s?"#18181b":"#ffffff",f={fill:"light"===s?"rgba(91,91,214,0.28)":"rgba(124,124,240,0.35)",stroke:g,strokeWidth:2},u={stroke:g,strokeWidth:4},T={useBackendTranslations:!1,source:e.source,tabsIds:[...d],defaultTabId:"Adjust",defaultToolId:"Crop",Crop:{presetsItems:c(n,e.renderRatioIcon)},savingPixelRatio:e.savingPixelRatio??4,previewPixelRatio:e.previewPixelRatio??2,language:"en",translations:l,defaultSavedImageType:"jpeg",defaultSavedImageQuality:.92,defaultSavedImageName:"image",onBeforeSave:()=>!1,annotationsCommon:{fill:b},Rect:{...f},Ellipse:{...f},Polygon:{...f},Text:{fontSize:30},Line:{...u},Arrow:{...u},Pen:{...u},theme:{palette:{...p,...e.theme?.palette},typography:{fontFamily:'-apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif',...e.theme?.typography}},onAnnotationAdd:o};return void 0!==e.loadableDesignState&&(T.loadableDesignState=e.loadableDesignState),e.onSave&&(T.onSave=e.onSave),e.onClose&&(T.onClose=e.onClose),T}export{n as FIE_ES,i as FIE_ZH,l as FIE_ZH_HANT,r as IMAGE_EDITOR_DARK_PALETTE,t as IMAGE_EDITOR_LIGHT_PALETTE,d as IMAGE_EDITOR_TABS,c as buildCropPresetItems,m as buildImageEditorTranslations,p as createImageEditorConfig};
@@ -0,0 +1 @@
1
+ "use strict";var zod=require("zod"),StrokeCommon={color:zod.z.string().max(32),width:zod.z.number().positive().max(200)},RotationCommon={rotation:zod.z.number().min(-180).max(180).optional()},TimelineCommon={startAt:zod.z.number().min(0).optional(),endAt:zod.z.number().min(0).optional(),timelineTrack:zod.z.number().int().min(0).max(99).optional(),hidden:zod.z.boolean().optional(),locked:zod.z.boolean().optional()},FilterCommon={brightness:zod.z.number().min(-1).max(1).default(0),contrast:zod.z.number().min(-1).max(1).default(0),saturation:zod.z.number().min(-1).max(1).default(0),temperature:zod.z.number().min(-1).max(1).default(0),tint:zod.z.number().min(-1).max(1).default(0),vibrance:zod.z.number().min(-1).max(1).default(0),gamma:zod.z.number().min(-1).max(1).default(0),highlights:zod.z.number().min(-1).max(1).default(0),shadows:zod.z.number().min(-1).max(1).default(0),whites:zod.z.number().min(-1).max(1).default(0),blacks:zod.z.number().min(-1).max(1).default(0),lightSense:zod.z.number().min(-1).max(1).default(0),sharpen:zod.z.number().min(0).max(1).default(0),clarity:zod.z.number().min(0).max(1).default(0),grain:zod.z.number().min(0).max(1).default(0),fade:zod.z.number().min(0).max(1).default(0),vignette:zod.z.number().min(0).max(1).default(0)},Overlay=zod.z.discriminatedUnion("type",[zod.z.object({type:zod.z.literal("pen"),points:zod.z.array(zod.z.number()).min(4),...StrokeCommon,...TimelineCommon,...RotationCommon}),zod.z.object({type:zod.z.literal("line"),x1:zod.z.number(),y1:zod.z.number(),x2:zod.z.number(),y2:zod.z.number(),...StrokeCommon,...TimelineCommon,...RotationCommon}),zod.z.object({type:zod.z.literal("arrow"),x1:zod.z.number(),y1:zod.z.number(),x2:zod.z.number(),y2:zod.z.number(),...StrokeCommon,...TimelineCommon,...RotationCommon}),zod.z.object({type:zod.z.literal("rect"),x:zod.z.number(),y:zod.z.number(),w:zod.z.number(),h:zod.z.number(),...StrokeCommon,...TimelineCommon,...RotationCommon}),zod.z.object({type:zod.z.literal("ellipse"),x:zod.z.number(),y:zod.z.number(),w:zod.z.number(),h:zod.z.number(),...StrokeCommon,...TimelineCommon,...RotationCommon}),zod.z.object({type:zod.z.literal("text"),x:zod.z.number(),y:zod.z.number(),text:zod.z.string().max(500),color:zod.z.string().max(32),fontSize:zod.z.number().positive().max(512),fontFamily:zod.z.string().max(120).optional(),fontWeight:zod.z.string().max(20).optional(),italic:zod.z.boolean().optional(),underline:zod.z.boolean().optional(),strikethrough:zod.z.boolean().optional(),align:zod.z.enum(["left","center","right"]).optional(),width:zod.z.number().positive().max(8192).optional(),backgroundColor:zod.z.string().max(32).optional(),strokeColor:zod.z.string().max(32).optional(),borderWidth:zod.z.number().min(0).max(64).optional(),paddingX:zod.z.number().min(0).max(256).optional(),paddingY:zod.z.number().min(0).max(256).optional(),lineHeight:zod.z.number().positive().max(4).optional(),opacity:zod.z.number().min(0).max(100).optional(),...TimelineCommon,...RotationCommon}),zod.z.object({type:zod.z.literal("sticker"),x:zod.z.number(),y:zod.z.number(),w:zod.z.number().positive(),h:zod.z.number().positive(),emoji:zod.z.string().max(16).optional(),src:zod.z.string().optional(),...TimelineCommon,...RotationCommon}),zod.z.object({type:zod.z.literal("adjust"),x:zod.z.number(),y:zod.z.number(),w:zod.z.number().positive(),h:zod.z.number().positive(),layerKind:zod.z.enum(["adjust","filter"]).optional(),filterPreset:zod.z.string().max(32).optional(),...FilterCommon,...TimelineCommon,...RotationCommon})]),Clip=zod.z.object({srcIdx:zod.z.number().int().min(0).max(7),in:zod.z.number().min(0),out:zod.z.number().min(0),hidden:zod.z.boolean().optional(),locked:zod.z.boolean().optional()}),AudioClip=zod.z.object({srcIdx:zod.z.number().int().min(0).max(2),track:zod.z.number().int().min(0).default(0),startAt:zod.z.number().min(0),in:zod.z.number().min(0),out:zod.z.number().min(0),speed:zod.z.number().min(.5).max(2).default(1),volume:zod.z.number().min(0).max(10),muted:zod.z.boolean().optional(),locked:zod.z.boolean().optional(),fadeIn:zod.z.number().min(0).default(0),fadeOut:zod.z.number().min(0).default(0)}),Transition=zod.z.object({type:zod.z.enum(["none","fade","slide","wipe","flip","clockWipe","star","circle","rectangle"]).default("none"),duration:zod.z.number().min(0).max(2).default(.4)}),ExportSettings=zod.z.object({fileName:zod.z.string().max(120).optional(),format:zod.z.enum(["mp4","mov","mxf"]).default("mp4"),width:zod.z.number().int().min(2).max(8192).optional(),height:zod.z.number().int().min(2).max(8192).optional(),frameRate:zod.z.number().int().min(12).max(120).default(30),bitrateMode:zod.z.enum(["auto","custom"]).optional(),videoBitrateKbps:zod.z.number().int().min(100).max(5e4).optional(),audioBitrateKbps:zod.z.number().int().min(32).max(1024).optional(),audioCodec:zod.z.enum(["aac","mp3"]).default("aac")}).optional(),DEFAULT_FILTERS={brightness:0,contrast:0,saturation:0,temperature:0,tint:0,vibrance:0,gamma:0,highlights:0,shadows:0,whites:0,blacks:0,lightSense:0,sharpen:0,clarity:0,grain:0,fade:0,vignette:0},VideoEditState=zod.z.object({clips:zod.z.array(Clip).min(1).max(50),audioClips:zod.z.array(AudioClip).max(8).default([]),canvas:zod.z.object({w:zod.z.number().int().min(2).max(4096),h:zod.z.number().int().min(2).max(4096)}),crop:zod.z.object({x:zod.z.number().min(0),y:zod.z.number().min(0),width:zod.z.number().positive(),height:zod.z.number().positive()}).optional(),scale:zod.z.object({width:zod.z.number().positive(),height:zod.z.number().positive(),fit:zod.z.enum(["contain","cover","force"]),backgroundColor:zod.z.string().max(32).optional()}).optional(),rotation:zod.z.number().min(-180).max(180).default(0),flipX:zod.z.boolean().default(!1),flipY:zod.z.boolean().default(!1),filters:zod.z.object(FilterCommon).default(DEFAULT_FILTERS),filterPreset:zod.z.string().max(32).optional(),overlays:zod.z.array(Overlay).max(200).optional(),transitions:zod.z.array(Transition).max(49).default([]),keepAudio:zod.z.boolean().default(!0),poster:zod.z.object({time:zod.z.number().min(0),src:zod.z.string().optional(),useAsVideoCover:zod.z.boolean().optional(),preview:zod.z.string().optional()}).optional(),exportSettings:ExportSettings}).superRefine((e,t)=>{e.clips.forEach((e,o)=>{e.out<=e.in&&t.addIssue({code:zod.z.ZodIssueCode.custom,message:`clips[${o}].out 必须大于 in`,path:["clips",o,"out"]})}),e.audioClips?.forEach((e,o)=>{e.out<=e.in&&t.addIssue({code:zod.z.ZodIssueCode.custom,message:`audioClips[${o}].out 必须大于 in`,path:["audioClips",o,"out"]})}),e.canvas.w%2==0&&e.canvas.h%2==0||t.addIssue({code:zod.z.ZodIssueCode.custom,message:"canvas 宽高必须为偶数",path:["canvas"]}),null!=e.exportSettings?.width&&e.exportSettings.width%2!=0&&t.addIssue({code:zod.z.ZodIssueCode.custom,message:"exportSettings.width must be even",path:["exportSettings","width"]}),null!=e.exportSettings?.height&&e.exportSettings.height%2!=0&&t.addIssue({code:zod.z.ZodIssueCode.custom,message:"exportSettings.height must be even",path:["exportSettings","height"]})});function defaultVideoEditState(){return{clips:[],audioClips:[],canvas:{w:2,h:2},rotation:0,flipX:!1,flipY:!1,filters:DEFAULT_FILTERS,transitions:[],keepAudio:!0}}var MIN_CLIP=.1;function clipDuration(e){return e.out-e.in}function totalDuration(e){return e.reduce((e,t)=>e+clipDuration(t),0)}function clipStartsAt(e,t){let o=0;for(let i=0;i<t&&i<e.length;i++)o+=clipDuration(e[i]);return o}function locateOutput(e,t){if(!e.length||t<0)return null;let o=0;for(let i=0;i<e.length;i++){const r=clipDuration(e[i]);if(t<o+r)return{idx:i,srcTime:e[i].in+(t-o)};o+=r}if(Math.abs(t-o)<1e-9||t<=o){const t=e.length-1;return{idx:t,srcTime:e[t].out}}return null}function splitAtOutput(e,t){const o=locateOutput(e,t);if(!o)return e;const i=e[o.idx];return o.srcTime<i.in+MIN_CLIP||o.srcTime>i.out-MIN_CLIP?e:[...e.slice(0,o.idx),{...i,out:o.srcTime},{...i,in:o.srcTime},...e.slice(o.idx+1)]}function removeClip(e,t){return e.length<=1||!e[t]?e:e.filter((e,o)=>o!==t)}function duplicateClip(e,t){const o=e[t];return o?[...e.slice(0,t+1),{...o},...e.slice(t+1)]:e}function reorderClips(e,t,o){if(t===o||!e[t]||o<0||o>=e.length)return e;const i=[...e],[r]=i.splice(t,1);return i.splice(o,0,r),i}function trimClipEdge(e,t,o,i,r){if(!e[t])return e;const a=e.map(e=>({...e}));return"in"===o?a[t].in=Math.min(Math.max(i,0),a[t].out-MIN_CLIP):a[t].out=Math.max(Math.min(i,r),a[t].in+MIN_CLIP),a}function clampAudioClip(e,t,o){const i=Math.max(Math.min(e.out,t),MIN_CLIP),r=Math.min(Math.max(e.in,0),i-MIN_CLIP),a=Math.min(Math.max(e.startAt,0),Math.max(0,o-MIN_CLIP));return{...e,in:r,out:i,startAt:a}}function contentDuration(e,t=[]){const o=totalDuration(e),i=t.reduce((e,t)=>Math.max(e,t.startAt+(t.out-t.in)/Math.max(.01,t.speed??1)),0);return Math.max(o,i)}function usedVideoSrcIndices(e){return[...new Set(e.map(e=>e.srcIdx))].sort((e,t)=>e-t)}function remapSrcIndices(e,t){const o=new Map(t.map((e,t)=>[e,t]));return e.map(e=>({...e,srcIdx:o.get(e.srcIdx)??0}))}var DEG2RAD=Math.PI/180;function rotatedSize(e,t,o){const i=normalizeDeg(o);if(0===i||180===i)return{w:e,h:t};if(90===i||270===i)return{w:t,h:e};const r=i*DEG2RAD;return{w:Math.round(Math.abs(e*Math.cos(r))+Math.abs(t*Math.sin(r))),h:Math.round(Math.abs(e*Math.sin(r))+Math.abs(t*Math.cos(r)))}}function normalizeDeg(e){return(e%360+360)%360}function evenize(e){const t=Math.round(e);return t-t%2}function clampRect(e,t,o=40){const i=Math.min(Math.max(o,e.width),t.w),r=Math.min(Math.max(o,e.height),t.h),a=Math.min(Math.max(0,e.x),t.w-i),n=Math.min(Math.max(0,e.y),t.h-r);return{x:Math.round(a),y:Math.round(n),width:Math.round(i),height:Math.round(r)}}function centeredMaxRect(e,t){let o=e.w,i=o/t;return i>e.h&&(i=e.h,o=i*t),{x:Math.round((e.w-o)/2),y:Math.round((e.h-i)/2),width:Math.round(o),height:Math.round(i)}}function fitRects(e,t,o){const i={x:0,y:0,width:e.width,height:e.height},r={x:0,y:0,width:t.w,height:t.h};return"cover"===o?{src:centeredMaxRect({w:e.width,h:e.height},t.w/t.h),dst:r}:"contain"===o?{src:i,dst:centeredMaxRect({w:t.w,h:t.h},e.width/e.height)}:{src:i,dst:r}}function outputSize(e,t){if(t.scale)return{w:evenize(t.scale.width),h:evenize(t.scale.height)};if(t.crop)return{w:evenize(t.crop.width),h:evenize(t.crop.height)};const o=rotatedSize(e.w,e.h,t.rotation);return{w:evenize(o.w),h:evenize(o.h)}}var FILTER_PRESETS=[{id:"bw",label:"黑白",vf:"hue=s=0",css:"grayscale(1)"},{id:"sepia",label:"复古",vf:"colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131",css:"sepia(0.85)"},{id:"warm",label:"暖阳",vf:"colorbalance=rs=.15:gs=.04:bs=-.15",css:"sepia(0.25) saturate(1.25) brightness(1.03)"},{id:"cool",label:"冷调",vf:"colorbalance=rs=-.14:bs=.16",css:"hue-rotate(12deg) saturate(0.95) brightness(1.02)"},{id:"vivid",label:"鲜艳",vf:"eq=saturation=1.45:contrast=1.08",css:"saturate(1.45) contrast(1.08)"}];function findFilterPreset(e){return e?FILTER_PRESETS.find(t=>t.id===e):void 0}function buildFilterCss(e,t){const o=findFilterPreset(t)?.css??"",i=e.temperature??0,r=e.tint??0,a=e.vibrance??0,n=e.gamma??0,s=e.sharpen??0,l=e.clarity??0;return[`brightness(${1+e.brightness})`,`contrast(${1+e.contrast})`,`saturate(${1+e.saturation})`,o,a?`saturate(${(1+.65*a).toFixed(3)})`:"",i>0?`sepia(${Math.min(.36,.28*i).toFixed(3)})`:"",i?`hue-rotate(${(14*-i).toFixed(2)}deg)`:"",r?`hue-rotate(${(10*r).toFixed(2)}deg)`:"",n?`brightness(${(1+.08*n).toFixed(3)})`:"",l||s?`contrast(${(1+.16*l+.1*s).toFixed(3)})`:""].filter(Boolean).join(" ")}function isOverlayHidden(e){return Boolean(e.hidden)}function overlayTrack(e,t){const o=Number(e.timelineTrack);return Number.isFinite(o)?Math.max(0,Math.round(o)):t}function overlayLayerRenderOrder(e){return e.map((e,t)=>({overlay:e,index:t,track:overlayTrack(e,t)})).sort((e,t)=>t.track-e.track||e.index-t.index).map(e=>e.overlay)}function rotationFilters(e){const t=normalizeDeg(e);if(0===t)return[];if(90===t)return["transpose=1"];if(180===t)return["transpose=1","transpose=1"];if(270===t)return["transpose=2"];const o=`${t}*PI/180`;return[`rotate=${o}:ow=rotw(${o}):oh=roth(${o}):c=black`]}function clampInt(e,t,o,i){const r=Math.round(Number(e));return Number.isFinite(r)?Math.min(o,Math.max(t,r)):i}function evenExportSize(e,t){const o=clampInt(e,2,8192,t);return o%2==0?o:o-1}function exportSettingsOf(e){return e.exportSettings??void 0}function exportFormat(e){const t=String(exportSettingsOf(e)?.format??"mp4").toLowerCase();return"mov"===t||"mxf"===t?t:"mp4"}function exportFrameRate(e){return clampInt(exportSettingsOf(e)?.frameRate,12,120,30)}function exportOutputSize(e){const t=outputSize(e.canvas,e),o=exportSettingsOf(e);if(!o)return t;const i=Number.isFinite(Number(o.width))&&Number(o.width)>0,r=Number.isFinite(Number(o.height))&&Number(o.height)>0;if(!i&&!r)return t;const a=t.w>0&&t.h>0?t.w/t.h:1;if(i&&r)return{w:evenExportSize(o.width,t.w),h:evenExportSize(o.height,t.h)};if(i){const e=evenExportSize(o.width,t.w);return{w:e,h:evenExportSize(e/a,t.h)}}const n=evenExportSize(o.height,t.h);return{w:evenExportSize(n*a,t.w),h:n}}function exportScaleFilters(e){const t=outputSize(e.canvas,e),o=exportOutputSize(e);return o.w===t.w&&o.h===t.h?[]:[`scale=${o.w}:${o.h}`]}function videoBitrateKbps(e){const t=Number(exportSettingsOf(e)?.videoBitrateKbps);return Number.isFinite(t)&&t>=100?Math.round(t):0}function audioBitrateKbps(e){const t=Number(exportSettingsOf(e)?.audioBitrateKbps);return Number.isFinite(t)&&t>=32?Math.round(t):0}function audioCodecArg(e){return"mp3"===exportSettingsOf(e)?.audioCodec?"libmp3lame":"aac"}function ffmpegPadColor(e){if("string"!=typeof e)return"0x000000";const t=e.trim(),o=t.match(/^#?([0-9a-fA-F]{3})$/);if(o)return`0x${o[1].split("").map(e=>e+e).join("").toLowerCase()}`;const i=t.match(/^#?([0-9a-fA-F]{6})$/);return i?`0x${i[1].toLowerCase()}`:"0x000000"}function eqFilter(e){const{brightness:t,contrast:o,saturation:i}=e,r=e.gamma??0,a=e.temperature??0,n=e.tint??0,s=e.vibrance??0,l=e.highlights??0,d=e.shadows??0,p=e.whites??0,u=e.blacks??0,c=e.lightSense??0;if(0===t&&0===o&&0===i&&0===r&&0===a&&0===n&&0===s&&0===l&&0===d&&0===p&&0===u&&0===c)return null;const m=[],h=t+.08*l+.06*d+.05*p-.05*u+.08*c,v=o+.08*p+.08*u,f=i+.65*s;0!==h&&m.push(`brightness=${h.toFixed(3)}`),0!==v&&m.push(`contrast=${(1+v).toFixed(3)}`),0!==f&&m.push(`saturation=${(1+f).toFixed(3)}`),0!==r&&m.push(`gamma=${(1+r*(r>0?1:.5)).toFixed(3)}`);const z=m.length?[`eq=${m.join(":")}`]:[];return 0===a&&0===n||z.push(`colorbalance=rs=${(.18*a+.08*n).toFixed(3)}:gs=${(.02*a-.04*n).toFixed(3)}:bs=${(.18*-a-.08*n).toFixed(3)}`),z.join(",")}function audioClipOutputDuration(e){return Math.max(.001,(e.out-e.in)/Math.max(.01,e.speed??1))}function isClipHidden(e){return Boolean(e.hidden)}function clipVideoFilter(e,t,o,i,r,a){return isClipHidden(t)?`color=c=black:s=${i}x${r}:r=${a}:d=${Math.max(.001,t.out-t.in)},setsar=1,format=yuv420p[v${o}]`:`[${e}:v]trim=start=${t.in}:end=${t.out},setpts=PTS-STARTPTS,scale=${i}:${r}:force_original_aspect_ratio=increase,crop=${i}:${r},setsar=1,fps=${a},format=yuv420p[v${o}]`}function musicClipFilter(e,t,o,i){const r=Math.min(2,Math.max(.5,t.speed??1)),a=audioClipOutputDuration(t),n=Math.min(Math.max(0,t.fadeIn??0),a),s=Math.min(Math.max(0,t.fadeOut??0),a),l=[`atrim=start=${t.in}:end=${t.out}`,"asetpts=PTS-STARTPTS"];return Math.abs(r-1)>.001&&l.push(`atempo=${r.toFixed(3)}`),n>0&&l.push(`afade=t=in:st=0:d=${n.toFixed(3)}`),s>0&&l.push(`afade=t=out:st=${Math.max(0,a-s).toFixed(3)}:d=${s.toFixed(3)}`),l.push(`volume=${t.volume}`,AFORMAT,`adelay=${o}|${o}`),`${e}${l.join(",")}[${i}]`}function buildVideoFilters(e,t={}){const o=[];if(e.flipX&&o.push("hflip"),e.flipY&&o.push("vflip"),o.push(...rotationFilters(e.rotation)),e.crop){const{x:t,y:i,width:r,height:a}=e.crop;o.push(`crop=${r}:${a}:${t}:${i}`)}if(e.scale){const{width:t,height:i,fit:r}=e.scale;"force"===r?o.push(`scale=${t}:${i}`):"cover"===r?o.push(`scale=${t}:${i}:force_original_aspect_ratio=increase`,`crop=${t}:${i}`):o.push(`scale=${t}:${i}:force_original_aspect_ratio=decrease`,`pad=${t}:${i}:(ow-iw)/2:(oh-ih)/2:${ffmpegPadColor(e.scale.backgroundColor)}`)}const i=eqFilter(e.filters);i&&o.push(i);const r=findFilterPreset(e.filterPreset);return r&&o.push(r.vf),!1!==t.includeExportScale&&o.push(...exportScaleFilters(e)),o.push(`fps=${exportFrameRate(e)}`),normalizeDeg(e.rotation)%90==0||e.scale||o.push("scale=trunc(iw/2)*2:trunc(ih/2)*2"),o}function codecArgs(e,t){const o=exportFormat(t),i="mxf"===o?["-c:v","mpeg2video","-pix_fmt","yuv422p"]:["-c:v","libx264","-preset","veryfast","-pix_fmt","yuv420p","-movflags","+faststart"],r=videoBitrateKbps(t);if(r>0?i.push("-b:v",`${r}k`,"-maxrate",`${r}k`,"-bufsize",`${Math.max(2*r,512)}k`):"mxf"===o&&i.push("-q:v","2"),e)if("mxf"===o)i.push("-c:a","pcm_s16le");else{i.push("-c:a",audioCodecArg(t));const e=audioBitrateKbps(t);e>0&&i.push("-b:a",`${e}k`)}return"mxf"===o&&i.push("-f","mxf"),i}var AFORMAT="aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo",ANULL="anullsrc=r=44100:cl=stereo";function declick(e){return e>.02?`,afade=t=in:st=0:d=0.01,afade=t=out:st=${Math.round(1e3*(e-.01))/1e3}:d=0.01`:""}var LIMITER="alimiter=limit=0.95:level=disabled:latency=1";function timedOverlayRanges(e,t=Number.POSITIVE_INFINITY){const o=[];for(const i of e??[]){if(isOverlayHidden(i))continue;if("adjust"===i.type)continue;const e=Number(i.startAt),r=Number(i.endAt);if(Number.isFinite(e)&&Number.isFinite(r)&&!(r<=e)&&(o.push({startAt:Math.max(0,e),endAt:Math.max(e+.01,r)}),o.length>=t))break}return o}function evenFloor(e,t=2){const o=Math.max(t,Math.floor(Number(e)||t));return o%2==0?o:o-1}function timedEffectRange(e){const t=Number.isFinite(e.startAt)?Math.max(0,Number(e.startAt)):0,o=Number(e.endAt);return Number.isFinite(o)?{startAt:t,endAt:Math.max(t+.1,o)}:{startAt:t,endAt:t+3}}function adjustmentOverlayFilters(e){const t=eqFilter({...DEFAULT_FILTERS,...e}),o=findFilterPreset(e.filterPreset);return[t,o?.vf].filter(e=>Boolean(e))}function adjustmentRect(e,t){const o=Math.max(2,evenFloor(t.w)),i=Math.max(2,evenFloor(t.h)),r=Math.max(0,Math.min(o-2,evenFloor(e.x,0))),a=Math.max(0,Math.min(i-2,evenFloor(e.y,0))),n=Math.min(o-r,Math.max(2,evenFloor(e.w))),s=Math.min(i-a,Math.max(2,evenFloor(e.h)));return n<=1||s<=1?null:{x:r,y:a,w:n,h:s}}function timedAdjustmentEffects(e,t){const o=[];for(const i of e??[]){if(isOverlayHidden(i))continue;if("adjust"!==i.type)continue;const e=adjustmentRect(i,t);if(!e)continue;const r=adjustmentOverlayFilters(i);r.length&&o.push({rect:e,filters:r,...timedEffectRange(i)})}return o}function appendTimedOverlayFilters(e,t,o,i){let r=t;return i.forEach((t,i)=>{const a=`[vtimed${o+i}]`;e.push(`${r}[${o+i}:v]overlay=0:0:enable='between(t,${t.startAt.toFixed(3)},${t.endAt.toFixed(3)})'${a}`),r=a}),r}function appendTimedAdjustmentFilters(e,t,o){let i=t;return o.forEach((t,o)=>{const r=`[vadjsrc${o}]`,a=`[vadjbase${o}]`,n=`[vadjcrop${o}]`,s=`[vadj${o}]`,{rect:l}=t;e.push(`${i}split=2${r}${a}`),e.push(`${r}crop=${l.w}:${l.h}:${l.x}:${l.y},${t.filters.join(",")}${n}`),e.push(`${a}${n}overlay=${l.x}:${l.y}:enable='between(t,${t.startAt.toFixed(3)},${t.endAt.toFixed(3)})'${s}`),i=s}),i}function overlayEnableExpr(e){const t=Number(e.startAt),o=Number(e.endAt);return!Number.isFinite(t)||!Number.isFinite(o)||o<=t?"":`:enable='between(t,${Math.max(0,t).toFixed(3)},${Math.max(t+.01,o).toFixed(3)})'`}function appendAdjustmentFilter(e,t,o,i){const r=`[${i}src]`,a=`[${i}base]`,n=`[${i}crop]`,s=`[${i}]`,{rect:l}=o;return e.push(`${t}split=2${r}${a}`),e.push(`${r}crop=${l.w}:${l.h}:${l.x}:${l.y},${o.filters.join(",")}${n}`),e.push(`${a}${n}overlay=${l.x}:${l.y}:enable='between(t,${o.startAt.toFixed(3)},${o.endAt.toFixed(3)})'${s}`),s}function appendLayeredOverlayFilters(e,t,o,i,r,a,n){let s=t,l=0,d=0;for(const t of overlayLayerRenderOrder(i??[])){if(isOverlayHidden(t))continue;if("adjust"===t.type){const o=adjustmentRect(t,a),i=adjustmentOverlayFilters(t);if(!o||!i.length)continue;s=appendAdjustmentFilter(e,s,{rect:o,filters:i,...timedEffectRange(t)},`v${n}adj${d}`),d++;continue}if(l>=r){l++;continue}const i=`[v${n}lay${l}]`;e.push(`${s}[${o+l}:v]overlay=0:0${overlayEnableExpr(t)}${i}`),s=i,l++}return s}function buildSingleSourceArgs(e,t,o,i,r,a=[],n=[]){const s=buildVideoFilters(e,{includeExportScale:!1}),l=e.clips,d=e.keepAudio&&r,p=l.length>=2,u=l.some(isClipHidden),c=exportFrameRate(e),m=n.length>0,h=m?[]:timedOverlayRanges(e.overlays,a.length),v=m?[]:a.slice(0,h.length),f=m?n:[],z=m?[]:timedAdjustmentEffects(e.overlays,outputSize(e.canvas,e));if(p||u||i||v.length||f.length||z.length){const r=[];let a;if(p){l.forEach((t,o)=>{r.push(clipVideoFilter(0,t,o,e.canvas.w,e.canvas.h,c)),d&&r.push(`[0:a]atrim=start=${t.in}:end=${t.out},asetpts=PTS-STARTPTS${declick(t.out-t.in)}[a${o}]`)});const t=l.map((e,t)=>d?`[v${t}][a${t}]`:`[v${t}]`).join(""),o=d?"[vcat][acat]":"[vcat]";r.push(`${t}concat=n=${l.length}:v=1:a=${d?1:0}${o}`),a="[vcat]"}else u?(r.push(clipVideoFilter(0,l[0],0,e.canvas.w,e.canvas.h,c)),a="[v0]"):a="[0:v]";s.length&&(r.push(`${a}${s.join(",")}[vflt]`),a="[vflt]"),f.length?(i&&(r.push(`${a}[1:v]overlay=0:0[vlegacy]`),a="[vlegacy]"),a=appendLayeredOverlayFilters(r,a,1+(i?1:0),e.overlays,f.length,outputSize(e.canvas,e),"s")):z.length&&(a=appendTimedAdjustmentFilters(r,a,z)),!f.length&&i?(r.push(`${a}[1:v]overlay=0:0[vout]`),a="[vout]"):"[0:v]"===a&&(r.push("[0:v]null[vout]"),a="[vout]"),v.length&&(a=appendTimedOverlayFilters(r,a,1+(i?1:0),h));const n=exportScaleFilters(e);n.length&&(r.push(`${a}${n.join(",")}[vscaled]`),a="[vscaled]");const m=[];p||1!==l.length||m.push("-ss",String(l[0].in),"-t",String(l[0].out-l[0].in));const g=["-y",...m,"-i",t];i&&g.push("-i",i);for(const e of f)g.push("-i",e);for(const e of v)g.push("-i",e);return g.push("-filter_complex",r.join(";"),"-map",a),d&&g.push("-map",p?"[acat]":"0:a?"),g.push(...codecArgs(d,e)),g.push(o),g}const g=["-ss",String(l[0].in),"-t",String(l[0].out-l[0].in)],x=buildVideoFilters(e),b=["-y",...g,"-i",t];return x.length&&b.push("-vf",x.join(",")),d||b.push("-an"),b.push(...codecArgs(d,e)),b.push(o),b}function buildFfmpegArgs(e,t,o){const{videoPaths:i,videoHasAudio:r,audioPaths:a,overlayPath:n,textOverlayPaths:s=[],overlayLayerPaths:l=[]}=t,d=(e.audioClips??[]).filter(e=>!e.muted),p=l.length>0,u=p?[]:timedOverlayRanges(e.overlays,s.length),c=p?[]:s.slice(0,u.length),m=p?l:[],h=p?[]:timedAdjustmentEffects(e.overlays,outputSize(e.canvas,e));if(1===i.length&&0===d.length)return buildSingleSourceArgs(e,i[0],o,n,r[0]??!1,c,m);const v=i.length,f=a.length,z=e.canvas.w,g=e.canvas.h,x=e.clips,b=e.keepAudio&&x.some(e=>r[e.srcIdx]),S=exportFrameRate(e),y=x.reduce((e,t)=>e+(t.out-t.in),0),T=[];x.forEach((e,t)=>{T.push(clipVideoFilter(e.srcIdx,e,t,z,g,S)),b&&(r[e.srcIdx]?T.push(`[${e.srcIdx}:a]atrim=start=${e.in}:end=${e.out},asetpts=PTS-STARTPTS${declick(e.out-e.in)},${AFORMAT}[a${t}]`):T.push(`${ANULL},atrim=start=0:end=${e.out-e.in},asetpts=PTS-STARTPTS,${AFORMAT}[a${t}]`))});const $=x.map((e,t)=>b?`[v${t}][a${t}]`:`[v${t}]`).join("");T.push(`${$}concat=n=${x.length}:v=1:a=${b?1:0}${b?"[vcat][acat]":"[vcat]"}`);let R=b?"[acat]":"";if(!b&&d.length&&(T.push(`${ANULL},atrim=start=0:end=${y},asetpts=PTS-STARTPTS,${AFORMAT}[acat]`),R="[acat]"),d.length){d.forEach((e,t)=>{const o=Math.max(0,Math.round(1e3*e.startAt));T.push(musicClipFilter(`[${v+e.srcIdx}:a]`,e,o,`mu${t}`))});const e=`${R}${d.map((e,t)=>`[mu${t}]`).join("")}`;T.push(`${e}amix=inputs=${1+d.length}:duration=first:dropout_transition=0:normalize=0,${LIMITER}[aout]`),R="[aout]"}let A="[vcat]";const E=buildVideoFilters(e,{includeExportScale:!1});E.length&&(T.push(`${A}${E.join(",")}[vflt]`),A="[vflt]"),m.length?(n&&(T.push(`${A}[${v+f}:v]overlay=0:0[vlegacy]`),A="[vlegacy]"),A=appendLayeredOverlayFilters(T,A,v+f+(n?1:0),e.overlays,m.length,outputSize(e.canvas,e),"m")):h.length&&(A=appendTimedAdjustmentFilters(T,A,h)),!m.length&&n&&(T.push(`${A}[${v+f}:v]overlay=0:0[vout]`),A="[vout]"),c.length&&(A=appendTimedOverlayFilters(T,A,v+f+(n?1:0),u));const F=exportScaleFilters(e);F.length&&(T.push(`${A}${F.join(",")}[vscaled]`),A="[vscaled]");const w=["-y"];for(const e of i)w.push("-i",e);for(const e of a)w.push("-i",e);n&&w.push("-i",n);for(const e of m)w.push("-i",e);for(const e of c)w.push("-i",e);w.push("-filter_complex",T.join(";"),"-map",A);const P=!!R;return P&&w.push("-map",R),w.push(...codecArgs(P,e)),P&&w.push("-ar","44100","-ac","2"),w.push(o),w}function buildPosterArgs(e,t,o){return["-y","-ss",String(t),"-i",e,"-frames:v","1","-q:v","2",o]}var MAX_DEPTH=100;function createHistory(e){return{past:[],present:e,future:[]}}function pushHistory(e,t){if(t===e.present)return e;const o=[...e.past,e.present];return o.length>MAX_DEPTH&&o.shift(),{past:o,present:t,future:[]}}function replacePresent(e,t){return t===e.present?e:{...e,present:t}}function canUndo(e){return e.past.length>0}function canRedo(e){return e.future.length>0}function undo(e){return canUndo(e)?{past:e.past.slice(0,-1),present:e.past[e.past.length-1],future:[e.present,...e.future]}:e}function redo(e){if(!canRedo(e))return e;const[t,...o]=e.future;return{past:[...e.past,e.present],present:t,future:o}}var zh={"tool.trim":"剪辑","tool.crop":"裁剪","tool.tune":"调色","tool.filter":"滤镜","tool.annotate":"标注","tool.sticker":"贴纸","tool.resize":"比例","tune.brightness":"亮度","tune.contrast":"对比","tune.saturation":"饱和","tune.gamma":"Gamma","tune.temperature":"色温","tune.tint":"色调","tune.vibrance":"自然饱和","tune.highlights":"高光","tune.shadows":"阴影","tune.whites":"白色","tune.blacks":"黑色","tune.lightSense":"光感","tune.sharpen":"锐化","tune.clarity":"清晰度","tune.grain":"颗粒","tune.fade":"褪色","tune.vignette":"暗角","overlay.select":"选择","overlay.pen":"画笔","overlay.eraser":"橡皮","overlay.line":"直线","overlay.arrow":"箭头","overlay.rect":"矩形","overlay.ellipse":"椭圆","overlay.text":"文字","overlay.color":"线色","overlay.width":"线宽","overlay.fontSize":"字号","overlay.font":"字体","overlay.align":"对齐","overlay.background":"背景","overlay.copySelected":"复制","overlay.delSelected":"删除选中","overlay.editSelected":"编辑","overlay.pickImage":"选择图片","overlay.hint":"点 emoji/图片添加 → 画布上拖动摆位,拖右下角紫色把手缩放","overlay.textPlaceholder":"输入文字,回车确认","filter.none":"原图","filter.bw":"黑白","filter.sepia":"复古","filter.warm":"暖阳","filter.cool":"冷调","filter.vivid":"鲜艳","ratio.orig":"原始","ratio.free":"自由比例","ratio.9:16":"竖屏 9:16","ratio.16:9":"横屏 16:9","ratio.1:1":"方形 1:1","ratio.4:5":"竖图 4:5","ratio.3:4":"竖图 3:4","ratio.2:3":"竖图 2:3","ratio.1.91:1":"横幅 1.91:1","act.fit":"适应","act.zoomFit":"缩放至适当大小","act.zoomTo":"缩放至 {value}%","act.split":"分割","act.copy":"复制","act.delete":"删除","act.restore":"还原","act.deleteMusic":"删除音乐","act.cancel":"取消","act.exportPoster":"导出封面","act.exporting":"导出中…","act.poster":"🖼 封面","act.again":"再次下载","act.saveDrive":"存网盘","act.changeImage":"← 换一张","act.changeVideo":"← 换一个","crop.rotateLeft":"↺ 向左旋转","crop.flipX":"⇋ 水平翻转","crop.flipY":"⇵ 垂直翻转","crop.rotateLeftShort":"左转","crop.flipXShort":"横翻","crop.flipYShort":"竖翻","tip.close":"关闭(换文件)","tip.undo":"撤销","tip.redo":"重做","tip.resetOpened":"重置到打开文件时","tip.previewZoom":"预览缩放比例","tip.previewZoomOut":"缩小预览","tip.previewZoomIn":"放大预览","tip.previewZoomFit":"适应预览","tip.previewPointer":"指针工具","tip.previewPan":"手工具:拖动画面","tip.poster":"预览并选择封面帧","tip.keepAudio":"原视频声音开关(与音乐混音;预览同步)","tip.split":"在播放头处把当前片段一分为二","tip.zoomOut":"缩小时间轴(Ctrl+滚轮)","tip.zoomIn":"放大时间轴(Ctrl+滚轮)","tip.fit":"缩放到适应宽度","tip.addVideo":"添加视频片段","tip.addAudio":"添加音乐(音频文件,或选含声音的视频自动提取音轨;与原声混音)","tip.dupClip":"复制该片段(插到其后)","tip.delClip":"删除该片段","tip.lockAspect":"锁定纵横比","tip.dblConfirm":"双击确认裁剪","err.notVideo":"请选择视频文件","err.maxVideo":"最多 {max} 个视频素材","err.videoLoad":"视频加载失败,请换一个文件","err.notAudio":"请选择音频文件(mp3/wav/m4a),或含声音的视频(自动提取音轨)","err.maxAudio":"最多 {max} 个音频素材","err.audioLoad":"音频加载失败,请换一个文件","err.processFailed":"处理失败","err.posterFailed":"封面渲染失败","err.canvas":"canvas 不可用","err.imageRead":"图片读取失败,请换一张","err.notImage":"请选择图片文件","err.fileType":"只支持图片或视频文件","err.saveDrive":"存网盘失败","msg.processing":"正在导出中…","msg.exportPrepare":"正在准备素材…","msg.exportUpload":"正在上传素材…","msg.exportEncode":"正在编码视频…","msg.exportDownload":"正在接收结果…","msg.exportingHint":"请稍候,导出完成后会自动返回结果。","msg.done":"完成 ✓","msg.loading":"素材加载中…","msg.exported":"已导出:","msg.saving":"存网盘中…","msg.saved":"已存到网盘 ✓","lbl.ratioSection":"画面比例(裁剪,不变形)","lbl.dragToReposition":"↔ 拖动预览可调整裁剪位置","lbl.sizeSection":"导出尺寸(像素;比例不符时 cover 居中裁剪)","lbl.currentOut":"当前输出","lbl.zoomSize":"大小","lbl.noScale":"(未缩放)","lbl.coverNote":"· 比例不一致时居中裁剪(cover),不变形","lbl.audioTrackHint":"♪ 音频轨(右侧 + 添加音乐,与原声混音)","lbl.volume":"音量","lbl.volNote":"(预览最大 100%,导出按设定值)","lbl.music":"音乐","kbd.fit":"⇧ F","poster.title":"选择封面帧","panel.title":"媒体编辑器","panel.subtitle":"上传图片 / 视频,裁剪 · 滤镜 · 文字 · 导出","panel.pick":"点击选择图片或视频","panel.pickHint":"图片用 Filerobot · 视频可裁剪/静音/封面"},en={"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","tune.temperature":"Temperature","tune.tint":"Tint","tune.vibrance":"Vibrance","tune.highlights":"Highlights","tune.shadows":"Shadows","tune.whites":"Whites","tune.blacks":"Blacks","tune.lightSense":"Light","tune.sharpen":"Sharpen","tune.clarity":"Clarity","tune.grain":"Grain","tune.fade":"Fade","tune.vignette":"Vignette","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.fontSize":"Size","overlay.font":"Font","overlay.align":"Align","overlay.background":"Background","overlay.copySelected":"Copy","overlay.delSelected":"Delete selected","overlay.editSelected":"Edit","overlay.pickImage":"Pick image","overlay.hint":"Tap emoji/image to add → 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","ratio.3:4":"Vertical 3:4","ratio.2:3":"Vertical 2:3","ratio.1.91:1":"Wide 1.91:1","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…","act.poster":"🖼 Cover","act.again":"Download again","act.saveDrive":"Save to drive","act.changeImage":"← Change image","act.changeVideo":"← Change file","crop.rotateLeft":"↺ Rotate left","crop.flipX":"⇋ Flip horizontal","crop.flipY":"⇵ 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…","msg.exportPrepare":"Preparing media…","msg.exportUpload":"Uploading media…","msg.exportEncode":"Encoding video…","msg.exportDownload":"Receiving result…","msg.exportingHint":"Please wait. The result will be returned automatically when export finishes.","msg.done":"Done ✓","msg.loading":"Loading media…","msg.exported":"Exported: ","msg.saving":"Saving…","msg.saved":"Saved to drive ✓","lbl.ratioSection":"Frame ratio (crop, no distortion)","lbl.dragToReposition":"↔ 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":"· center-cropped (cover) when ratios differ, no distortion","lbl.audioTrackHint":"♪ Audio track (+ 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":"⇧ F","poster.title":"Pick a cover frame","panel.title":"Media Editor","panel.subtitle":"Upload an image / video — crop · filters · text · export","panel.pick":"Click to choose an image or video","panel.pickHint":"Images via Filerobot · videos: trim/mute/cover"},es={"tool.trim":"Editar","tool.crop":"Recortar","tool.tune":"Ajustar color","tool.filter":"Filtros","tool.annotate":"Anotar","tool.sticker":"Stickers","tool.resize":"Proporción","tune.brightness":"Brillo","tune.contrast":"Contraste","tune.saturation":"Saturación","tune.gamma":"Gamma","tune.temperature":"Temperatura","tune.tint":"Tinte","tune.vibrance":"Intensidad","tune.highlights":"Altas luces","tune.shadows":"Sombras","tune.whites":"Blancos","tune.blacks":"Negros","tune.lightSense":"Luz","tune.sharpen":"Enfoque","tune.clarity":"Claridad","tune.grain":"Grano","tune.fade":"Desvanecer","tune.vignette":"Viñeta","overlay.select":"Seleccionar","overlay.pen":"Pincel","overlay.eraser":"Borrador","overlay.line":"Línea","overlay.arrow":"Flecha","overlay.rect":"Rectángulo","overlay.ellipse":"Elipse","overlay.text":"Texto","overlay.color":"Color","overlay.width":"Grosor","overlay.fontSize":"Tamaño","overlay.font":"Fuente","overlay.align":"Alinear","overlay.background":"Fondo","overlay.copySelected":"Copiar","overlay.delSelected":"Eliminar seleccionado","overlay.editSelected":"Editar","overlay.pickImage":"Elegir imagen","overlay.hint":"Toca un emoji/imagen para añadirlo → 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álido","filter.cool":"Frío","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","ratio.3:4":"Vertical 3:4","ratio.2:3":"Vertical 2:3","ratio.1.91:1":"Panorámico 1.91:1","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úsica","act.cancel":"Cancelar","act.exportPoster":"Exportar portada","act.exporting":"Exportando…","act.poster":"🖼 Portada","act.again":"Descargar de nuevo","act.saveDrive":"Guardar en disco","act.changeImage":"← Cambiar imagen","act.changeVideo":"← Cambiar archivo","crop.rotateLeft":"↺ Girar a la izquierda","crop.flipX":"⇋ Voltear horizontal","crop.flipY":"⇵ 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úsica; la vista previa lo refleja)","tip.split":"Dividir el clip actual en el cursor","tip.zoomOut":"Reducir línea de tiempo (Ctrl+rueda)","tip.zoomIn":"Ampliar línea de tiempo (Ctrl+rueda)","tip.fit":"Ajustar al ancho","tip.addVideo":"Añadir clip de vídeo","tip.addAudio":"Añadir música (archivo de audio o vídeo con sonido para extraer la pista; se mezcla con el original)","tip.dupClip":"Duplicar clip (insertar después)","tip.delClip":"Eliminar clip","tip.lockAspect":"Bloquear proporción","tip.dblConfirm":"Doble clic para confirmar recorte","err.notVideo":"Elige un archivo de vídeo","err.maxVideo":"Máximo {max} vídeos","err.videoLoad":"No se pudo cargar el vídeo, prueba con otro archivo","err.notAudio":"Elige un audio (mp3/wav/m4a) o un vídeo con sonido (se extrae automáticamente)","err.maxAudio":"Máximo {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ídeo","err.saveDrive":"No se pudo guardar en disco","msg.processing":"Exportando…","msg.exportPrepare":"Preparando medios…","msg.exportUpload":"Subiendo medios…","msg.exportEncode":"Codificando video…","msg.exportDownload":"Recibiendo resultado…","msg.exportingHint":"Espera un momento. El resultado se devolverá automáticamente al finalizar.","msg.done":"Listo ✓","msg.loading":"Cargando medios…","msg.exported":"Exportado: ","msg.saving":"Guardando…","msg.saved":"Guardado en disco ✓","lbl.ratioSection":"Proporción de imagen (recorte, sin deformar)","lbl.dragToReposition":"↔ Arrastra la vista previa para reposicionar el recorte","lbl.sizeSection":"Tamaño de exportación (px; recorte cover centrado si la proporción difiere)","lbl.currentOut":"Salida","lbl.zoomSize":"Tamaño","lbl.noScale":"(sin escala)","lbl.coverNote":"· recorte centrado (cover) cuando la proporción difiere, sin deformar","lbl.audioTrackHint":"♪ Pista de audio (+ a la derecha para añadir música, mezclada con el original)","lbl.volume":"Volumen","lbl.volNote":"(la vista previa limita a 100%, la exportación usa el valor definido)","lbl.music":"Música","kbd.fit":"⇧ F","poster.title":"Elegir portada","panel.title":"Editor multimedia","panel.subtitle":"Sube una imagen / vídeo — recorta · filtros · texto · exporta","panel.pick":"Haz clic para elegir una imagen o vídeo","panel.pickHint":"Imágenes con Filerobot · vídeos: cortar/silenciar/portada"},ZH_HANT_MAP={"简":"簡","体":"體","图":"圖","频":"頻","视":"視","辑":"輯","调":"調","滤":"濾","标":"標","注":"註","贴":"貼","选":"選","择":"擇","线":"線","箭":"箭","头":"頭","复":"複","删":"刪","除":"除","编":"編","边":"邊","输":"輸","入":"入","确":"確","认":"認","饱":"飽","对":"對","暖":"暖","阳":"陽","冷":"冷","纵":"縱","横":"橫","适":"適","应":"應","缩":"縮","实":"實","际":"際","导":"導","出":"出","封":"封","面":"面","换":"換","张":"張","预":"預","览":"覽","动":"動","声":"聲","开":"開","关":"關","与":"與","乐":"樂","混":"混","处":"處","载":"載","错":"錯","误":"誤","读":"讀","仅":"僅","终":"終","稍":"稍","候":"候","返回":"返回","当前":"目前","输出":"輸出","画":"畫","变":"變","音频":"音訊","音轨":"音軌","添加":"新增","删除":"刪除","保存":"儲存","加载":"載入","网盘":"網盤"},toHant=e=>{let t=e;for(const[e,o]of Object.entries(ZH_HANT_MAP).sort((e,t)=>t[0].length-e[0].length))t=t.replaceAll(e,o);return t},zhHant=Object.fromEntries(Object.entries(zh).map(([e,t])=>[e,toHant(t)])),EDITOR_MESSAGES={zh:zh,en:en,es:es,"zh-Hant":zhHant};function tEditor(e,t,o){let i=EDITOR_MESSAGES[e]?.[t]??EDITOR_MESSAGES.zh[t]??t;if(o)for(const[e,t]of Object.entries(o))i=i.replaceAll(`{${e}}`,String(t));return i}var DEFAULT_PLATFORM_TARGETS=[{platform:"tiktok",postType:"video",label:"TikTok Video",shortLabel:"TT·Video",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"post",label:"Instagram Post",shortLabel:"IG·Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"instagram",postType:"reels",label:"Instagram Reels",shortLabel:"IG·Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"story",label:"Instagram Story",shortLabel:"IG·Story",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"facebook",postType:"post",label:"Facebook Post",shortLabel:"FB·Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"facebook",postType:"reels",label:"Facebook Reels",shortLabel:"FB·Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"youtube",postType:"video",label:"YouTube Video",shortLabel:"YT·Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"youtube",postType:"shorts",label:"YouTube Shorts",shortLabel:"YT·Shorts",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·Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"},{platform:"linkedin",postType:"post",label:"LinkedIn Post",shortLabel:"LI·Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"linkedin",postType:"video",label:"LinkedIn Video",shortLabel:"LI·Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"threads",postType:"post",label:"Threads Post",shortLabel:"TH·Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"telegram",postType:"post",label:"Telegram Post",shortLabel:"TG·Post",ratio:"1:1",imageSize:"2048x2048",videoRatio:"9:16",videoResolution:"720p"},{platform:"reddit",postType:"post",label:"Reddit Post",shortLabel:"RD·Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"}],RATIO_LABEL={"1:1":"方形 1:1","4:5":"竖图 4:5","3:4":"竖图 3:4","9:16":"竖屏 9:16","16:9":"横屏 16:9","2:3":"竖图 2:3","1.91:1":"横幅 1.91:1"};function parseRatio(e){const[t,o]=e.split(":").map(Number);return t&&o?t/o:1}function dedupePresets(e){const t=new Set,o=[];for(const i of e)i&&!t.has(i)&&(t.add(i),o.push({ratio:i,value:parseRatio(i),label:RATIO_LABEL[i]??i}));return o}var IMAGE_RATIO_PRESETS=dedupePresets(["1:1","4:5","3:4","2:3","9:16","16:9","1.91:1"]),VIDEO_RATIO_PRESETS=dedupePresets(["9:16","16:9","1:1","4:5","3:4","2:3","1.91:1"]);function buildVideoPlatformRatioPresets(e=DEFAULT_PLATFORM_TARGETS){const t=new Set,o=[];for(const i of e){if(!i.videoRatio)continue;const e=`${i.platform}:${i.postType}:${i.videoRatio}`;if(t.has(e))continue;t.add(e);const r=i.label.split(" ").slice(0,-1).join(" ")||i.label;o.push({platform:i.platform,postType:i.postType,label:`${r} ${i.videoRatio}`,ratio:i.videoRatio,value:parseRatio(i.videoRatio)})}return o}var VIDEO_PLATFORM_RATIO_PRESETS=buildVideoPlatformRatioPresets();function buildImagePlatformPresets(e=DEFAULT_PLATFORM_TARGETS){const t=new Map;for(const o of e){const e=t.get(o.platform);(!e||"post"!==e.postType&&"post"===o.postType)&&t.set(o.platform,o)}return Array.from(t.values()).map(e=>{const[t,o]=e.imageSize.split("x").map(Number),i=e.label.split(" ").slice(0,-1).join(" ")||e.label;return{platform:e.platform,label:`${i} ${e.ratio}`,ratio:e.ratio,value:parseRatio(e.ratio),w:t,h:o}})}var IMAGE_PLATFORM_PRESETS=buildImagePlatformPresets();function sizeOf(e,t){return e>=1?{w:2*Math.round(t*e/2),h:t}:{w:t,h:2*Math.round(t/e/2)}}function buildVideoSizePresets(e=DEFAULT_PLATFORM_TARGETS){const t=new Set,o=[];for(const i of e){if(!i.videoRatio||!i.videoResolution)continue;const e="1080p"===i.videoResolution?1080:720,{w:r,h:a}=sizeOf(parseRatio(i.videoRatio),e),n=`${r}x${a}`;t.has(n)||(t.add(n),o.push({label:`${i.shortLabel} ${r}×${a}`,w:r,h:a}))}return o}var VIDEO_SIZE_PRESETS=buildVideoSizePresets();function compensateAnnotationRotation(e,t){if(e.isDuplicated)return{};if(0!==(e.rotation??0))return{};const o=t.adjustments?.rotation??0;return o?{rotation:-o}:{}}exports.AudioClip=AudioClip,exports.Clip=Clip,exports.DEFAULT_FILTERS=DEFAULT_FILTERS,exports.DEFAULT_PLATFORM_TARGETS=DEFAULT_PLATFORM_TARGETS,exports.DEG2RAD=DEG2RAD,exports.EDITOR_MESSAGES=EDITOR_MESSAGES,exports.ExportSettings=ExportSettings,exports.FILTER_PRESETS=FILTER_PRESETS,exports.IMAGE_PLATFORM_PRESETS=IMAGE_PLATFORM_PRESETS,exports.IMAGE_RATIO_PRESETS=IMAGE_RATIO_PRESETS,exports.MIN_CLIP=MIN_CLIP,exports.Overlay=Overlay,exports.Transition=Transition,exports.VIDEO_PLATFORM_RATIO_PRESETS=VIDEO_PLATFORM_RATIO_PRESETS,exports.VIDEO_RATIO_PRESETS=VIDEO_RATIO_PRESETS,exports.VIDEO_SIZE_PRESETS=VIDEO_SIZE_PRESETS,exports.VideoEditState=VideoEditState,exports.buildFfmpegArgs=buildFfmpegArgs,exports.buildFilterCss=buildFilterCss,exports.buildImagePlatformPresets=buildImagePlatformPresets,exports.buildPosterArgs=buildPosterArgs,exports.buildVideoPlatformRatioPresets=buildVideoPlatformRatioPresets,exports.buildVideoSizePresets=buildVideoSizePresets,exports.canRedo=canRedo,exports.canUndo=canUndo,exports.centeredMaxRect=centeredMaxRect,exports.clampAudioClip=clampAudioClip,exports.clampRect=clampRect,exports.clipDuration=clipDuration,exports.clipStartsAt=clipStartsAt,exports.compensateAnnotationRotation=compensateAnnotationRotation,exports.contentDuration=contentDuration,exports.createHistory=createHistory,exports.defaultVideoEditState=defaultVideoEditState,exports.duplicateClip=duplicateClip,exports.evenize=evenize,exports.findFilterPreset=findFilterPreset,exports.fitRects=fitRects,exports.locateOutput=locateOutput,exports.normalizeDeg=normalizeDeg,exports.outputSize=outputSize,exports.parseRatio=parseRatio,exports.pushHistory=pushHistory,exports.redo=redo,exports.remapSrcIndices=remapSrcIndices,exports.removeClip=removeClip,exports.reorderClips=reorderClips,exports.replacePresent=replacePresent,exports.rotatedSize=rotatedSize,exports.splitAtOutput=splitAtOutput,exports.tEditor=tEditor,exports.toHant=toHant,exports.totalDuration=totalDuration,exports.trimClipEdge=trimClipEdge,exports.undo=undo,exports.usedVideoSrcIndices=usedVideoSrcIndices;
@@ -0,0 +1,250 @@
1
+ import { A as AudioClipT, C as ClipT, V as VideoEditStateT } from './state-D2oM5s1a.js';
2
+ export { a as AudioClip, b as Clip, D as DEFAULT_FILTERS, E as ExportSettings, c as ExportSettingsT, d as Overlay, O as OverlayT, T as Transition, e as TransitionT, f as VideoEditState, g as defaultVideoEditState } from './state-D2oM5s1a.js';
3
+ export { D as DEFAULT_PLATFORM_TARGETS, a as EDITOR_MESSAGES, E as EditorLocale, I as IMAGE_PLATFORM_PRESETS, b as IMAGE_RATIO_PRESETS, P as PlatformPreset, c as PlatformTarget, R as RatioPreset, S as SizePreset, V as VIDEO_PLATFORM_RATIO_PRESETS, d as VIDEO_RATIO_PRESETS, e as VIDEO_SIZE_PRESETS, f as VideoPlatformRatioPreset, g as buildImagePlatformPresets, h as buildVideoPlatformRatioPresets, i as buildVideoSizePresets, p as parseRatio, t as tEditor, j as toHant } from './platform-presets-Ca2LbKQ3.js';
4
+ import 'zod';
5
+
6
+ /**
7
+ * editor-core/timeline v2 —— 输出时间轴纯函数(多素材 clips/audioClips 操作)。
8
+ * 从 UI 抽出,Vue/React 壳共用;全部不可变(返回新数组)。
9
+ *
10
+ * 模型:clips 数组顺序 = 输出拼接顺序;输出时间轴 x = Σ前序片段时长。
11
+ * 所有 "t" 参数除特别说明外都是**输出时间**;trimClipEdge 的 srcT 是源时间。
12
+ */
13
+
14
+ declare const MIN_CLIP = 0.1;
15
+ /** 片段时长 */
16
+ declare function clipDuration(c: ClipT): number;
17
+ /** 输出总时长 */
18
+ declare function totalDuration(clips: ClipT[]): number;
19
+ /** 第 idx 个片段在输出时间轴上的起点(前缀和) */
20
+ declare function clipStartsAt(clips: ClipT[], idx: number): number;
21
+ /**
22
+ * 输出时间 t → 所属片段与源内时刻。
23
+ * 交界时刻归后段(前段已播完);t === total 归末段(srcTime = out);
24
+ * t 越界或 clips 为空返回 null。
25
+ */
26
+ declare function locateOutput(clips: ClipT[], t: number): {
27
+ idx: number;
28
+ srcTime: number;
29
+ } | null;
30
+ /** 在输出时刻 t 处把所属片段一分为二;距两端 <MIN_CLIP 返回原数组 */
31
+ declare function splitAtOutput(clips: ClipT[], t: number): ClipT[];
32
+ /** 删除第 idx 个片段;只剩一段时不可删,返回原数组 */
33
+ declare function removeClip(clips: ClipT[], idx: number): ClipT[];
34
+ /** 复制第 idx 个片段,插到原段之后 */
35
+ declare function duplicateClip(clips: ClipT[], idx: number): ClipT[];
36
+ /** 拖拽重排:把第 from 段移动到第 to 位 */
37
+ declare function reorderClips(clips: ClipT[], from: number, to: number): ClipT[];
38
+ /**
39
+ * 拖片段把手:把第 idx 段的 in/out 改到源时刻 srcT。
40
+ * in 钳 [0, out-MIN_CLIP];out 钳 [in+MIN_CLIP, srcDuration]。
41
+ */
42
+ declare function trimClipEdge(clips: ClipT[], idx: number, edge: 'in' | 'out', srcT: number, srcDuration: number): ClipT[];
43
+ /**
44
+ * 音乐片段钳制:in/out 在源时长内且 out-in≥MIN_CLIP;
45
+ * startAt ∈ [0, max(0, total-MIN_CLIP)] —— 允许尾部悬出输出末尾(导出 amix duration=first 截断)。
46
+ */
47
+ declare function clampAudioClip(a: AudioClipT, srcDuration: number, total: number): AudioClipT;
48
+ /**
49
+ * 时间轴内容时长 = max(视频总长, 音乐悬出末端)。
50
+ * 用于内容宽度/适应缩放/标尺——音乐尾部悬出视频末尾时也要看得见;
51
+ * 播放头/seek 仍以视频总长为界(导出 amix duration=first 同语义)。
52
+ */
53
+ declare function contentDuration(clips: ClipT[], audioClips?: AudioClipT[]): number;
54
+ /** clips 实际引用到的视频源序号(升序去重)——导出前压缩上传用 */
55
+ declare function usedVideoSrcIndices(clips: ClipT[]): number[];
56
+ /** 把 clips 的 srcIdx 重映射为 used 中的序号(与压缩后的上传文件序对齐) */
57
+ declare function remapSrcIndices(clips: ClipT[], used: number[]): ClipT[];
58
+
59
+ /**
60
+ * editor-core/ffmpeg-args v2 —— VideoEditState → FFmpeg 参数(纯函数,服务端执行)。
61
+ * 安全:只接受结构化 state + 服务端落盘的文件路径数组;文件内容不进命令行。
62
+ *
63
+ * 多素材模型:clips 数组序 = 输出拼接序;每片段先归一到画布
64
+ * (cover 居中裁剪 + setsar=1 + fps=30 + format=yuv420p,防 concat 流参数不齐),
65
+ * concat 后过全局画面链(flips → rotate → crop → scale → eq → 预设滤镜),最后 overlay。
66
+ * 音频:原声(keepAudio,无音轨源用 anullsrc 补齐) concat → 与音乐(atrim+volume+adelay)
67
+ * amix=duration=first(锚定视频长):normalize=0(不自动衰减)。
68
+ *
69
+ * 单视频源且无音乐时走 v1 快路径(-ss/-t 或单输入 filter_complex),隔离回归面。
70
+ */
71
+
72
+ /** 服务端按 srcIdx 顺序落盘后的路径与探测结果 */
73
+ interface FfmpegIo {
74
+ /** index 与 clip.srcIdx 对齐(客户端导出前已压缩重映射) */
75
+ videoPaths: string[];
76
+ /** 与 videoPaths 等长,probeHasAudio 结果 */
77
+ videoHasAudio: boolean[];
78
+ /** index 与 audioClip.srcIdx 对齐 */
79
+ audioPaths: string[];
80
+ overlayPath?: string;
81
+ textOverlayPaths?: string[];
82
+ overlayLayerPaths?: string[];
83
+ }
84
+ /**
85
+ * v2 主入口:多视频源 concat + 音乐 amix + 全局链 + overlay。
86
+ * 输入序:视频 0..N-1 → 音乐 N..N+M-1 → overlay N+M。
87
+ */
88
+ declare function buildFfmpegArgs(state: VideoEditStateT, io: FfmpegIo, output: string): string[];
89
+ /** 封面帧:在 time 处抽 1 帧 jpg */
90
+ declare function buildPosterArgs(input: string, time: number, output: string): string[];
91
+
92
+ /**
93
+ * editor-core/transform —— 旋转/坐标换算纯函数。
94
+ * 与 ffmpeg 的 rotw/roth 同公式,保证预览画布与导出尺寸一致。
95
+ */
96
+ declare const DEG2RAD: number;
97
+ /** 旋转 deg 度后的外接框尺寸(= ffmpeg rotate 滤镜 ow=rotw/oh=roth) */
98
+ declare function rotatedSize(w: number, h: number, deg: number): {
99
+ w: number;
100
+ h: number;
101
+ };
102
+ /** 角度归一化到 [0,360) */
103
+ declare function normalizeDeg(deg: number): number;
104
+ /** h264 偶数像素对齐 */
105
+ declare function evenize(n: number): number;
106
+ /** 把 rect 钳制在 bounds 内(裁剪框拖拽用) */
107
+ declare function clampRect(rect: {
108
+ x: number;
109
+ y: number;
110
+ width: number;
111
+ height: number;
112
+ }, bounds: {
113
+ w: number;
114
+ h: number;
115
+ }, minSize?: number): {
116
+ x: number;
117
+ y: number;
118
+ width: number;
119
+ height: number;
120
+ };
121
+ /** 给定纵横比,在 bounds 内求居中最大 rect(比例预设落框用) */
122
+ declare function centeredMaxRect(bounds: {
123
+ w: number;
124
+ h: number;
125
+ }, aspect: number): {
126
+ x: number;
127
+ y: number;
128
+ width: number;
129
+ height: number;
130
+ };
131
+ type FitMode = 'cover' | 'contain' | 'force';
132
+ /**
133
+ * scale 的 fit 语义 → 源/目标矩形对(预览画布与 ffmpeg 严格同语义):
134
+ * - cover:源侧取目标比例的居中最大区(= ffmpeg scale:force_original_aspect_ratio=increase + 居中 crop),不变形
135
+ * - contain:目标侧居中留黑边(= ffmpeg scale:decrease + pad)
136
+ * - force:双全幅拉伸(= ffmpeg scale=W:H)
137
+ * src 坐标相对 crop 区原点;dst 坐标相对输出原点。
138
+ */
139
+ declare function fitRects(crop: {
140
+ width: number;
141
+ height: number;
142
+ }, out: {
143
+ w: number;
144
+ h: number;
145
+ }, fit: FitMode): {
146
+ src: {
147
+ x: number;
148
+ y: number;
149
+ width: number;
150
+ height: number;
151
+ };
152
+ dst: {
153
+ x: number;
154
+ y: number;
155
+ width: number;
156
+ height: number;
157
+ };
158
+ };
159
+ /** 导出产物的最终输出尺寸(决定 overlay PNG 的分辨率) */
160
+ declare function outputSize(source: {
161
+ w: number;
162
+ h: number;
163
+ }, state: {
164
+ rotation: number;
165
+ crop?: {
166
+ width: number;
167
+ height: number;
168
+ } | undefined;
169
+ scale?: {
170
+ width: number;
171
+ height: number;
172
+ } | undefined;
173
+ }): {
174
+ w: number;
175
+ h: number;
176
+ };
177
+
178
+ /**
179
+ * editor-core/filters —— 预设滤镜表(数据驱动)。
180
+ * vf = ffmpeg 滤镜片段(导出真值);css = 浏览器预览近似。
181
+ * 全部使用 ffmpeg-static 6.x 标配滤镜(hue/eq/colorbalance/colorchannelmixer)。
182
+ */
183
+ interface FilterPreset {
184
+ id: string;
185
+ label: string;
186
+ vf: string;
187
+ css: string;
188
+ }
189
+ declare const FILTER_PRESETS: FilterPreset[];
190
+ declare function findFilterPreset(id: string | undefined): FilterPreset | undefined;
191
+ /**
192
+ * 拼出 canvas/CSS 用的 filter 字符串(预览与帧合成共用)。
193
+ * brightness/contrast/saturation 来自手调 [-1,1] → 1+v;叠加预设 css。
194
+ * gamma 无 CSS 等价(仅 ffmpeg 导出生效),此处不含。
195
+ */
196
+ declare function buildFilterCss(filters: {
197
+ brightness: number;
198
+ contrast: number;
199
+ saturation: number;
200
+ temperature?: number;
201
+ tint?: number;
202
+ vibrance?: number;
203
+ gamma?: number;
204
+ sharpen?: number;
205
+ clarity?: number;
206
+ }, presetId?: string): string;
207
+
208
+ /**
209
+ * editor-core/history —— 不可变快照 undo/redo 栈(纯函数)。
210
+ * 泛型,对 EditState 的 JSON 快照工作;壳层(React/Vue)只持有 History<T> 并 set 回去。
211
+ */
212
+ interface History<T> {
213
+ past: T[];
214
+ present: T;
215
+ future: T[];
216
+ }
217
+ declare function createHistory<T>(initial: T): History<T>;
218
+ /** 写入新状态(清空 redo 栈);浅比较相同引用则原样返回 */
219
+ declare function pushHistory<T>(h: History<T>, next: T): History<T>;
220
+ /**
221
+ * 替换当前态但不入栈(高频拖拽的中间帧用):
222
+ * 拖动过程 replacePresent 持续刷新,pointerup 时再 pushHistory 定格一步。
223
+ */
224
+ declare function replacePresent<T>(h: History<T>, next: T): History<T>;
225
+ declare function canUndo<T>(h: History<T>): boolean;
226
+ declare function canRedo<T>(h: History<T>): boolean;
227
+ declare function undo<T>(h: History<T>): History<T>;
228
+ declare function redo<T>(h: History<T>): History<T>;
229
+
230
+ /**
231
+ * Filerobot 图片编辑器的标注旋转补偿(纯函数,供 ImageEditor 注入 config.onAnnotationAdd)。
232
+ *
233
+ * 背景:Filerobot 把 rotation 加在整个 Konva DesignLayer 上(DesignLayerWrapper),
234
+ * 新标注挂进同一层会继承父层旋转 → 旋转图片后再贴文字,文字方向跟着转。
235
+ * onAnnotationAdd 是 5.0.0-beta.159 真实存在但未写进 index.d.ts 的 config 钩子:
236
+ * 源码 lib/actions/setAnnotation.js 在「新建标注」时调用 (annotation, 全量state),
237
+ * 把返回的 partial 合并进标注 —— 这里给新标注反向初始 rotation,与父层旋转叠加后视觉正向。
238
+ */
239
+ declare function compensateAnnotationRotation(ann: {
240
+ rotation?: number;
241
+ isDuplicated?: boolean;
242
+ }, state: {
243
+ adjustments?: {
244
+ rotation?: number;
245
+ };
246
+ }): {
247
+ rotation?: number;
248
+ };
249
+
250
+ export { AudioClipT, ClipT, DEG2RAD, FILTER_PRESETS, type FfmpegIo, type FilterPreset, type FitMode, type History, MIN_CLIP, VideoEditStateT, buildFfmpegArgs, buildFilterCss, buildPosterArgs, canRedo, canUndo, centeredMaxRect, clampAudioClip, clampRect, clipDuration, clipStartsAt, compensateAnnotationRotation, contentDuration, createHistory, duplicateClip, evenize, findFilterPreset, fitRects, locateOutput, normalizeDeg, outputSize, pushHistory, redo, remapSrcIndices, removeClip, reorderClips, replacePresent, rotatedSize, splitAtOutput, totalDuration, trimClipEdge, undo, usedVideoSrcIndices };