@bylqwjc/media-editor-react 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/dist/index.cjs +282 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +54 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.js +240 -0
- package/dist/index.js.map +1 -0
- package/filerobot.css +1669 -0
- package/node_modules/@media-editor/client/LICENSE +21 -0
- package/node_modules/@media-editor/client/README.md +27 -0
- package/node_modules/@media-editor/client/dist/index.cjs +60 -0
- package/node_modules/@media-editor/client/dist/index.cjs.map +1 -0
- package/node_modules/@media-editor/client/dist/index.d.cts +24 -0
- package/node_modules/@media-editor/client/dist/index.d.ts +24 -0
- package/node_modules/@media-editor/client/dist/index.js +35 -0
- package/node_modules/@media-editor/client/dist/index.js.map +1 -0
- package/node_modules/@media-editor/client/package.json +23 -0
- package/node_modules/@media-editor/core/LICENSE +21 -0
- package/node_modules/@media-editor/core/README.md +14 -0
- package/node_modules/@media-editor/core/dist/browser.cjs +505 -0
- package/node_modules/@media-editor/core/dist/browser.cjs.map +1 -0
- package/node_modules/@media-editor/core/dist/browser.d.cts +100 -0
- package/node_modules/@media-editor/core/dist/browser.d.ts +100 -0
- package/node_modules/@media-editor/core/dist/browser.js +883 -0
- package/node_modules/@media-editor/core/dist/browser.js.map +1 -0
- package/node_modules/@media-editor/core/dist/chunk-MGKYVYOH.js +371 -0
- package/node_modules/@media-editor/core/dist/chunk-MGKYVYOH.js.map +1 -0
- package/node_modules/@media-editor/core/dist/chunk-USY6UDGL.js +87 -0
- package/node_modules/@media-editor/core/dist/chunk-USY6UDGL.js.map +1 -0
- package/node_modules/@media-editor/core/dist/chunk-XCBM7P7N.js +592 -0
- package/node_modules/@media-editor/core/dist/chunk-XCBM7P7N.js.map +1 -0
- package/node_modules/@media-editor/core/dist/engine.cjs +540 -0
- package/node_modules/@media-editor/core/dist/engine.cjs.map +1 -0
- package/node_modules/@media-editor/core/dist/engine.d.cts +325 -0
- package/node_modules/@media-editor/core/dist/engine.d.ts +359 -0
- package/node_modules/@media-editor/core/dist/engine.js +315 -0
- package/node_modules/@media-editor/core/dist/engine.js.map +1 -0
- package/node_modules/@media-editor/core/dist/filerobot.cjs +818 -0
- package/node_modules/@media-editor/core/dist/filerobot.cjs.map +1 -0
- package/node_modules/@media-editor/core/dist/filerobot.d.cts +88 -0
- package/node_modules/@media-editor/core/dist/filerobot.d.ts +88 -0
- package/node_modules/@media-editor/core/dist/filerobot.js +473 -0
- package/node_modules/@media-editor/core/dist/filerobot.js.map +1 -0
- package/node_modules/@media-editor/core/dist/index.cjs +1276 -0
- package/node_modules/@media-editor/core/dist/index.cjs.map +1 -0
- package/node_modules/@media-editor/core/dist/index.d.cts +242 -0
- package/node_modules/@media-editor/core/dist/index.d.ts +264 -0
- package/node_modules/@media-editor/core/dist/index.js +682 -0
- package/node_modules/@media-editor/core/dist/index.js.map +1 -0
- package/node_modules/@media-editor/core/dist/platform-presets-B-o4C6uY.d.cts +80 -0
- package/node_modules/@media-editor/core/dist/platform-presets-B-o4C6uY.d.ts +80 -0
- package/node_modules/@media-editor/core/dist/state-B85vkf7_.d.cts +936 -0
- package/node_modules/@media-editor/core/dist/state-B85vkf7_.d.ts +1027 -0
- package/node_modules/@media-editor/core/node_modules/zod/LICENSE +21 -0
- package/node_modules/@media-editor/core/node_modules/zod/README.md +208 -0
- package/node_modules/@media-editor/core/node_modules/zod/index.cjs +33 -0
- package/node_modules/@media-editor/core/node_modules/zod/index.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/index.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/index.js +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/package.json +118 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.cjs +138 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.d.cts +164 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.d.ts +164 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.js +133 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/errors.cjs +17 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/errors.d.cts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/errors.d.ts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/errors.js +9 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/external.cjs +22 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/external.d.cts +6 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/external.d.ts +6 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/external.js +6 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.js +6 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.js +109 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.cjs +137 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.d.cts +85 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.d.ts +85 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.js +133 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/index.cjs +33 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/index.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/index.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/index.js +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.cjs +111 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.d.cts +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.d.ts +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.js +109 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.cjs +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.d.cts +102 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.d.ts +102 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/types.cjs +3775 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/types.d.cts +1031 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/types.d.ts +1031 -0
- package/node_modules/@media-editor/core/node_modules/zod/v3/types.js +3693 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/checks.cjs +32 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/checks.d.cts +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/checks.d.ts +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/checks.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/coerce.cjs +47 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/coerce.d.cts +17 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/coerce.d.ts +17 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/coerce.js +17 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/compat.cjs +57 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/compat.d.cts +46 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/compat.d.ts +46 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/compat.js +27 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/errors.cjs +67 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/errors.d.cts +30 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/errors.d.ts +30 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/errors.js +41 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/external.cjs +70 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/external.d.cts +13 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/external.d.ts +13 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/external.js +18 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/index.cjs +33 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/index.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/index.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/index.js +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/iso.cjs +60 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/iso.d.cts +22 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/iso.d.ts +22 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/iso.js +30 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/parse.cjs +32 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/parse.d.cts +23 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/parse.d.ts +23 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/parse.js +6 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/schemas.cjs +1109 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/schemas.d.cts +630 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/schemas.d.ts +630 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/classic/schemas.js +1006 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/api.cjs +1039 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/api.d.cts +284 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/api.d.ts +284 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/api.js +906 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/checks.cjs +591 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/checks.d.cts +278 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/checks.d.ts +278 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/checks.js +565 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/core.cjs +67 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/core.d.cts +49 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/core.d.ts +49 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/core.js +61 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/doc.cjs +39 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/doc.d.cts +14 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/doc.d.ts +14 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/doc.js +35 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/errors.cjs +226 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/errors.d.cts +208 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/errors.d.ts +208 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/errors.js +195 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/function.cjs +102 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/function.d.cts +52 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/function.d.ts +52 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/function.js +75 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/index.cjs +44 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/index.d.cts +15 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/index.d.ts +15 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/index.js +15 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/json-schema.cjs +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/json-schema.d.cts +87 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/json-schema.d.ts +87 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/json-schema.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/parse.cjs +87 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/parse.d.cts +25 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/parse.d.ts +25 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/parse.js +57 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/regexes.cjs +103 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/regexes.d.cts +62 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/regexes.d.ts +62 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/regexes.js +95 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/registries.cjs +56 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/registries.d.cts +35 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/registries.d.ts +35 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/registries.js +51 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/schemas.cjs +1748 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/schemas.d.cts +1041 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/schemas.d.ts +1041 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/schemas.js +1717 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/standard-schema.cjs +2 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/standard-schema.d.cts +55 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/standard-schema.d.ts +55 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/standard-schema.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/to-json-schema.cjs +854 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/to-json-schema.d.cts +88 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/to-json-schema.d.ts +88 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/to-json-schema.js +849 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/util.cjs +539 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/util.d.cts +183 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/util.d.ts +183 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/util.js +493 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/versions.cjs +8 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/versions.d.cts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/versions.d.ts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/core/versions.js +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/index.cjs +22 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/index.d.cts +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/index.d.ts +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/index.js +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ar.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ar.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ar.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ar.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/az.cjs +141 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/az.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/az.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/az.js +115 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/be.cjs +190 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/be.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/be.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/be.js +164 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ca.cjs +144 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ca.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ca.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ca.js +118 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/cs.cjs +161 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/cs.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/cs.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/cs.js +135 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/de.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/de.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/de.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/de.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/en.cjs +145 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/en.d.cts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/en.d.ts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/en.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/eo.cjs +144 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/eo.d.cts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/eo.d.ts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/eo.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/es.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/es.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/es.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/es.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fa.cjs +148 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fa.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fa.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fa.js +122 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fi.cjs +148 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fi.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fi.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fi.js +122 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr-CA.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr-CA.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr-CA.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/he.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/he.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/he.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/he.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/hu.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/hu.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/hu.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/hu.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/id.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/id.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/id.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/id.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/index.cjs +84 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/index.d.cts +39 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/index.d.ts +39 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/index.js +39 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/it.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/it.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/it.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/it.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ja.cjs +141 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ja.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ja.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ja.js +115 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/kh.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/kh.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/kh.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/kh.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ko.cjs +147 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ko.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ko.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ko.js +121 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/mk.cjs +144 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/mk.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/mk.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/mk.js +118 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ms.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ms.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ms.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ms.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/nl.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/nl.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/nl.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/nl.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/no.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/no.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/no.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/no.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ota.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ota.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ota.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ota.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pl.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pl.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pl.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pl.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ps.cjs +148 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ps.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ps.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ps.js +122 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pt.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pt.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pt.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pt.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ru.cjs +190 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ru.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ru.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ru.js +164 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sl.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sl.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sl.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sl.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sv.cjs +144 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sv.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sv.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sv.js +118 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ta.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ta.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ta.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ta.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/th.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/th.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/th.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/th.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/tr.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/tr.d.cts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/tr.d.ts +5 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/tr.js +115 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ua.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ua.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ua.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ua.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ur.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ur.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ur.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ur.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/vi.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/vi.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/vi.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/vi.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-CN.cjs +142 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-CN.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-CN.js +116 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-TW.cjs +143 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-TW.d.cts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-TW.js +117 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/checks.cjs +34 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/checks.d.cts +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/checks.d.ts +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/checks.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/coerce.cjs +47 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/coerce.d.cts +7 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/coerce.d.ts +7 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/coerce.js +17 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/external.cjs +62 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/external.d.cts +11 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/external.d.ts +11 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/external.js +13 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/index.cjs +32 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/index.d.cts +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/index.d.ts +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/index.js +3 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/iso.cjs +60 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/iso.d.cts +22 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/iso.d.ts +22 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/iso.js +30 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/parse.cjs +8 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/parse.d.cts +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/parse.d.ts +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/parse.js +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/schemas.cjs +839 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/schemas.d.cts +356 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/schemas.d.ts +356 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4/mini/schemas.js +732 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4-mini/index.cjs +17 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4-mini/index.d.cts +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4-mini/index.d.ts +1 -0
- package/node_modules/@media-editor/core/node_modules/zod/v4-mini/index.js +1 -0
- package/node_modules/@media-editor/core/package.json +42 -0
- package/node_modules/@media-editor/image/LICENSE +21 -0
- package/node_modules/@media-editor/image/README.md +48 -0
- package/node_modules/@media-editor/image/dist/chunk-5TBO732O.js +1 -0
- package/node_modules/@media-editor/image/dist/index-CU3vkvDR.d.ts +44 -0
- package/node_modules/@media-editor/image/dist/index.css +1 -0
- package/node_modules/@media-editor/image/dist/index.d.ts +2 -0
- package/node_modules/@media-editor/image/dist/index.js +364 -0
- package/node_modules/@media-editor/image/dist/lazy.css +1 -0
- package/node_modules/@media-editor/image/dist/lazy.d.ts +8 -0
- package/node_modules/@media-editor/image/dist/lazy.js +1 -0
- package/node_modules/@media-editor/image/package.json +29 -0
- package/node_modules/@media-editor/video/LICENSE +21 -0
- package/node_modules/@media-editor/video/README.md +55 -0
- package/node_modules/@media-editor/video/dist/chunk-EK7ODJWE.js +1 -0
- package/node_modules/@media-editor/video/dist/index-CX2iAapm.d.ts +51 -0
- package/node_modules/@media-editor/video/dist/index.d.ts +4 -0
- package/node_modules/@media-editor/video/dist/index.js +16919 -0
- package/node_modules/@media-editor/video/dist/lazy.d.ts +10 -0
- package/node_modules/@media-editor/video/dist/lazy.js +1 -0
- package/node_modules/@media-editor/video/dist/legacy.js +65 -0
- package/node_modules/@media-editor/video/package.json +29 -0
- package/package.json +48 -0
- package/style.css +1 -0
- package/theme.css +1214 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/overlay-render.ts","../src/export-form.ts","../src/frame-compositor.ts","../src/fullscreen.ts"],"names":["DEG2RAD"],"mappings":"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","file":"browser.js","sourcesContent":["/**\n * editor-core/overlay-render —— 标注/贴纸绘制(浏览器环境,Canvas API;零框架依赖)。\n * 交互画布与导出 PNG 共用 drawOverlays,保证所见即所得。\n * 坐标系 = 最终输出空间(旋转/裁剪/缩放后),导出 PNG 即按输出分辨率渲染。\n */\nimport type { OverlayT } from './state';\n\nconst DEG2RAD = Math.PI / 180;\n\nfunction strokeStyle(ctx: CanvasRenderingContext2D, color: string, width: number) {\n ctx.strokeStyle = color;\n ctx.lineWidth = width;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n}\n\nfunction drawArrowHead(ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, width: number) {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const len = Math.max(12, width * 3.5);\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(x2 - len * Math.cos(angle - Math.PI / 7), y2 - len * Math.sin(angle - Math.PI / 7));\n ctx.moveTo(x2, y2);\n ctx.lineTo(x2 - len * Math.cos(angle + Math.PI / 7), y2 - len * Math.sin(angle + Math.PI / 7));\n ctx.stroke();\n}\n\nfunction normalizeOverlayRotation(deg: number): number {\n if (!Number.isFinite(deg)) return 0;\n let next = deg % 360;\n if (next > 180) next -= 360;\n if (next < -180) next += 360;\n return Math.abs(next) < 0.001 ? 0 : next;\n}\n\nexport function getOverlayRotation(o: OverlayT): number {\n return normalizeOverlayRotation((o as { rotation?: number }).rotation ?? 0);\n}\n\nexport function overlayBBox(o: OverlayT): { x: number; y: number; w: number; h: number } {\n switch (o.type) {\n case 'pen': {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i < o.points.length; i += 2) {\n minX = Math.min(minX, o.points[i]); maxX = Math.max(maxX, o.points[i]);\n minY = Math.min(minY, o.points[i + 1]); maxY = Math.max(maxY, o.points[i + 1]);\n }\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n }\n case 'line':\n case 'arrow':\n return { x: Math.min(o.x1, o.x2), y: Math.min(o.y1, o.y2), w: Math.abs(o.x2 - o.x1), h: Math.abs(o.y2 - o.y1) };\n case 'rect':\n case 'ellipse':\n case 'sticker':\n return { x: o.x, y: o.y, w: o.w, h: o.h };\n case 'text':\n return { x: o.x, y: o.y, w: o.text.length * o.fontSize * 0.6, h: o.fontSize * 1.2 };\n }\n}\n\nfunction overlayCenter(o: OverlayT): { x: number; y: number } {\n const b = overlayBBox(o);\n return { x: b.x + b.w / 2, y: b.y + b.h / 2 };\n}\n\nfunction rotatePoint(x: number, y: number, cx: number, cy: number, deg: number): { x: number; y: number } {\n const rad = deg * DEG2RAD;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const dx = x - cx;\n const dy = y - cy;\n return { x: cx + dx * cos - dy * sin, y: cy + dx * sin + dy * cos };\n}\n\nfunction scalePoint(x: number, y: number, cx: number, cy: number, ratio: number): { x: number; y: number } {\n return { x: cx + (x - cx) * ratio, y: cy + (y - cy) * ratio };\n}\n\n/** 单个对象绘制;sticker 的位图经 imageCache 提供(加载由调用方负责) */\nexport function drawOverlay(\n ctx: CanvasRenderingContext2D,\n o: OverlayT,\n imageCache?: Map<string, HTMLImageElement>\n): void {\n const rotation = getOverlayRotation(o);\n if (rotation) {\n const c = overlayCenter(o);\n ctx.save();\n ctx.translate(c.x, c.y);\n ctx.rotate(rotation * DEG2RAD);\n ctx.translate(-c.x, -c.y);\n drawOverlayBase(ctx, o, imageCache);\n ctx.restore();\n return;\n }\n drawOverlayBase(ctx, o, imageCache);\n}\n\nfunction drawOverlayBase(\n ctx: CanvasRenderingContext2D,\n o: OverlayT,\n imageCache?: Map<string, HTMLImageElement>\n): void {\n switch (o.type) {\n case 'pen': {\n strokeStyle(ctx, o.color, o.width);\n ctx.beginPath();\n ctx.moveTo(o.points[0], o.points[1]);\n for (let i = 2; i < o.points.length; i += 2) ctx.lineTo(o.points[i], o.points[i + 1]);\n ctx.stroke();\n break;\n }\n case 'line':\n case 'arrow': {\n strokeStyle(ctx, o.color, o.width);\n ctx.beginPath();\n ctx.moveTo(o.x1, o.y1);\n ctx.lineTo(o.x2, o.y2);\n ctx.stroke();\n if (o.type === 'arrow') drawArrowHead(ctx, o.x1, o.y1, o.x2, o.y2, o.width);\n break;\n }\n case 'rect': {\n strokeStyle(ctx, o.color, o.width);\n ctx.strokeRect(o.x, o.y, o.w, o.h);\n break;\n }\n case 'ellipse': {\n strokeStyle(ctx, o.color, o.width);\n ctx.beginPath();\n ctx.ellipse(o.x + o.w / 2, o.y + o.h / 2, Math.abs(o.w / 2), Math.abs(o.h / 2), 0, 0, Math.PI * 2);\n ctx.stroke();\n break;\n }\n case 'text': {\n ctx.fillStyle = o.color;\n ctx.font = `bold ${o.fontSize}px -apple-system, \"PingFang SC\", \"Microsoft YaHei\", sans-serif`;\n ctx.textBaseline = 'top';\n // 描边提升可读性\n ctx.strokeStyle = 'rgba(0,0,0,0.45)';\n ctx.lineWidth = Math.max(2, o.fontSize / 16);\n ctx.lineJoin = 'round';\n ctx.strokeText(o.text, o.x, o.y);\n ctx.fillText(o.text, o.x, o.y);\n break;\n }\n case 'sticker': {\n if (o.emoji) {\n ctx.font = `${Math.min(o.w, o.h)}px -apple-system, \"Apple Color Emoji\", \"Segoe UI Emoji\", sans-serif`;\n ctx.textBaseline = 'top';\n ctx.fillText(o.emoji, o.x, o.y);\n } else if (o.src) {\n const img = imageCache?.get(o.src);\n if (img) ctx.drawImage(img, o.x, o.y, o.w, o.h);\n }\n break;\n }\n }\n}\n\nexport function drawOverlays(\n ctx: CanvasRenderingContext2D,\n overlays: OverlayT[],\n imageCache?: Map<string, HTMLImageElement>\n): void {\n for (const o of overlays) drawOverlay(ctx, o, imageCache);\n}\n\n/** sticker 位图预加载(dataURL → HTMLImageElement) */\nexport async function loadOverlayImages(overlays: OverlayT[]): Promise<Map<string, HTMLImageElement>> {\n const cache = new Map<string, HTMLImageElement>();\n const srcs = [...new Set(overlays.filter((o) => o.type === 'sticker' && o.src).map((o) => (o as { src?: string }).src!))];\n await Promise.all(\n srcs.map(\n (src) =>\n new Promise<void>((resolve) => {\n const img = new Image();\n img.onload = () => {\n cache.set(src, img);\n resolve();\n };\n img.onerror = () => resolve();\n img.src = src;\n })\n )\n );\n return cache;\n}\n\n/** 导出:把 overlays 渲染成输出分辨率的透明 PNG Blob(无 overlay 返回 null) */\nexport async function renderOverlaysToPng(\n overlays: OverlayT[] | undefined,\n width: number,\n height: number\n): Promise<Blob | null> {\n if (!overlays?.length) return null;\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n const cache = await loadOverlayImages(overlays);\n drawOverlays(ctx, overlays, cache);\n return new Promise((resolve) => canvas.toBlob((b) => resolve(b), 'image/png'));\n}\n\n/** 命中检测(选中/拖动用):返回最上层命中的 overlay 下标,无命中 -1 */\nexport function hitTestOverlay(overlays: OverlayT[], x: number, y: number, tolerance = 12): number {\n for (let i = overlays.length - 1; i >= 0; i--) {\n const o = overlays[i];\n if (hitOne(o, x, y, tolerance)) return i;\n }\n return -1;\n}\n\nfunction near(px: number, py: number, x: number, y: number, tol: number): boolean {\n return Math.abs(px - x) <= tol && Math.abs(py - y) <= tol;\n}\n\nfunction nearSegment(x: number, y: number, x1: number, y1: number, x2: number, y2: number, tol: number): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len2 = dx * dx + dy * dy || 1;\n const t = Math.max(0, Math.min(1, ((x - x1) * dx + (y - y1) * dy) / len2));\n const cx = x1 + t * dx;\n const cy = y1 + t * dy;\n return (x - cx) ** 2 + (y - cy) ** 2 <= tol * tol;\n}\n\nfunction hitOne(o: OverlayT, x: number, y: number, tol: number): boolean {\n const rotation = getOverlayRotation(o);\n if (rotation) {\n const c = overlayCenter(o);\n const p = rotatePoint(x, y, c.x, c.y, -rotation);\n return hitOneBase(o, p.x, p.y, tol);\n }\n return hitOneBase(o, x, y, tol);\n}\n\nfunction hitOneBase(o: OverlayT, x: number, y: number, tol: number): boolean {\n switch (o.type) {\n case 'pen': {\n for (let i = 0; i + 3 < o.points.length; i += 2) {\n if (nearSegment(x, y, o.points[i], o.points[i + 1], o.points[i + 2], o.points[i + 3], tol + o.width / 2)) return true;\n }\n return false;\n }\n case 'line':\n case 'arrow':\n return nearSegment(x, y, o.x1, o.y1, o.x2, o.y2, tol + o.width / 2);\n case 'rect':\n case 'ellipse':\n return x >= o.x - tol && x <= o.x + o.w + tol && y >= o.y - tol && y <= o.y + o.h + tol;\n case 'text':\n return x >= o.x - tol && x <= o.x + o.text.length * o.fontSize * 0.6 + tol && y >= o.y - tol && y <= o.y + o.fontSize + tol;\n case 'sticker':\n return near(x, y, o.x + o.w / 2, o.y + o.h / 2, Math.max(o.w, o.h) / 2 + tol);\n }\n}\n\n/**\n * 贴纸图片等比落盒:长边 = boxSide、短边按原始宽高比,下限 8px。\n * 上传任意比例图片不再被压成正方形(drawImage 是拉伸语义,入库 w/h 必须等比)。\n */\nexport function fitStickerBox(natW: number, natH: number, boxSide: number): { w: number; h: number } {\n const side = Math.max(8, boxSide);\n if (!(natW > 0) || !(natH > 0)) return { w: side, h: side };\n const k = side / Math.max(natW, natH);\n return { w: Math.max(8, Math.round(natW * k)), h: Math.max(8, Math.round(natH * k)) };\n}\n\n/**\n * 缩放 overlay(选中后拖右下角把手):以对象左上角为锚,按 ratio 等比。\n * sticker/rect/ellipse 改 w/h;text 改 fontSize;pen/line/arrow 不支持(原样返回)。\n */\nexport function scaleOverlay(o: OverlayT, ratio: number): OverlayT {\n const r = Math.max(0.05, ratio);\n const c = overlayCenter(o);\n switch (o.type) {\n case 'pen':\n return { ...o, points: o.points.map((v, i) => (i % 2 === 0 ? c.x + (v - c.x) * r : c.y + (v - c.y) * r)) };\n case 'line':\n case 'arrow': {\n const p1 = scalePoint(o.x1, o.y1, c.x, c.y, r);\n const p2 = scalePoint(o.x2, o.y2, c.x, c.y, r);\n return { ...o, x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y };\n }\n case 'rect':\n case 'ellipse':\n case 'sticker':\n return { ...o, w: Math.max(8, o.w * r), h: Math.max(8, o.h * r) };\n case 'text':\n return { ...o, fontSize: Math.min(512, Math.max(8, o.fontSize * r)) };\n default:\n return o;\n }\n}\n\n/** 旋转 overlay:以对象 bbox 中心为视觉锚点;坐标本身不变,绘制/命中检测按 rotation 处理。 */\nexport function rotateOverlay(o: OverlayT, deg: number): OverlayT {\n return { ...o, rotation: normalizeOverlayRotation(deg) };\n}\n\n/** 平移 overlay(拖动选中对象) */\nexport function translateOverlay(o: OverlayT, dx: number, dy: number): OverlayT {\n switch (o.type) {\n case 'pen': {\n const points = o.points.map((v, i) => (i % 2 === 0 ? v + dx : v + dy));\n return { ...o, points };\n }\n case 'line':\n case 'arrow':\n return { ...o, x1: o.x1 + dx, y1: o.y1 + dy, x2: o.x2 + dx, y2: o.y2 + dy };\n case 'rect':\n case 'ellipse':\n case 'sticker':\n return { ...o, x: o.x + dx, y: o.y + dy };\n case 'text':\n return { ...o, x: o.x + dx, y: o.y + dy };\n }\n}\n","/**\n * 把引擎导出计划 + 浏览器端 File 组装成服务端约定的 FormData\n * (video_0../audio_0../overlay/editState),供 @media-editor/client.exportVideo 直接发。\n * 触碰 DOM(overlay → canvas PNG),故归 @media-editor/core/browser,React/Vue 共用。\n */\nimport type { VideoEditorEngine } from './engine';\nimport { outputSize } from './transform';\nimport { renderOverlaysToPng } from './overlay-render';\n\n/**\n * @param videoFiles 以「原始 srcIdx」为下标的视频 File 数组(引擎按 videoSrcOrder 取并重排)\n * @param audioFiles 同上(音频)\n */\nexport async function buildVideoExportFormData(\n engine: VideoEditorEngine,\n videoFiles: ReadonlyArray<File | undefined>,\n audioFiles: ReadonlyArray<File | undefined> = [],\n): Promise<FormData> {\n const plan = engine.getExportPlan();\n const fd = new FormData();\n\n plan.videoSrcOrder.forEach((srcIdx, slot) => {\n const f = videoFiles[srcIdx];\n if (f) fd.append(`video_${slot}`, f, f.name || `video_${slot}.mp4`);\n });\n plan.audioSrcOrder.forEach((srcIdx, slot) => {\n const f = audioFiles[srcIdx];\n if (f) fd.append(`audio_${slot}`, f, f.name || `audio_${slot}`);\n });\n\n // overlays 烧成输出分辨率透明 PNG(服务端叠加)\n const out = outputSize(plan.state.canvas, plan.state);\n const overlay = await renderOverlaysToPng(plan.state.overlays, out.w, out.h);\n if (overlay) fd.append('overlay', overlay, 'overlay.png');\n\n fd.append('editState', JSON.stringify(plan.state));\n return fd;\n}\n","/**\n * 帧合成器(框架无关 canvas)—— 把「源帧 → 输出画布 + 完整效果链 + overlays」绘到 canvas。\n * 从 SocialEcho VideoFramePreview.drawFinalFrame 抽出,供实时预览与封面导出复用。\n *\n * 效果链与 ffmpeg 导出严格同构:源→画布 cover 归一 → flips → rotate → crop → scale + 调色/滤镜 css。\n */\nimport type { VideoEditStateT } from './state';\nimport { rotatedSize, outputSize, fitRects, DEG2RAD, type FitMode } from './transform';\nimport { drawOverlays } from './overlay-render';\nimport { buildFilterCss } from './filters';\n\n/** drawImage 可接受的源(video / image / canvas) */\nexport type FrameSource = CanvasImageSource;\n\n/**\n * 把一帧合成绘到 canvas(物理分辨率 = 输出尺寸 × k)。\n * @param srcDims 活动源原始分辨率(逐片段可能不同)\n * @param canvasDims 输出画布(= 首素材分辨率),全局效果链的「源 dims」\n * @param k 物理像素倍率(预览用 ≤1 控带宽,封面导出用 1 全分辨率)\n * @param imageCache 贴纸图片缓存(loadOverlayImages 产出)\n */\nexport function drawVideoFrame(\n canvas: HTMLCanvasElement,\n source: FrameSource,\n srcDims: { w: number; h: number },\n canvasDims: { w: number; h: number },\n state: VideoEditStateT,\n k = 1,\n imageCache?: Map<string, HTMLImageElement>,\n withOverlays = true,\n): void {\n const out = outputSize(canvasDims, state);\n canvas.width = Math.max(2, Math.round(out.w * k));\n canvas.height = Math.max(2, Math.round(out.h * k));\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const rb = rotatedSize(canvasDims.w, canvasDims.h, state.rotation);\n const crop = state.crop ?? { x: 0, y: 0, width: rb.w, height: rb.h };\n const fit: FitMode = state.scale?.fit ?? 'force';\n const { src, dst } = fitRects({ width: crop.width, height: crop.height }, out, fit);\n\n if (fit === 'contain') {\n ctx.fillStyle = '#000';\n ctx.fillRect(0, 0, canvas.width, canvas.height); // 黑边(在 filter 前,免被调色串扰)\n }\n\n ctx.filter = buildFilterCss(state.filters, state.filterPreset);\n ctx.save();\n if (fit === 'contain') {\n ctx.beginPath();\n ctx.rect(k * dst.x, k * dst.y, k * dst.width, k * dst.height);\n ctx.clip();\n }\n ctx.translate(k * dst.x, k * dst.y);\n ctx.scale((k * dst.width) / src.width, (k * dst.height) / src.height);\n ctx.translate(-(crop.x + src.x), -(crop.y + src.y));\n ctx.translate(rb.w / 2, rb.h / 2);\n ctx.rotate(state.rotation * DEG2RAD);\n ctx.scale(state.flipX ? -1 : 1, state.flipY ? -1 : 1);\n // 源帧 cover 居中裁剪铺满画布(与 ffmpeg 逐片段归一同构);srcDims===canvas 时为恒等映射\n const cov = fitRects({ width: srcDims.w, height: srcDims.h }, { w: canvasDims.w, h: canvasDims.h }, 'cover');\n ctx.drawImage(\n source,\n cov.src.x,\n cov.src.y,\n cov.src.width,\n cov.src.height,\n -canvasDims.w / 2,\n -canvasDims.h / 2,\n canvasDims.w,\n canvasDims.h,\n );\n ctx.restore();\n ctx.filter = 'none';\n\n if (withOverlays && state.overlays?.length) {\n ctx.setTransform(k, 0, 0, k, 0, 0);\n drawOverlays(ctx, state.overlays, imageCache);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n}\n\n/** seek 一个 video 到 t 秒,resolve 于 seeked */\nfunction seekVideo(el: HTMLVideoElement, t: number): Promise<void> {\n return new Promise((resolve) => {\n const onSeeked = () => {\n el.removeEventListener('seeked', onSeeked);\n resolve();\n };\n el.addEventListener('seeked', onSeeked);\n el.currentTime = Math.min(Math.max(0, t), el.duration || t);\n });\n}\n\n/**\n * 抽 count 张等距缩略图(dataURL,jpeg)。供时间轴缩略图条 / 封面条。\n * 传入**专用离屏 video 元素**(勿用主预览源,seek 会打断播放)。\n */\nexport async function generateThumbnails(\n videoEl: HTMLVideoElement,\n count: number,\n maxW = 160,\n): Promise<string[]> {\n const dur = videoEl.duration;\n if (!dur || !isFinite(dur) || count <= 0) return [];\n const natW = videoEl.videoWidth || 16;\n const natH = videoEl.videoHeight || 9;\n const w = Math.min(maxW, natW);\n const h = Math.max(1, Math.round((w * natH) / natW));\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n if (!ctx) return [];\n const out: string[] = [];\n for (let i = 0; i < count; i++) {\n await seekVideo(videoEl, (dur * (i + 0.5)) / count);\n ctx.drawImage(videoEl, 0, 0, w, h);\n out.push(canvas.toDataURL('image/jpeg', 0.6));\n }\n return out;\n}\n","/**\n * 全屏切换按钮(框架无关 DOM)。点按对 host 进/出全屏;监听 fullscreenchange 切图标和 host 状态类。\n * 图片/视频 mount 共用:默认可作为覆盖按钮,也可放进宿主自己的返回工具栏。\n */\nexport interface FullscreenToggle {\n button: HTMLButtonElement;\n dispose: () => void;\n}\n\nexport interface FullscreenToggleOptions {\n mode?: 'overlay' | 'inline';\n className?: string;\n}\n\nexport function createFullscreenToggle(host: HTMLElement, options: FullscreenToggleOptions = {}): FullscreenToggle {\n const mode = options.mode ?? 'overlay';\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = ['me-fullscreen-toggle', options.className].filter(Boolean).join(' ');\n btn.dataset.meFullscreenToggle = 'true';\n btn.dataset.mode = mode;\n btn.title = '全屏 / 退出全屏';\n btn.style.cssText = [\n mode === 'overlay' ? 'position:absolute;left:8px;bottom:8px;z-index:30;' : 'position:static;',\n 'width:32px;height:32px;padding:0;',\n 'display:inline-flex;align-items:center;justify-content:center;',\n 'border:1px solid var(--me-border,#26262b);border-radius:6px;',\n 'background:var(--me-chip,#1c1c20);color:var(--me-fg,#e7e7ee);',\n 'cursor:pointer;font-size:15px;line-height:1;opacity:0.9;font:inherit;',\n ].join('');\n\n host.classList.add('me-fullscreen-host');\n\n const sync = () => {\n const isFullscreen = document.fullscreenElement === host;\n btn.textContent = isFullscreen ? '×' : '⛶';\n btn.setAttribute('aria-label', isFullscreen ? '退出全屏' : '全屏');\n host.classList.toggle('me-is-fullscreen', isFullscreen);\n host.dataset.meFullscreen = isFullscreen ? 'true' : 'false';\n };\n sync();\n const onChange = () => sync();\n const onClick = () => {\n const action =\n document.fullscreenElement === host ? document.exitFullscreen?.() : host.requestFullscreen?.();\n void action?.catch?.(() => {});\n };\n btn.addEventListener('click', onClick);\n document.addEventListener('fullscreenchange', onChange);\n\n return {\n button: btn,\n dispose: () => {\n document.removeEventListener('fullscreenchange', onChange);\n btn.removeEventListener('click', onClick);\n btn.remove();\n host.classList.remove('me-fullscreen-host', 'me-is-fullscreen');\n delete host.dataset.meFullscreen;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
// src/state.ts
|
|
4
|
+
var StrokeCommon = {
|
|
5
|
+
color: z.string().max(32),
|
|
6
|
+
width: z.number().positive().max(200)
|
|
7
|
+
};
|
|
8
|
+
var RotationCommon = {
|
|
9
|
+
rotation: z.number().min(-180).max(180).optional()
|
|
10
|
+
};
|
|
11
|
+
var TimedOverlayCommon = {
|
|
12
|
+
startAt: z.number().min(0).optional(),
|
|
13
|
+
endAt: z.number().min(0).optional(),
|
|
14
|
+
timelineTrack: z.number().int().min(0).max(99).optional()
|
|
15
|
+
};
|
|
16
|
+
var Overlay = z.discriminatedUnion("type", [
|
|
17
|
+
// 自由画笔:扁平点序列 [x0,y0,x1,y1,...]
|
|
18
|
+
z.object({ type: z.literal("pen"), points: z.array(z.number()).min(4), ...StrokeCommon, ...RotationCommon }),
|
|
19
|
+
z.object({ type: z.literal("line"), x1: z.number(), y1: z.number(), x2: z.number(), y2: z.number(), ...StrokeCommon, ...RotationCommon }),
|
|
20
|
+
z.object({ type: z.literal("arrow"), x1: z.number(), y1: z.number(), x2: z.number(), y2: z.number(), ...StrokeCommon, ...RotationCommon }),
|
|
21
|
+
z.object({ type: z.literal("rect"), x: z.number(), y: z.number(), w: z.number(), h: z.number(), ...StrokeCommon, ...RotationCommon }),
|
|
22
|
+
z.object({ type: z.literal("ellipse"), x: z.number(), y: z.number(), w: z.number(), h: z.number(), ...StrokeCommon, ...RotationCommon }),
|
|
23
|
+
z.object({
|
|
24
|
+
type: z.literal("text"),
|
|
25
|
+
x: z.number(),
|
|
26
|
+
y: z.number(),
|
|
27
|
+
text: z.string().max(500),
|
|
28
|
+
color: z.string().max(32),
|
|
29
|
+
fontSize: z.number().positive().max(512),
|
|
30
|
+
startAt: z.number().min(0).optional(),
|
|
31
|
+
endAt: z.number().min(0).optional(),
|
|
32
|
+
timelineTrack: z.number().int().min(0).max(99).optional(),
|
|
33
|
+
...RotationCommon
|
|
34
|
+
}),
|
|
35
|
+
// emoji 字符 或 dataURL 图片二选一
|
|
36
|
+
z.object({
|
|
37
|
+
type: z.literal("sticker"),
|
|
38
|
+
x: z.number(),
|
|
39
|
+
y: z.number(),
|
|
40
|
+
w: z.number().positive(),
|
|
41
|
+
h: z.number().positive(),
|
|
42
|
+
emoji: z.string().max(16).optional(),
|
|
43
|
+
src: z.string().optional(),
|
|
44
|
+
startAt: z.number().min(0).optional(),
|
|
45
|
+
endAt: z.number().min(0).optional(),
|
|
46
|
+
timelineTrack: z.number().int().min(0).max(99).optional(),
|
|
47
|
+
...RotationCommon
|
|
48
|
+
}),
|
|
49
|
+
z.object({
|
|
50
|
+
type: z.literal("filter"),
|
|
51
|
+
x: z.number(),
|
|
52
|
+
y: z.number(),
|
|
53
|
+
w: z.number().positive(),
|
|
54
|
+
h: z.number().positive(),
|
|
55
|
+
filterPreset: z.string().max(32).optional(),
|
|
56
|
+
...TimedOverlayCommon,
|
|
57
|
+
...RotationCommon
|
|
58
|
+
}),
|
|
59
|
+
z.object({
|
|
60
|
+
type: z.literal("adjust"),
|
|
61
|
+
x: z.number(),
|
|
62
|
+
y: z.number(),
|
|
63
|
+
w: z.number().positive(),
|
|
64
|
+
h: z.number().positive(),
|
|
65
|
+
brightness: z.number().min(-1).max(1).default(0),
|
|
66
|
+
contrast: z.number().min(-1).max(1).default(0),
|
|
67
|
+
saturation: z.number().min(-1).max(1).default(0),
|
|
68
|
+
temperature: z.number().min(-1).max(1).default(0),
|
|
69
|
+
tint: z.number().min(-1).max(1).default(0),
|
|
70
|
+
vibrance: z.number().min(-1).max(1).default(0),
|
|
71
|
+
gamma: z.number().min(-1).max(1).default(0),
|
|
72
|
+
highlights: z.number().min(-1).max(1).default(0),
|
|
73
|
+
shadows: z.number().min(-1).max(1).default(0),
|
|
74
|
+
whites: z.number().min(-1).max(1).default(0),
|
|
75
|
+
blacks: z.number().min(-1).max(1).default(0),
|
|
76
|
+
lightSense: z.number().min(-1).max(1).default(0),
|
|
77
|
+
sharpen: z.number().min(0).max(1).default(0),
|
|
78
|
+
clarity: z.number().min(0).max(1).default(0),
|
|
79
|
+
grain: z.number().min(0).max(1).default(0),
|
|
80
|
+
fade: z.number().min(0).max(1).default(0),
|
|
81
|
+
vignette: z.number().min(0).max(1).default(0),
|
|
82
|
+
...TimedOverlayCommon,
|
|
83
|
+
...RotationCommon
|
|
84
|
+
})
|
|
85
|
+
]);
|
|
86
|
+
var Clip = z.object({
|
|
87
|
+
srcIdx: z.number().int().min(0).max(7),
|
|
88
|
+
in: z.number().min(0),
|
|
89
|
+
out: z.number().min(0)
|
|
90
|
+
});
|
|
91
|
+
var AudioClip = z.object({
|
|
92
|
+
srcIdx: z.number().int().min(0).max(2),
|
|
93
|
+
track: z.number().int().min(0).default(0),
|
|
94
|
+
startAt: z.number().min(0),
|
|
95
|
+
in: z.number().min(0),
|
|
96
|
+
out: z.number().min(0),
|
|
97
|
+
speed: z.number().min(0.5).max(2).default(1),
|
|
98
|
+
volume: z.number().min(0).max(2),
|
|
99
|
+
fadeIn: z.number().min(0).default(0),
|
|
100
|
+
fadeOut: z.number().min(0).default(0)
|
|
101
|
+
});
|
|
102
|
+
var Transition = z.object({
|
|
103
|
+
type: z.enum(["none", "fade", "slide", "wipe", "flip", "clockWipe", "star", "circle", "rectangle"]).default("none"),
|
|
104
|
+
duration: z.number().min(0).max(2).default(0.4)
|
|
105
|
+
});
|
|
106
|
+
var ExportSettings = z.object({
|
|
107
|
+
fileName: z.string().max(120).optional(),
|
|
108
|
+
format: z.enum(["mp4", "mov", "mxf"]).default("mp4"),
|
|
109
|
+
width: z.number().int().min(2).max(8192).optional(),
|
|
110
|
+
height: z.number().int().min(2).max(8192).optional(),
|
|
111
|
+
frameRate: z.number().int().min(12).max(120).default(30),
|
|
112
|
+
videoBitrateKbps: z.number().int().min(100).max(5e4).optional(),
|
|
113
|
+
audioBitrateKbps: z.number().int().min(32).max(1024).optional(),
|
|
114
|
+
audioCodec: z.enum(["aac", "mp3"]).default("aac")
|
|
115
|
+
}).optional();
|
|
116
|
+
var VideoEditState = z.object({
|
|
117
|
+
clips: z.array(Clip).min(1).max(50),
|
|
118
|
+
audioClips: z.array(AudioClip).max(8).default([]),
|
|
119
|
+
/** 输出画布(=首素材分辨率,偶数);全局 crop/rotation 的"源 dims" */
|
|
120
|
+
canvas: z.object({
|
|
121
|
+
w: z.number().int().min(2).max(4096),
|
|
122
|
+
h: z.number().int().min(2).max(4096)
|
|
123
|
+
}),
|
|
124
|
+
crop: z.object({
|
|
125
|
+
x: z.number().min(0),
|
|
126
|
+
y: z.number().min(0),
|
|
127
|
+
width: z.number().positive(),
|
|
128
|
+
height: z.number().positive()
|
|
129
|
+
}).optional(),
|
|
130
|
+
scale: z.object({
|
|
131
|
+
width: z.number().positive(),
|
|
132
|
+
height: z.number().positive(),
|
|
133
|
+
fit: z.enum(["contain", "cover", "force"])
|
|
134
|
+
}).optional(),
|
|
135
|
+
/** 任意角度(度)。UI = 90° 步进按钮 + ±45° 刻度盘叠加 */
|
|
136
|
+
rotation: z.number().min(-180).max(180).default(0),
|
|
137
|
+
flipX: z.boolean().default(false),
|
|
138
|
+
flipY: z.boolean().default(false),
|
|
139
|
+
filters: z.object({
|
|
140
|
+
brightness: z.number().min(-1).max(1).default(0),
|
|
141
|
+
contrast: z.number().min(-1).max(1).default(0),
|
|
142
|
+
saturation: z.number().min(-1).max(1).default(0),
|
|
143
|
+
temperature: z.number().min(-1).max(1).default(0),
|
|
144
|
+
tint: z.number().min(-1).max(1).default(0),
|
|
145
|
+
vibrance: z.number().min(-1).max(1).default(0),
|
|
146
|
+
gamma: z.number().min(-1).max(1).default(0),
|
|
147
|
+
highlights: z.number().min(-1).max(1).default(0),
|
|
148
|
+
shadows: z.number().min(-1).max(1).default(0),
|
|
149
|
+
whites: z.number().min(-1).max(1).default(0),
|
|
150
|
+
blacks: z.number().min(-1).max(1).default(0),
|
|
151
|
+
lightSense: z.number().min(-1).max(1).default(0),
|
|
152
|
+
sharpen: z.number().min(0).max(1).default(0),
|
|
153
|
+
clarity: z.number().min(0).max(1).default(0),
|
|
154
|
+
grain: z.number().min(0).max(1).default(0),
|
|
155
|
+
fade: z.number().min(0).max(1).default(0),
|
|
156
|
+
vignette: z.number().min(0).max(1).default(0)
|
|
157
|
+
}).default({
|
|
158
|
+
brightness: 0,
|
|
159
|
+
contrast: 0,
|
|
160
|
+
saturation: 0,
|
|
161
|
+
temperature: 0,
|
|
162
|
+
tint: 0,
|
|
163
|
+
vibrance: 0,
|
|
164
|
+
gamma: 0,
|
|
165
|
+
highlights: 0,
|
|
166
|
+
shadows: 0,
|
|
167
|
+
whites: 0,
|
|
168
|
+
blacks: 0,
|
|
169
|
+
lightSense: 0,
|
|
170
|
+
sharpen: 0,
|
|
171
|
+
clarity: 0,
|
|
172
|
+
grain: 0,
|
|
173
|
+
fade: 0,
|
|
174
|
+
vignette: 0
|
|
175
|
+
}),
|
|
176
|
+
/** 预设滤镜 id(见 filters.ts);与 filters 手调叠加 */
|
|
177
|
+
filterPreset: z.string().max(32).optional(),
|
|
178
|
+
overlays: z.array(Overlay).max(200).optional(),
|
|
179
|
+
transitions: z.array(Transition).max(49).default([]),
|
|
180
|
+
/** 原视频声音开关(与音乐混音共存) */
|
|
181
|
+
keepAudio: z.boolean().default(true),
|
|
182
|
+
/** 封面时刻 = 输出时间轴 */
|
|
183
|
+
poster: z.object({ time: z.number().min(0) }).optional(),
|
|
184
|
+
exportSettings: ExportSettings
|
|
185
|
+
}).superRefine((s, ctx) => {
|
|
186
|
+
s.clips.forEach((c, i) => {
|
|
187
|
+
if (c.out <= c.in) {
|
|
188
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: `clips[${i}].out \u5FC5\u987B\u5927\u4E8E in`, path: ["clips", i, "out"] });
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
s.audioClips?.forEach((a, i) => {
|
|
192
|
+
if (a.out <= a.in) {
|
|
193
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: `audioClips[${i}].out \u5FC5\u987B\u5927\u4E8E in`, path: ["audioClips", i, "out"] });
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
if (s.canvas.w % 2 !== 0 || s.canvas.h % 2 !== 0) {
|
|
197
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "canvas \u5BBD\u9AD8\u5FC5\u987B\u4E3A\u5076\u6570", path: ["canvas"] });
|
|
198
|
+
}
|
|
199
|
+
if (s.exportSettings?.width != null && s.exportSettings.width % 2 !== 0) {
|
|
200
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "exportSettings.width \u5FC5\u987B\u4E3A\u5076\u6570", path: ["exportSettings", "width"] });
|
|
201
|
+
}
|
|
202
|
+
if (s.exportSettings?.height != null && s.exportSettings.height % 2 !== 0) {
|
|
203
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "exportSettings.height \u5FC5\u987B\u4E3A\u5076\u6570", path: ["exportSettings", "height"] });
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
function defaultVideoEditState() {
|
|
207
|
+
return {
|
|
208
|
+
clips: [],
|
|
209
|
+
audioClips: [],
|
|
210
|
+
canvas: { w: 2, h: 2 },
|
|
211
|
+
rotation: 0,
|
|
212
|
+
flipX: false,
|
|
213
|
+
flipY: false,
|
|
214
|
+
filters: {
|
|
215
|
+
brightness: 0,
|
|
216
|
+
contrast: 0,
|
|
217
|
+
saturation: 0,
|
|
218
|
+
temperature: 0,
|
|
219
|
+
tint: 0,
|
|
220
|
+
vibrance: 0,
|
|
221
|
+
gamma: 0,
|
|
222
|
+
highlights: 0,
|
|
223
|
+
shadows: 0,
|
|
224
|
+
whites: 0,
|
|
225
|
+
blacks: 0,
|
|
226
|
+
lightSense: 0,
|
|
227
|
+
sharpen: 0,
|
|
228
|
+
clarity: 0,
|
|
229
|
+
grain: 0,
|
|
230
|
+
fade: 0,
|
|
231
|
+
vignette: 0
|
|
232
|
+
},
|
|
233
|
+
transitions: [],
|
|
234
|
+
keepAudio: true
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// src/timeline.ts
|
|
239
|
+
var MIN_CLIP = 0.1;
|
|
240
|
+
function clipDuration(c) {
|
|
241
|
+
return c.out - c.in;
|
|
242
|
+
}
|
|
243
|
+
function totalDuration(clips) {
|
|
244
|
+
return clips.reduce((s, c) => s + clipDuration(c), 0);
|
|
245
|
+
}
|
|
246
|
+
function clipStartsAt(clips, idx) {
|
|
247
|
+
let s = 0;
|
|
248
|
+
for (let i = 0; i < idx && i < clips.length; i++) s += clipDuration(clips[i]);
|
|
249
|
+
return s;
|
|
250
|
+
}
|
|
251
|
+
function locateOutput(clips, t) {
|
|
252
|
+
if (!clips.length || t < 0) return null;
|
|
253
|
+
let acc = 0;
|
|
254
|
+
for (let i = 0; i < clips.length; i++) {
|
|
255
|
+
const d = clipDuration(clips[i]);
|
|
256
|
+
if (t < acc + d) return { idx: i, srcTime: clips[i].in + (t - acc) };
|
|
257
|
+
acc += d;
|
|
258
|
+
}
|
|
259
|
+
if (Math.abs(t - acc) < 1e-9 || t <= acc) {
|
|
260
|
+
const last = clips.length - 1;
|
|
261
|
+
return { idx: last, srcTime: clips[last].out };
|
|
262
|
+
}
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
function splitAtOutput(clips, t) {
|
|
266
|
+
const loc = locateOutput(clips, t);
|
|
267
|
+
if (!loc) return clips;
|
|
268
|
+
const c = clips[loc.idx];
|
|
269
|
+
if (loc.srcTime < c.in + MIN_CLIP || loc.srcTime > c.out - MIN_CLIP) return clips;
|
|
270
|
+
return [
|
|
271
|
+
...clips.slice(0, loc.idx),
|
|
272
|
+
{ ...c, out: loc.srcTime },
|
|
273
|
+
{ ...c, in: loc.srcTime },
|
|
274
|
+
...clips.slice(loc.idx + 1)
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
function removeClip(clips, idx) {
|
|
278
|
+
if (clips.length <= 1 || !clips[idx]) return clips;
|
|
279
|
+
return clips.filter((_, i) => i !== idx);
|
|
280
|
+
}
|
|
281
|
+
function duplicateClip(clips, idx) {
|
|
282
|
+
const c = clips[idx];
|
|
283
|
+
if (!c) return clips;
|
|
284
|
+
return [...clips.slice(0, idx + 1), { ...c }, ...clips.slice(idx + 1)];
|
|
285
|
+
}
|
|
286
|
+
function reorderClips(clips, from, to) {
|
|
287
|
+
if (from === to || !clips[from] || to < 0 || to >= clips.length) return clips;
|
|
288
|
+
const next = [...clips];
|
|
289
|
+
const [moved] = next.splice(from, 1);
|
|
290
|
+
next.splice(to, 0, moved);
|
|
291
|
+
return next;
|
|
292
|
+
}
|
|
293
|
+
function trimClipEdge(clips, idx, edge, srcT, srcDuration) {
|
|
294
|
+
const c = clips[idx];
|
|
295
|
+
if (!c) return clips;
|
|
296
|
+
const next = clips.map((x) => ({ ...x }));
|
|
297
|
+
if (edge === "in") {
|
|
298
|
+
next[idx].in = Math.min(Math.max(srcT, 0), next[idx].out - MIN_CLIP);
|
|
299
|
+
} else {
|
|
300
|
+
next[idx].out = Math.max(Math.min(srcT, srcDuration), next[idx].in + MIN_CLIP);
|
|
301
|
+
}
|
|
302
|
+
return next;
|
|
303
|
+
}
|
|
304
|
+
function clampAudioClip(a, srcDuration, total) {
|
|
305
|
+
const out = Math.max(Math.min(a.out, srcDuration), MIN_CLIP);
|
|
306
|
+
const inn = Math.min(Math.max(a.in, 0), out - MIN_CLIP);
|
|
307
|
+
const startAt = Math.min(Math.max(a.startAt, 0), Math.max(0, total - MIN_CLIP));
|
|
308
|
+
const duration = Math.max(MIN_CLIP, out - inn);
|
|
309
|
+
const speed = Math.min(Math.max(Number(a.speed) || 1, 0.5), 2);
|
|
310
|
+
const track = Number.isInteger(a.track) && a.track >= 0 ? a.track : 0;
|
|
311
|
+
const fadeIn = Math.min(Math.max(Number(a.fadeIn) || 0, 0), duration);
|
|
312
|
+
const fadeOut = Math.min(Math.max(Number(a.fadeOut) || 0, 0), Math.max(0, duration - fadeIn));
|
|
313
|
+
return { ...a, track, in: inn, out, startAt, speed, fadeIn, fadeOut };
|
|
314
|
+
}
|
|
315
|
+
function overlayDurationEnd(overlays = []) {
|
|
316
|
+
return (overlays ?? []).reduce((maxEnd, overlay) => {
|
|
317
|
+
if (overlay?.type !== "text" && overlay?.type !== "sticker") return maxEnd;
|
|
318
|
+
const startAt = Number.isFinite(overlay?.startAt) ? Math.max(0, Number(overlay.startAt)) : 0;
|
|
319
|
+
const endAt = Number.isFinite(overlay?.endAt) ? Math.max(startAt, Number(overlay.endAt)) : startAt;
|
|
320
|
+
return Math.max(maxEnd, endAt);
|
|
321
|
+
}, 0);
|
|
322
|
+
}
|
|
323
|
+
function contentDuration(clips, audioClips = [], overlays = []) {
|
|
324
|
+
const video = totalDuration(clips);
|
|
325
|
+
const audioEnd = audioClips.reduce((m, a) => Math.max(m, a.startAt + (a.out - a.in)), 0);
|
|
326
|
+
const overlayEnd = overlayDurationEnd(overlays);
|
|
327
|
+
return Math.max(video, audioEnd, overlayEnd);
|
|
328
|
+
}
|
|
329
|
+
function usedVideoSrcIndices(clips) {
|
|
330
|
+
return [...new Set(clips.map((c) => c.srcIdx))].sort((x, y) => x - y);
|
|
331
|
+
}
|
|
332
|
+
function remapSrcIndices(clips, used) {
|
|
333
|
+
const map = new Map(used.map((s, i) => [s, i]));
|
|
334
|
+
return clips.map((c) => ({ ...c, srcIdx: map.get(c.srcIdx) ?? 0 }));
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// src/history.ts
|
|
338
|
+
var MAX_DEPTH = 100;
|
|
339
|
+
function createHistory(initial) {
|
|
340
|
+
return { past: [], present: initial, future: [] };
|
|
341
|
+
}
|
|
342
|
+
function pushHistory(h, next) {
|
|
343
|
+
if (next === h.present) return h;
|
|
344
|
+
const past = [...h.past, h.present];
|
|
345
|
+
if (past.length > MAX_DEPTH) past.shift();
|
|
346
|
+
return { past, present: next, future: [] };
|
|
347
|
+
}
|
|
348
|
+
function replacePresent(h, next) {
|
|
349
|
+
if (next === h.present) return h;
|
|
350
|
+
return { ...h, present: next };
|
|
351
|
+
}
|
|
352
|
+
function canUndo(h) {
|
|
353
|
+
return h.past.length > 0;
|
|
354
|
+
}
|
|
355
|
+
function canRedo(h) {
|
|
356
|
+
return h.future.length > 0;
|
|
357
|
+
}
|
|
358
|
+
function undo(h) {
|
|
359
|
+
if (!canUndo(h)) return h;
|
|
360
|
+
const past = h.past.slice(0, -1);
|
|
361
|
+
return { past, present: h.past[h.past.length - 1], future: [h.present, ...h.future] };
|
|
362
|
+
}
|
|
363
|
+
function redo(h) {
|
|
364
|
+
if (!canRedo(h)) return h;
|
|
365
|
+
const [next, ...future] = h.future;
|
|
366
|
+
return { past: [...h.past, h.present], present: next, future };
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export { AudioClip, Clip, MIN_CLIP, Overlay, VideoEditState, canRedo, canUndo, clampAudioClip, clipDuration, clipStartsAt, contentDuration, createHistory, defaultVideoEditState, duplicateClip, locateOutput, pushHistory, redo, remapSrcIndices, removeClip, reorderClips, replacePresent, splitAtOutput, totalDuration, trimClipEdge, undo, usedVideoSrcIndices };
|
|
370
|
+
//# sourceMappingURL=chunk-MGKYVYOH.js.map
|
|
371
|
+
//# sourceMappingURL=chunk-MGKYVYOH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/state.ts","../src/timeline.ts","../src/history.ts"],"names":[],"mappings":"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","file":"chunk-MGKYVYOH.js","sourcesContent":["/**\n * editor-core/state —— 视频编辑状态模型 v2(纯 TS,零框架依赖)\n *\n * SDK 分层约定:本目录(editor-core)是未来 Vue/任意框架适配的共享核心,\n * 只允许纯 TS + zod,禁止 import React/Next/DOM 类型。\n *\n * v2 = 多素材输出时间轴(CapCut 简化版):\n * - clips:视频片段列表,**数组顺序 = 输出拼接顺序**(x 轴是输出时间,不是源时间)。\n * 每个片段 = { srcIdx: 第几个上传的视频文件, in/out: 该源内的时间区间 }。\n * EditState 只存索引引用——File/objectURL 是浏览器运行时的事,不进状态。\n * - audioClips:音乐轨。startAt = 在输出时间轴上的落点;volume 0-2(导出真值,预览钳 1)。\n * - canvas:输出画布 = 第一个素材的分辨率(偶数)。所有片段先 cover 居中裁剪铺满画布,\n * 再统一过全局效果链 —— crop/rotation/outputSize 的「源 dims」一律指 canvas。\n * - 全局效果(crop/scale/rotation/flips/filters/overlays)作用于拼接后的整条输出。\n * - poster.time = 输出时间轴时刻。\n * overlays 坐标存「最终输出空间」,导出时客户端渲染成输出分辨率透明 PNG 烧入。\n */\nimport { z } from 'zod';\n\nconst StrokeCommon = {\n color: z.string().max(32),\n width: z.number().positive().max(200),\n};\nconst RotationCommon = {\n rotation: z.number().min(-180).max(180).optional(),\n};\n\nexport const Overlay = z.discriminatedUnion('type', [\n // 自由画笔:扁平点序列 [x0,y0,x1,y1,...]\n z.object({ type: z.literal('pen'), points: z.array(z.number()).min(4), ...StrokeCommon, ...RotationCommon }),\n z.object({ type: z.literal('line'), x1: z.number(), y1: z.number(), x2: z.number(), y2: z.number(), ...StrokeCommon, ...RotationCommon }),\n z.object({ type: z.literal('arrow'), x1: z.number(), y1: z.number(), x2: z.number(), y2: z.number(), ...StrokeCommon, ...RotationCommon }),\n z.object({ type: z.literal('rect'), x: z.number(), y: z.number(), w: z.number(), h: z.number(), ...StrokeCommon, ...RotationCommon }),\n z.object({ type: z.literal('ellipse'), x: z.number(), y: z.number(), w: z.number(), h: z.number(), ...StrokeCommon, ...RotationCommon }),\n z.object({\n type: z.literal('text'),\n x: z.number(),\n y: z.number(),\n text: z.string().max(500),\n color: z.string().max(32),\n fontSize: z.number().positive().max(512),\n ...RotationCommon,\n }),\n // emoji 字符 或 dataURL 图片二选一\n z.object({\n type: z.literal('sticker'),\n x: z.number(),\n y: z.number(),\n w: z.number().positive(),\n h: z.number().positive(),\n emoji: z.string().max(16).optional(),\n src: z.string().optional(),\n ...RotationCommon,\n }),\n]);\nexport type OverlayT = z.infer<typeof Overlay>;\n\n/** 视频片段:srcIdx 指向上传文件序(服务端交叉校验 < 实际文件数) */\nexport const Clip = z.object({\n srcIdx: z.number().int().min(0).max(7),\n in: z.number().min(0),\n out: z.number().min(0),\n});\nexport type ClipT = z.infer<typeof Clip>;\n\n/** 音乐片段:startAt = 输出时间轴落点;in/out = 音频源内区间 */\nexport const AudioClip = z.object({\n srcIdx: z.number().int().min(0).max(2),\n startAt: z.number().min(0),\n in: z.number().min(0),\n out: z.number().min(0),\n volume: z.number().min(0).max(2),\n});\nexport type AudioClipT = z.infer<typeof AudioClip>;\n\nexport const VideoEditState = z\n .object({\n clips: z.array(Clip).min(1).max(50),\n audioClips: z.array(AudioClip).max(8).default([]),\n /** 输出画布(=首素材分辨率,偶数);全局 crop/rotation 的\"源 dims\" */\n canvas: z.object({\n w: z.number().int().min(2).max(4096),\n h: z.number().int().min(2).max(4096),\n }),\n crop: z\n .object({\n x: z.number().min(0),\n y: z.number().min(0),\n width: z.number().positive(),\n height: z.number().positive(),\n })\n .optional(),\n scale: z\n .object({\n width: z.number().positive(),\n height: z.number().positive(),\n fit: z.enum(['contain', 'cover', 'force']),\n })\n .optional(),\n /** 任意角度(度)。UI = 90° 步进按钮 + ±45° 刻度盘叠加 */\n rotation: z.number().min(-180).max(180).default(0),\n flipX: z.boolean().default(false),\n flipY: z.boolean().default(false),\n filters: z\n .object({\n brightness: z.number().min(-1).max(1),\n contrast: z.number().min(-1).max(1),\n saturation: z.number().min(-1).max(1),\n gamma: z.number().min(-1).max(1).default(0),\n })\n .default({ brightness: 0, contrast: 0, saturation: 0, gamma: 0 }),\n /** 预设滤镜 id(见 filters.ts);与 filters 手调叠加 */\n filterPreset: z.string().max(32).optional(),\n overlays: z.array(Overlay).max(200).optional(),\n /** 原视频声音开关(与音乐混音共存) */\n keepAudio: z.boolean().default(true),\n /** 封面时刻 = 输出时间轴 */\n poster: z.object({ time: z.number().min(0) }).optional(),\n })\n .superRefine((s, ctx) => {\n // 同源可多次引用(复制语义),唯一硬约束 out > in;画布偶数(h264)\n s.clips.forEach((c, i) => {\n if (c.out <= c.in) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: `clips[${i}].out 必须大于 in`, path: ['clips', i, 'out'] });\n }\n });\n s.audioClips?.forEach((a, i) => {\n if (a.out <= a.in) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: `audioClips[${i}].out 必须大于 in`, path: ['audioClips', i, 'out'] });\n }\n });\n if (s.canvas.w % 2 !== 0 || s.canvas.h % 2 !== 0) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'canvas 宽高必须为偶数', path: ['canvas'] });\n }\n });\n\nexport type VideoEditStateT = z.infer<typeof VideoEditState>;\n\n/**\n * 客户端初始占位:首个素材 metadata 加载前 clips 为空、canvas 为最小值,\n * **不过 schema**(clips min1)——服务端只收显式提交的完整状态,不受影响;\n * 首源加载完成后编辑器会用真实 clips/canvas 重建 history。\n */\nexport function defaultVideoEditState(): VideoEditStateT {\n return {\n clips: [],\n audioClips: [],\n canvas: { w: 2, h: 2 },\n rotation: 0,\n flipX: false,\n flipY: false,\n filters: { brightness: 0, contrast: 0, saturation: 0, gamma: 0 },\n keepAudio: true,\n };\n}\n","/**\n * editor-core/timeline v2 —— 输出时间轴纯函数(多素材 clips/audioClips 操作)。\n * 从 UI 抽出,Vue/React 壳共用;全部不可变(返回新数组)。\n *\n * 模型:clips 数组顺序 = 输出拼接顺序;输出时间轴 x = Σ前序片段时长。\n * 所有 \"t\" 参数除特别说明外都是**输出时间**;trimClipEdge 的 srcT 是源时间。\n */\nimport type { ClipT, AudioClipT } from './state';\n\nexport const MIN_CLIP = 0.1; // 片段最短时长(秒)\n\n/** 片段时长 */\nexport function clipDuration(c: ClipT): number {\n return c.out - c.in;\n}\n\n/** 输出总时长 */\nexport function totalDuration(clips: ClipT[]): number {\n return clips.reduce((s, c) => s + clipDuration(c), 0);\n}\n\n/** 第 idx 个片段在输出时间轴上的起点(前缀和) */\nexport function clipStartsAt(clips: ClipT[], idx: number): number {\n let s = 0;\n for (let i = 0; i < idx && i < clips.length; i++) s += clipDuration(clips[i]);\n return s;\n}\n\n/**\n * 输出时间 t → 所属片段与源内时刻。\n * 交界时刻归后段(前段已播完);t === total 归末段(srcTime = out);\n * t 越界或 clips 为空返回 null。\n */\nexport function locateOutput(clips: ClipT[], t: number): { idx: number; srcTime: number } | null {\n if (!clips.length || t < 0) return null;\n let acc = 0;\n for (let i = 0; i < clips.length; i++) {\n const d = clipDuration(clips[i]);\n if (t < acc + d) return { idx: i, srcTime: clips[i].in + (t - acc) };\n acc += d;\n }\n // 恰好等于总时长 → 末段终点(播放头停在结尾的合法位置)\n if (Math.abs(t - acc) < 1e-9 || t <= acc) {\n const last = clips.length - 1;\n return { idx: last, srcTime: clips[last].out };\n }\n return null;\n}\n\n/** 在输出时刻 t 处把所属片段一分为二;距两端 <MIN_CLIP 返回原数组 */\nexport function splitAtOutput(clips: ClipT[], t: number): ClipT[] {\n const loc = locateOutput(clips, t);\n if (!loc) return clips;\n const c = clips[loc.idx];\n if (loc.srcTime < c.in + MIN_CLIP || loc.srcTime > c.out - MIN_CLIP) return clips;\n return [\n ...clips.slice(0, loc.idx),\n { ...c, out: loc.srcTime },\n { ...c, in: loc.srcTime },\n ...clips.slice(loc.idx + 1),\n ];\n}\n\n/** 删除第 idx 个片段;只剩一段时不可删,返回原数组 */\nexport function removeClip(clips: ClipT[], idx: number): ClipT[] {\n if (clips.length <= 1 || !clips[idx]) return clips;\n return clips.filter((_, i) => i !== idx);\n}\n\n/** 复制第 idx 个片段,插到原段之后 */\nexport function duplicateClip(clips: ClipT[], idx: number): ClipT[] {\n const c = clips[idx];\n if (!c) return clips;\n return [...clips.slice(0, idx + 1), { ...c }, ...clips.slice(idx + 1)];\n}\n\n/** 拖拽重排:把第 from 段移动到第 to 位 */\nexport function reorderClips(clips: ClipT[], from: number, to: number): ClipT[] {\n if (from === to || !clips[from] || to < 0 || to >= clips.length) return clips;\n const next = [...clips];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n}\n\n/**\n * 拖片段把手:把第 idx 段的 in/out 改到源时刻 srcT。\n * in 钳 [0, out-MIN_CLIP];out 钳 [in+MIN_CLIP, srcDuration]。\n */\nexport function trimClipEdge(\n clips: ClipT[],\n idx: number,\n edge: 'in' | 'out',\n srcT: number,\n srcDuration: number\n): ClipT[] {\n const c = clips[idx];\n if (!c) return clips;\n const next = clips.map((x) => ({ ...x }));\n if (edge === 'in') {\n next[idx].in = Math.min(Math.max(srcT, 0), next[idx].out - MIN_CLIP);\n } else {\n next[idx].out = Math.max(Math.min(srcT, srcDuration), next[idx].in + MIN_CLIP);\n }\n return next;\n}\n\n/**\n * 音乐片段钳制:in/out 在源时长内且 out-in≥MIN_CLIP;\n * startAt ∈ [0, max(0, total-MIN_CLIP)] —— 允许尾部悬出输出末尾(导出 amix duration=first 截断)。\n */\nexport function clampAudioClip(a: AudioClipT, srcDuration: number, total: number): AudioClipT {\n const out = Math.max(Math.min(a.out, srcDuration), MIN_CLIP);\n const inn = Math.min(Math.max(a.in, 0), out - MIN_CLIP);\n const startAt = Math.min(Math.max(a.startAt, 0), Math.max(0, total - MIN_CLIP));\n return { ...a, in: inn, out, startAt };\n}\n\n/**\n * 时间轴内容时长 = max(视频总长, 音乐悬出末端)。\n * 用于内容宽度/适应缩放/标尺——音乐尾部悬出视频末尾时也要看得见;\n * 播放头/seek 仍以视频总长为界(导出 amix duration=first 同语义)。\n */\nexport function contentDuration(clips: ClipT[], audioClips: AudioClipT[] = []): number {\n const video = totalDuration(clips);\n const audioEnd = audioClips.reduce((m, a) => Math.max(m, a.startAt + (a.out - a.in)), 0);\n return Math.max(video, audioEnd);\n}\n\n/** clips 实际引用到的视频源序号(升序去重)——导出前压缩上传用 */\nexport function usedVideoSrcIndices(clips: ClipT[]): number[] {\n return [...new Set(clips.map((c) => c.srcIdx))].sort((x, y) => x - y);\n}\n\n/** 把 clips 的 srcIdx 重映射为 used 中的序号(与压缩后的上传文件序对齐) */\nexport function remapSrcIndices(clips: ClipT[], used: number[]): ClipT[] {\n const map = new Map(used.map((s, i) => [s, i]));\n return clips.map((c) => ({ ...c, srcIdx: map.get(c.srcIdx) ?? 0 }));\n}\n","/**\n * editor-core/history —— 不可变快照 undo/redo 栈(纯函数)。\n * 泛型,对 EditState 的 JSON 快照工作;壳层(React/Vue)只持有 History<T> 并 set 回去。\n */\n\nexport interface History<T> {\n past: T[];\n present: T;\n future: T[];\n}\n\nconst MAX_DEPTH = 100;\n\nexport function createHistory<T>(initial: T): History<T> {\n return { past: [], present: initial, future: [] };\n}\n\n/** 写入新状态(清空 redo 栈);浅比较相同引用则原样返回 */\nexport function pushHistory<T>(h: History<T>, next: T): History<T> {\n if (next === h.present) return h;\n const past = [...h.past, h.present];\n if (past.length > MAX_DEPTH) past.shift();\n return { past, present: next, future: [] };\n}\n\n/**\n * 替换当前态但不入栈(高频拖拽的中间帧用):\n * 拖动过程 replacePresent 持续刷新,pointerup 时再 pushHistory 定格一步。\n */\nexport function replacePresent<T>(h: History<T>, next: T): History<T> {\n if (next === h.present) return h;\n return { ...h, present: next };\n}\n\nexport function canUndo<T>(h: History<T>): boolean {\n return h.past.length > 0;\n}\n\nexport function canRedo<T>(h: History<T>): boolean {\n return h.future.length > 0;\n}\n\nexport function undo<T>(h: History<T>): History<T> {\n if (!canUndo(h)) return h;\n const past = h.past.slice(0, -1);\n return { past, present: h.past[h.past.length - 1], future: [h.present, ...h.future] };\n}\n\nexport function redo<T>(h: History<T>): History<T> {\n if (!canRedo(h)) return h;\n const [next, ...future] = h.future;\n return { past: [...h.past, h.present], present: next, future };\n}\n"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// src/transform.ts
|
|
2
|
+
var DEG2RAD = Math.PI / 180;
|
|
3
|
+
function rotatedSize(w, h, deg) {
|
|
4
|
+
const norm = normalizeDeg(deg);
|
|
5
|
+
if (norm === 0 || norm === 180) return { w, h };
|
|
6
|
+
if (norm === 90 || norm === 270) return { w: h, h: w };
|
|
7
|
+
const rad = norm * DEG2RAD;
|
|
8
|
+
return {
|
|
9
|
+
w: Math.round(Math.abs(w * Math.cos(rad)) + Math.abs(h * Math.sin(rad))),
|
|
10
|
+
h: Math.round(Math.abs(w * Math.sin(rad)) + Math.abs(h * Math.cos(rad)))
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function normalizeDeg(deg) {
|
|
14
|
+
return (deg % 360 + 360) % 360;
|
|
15
|
+
}
|
|
16
|
+
function evenize(n) {
|
|
17
|
+
const v = Math.round(n);
|
|
18
|
+
return v - v % 2;
|
|
19
|
+
}
|
|
20
|
+
function clampRect(rect, bounds, minSize = 40) {
|
|
21
|
+
const width = Math.min(Math.max(minSize, rect.width), bounds.w);
|
|
22
|
+
const height = Math.min(Math.max(minSize, rect.height), bounds.h);
|
|
23
|
+
const x = Math.min(Math.max(0, rect.x), bounds.w - width);
|
|
24
|
+
const y = Math.min(Math.max(0, rect.y), bounds.h - height);
|
|
25
|
+
return { x: Math.round(x), y: Math.round(y), width: Math.round(width), height: Math.round(height) };
|
|
26
|
+
}
|
|
27
|
+
function centeredMaxRect(bounds, aspect) {
|
|
28
|
+
let width = bounds.w;
|
|
29
|
+
let height = width / aspect;
|
|
30
|
+
if (height > bounds.h) {
|
|
31
|
+
height = bounds.h;
|
|
32
|
+
width = height * aspect;
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
x: Math.round((bounds.w - width) / 2),
|
|
36
|
+
y: Math.round((bounds.h - height) / 2),
|
|
37
|
+
width: Math.round(width),
|
|
38
|
+
height: Math.round(height)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function fitRects(crop, out, fit) {
|
|
42
|
+
const fullSrc = { x: 0, y: 0, width: crop.width, height: crop.height };
|
|
43
|
+
const fullDst = { x: 0, y: 0, width: out.w, height: out.h };
|
|
44
|
+
if (fit === "cover") {
|
|
45
|
+
return { src: centeredMaxRect({ w: crop.width, h: crop.height }, out.w / out.h), dst: fullDst };
|
|
46
|
+
}
|
|
47
|
+
if (fit === "contain") {
|
|
48
|
+
return { src: fullSrc, dst: centeredMaxRect({ w: out.w, h: out.h }, crop.width / crop.height) };
|
|
49
|
+
}
|
|
50
|
+
return { src: fullSrc, dst: fullDst };
|
|
51
|
+
}
|
|
52
|
+
function outputSize(source, state) {
|
|
53
|
+
if (state.scale) return { w: evenize(state.scale.width), h: evenize(state.scale.height) };
|
|
54
|
+
if (state.crop) return { w: evenize(state.crop.width), h: evenize(state.crop.height) };
|
|
55
|
+
const r = rotatedSize(source.w, source.h, state.rotation);
|
|
56
|
+
return { w: evenize(r.w), h: evenize(r.h) };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// src/filters.ts
|
|
60
|
+
var FILTER_PRESETS = [
|
|
61
|
+
{ id: "bw", label: "\u9ED1\u767D", vf: "hue=s=0", css: "grayscale(1)" },
|
|
62
|
+
{
|
|
63
|
+
id: "sepia",
|
|
64
|
+
label: "\u590D\u53E4",
|
|
65
|
+
vf: "colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131",
|
|
66
|
+
css: "sepia(0.85)"
|
|
67
|
+
},
|
|
68
|
+
{ id: "warm", label: "\u6696\u9633", vf: "colorbalance=rs=.15:gs=.04:bs=-.15", css: "sepia(0.25) saturate(1.25) brightness(1.03)" },
|
|
69
|
+
{ id: "cool", label: "\u51B7\u8C03", vf: "colorbalance=rs=-.14:bs=.16", css: "hue-rotate(12deg) saturate(0.95) brightness(1.02)" },
|
|
70
|
+
{ id: "vivid", label: "\u9C9C\u8273", vf: "eq=saturation=1.45:contrast=1.08", css: "saturate(1.45) contrast(1.08)" }
|
|
71
|
+
];
|
|
72
|
+
function findFilterPreset(id) {
|
|
73
|
+
return id ? FILTER_PRESETS.find((p) => p.id === id) : void 0;
|
|
74
|
+
}
|
|
75
|
+
function buildFilterCss(filters, presetId) {
|
|
76
|
+
const presetCss = findFilterPreset(presetId)?.css ?? "";
|
|
77
|
+
return [
|
|
78
|
+
`brightness(${1 + filters.brightness})`,
|
|
79
|
+
`contrast(${1 + filters.contrast})`,
|
|
80
|
+
`saturate(${1 + filters.saturation})`,
|
|
81
|
+
presetCss
|
|
82
|
+
].filter(Boolean).join(" ");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { DEG2RAD, FILTER_PRESETS, buildFilterCss, centeredMaxRect, clampRect, evenize, findFilterPreset, fitRects, normalizeDeg, outputSize, rotatedSize };
|
|
86
|
+
//# sourceMappingURL=chunk-USY6UDGL.js.map
|
|
87
|
+
//# sourceMappingURL=chunk-USY6UDGL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transform.ts","../src/filters.ts"],"names":[],"mappings":"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","file":"chunk-USY6UDGL.js","sourcesContent":["/**\n * editor-core/transform —— 旋转/坐标换算纯函数。\n * 与 ffmpeg 的 rotw/roth 同公式,保证预览画布与导出尺寸一致。\n */\n\nexport const DEG2RAD = Math.PI / 180;\n\n/** 旋转 deg 度后的外接框尺寸(= ffmpeg rotate 滤镜 ow=rotw/oh=roth) */\nexport function rotatedSize(w: number, h: number, deg: number): { w: number; h: number } {\n const norm = normalizeDeg(deg);\n // 90 倍数精确交换,避免浮点\n if (norm === 0 || norm === 180) return { w, h };\n if (norm === 90 || norm === 270) return { w: h, h: w };\n const rad = norm * DEG2RAD;\n return {\n w: Math.round(Math.abs(w * Math.cos(rad)) + Math.abs(h * Math.sin(rad))),\n h: Math.round(Math.abs(w * Math.sin(rad)) + Math.abs(h * Math.cos(rad))),\n };\n}\n\n/** 角度归一化到 [0,360) */\nexport function normalizeDeg(deg: number): number {\n return ((deg % 360) + 360) % 360;\n}\n\n/** h264 偶数像素对齐 */\nexport function evenize(n: number): number {\n const v = Math.round(n);\n return v - (v % 2);\n}\n\n/** 把 rect 钳制在 bounds 内(裁剪框拖拽用) */\nexport function clampRect(\n rect: { x: number; y: number; width: number; height: number },\n bounds: { w: number; h: number },\n minSize = 40\n): { x: number; y: number; width: number; height: number } {\n const width = Math.min(Math.max(minSize, rect.width), bounds.w);\n const height = Math.min(Math.max(minSize, rect.height), bounds.h);\n const x = Math.min(Math.max(0, rect.x), bounds.w - width);\n const y = Math.min(Math.max(0, rect.y), bounds.h - height);\n return { x: Math.round(x), y: Math.round(y), width: Math.round(width), height: Math.round(height) };\n}\n\n/** 给定纵横比,在 bounds 内求居中最大 rect(比例预设落框用) */\nexport function centeredMaxRect(\n bounds: { w: number; h: number },\n aspect: number\n): { x: number; y: number; width: number; height: number } {\n let width = bounds.w;\n let height = width / aspect;\n if (height > bounds.h) {\n height = bounds.h;\n width = height * aspect;\n }\n return {\n x: Math.round((bounds.w - width) / 2),\n y: Math.round((bounds.h - height) / 2),\n width: Math.round(width),\n height: Math.round(height),\n };\n}\n\nexport type FitMode = 'cover' | 'contain' | 'force';\n\n/**\n * scale 的 fit 语义 → 源/目标矩形对(预览画布与 ffmpeg 严格同语义):\n * - cover:源侧取目标比例的居中最大区(= ffmpeg scale:force_original_aspect_ratio=increase + 居中 crop),不变形\n * - contain:目标侧居中留黑边(= ffmpeg scale:decrease + pad)\n * - force:双全幅拉伸(= ffmpeg scale=W:H)\n * src 坐标相对 crop 区原点;dst 坐标相对输出原点。\n */\nexport function fitRects(\n crop: { width: number; height: number },\n out: { w: number; h: number },\n fit: FitMode\n): {\n src: { x: number; y: number; width: number; height: number };\n dst: { x: number; y: number; width: number; height: number };\n} {\n const fullSrc = { x: 0, y: 0, width: crop.width, height: crop.height };\n const fullDst = { x: 0, y: 0, width: out.w, height: out.h };\n if (fit === 'cover') {\n return { src: centeredMaxRect({ w: crop.width, h: crop.height }, out.w / out.h), dst: fullDst };\n }\n if (fit === 'contain') {\n return { src: fullSrc, dst: centeredMaxRect({ w: out.w, h: out.h }, crop.width / crop.height) };\n }\n return { src: fullSrc, dst: fullDst };\n}\n\n/** 导出产物的最终输出尺寸(决定 overlay PNG 的分辨率) */\nexport function outputSize(\n source: { w: number; h: number },\n state: {\n rotation: number;\n crop?: { width: number; height: number } | undefined;\n scale?: { width: number; height: number } | undefined;\n }\n): { w: number; h: number } {\n if (state.scale) return { w: evenize(state.scale.width), h: evenize(state.scale.height) };\n if (state.crop) return { w: evenize(state.crop.width), h: evenize(state.crop.height) };\n const r = rotatedSize(source.w, source.h, state.rotation);\n return { w: evenize(r.w), h: evenize(r.h) };\n}\n","/**\n * editor-core/filters —— 预设滤镜表(数据驱动)。\n * vf = ffmpeg 滤镜片段(导出真值);css = 浏览器预览近似。\n * 全部使用 ffmpeg-static 6.x 标配滤镜(hue/eq/colorbalance/colorchannelmixer)。\n */\n\nexport interface FilterPreset {\n id: string;\n label: string;\n vf: string;\n css: string;\n}\n\nexport const FILTER_PRESETS: FilterPreset[] = [\n { id: 'bw', label: '黑白', vf: 'hue=s=0', css: 'grayscale(1)' },\n {\n id: 'sepia',\n label: '复古',\n vf: 'colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131',\n css: 'sepia(0.85)',\n },\n { id: 'warm', label: '暖阳', vf: 'colorbalance=rs=.15:gs=.04:bs=-.15', css: 'sepia(0.25) saturate(1.25) brightness(1.03)' },\n { id: 'cool', label: '冷调', vf: 'colorbalance=rs=-.14:bs=.16', css: 'hue-rotate(12deg) saturate(0.95) brightness(1.02)' },\n { id: 'vivid', label: '鲜艳', vf: 'eq=saturation=1.45:contrast=1.08', css: 'saturate(1.45) contrast(1.08)' },\n];\n\nexport function findFilterPreset(id: string | undefined): FilterPreset | undefined {\n return id ? FILTER_PRESETS.find((p) => p.id === id) : undefined;\n}\n\n/**\n * 拼出 canvas/CSS 用的 filter 字符串(预览与帧合成共用)。\n * brightness/contrast/saturation 来自手调 [-1,1] → 1+v;叠加预设 css。\n * gamma 无 CSS 等价(仅 ffmpeg 导出生效),此处不含。\n */\nexport function buildFilterCss(\n filters: { brightness: number; contrast: number; saturation: number },\n presetId?: string,\n): string {\n const presetCss = findFilterPreset(presetId)?.css ?? '';\n return [\n `brightness(${1 + filters.brightness})`,\n `contrast(${1 + filters.contrast})`,\n `saturate(${1 + filters.saturation})`,\n presetCss,\n ]\n .filter(Boolean)\n .join(' ');\n}\n"]}
|