@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.
Files changed (434) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/index.cjs +282 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +54 -0
  6. package/dist/index.d.ts +54 -0
  7. package/dist/index.js +240 -0
  8. package/dist/index.js.map +1 -0
  9. package/filerobot.css +1669 -0
  10. package/node_modules/@media-editor/client/LICENSE +21 -0
  11. package/node_modules/@media-editor/client/README.md +27 -0
  12. package/node_modules/@media-editor/client/dist/index.cjs +60 -0
  13. package/node_modules/@media-editor/client/dist/index.cjs.map +1 -0
  14. package/node_modules/@media-editor/client/dist/index.d.cts +24 -0
  15. package/node_modules/@media-editor/client/dist/index.d.ts +24 -0
  16. package/node_modules/@media-editor/client/dist/index.js +35 -0
  17. package/node_modules/@media-editor/client/dist/index.js.map +1 -0
  18. package/node_modules/@media-editor/client/package.json +23 -0
  19. package/node_modules/@media-editor/core/LICENSE +21 -0
  20. package/node_modules/@media-editor/core/README.md +14 -0
  21. package/node_modules/@media-editor/core/dist/browser.cjs +505 -0
  22. package/node_modules/@media-editor/core/dist/browser.cjs.map +1 -0
  23. package/node_modules/@media-editor/core/dist/browser.d.cts +100 -0
  24. package/node_modules/@media-editor/core/dist/browser.d.ts +100 -0
  25. package/node_modules/@media-editor/core/dist/browser.js +883 -0
  26. package/node_modules/@media-editor/core/dist/browser.js.map +1 -0
  27. package/node_modules/@media-editor/core/dist/chunk-MGKYVYOH.js +371 -0
  28. package/node_modules/@media-editor/core/dist/chunk-MGKYVYOH.js.map +1 -0
  29. package/node_modules/@media-editor/core/dist/chunk-USY6UDGL.js +87 -0
  30. package/node_modules/@media-editor/core/dist/chunk-USY6UDGL.js.map +1 -0
  31. package/node_modules/@media-editor/core/dist/chunk-XCBM7P7N.js +592 -0
  32. package/node_modules/@media-editor/core/dist/chunk-XCBM7P7N.js.map +1 -0
  33. package/node_modules/@media-editor/core/dist/engine.cjs +540 -0
  34. package/node_modules/@media-editor/core/dist/engine.cjs.map +1 -0
  35. package/node_modules/@media-editor/core/dist/engine.d.cts +325 -0
  36. package/node_modules/@media-editor/core/dist/engine.d.ts +359 -0
  37. package/node_modules/@media-editor/core/dist/engine.js +315 -0
  38. package/node_modules/@media-editor/core/dist/engine.js.map +1 -0
  39. package/node_modules/@media-editor/core/dist/filerobot.cjs +818 -0
  40. package/node_modules/@media-editor/core/dist/filerobot.cjs.map +1 -0
  41. package/node_modules/@media-editor/core/dist/filerobot.d.cts +88 -0
  42. package/node_modules/@media-editor/core/dist/filerobot.d.ts +88 -0
  43. package/node_modules/@media-editor/core/dist/filerobot.js +473 -0
  44. package/node_modules/@media-editor/core/dist/filerobot.js.map +1 -0
  45. package/node_modules/@media-editor/core/dist/index.cjs +1276 -0
  46. package/node_modules/@media-editor/core/dist/index.cjs.map +1 -0
  47. package/node_modules/@media-editor/core/dist/index.d.cts +242 -0
  48. package/node_modules/@media-editor/core/dist/index.d.ts +264 -0
  49. package/node_modules/@media-editor/core/dist/index.js +682 -0
  50. package/node_modules/@media-editor/core/dist/index.js.map +1 -0
  51. package/node_modules/@media-editor/core/dist/platform-presets-B-o4C6uY.d.cts +80 -0
  52. package/node_modules/@media-editor/core/dist/platform-presets-B-o4C6uY.d.ts +80 -0
  53. package/node_modules/@media-editor/core/dist/state-B85vkf7_.d.cts +936 -0
  54. package/node_modules/@media-editor/core/dist/state-B85vkf7_.d.ts +1027 -0
  55. package/node_modules/@media-editor/core/node_modules/zod/LICENSE +21 -0
  56. package/node_modules/@media-editor/core/node_modules/zod/README.md +208 -0
  57. package/node_modules/@media-editor/core/node_modules/zod/index.cjs +33 -0
  58. package/node_modules/@media-editor/core/node_modules/zod/index.d.cts +4 -0
  59. package/node_modules/@media-editor/core/node_modules/zod/index.d.ts +4 -0
  60. package/node_modules/@media-editor/core/node_modules/zod/index.js +4 -0
  61. package/node_modules/@media-editor/core/node_modules/zod/package.json +118 -0
  62. package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.cjs +138 -0
  63. package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.d.cts +164 -0
  64. package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.d.ts +164 -0
  65. package/node_modules/@media-editor/core/node_modules/zod/v3/ZodError.js +133 -0
  66. package/node_modules/@media-editor/core/node_modules/zod/v3/errors.cjs +17 -0
  67. package/node_modules/@media-editor/core/node_modules/zod/v3/errors.d.cts +5 -0
  68. package/node_modules/@media-editor/core/node_modules/zod/v3/errors.d.ts +5 -0
  69. package/node_modules/@media-editor/core/node_modules/zod/v3/errors.js +9 -0
  70. package/node_modules/@media-editor/core/node_modules/zod/v3/external.cjs +22 -0
  71. package/node_modules/@media-editor/core/node_modules/zod/v3/external.d.cts +6 -0
  72. package/node_modules/@media-editor/core/node_modules/zod/v3/external.d.ts +6 -0
  73. package/node_modules/@media-editor/core/node_modules/zod/v3/external.js +6 -0
  74. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
  75. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
  76. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
  77. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/enumUtil.js +1 -0
  78. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
  79. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
  80. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
  81. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/errorUtil.js +6 -0
  82. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
  83. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
  84. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
  85. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/parseUtil.js +109 -0
  86. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
  87. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
  88. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
  89. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/partialUtil.js +1 -0
  90. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
  91. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
  92. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
  93. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/typeAliases.js +1 -0
  94. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.cjs +137 -0
  95. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.d.cts +85 -0
  96. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.d.ts +85 -0
  97. package/node_modules/@media-editor/core/node_modules/zod/v3/helpers/util.js +133 -0
  98. package/node_modules/@media-editor/core/node_modules/zod/v3/index.cjs +33 -0
  99. package/node_modules/@media-editor/core/node_modules/zod/v3/index.d.cts +4 -0
  100. package/node_modules/@media-editor/core/node_modules/zod/v3/index.d.ts +4 -0
  101. package/node_modules/@media-editor/core/node_modules/zod/v3/index.js +4 -0
  102. package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.cjs +111 -0
  103. package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.d.cts +3 -0
  104. package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.d.ts +3 -0
  105. package/node_modules/@media-editor/core/node_modules/zod/v3/locales/en.js +109 -0
  106. package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.cjs +2 -0
  107. package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.d.cts +102 -0
  108. package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.d.ts +102 -0
  109. package/node_modules/@media-editor/core/node_modules/zod/v3/standard-schema.js +1 -0
  110. package/node_modules/@media-editor/core/node_modules/zod/v3/types.cjs +3775 -0
  111. package/node_modules/@media-editor/core/node_modules/zod/v3/types.d.cts +1031 -0
  112. package/node_modules/@media-editor/core/node_modules/zod/v3/types.d.ts +1031 -0
  113. package/node_modules/@media-editor/core/node_modules/zod/v3/types.js +3693 -0
  114. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/checks.cjs +32 -0
  115. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/checks.d.cts +1 -0
  116. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/checks.d.ts +1 -0
  117. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/checks.js +1 -0
  118. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/coerce.cjs +47 -0
  119. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/coerce.d.cts +17 -0
  120. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/coerce.d.ts +17 -0
  121. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/coerce.js +17 -0
  122. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/compat.cjs +57 -0
  123. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/compat.d.cts +46 -0
  124. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/compat.d.ts +46 -0
  125. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/compat.js +27 -0
  126. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/errors.cjs +67 -0
  127. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/errors.d.cts +30 -0
  128. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/errors.d.ts +30 -0
  129. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/errors.js +41 -0
  130. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/external.cjs +70 -0
  131. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/external.d.cts +13 -0
  132. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/external.d.ts +13 -0
  133. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/external.js +18 -0
  134. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/index.cjs +33 -0
  135. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/index.d.cts +4 -0
  136. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/index.d.ts +4 -0
  137. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/index.js +4 -0
  138. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/iso.cjs +60 -0
  139. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/iso.d.cts +22 -0
  140. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/iso.d.ts +22 -0
  141. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/iso.js +30 -0
  142. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/parse.cjs +32 -0
  143. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/parse.d.cts +23 -0
  144. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/parse.d.ts +23 -0
  145. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/parse.js +6 -0
  146. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/schemas.cjs +1109 -0
  147. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/schemas.d.cts +630 -0
  148. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/schemas.d.ts +630 -0
  149. package/node_modules/@media-editor/core/node_modules/zod/v4/classic/schemas.js +1006 -0
  150. package/node_modules/@media-editor/core/node_modules/zod/v4/core/api.cjs +1039 -0
  151. package/node_modules/@media-editor/core/node_modules/zod/v4/core/api.d.cts +284 -0
  152. package/node_modules/@media-editor/core/node_modules/zod/v4/core/api.d.ts +284 -0
  153. package/node_modules/@media-editor/core/node_modules/zod/v4/core/api.js +906 -0
  154. package/node_modules/@media-editor/core/node_modules/zod/v4/core/checks.cjs +591 -0
  155. package/node_modules/@media-editor/core/node_modules/zod/v4/core/checks.d.cts +278 -0
  156. package/node_modules/@media-editor/core/node_modules/zod/v4/core/checks.d.ts +278 -0
  157. package/node_modules/@media-editor/core/node_modules/zod/v4/core/checks.js +565 -0
  158. package/node_modules/@media-editor/core/node_modules/zod/v4/core/core.cjs +67 -0
  159. package/node_modules/@media-editor/core/node_modules/zod/v4/core/core.d.cts +49 -0
  160. package/node_modules/@media-editor/core/node_modules/zod/v4/core/core.d.ts +49 -0
  161. package/node_modules/@media-editor/core/node_modules/zod/v4/core/core.js +61 -0
  162. package/node_modules/@media-editor/core/node_modules/zod/v4/core/doc.cjs +39 -0
  163. package/node_modules/@media-editor/core/node_modules/zod/v4/core/doc.d.cts +14 -0
  164. package/node_modules/@media-editor/core/node_modules/zod/v4/core/doc.d.ts +14 -0
  165. package/node_modules/@media-editor/core/node_modules/zod/v4/core/doc.js +35 -0
  166. package/node_modules/@media-editor/core/node_modules/zod/v4/core/errors.cjs +226 -0
  167. package/node_modules/@media-editor/core/node_modules/zod/v4/core/errors.d.cts +208 -0
  168. package/node_modules/@media-editor/core/node_modules/zod/v4/core/errors.d.ts +208 -0
  169. package/node_modules/@media-editor/core/node_modules/zod/v4/core/errors.js +195 -0
  170. package/node_modules/@media-editor/core/node_modules/zod/v4/core/function.cjs +102 -0
  171. package/node_modules/@media-editor/core/node_modules/zod/v4/core/function.d.cts +52 -0
  172. package/node_modules/@media-editor/core/node_modules/zod/v4/core/function.d.ts +52 -0
  173. package/node_modules/@media-editor/core/node_modules/zod/v4/core/function.js +75 -0
  174. package/node_modules/@media-editor/core/node_modules/zod/v4/core/index.cjs +44 -0
  175. package/node_modules/@media-editor/core/node_modules/zod/v4/core/index.d.cts +15 -0
  176. package/node_modules/@media-editor/core/node_modules/zod/v4/core/index.d.ts +15 -0
  177. package/node_modules/@media-editor/core/node_modules/zod/v4/core/index.js +15 -0
  178. package/node_modules/@media-editor/core/node_modules/zod/v4/core/json-schema.cjs +2 -0
  179. package/node_modules/@media-editor/core/node_modules/zod/v4/core/json-schema.d.cts +87 -0
  180. package/node_modules/@media-editor/core/node_modules/zod/v4/core/json-schema.d.ts +87 -0
  181. package/node_modules/@media-editor/core/node_modules/zod/v4/core/json-schema.js +1 -0
  182. package/node_modules/@media-editor/core/node_modules/zod/v4/core/parse.cjs +87 -0
  183. package/node_modules/@media-editor/core/node_modules/zod/v4/core/parse.d.cts +25 -0
  184. package/node_modules/@media-editor/core/node_modules/zod/v4/core/parse.d.ts +25 -0
  185. package/node_modules/@media-editor/core/node_modules/zod/v4/core/parse.js +57 -0
  186. package/node_modules/@media-editor/core/node_modules/zod/v4/core/regexes.cjs +103 -0
  187. package/node_modules/@media-editor/core/node_modules/zod/v4/core/regexes.d.cts +62 -0
  188. package/node_modules/@media-editor/core/node_modules/zod/v4/core/regexes.d.ts +62 -0
  189. package/node_modules/@media-editor/core/node_modules/zod/v4/core/regexes.js +95 -0
  190. package/node_modules/@media-editor/core/node_modules/zod/v4/core/registries.cjs +56 -0
  191. package/node_modules/@media-editor/core/node_modules/zod/v4/core/registries.d.cts +35 -0
  192. package/node_modules/@media-editor/core/node_modules/zod/v4/core/registries.d.ts +35 -0
  193. package/node_modules/@media-editor/core/node_modules/zod/v4/core/registries.js +51 -0
  194. package/node_modules/@media-editor/core/node_modules/zod/v4/core/schemas.cjs +1748 -0
  195. package/node_modules/@media-editor/core/node_modules/zod/v4/core/schemas.d.cts +1041 -0
  196. package/node_modules/@media-editor/core/node_modules/zod/v4/core/schemas.d.ts +1041 -0
  197. package/node_modules/@media-editor/core/node_modules/zod/v4/core/schemas.js +1717 -0
  198. package/node_modules/@media-editor/core/node_modules/zod/v4/core/standard-schema.cjs +2 -0
  199. package/node_modules/@media-editor/core/node_modules/zod/v4/core/standard-schema.d.cts +55 -0
  200. package/node_modules/@media-editor/core/node_modules/zod/v4/core/standard-schema.d.ts +55 -0
  201. package/node_modules/@media-editor/core/node_modules/zod/v4/core/standard-schema.js +1 -0
  202. package/node_modules/@media-editor/core/node_modules/zod/v4/core/to-json-schema.cjs +854 -0
  203. package/node_modules/@media-editor/core/node_modules/zod/v4/core/to-json-schema.d.cts +88 -0
  204. package/node_modules/@media-editor/core/node_modules/zod/v4/core/to-json-schema.d.ts +88 -0
  205. package/node_modules/@media-editor/core/node_modules/zod/v4/core/to-json-schema.js +849 -0
  206. package/node_modules/@media-editor/core/node_modules/zod/v4/core/util.cjs +539 -0
  207. package/node_modules/@media-editor/core/node_modules/zod/v4/core/util.d.cts +183 -0
  208. package/node_modules/@media-editor/core/node_modules/zod/v4/core/util.d.ts +183 -0
  209. package/node_modules/@media-editor/core/node_modules/zod/v4/core/util.js +493 -0
  210. package/node_modules/@media-editor/core/node_modules/zod/v4/core/versions.cjs +8 -0
  211. package/node_modules/@media-editor/core/node_modules/zod/v4/core/versions.d.cts +5 -0
  212. package/node_modules/@media-editor/core/node_modules/zod/v4/core/versions.d.ts +5 -0
  213. package/node_modules/@media-editor/core/node_modules/zod/v4/core/versions.js +5 -0
  214. package/node_modules/@media-editor/core/node_modules/zod/v4/index.cjs +22 -0
  215. package/node_modules/@media-editor/core/node_modules/zod/v4/index.d.cts +3 -0
  216. package/node_modules/@media-editor/core/node_modules/zod/v4/index.d.ts +3 -0
  217. package/node_modules/@media-editor/core/node_modules/zod/v4/index.js +3 -0
  218. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ar.cjs +142 -0
  219. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ar.d.cts +4 -0
  220. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ar.d.ts +4 -0
  221. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ar.js +116 -0
  222. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/az.cjs +141 -0
  223. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/az.d.cts +4 -0
  224. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/az.d.ts +4 -0
  225. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/az.js +115 -0
  226. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/be.cjs +190 -0
  227. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/be.d.cts +4 -0
  228. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/be.d.ts +4 -0
  229. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/be.js +164 -0
  230. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ca.cjs +144 -0
  231. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ca.d.cts +4 -0
  232. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ca.d.ts +4 -0
  233. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ca.js +118 -0
  234. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/cs.cjs +161 -0
  235. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/cs.d.cts +4 -0
  236. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/cs.d.ts +4 -0
  237. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/cs.js +135 -0
  238. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/de.cjs +142 -0
  239. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/de.d.cts +4 -0
  240. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/de.d.ts +4 -0
  241. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/de.js +116 -0
  242. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/en.cjs +145 -0
  243. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/en.d.cts +5 -0
  244. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/en.d.ts +5 -0
  245. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/en.js +117 -0
  246. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/eo.cjs +144 -0
  247. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/eo.d.cts +5 -0
  248. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/eo.d.ts +5 -0
  249. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/eo.js +116 -0
  250. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/es.cjs +143 -0
  251. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/es.d.cts +4 -0
  252. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/es.d.ts +4 -0
  253. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/es.js +117 -0
  254. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fa.cjs +148 -0
  255. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fa.d.cts +4 -0
  256. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fa.d.ts +4 -0
  257. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fa.js +122 -0
  258. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fi.cjs +148 -0
  259. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fi.d.cts +4 -0
  260. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fi.d.ts +4 -0
  261. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fi.js +122 -0
  262. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr-CA.cjs +143 -0
  263. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr-CA.d.cts +4 -0
  264. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
  265. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr-CA.js +117 -0
  266. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr.cjs +142 -0
  267. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr.d.cts +4 -0
  268. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr.d.ts +4 -0
  269. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/fr.js +116 -0
  270. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/he.cjs +143 -0
  271. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/he.d.cts +4 -0
  272. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/he.d.ts +4 -0
  273. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/he.js +117 -0
  274. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/hu.cjs +143 -0
  275. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/hu.d.cts +4 -0
  276. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/hu.d.ts +4 -0
  277. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/hu.js +117 -0
  278. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/id.cjs +142 -0
  279. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/id.d.cts +4 -0
  280. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/id.d.ts +4 -0
  281. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/id.js +116 -0
  282. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/index.cjs +84 -0
  283. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/index.d.cts +39 -0
  284. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/index.d.ts +39 -0
  285. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/index.js +39 -0
  286. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/it.cjs +143 -0
  287. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/it.d.cts +4 -0
  288. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/it.d.ts +4 -0
  289. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/it.js +117 -0
  290. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ja.cjs +141 -0
  291. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ja.d.cts +4 -0
  292. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ja.d.ts +4 -0
  293. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ja.js +115 -0
  294. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/kh.cjs +143 -0
  295. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/kh.d.cts +4 -0
  296. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/kh.d.ts +4 -0
  297. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/kh.js +117 -0
  298. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ko.cjs +147 -0
  299. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ko.d.cts +4 -0
  300. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ko.d.ts +4 -0
  301. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ko.js +121 -0
  302. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/mk.cjs +144 -0
  303. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/mk.d.cts +4 -0
  304. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/mk.d.ts +4 -0
  305. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/mk.js +118 -0
  306. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ms.cjs +142 -0
  307. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ms.d.cts +4 -0
  308. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ms.d.ts +4 -0
  309. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ms.js +116 -0
  310. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/nl.cjs +143 -0
  311. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/nl.d.cts +4 -0
  312. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/nl.d.ts +4 -0
  313. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/nl.js +117 -0
  314. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/no.cjs +142 -0
  315. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/no.d.cts +4 -0
  316. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/no.d.ts +4 -0
  317. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/no.js +116 -0
  318. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ota.cjs +143 -0
  319. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ota.d.cts +4 -0
  320. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ota.d.ts +4 -0
  321. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ota.js +117 -0
  322. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pl.cjs +143 -0
  323. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pl.d.cts +4 -0
  324. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pl.d.ts +4 -0
  325. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pl.js +117 -0
  326. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ps.cjs +148 -0
  327. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ps.d.cts +4 -0
  328. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ps.d.ts +4 -0
  329. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ps.js +122 -0
  330. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pt.cjs +142 -0
  331. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pt.d.cts +4 -0
  332. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pt.d.ts +4 -0
  333. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/pt.js +116 -0
  334. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ru.cjs +190 -0
  335. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ru.d.cts +4 -0
  336. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ru.d.ts +4 -0
  337. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ru.js +164 -0
  338. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sl.cjs +143 -0
  339. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sl.d.cts +4 -0
  340. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sl.d.ts +4 -0
  341. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sl.js +117 -0
  342. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sv.cjs +144 -0
  343. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sv.d.cts +4 -0
  344. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sv.d.ts +4 -0
  345. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/sv.js +118 -0
  346. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ta.cjs +143 -0
  347. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ta.d.cts +4 -0
  348. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ta.d.ts +4 -0
  349. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ta.js +117 -0
  350. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/th.cjs +143 -0
  351. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/th.d.cts +4 -0
  352. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/th.d.ts +4 -0
  353. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/th.js +117 -0
  354. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/tr.cjs +143 -0
  355. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/tr.d.cts +5 -0
  356. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/tr.d.ts +5 -0
  357. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/tr.js +115 -0
  358. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ua.cjs +143 -0
  359. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ua.d.cts +4 -0
  360. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ua.d.ts +4 -0
  361. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ua.js +117 -0
  362. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ur.cjs +143 -0
  363. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ur.d.cts +4 -0
  364. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ur.d.ts +4 -0
  365. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/ur.js +117 -0
  366. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/vi.cjs +142 -0
  367. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/vi.d.cts +4 -0
  368. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/vi.d.ts +4 -0
  369. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/vi.js +116 -0
  370. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-CN.cjs +142 -0
  371. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-CN.d.cts +4 -0
  372. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
  373. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-CN.js +116 -0
  374. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-TW.cjs +143 -0
  375. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-TW.d.cts +4 -0
  376. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
  377. package/node_modules/@media-editor/core/node_modules/zod/v4/locales/zh-TW.js +117 -0
  378. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/checks.cjs +34 -0
  379. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/checks.d.cts +1 -0
  380. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/checks.d.ts +1 -0
  381. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/checks.js +1 -0
  382. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/coerce.cjs +47 -0
  383. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/coerce.d.cts +7 -0
  384. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/coerce.d.ts +7 -0
  385. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/coerce.js +17 -0
  386. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/external.cjs +62 -0
  387. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/external.d.cts +11 -0
  388. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/external.d.ts +11 -0
  389. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/external.js +13 -0
  390. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/index.cjs +32 -0
  391. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/index.d.cts +3 -0
  392. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/index.d.ts +3 -0
  393. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/index.js +3 -0
  394. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/iso.cjs +60 -0
  395. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/iso.d.cts +22 -0
  396. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/iso.d.ts +22 -0
  397. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/iso.js +30 -0
  398. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/parse.cjs +8 -0
  399. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/parse.d.cts +1 -0
  400. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/parse.d.ts +1 -0
  401. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/parse.js +1 -0
  402. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/schemas.cjs +839 -0
  403. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/schemas.d.cts +356 -0
  404. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/schemas.d.ts +356 -0
  405. package/node_modules/@media-editor/core/node_modules/zod/v4/mini/schemas.js +732 -0
  406. package/node_modules/@media-editor/core/node_modules/zod/v4-mini/index.cjs +17 -0
  407. package/node_modules/@media-editor/core/node_modules/zod/v4-mini/index.d.cts +1 -0
  408. package/node_modules/@media-editor/core/node_modules/zod/v4-mini/index.d.ts +1 -0
  409. package/node_modules/@media-editor/core/node_modules/zod/v4-mini/index.js +1 -0
  410. package/node_modules/@media-editor/core/package.json +42 -0
  411. package/node_modules/@media-editor/image/LICENSE +21 -0
  412. package/node_modules/@media-editor/image/README.md +48 -0
  413. package/node_modules/@media-editor/image/dist/chunk-5TBO732O.js +1 -0
  414. package/node_modules/@media-editor/image/dist/index-CU3vkvDR.d.ts +44 -0
  415. package/node_modules/@media-editor/image/dist/index.css +1 -0
  416. package/node_modules/@media-editor/image/dist/index.d.ts +2 -0
  417. package/node_modules/@media-editor/image/dist/index.js +364 -0
  418. package/node_modules/@media-editor/image/dist/lazy.css +1 -0
  419. package/node_modules/@media-editor/image/dist/lazy.d.ts +8 -0
  420. package/node_modules/@media-editor/image/dist/lazy.js +1 -0
  421. package/node_modules/@media-editor/image/package.json +29 -0
  422. package/node_modules/@media-editor/video/LICENSE +21 -0
  423. package/node_modules/@media-editor/video/README.md +55 -0
  424. package/node_modules/@media-editor/video/dist/chunk-EK7ODJWE.js +1 -0
  425. package/node_modules/@media-editor/video/dist/index-CX2iAapm.d.ts +51 -0
  426. package/node_modules/@media-editor/video/dist/index.d.ts +4 -0
  427. package/node_modules/@media-editor/video/dist/index.js +16919 -0
  428. package/node_modules/@media-editor/video/dist/lazy.d.ts +10 -0
  429. package/node_modules/@media-editor/video/dist/lazy.js +1 -0
  430. package/node_modules/@media-editor/video/dist/legacy.js +65 -0
  431. package/node_modules/@media-editor/video/package.json +29 -0
  432. package/package.json +48 -0
  433. package/style.css +1 -0
  434. package/theme.css +1214 -0
@@ -0,0 +1,505 @@
1
+ 'use strict';
2
+
3
+ // src/overlay-render.ts
4
+ var DEG2RAD = Math.PI / 180;
5
+ function strokeStyle(ctx, color, width) {
6
+ ctx.strokeStyle = color;
7
+ ctx.lineWidth = width;
8
+ ctx.lineCap = "round";
9
+ ctx.lineJoin = "round";
10
+ }
11
+ function drawArrowHead(ctx, x1, y1, x2, y2, width) {
12
+ const angle = Math.atan2(y2 - y1, x2 - x1);
13
+ const len = Math.max(12, width * 3.5);
14
+ ctx.beginPath();
15
+ ctx.moveTo(x2, y2);
16
+ ctx.lineTo(x2 - len * Math.cos(angle - Math.PI / 7), y2 - len * Math.sin(angle - Math.PI / 7));
17
+ ctx.moveTo(x2, y2);
18
+ ctx.lineTo(x2 - len * Math.cos(angle + Math.PI / 7), y2 - len * Math.sin(angle + Math.PI / 7));
19
+ ctx.stroke();
20
+ }
21
+ function normalizeOverlayRotation(deg) {
22
+ if (!Number.isFinite(deg)) return 0;
23
+ let next = deg % 360;
24
+ if (next > 180) next -= 360;
25
+ if (next < -180) next += 360;
26
+ return Math.abs(next) < 1e-3 ? 0 : next;
27
+ }
28
+ function getOverlayRotation(o) {
29
+ return normalizeOverlayRotation(o.rotation ?? 0);
30
+ }
31
+ function overlayBBox(o) {
32
+ switch (o.type) {
33
+ case "pen": {
34
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
35
+ for (let i = 0; i < o.points.length; i += 2) {
36
+ minX = Math.min(minX, o.points[i]);
37
+ maxX = Math.max(maxX, o.points[i]);
38
+ minY = Math.min(minY, o.points[i + 1]);
39
+ maxY = Math.max(maxY, o.points[i + 1]);
40
+ }
41
+ return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };
42
+ }
43
+ case "line":
44
+ case "arrow":
45
+ 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) };
46
+ case "rect":
47
+ case "ellipse":
48
+ case "sticker":
49
+ return { x: o.x, y: o.y, w: o.w, h: o.h };
50
+ case "text":
51
+ return { x: o.x, y: o.y, w: o.text.length * o.fontSize * 0.6, h: o.fontSize * 1.2 };
52
+ }
53
+ }
54
+ function overlayCenter(o) {
55
+ const b = overlayBBox(o);
56
+ return { x: b.x + b.w / 2, y: b.y + b.h / 2 };
57
+ }
58
+ function rotatePoint(x, y, cx, cy, deg) {
59
+ const rad = deg * DEG2RAD;
60
+ const cos = Math.cos(rad);
61
+ const sin = Math.sin(rad);
62
+ const dx = x - cx;
63
+ const dy = y - cy;
64
+ return { x: cx + dx * cos - dy * sin, y: cy + dx * sin + dy * cos };
65
+ }
66
+ function scalePoint(x, y, cx, cy, ratio) {
67
+ return { x: cx + (x - cx) * ratio, y: cy + (y - cy) * ratio };
68
+ }
69
+ function drawOverlay(ctx, o, imageCache) {
70
+ const rotation = getOverlayRotation(o);
71
+ if (rotation) {
72
+ const c = overlayCenter(o);
73
+ ctx.save();
74
+ ctx.translate(c.x, c.y);
75
+ ctx.rotate(rotation * DEG2RAD);
76
+ ctx.translate(-c.x, -c.y);
77
+ drawOverlayBase(ctx, o, imageCache);
78
+ ctx.restore();
79
+ return;
80
+ }
81
+ drawOverlayBase(ctx, o, imageCache);
82
+ }
83
+ function drawOverlayBase(ctx, o, imageCache) {
84
+ switch (o.type) {
85
+ case "pen": {
86
+ strokeStyle(ctx, o.color, o.width);
87
+ ctx.beginPath();
88
+ ctx.moveTo(o.points[0], o.points[1]);
89
+ for (let i = 2; i < o.points.length; i += 2) ctx.lineTo(o.points[i], o.points[i + 1]);
90
+ ctx.stroke();
91
+ break;
92
+ }
93
+ case "line":
94
+ case "arrow": {
95
+ strokeStyle(ctx, o.color, o.width);
96
+ ctx.beginPath();
97
+ ctx.moveTo(o.x1, o.y1);
98
+ ctx.lineTo(o.x2, o.y2);
99
+ ctx.stroke();
100
+ if (o.type === "arrow") drawArrowHead(ctx, o.x1, o.y1, o.x2, o.y2, o.width);
101
+ break;
102
+ }
103
+ case "rect": {
104
+ strokeStyle(ctx, o.color, o.width);
105
+ ctx.strokeRect(o.x, o.y, o.w, o.h);
106
+ break;
107
+ }
108
+ case "ellipse": {
109
+ strokeStyle(ctx, o.color, o.width);
110
+ ctx.beginPath();
111
+ 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);
112
+ ctx.stroke();
113
+ break;
114
+ }
115
+ case "text": {
116
+ ctx.fillStyle = o.color;
117
+ ctx.font = `bold ${o.fontSize}px -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif`;
118
+ ctx.textBaseline = "top";
119
+ ctx.strokeStyle = "rgba(0,0,0,0.45)";
120
+ ctx.lineWidth = Math.max(2, o.fontSize / 16);
121
+ ctx.lineJoin = "round";
122
+ ctx.strokeText(o.text, o.x, o.y);
123
+ ctx.fillText(o.text, o.x, o.y);
124
+ break;
125
+ }
126
+ case "sticker": {
127
+ if (o.emoji) {
128
+ ctx.font = `${Math.min(o.w, o.h)}px -apple-system, "Apple Color Emoji", "Segoe UI Emoji", sans-serif`;
129
+ ctx.textBaseline = "top";
130
+ ctx.fillText(o.emoji, o.x, o.y);
131
+ } else if (o.src) {
132
+ const img = imageCache?.get(o.src);
133
+ if (img) ctx.drawImage(img, o.x, o.y, o.w, o.h);
134
+ }
135
+ break;
136
+ }
137
+ }
138
+ }
139
+ function drawOverlays(ctx, overlays, imageCache) {
140
+ for (const o of overlays) drawOverlay(ctx, o, imageCache);
141
+ }
142
+ async function loadOverlayImages(overlays) {
143
+ const cache = /* @__PURE__ */ new Map();
144
+ const srcs = [...new Set(overlays.filter((o) => o.type === "sticker" && o.src).map((o) => o.src))];
145
+ await Promise.all(
146
+ srcs.map(
147
+ (src) => new Promise((resolve) => {
148
+ const img = new Image();
149
+ img.onload = () => {
150
+ cache.set(src, img);
151
+ resolve();
152
+ };
153
+ img.onerror = () => resolve();
154
+ img.src = src;
155
+ })
156
+ )
157
+ );
158
+ return cache;
159
+ }
160
+ async function renderOverlaysToPng(overlays, width, height) {
161
+ if (!overlays?.length) return null;
162
+ const canvas = document.createElement("canvas");
163
+ canvas.width = width;
164
+ canvas.height = height;
165
+ const ctx = canvas.getContext("2d");
166
+ if (!ctx) return null;
167
+ const cache = await loadOverlayImages(overlays);
168
+ drawOverlays(ctx, overlays, cache);
169
+ return new Promise((resolve) => canvas.toBlob((b) => resolve(b), "image/png"));
170
+ }
171
+ function hitTestOverlay(overlays, x, y, tolerance = 12) {
172
+ for (let i = overlays.length - 1; i >= 0; i--) {
173
+ const o = overlays[i];
174
+ if (hitOne(o, x, y, tolerance)) return i;
175
+ }
176
+ return -1;
177
+ }
178
+ function near(px, py, x, y, tol) {
179
+ return Math.abs(px - x) <= tol && Math.abs(py - y) <= tol;
180
+ }
181
+ function nearSegment(x, y, x1, y1, x2, y2, tol) {
182
+ const dx = x2 - x1;
183
+ const dy = y2 - y1;
184
+ const len2 = dx * dx + dy * dy || 1;
185
+ const t = Math.max(0, Math.min(1, ((x - x1) * dx + (y - y1) * dy) / len2));
186
+ const cx = x1 + t * dx;
187
+ const cy = y1 + t * dy;
188
+ return (x - cx) ** 2 + (y - cy) ** 2 <= tol * tol;
189
+ }
190
+ function hitOne(o, x, y, tol) {
191
+ const rotation = getOverlayRotation(o);
192
+ if (rotation) {
193
+ const c = overlayCenter(o);
194
+ const p = rotatePoint(x, y, c.x, c.y, -rotation);
195
+ return hitOneBase(o, p.x, p.y, tol);
196
+ }
197
+ return hitOneBase(o, x, y, tol);
198
+ }
199
+ function hitOneBase(o, x, y, tol) {
200
+ switch (o.type) {
201
+ case "pen": {
202
+ for (let i = 0; i + 3 < o.points.length; i += 2) {
203
+ 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;
204
+ }
205
+ return false;
206
+ }
207
+ case "line":
208
+ case "arrow":
209
+ return nearSegment(x, y, o.x1, o.y1, o.x2, o.y2, tol + o.width / 2);
210
+ case "rect":
211
+ case "ellipse":
212
+ return x >= o.x - tol && x <= o.x + o.w + tol && y >= o.y - tol && y <= o.y + o.h + tol;
213
+ case "text":
214
+ 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;
215
+ case "sticker":
216
+ return near(x, y, o.x + o.w / 2, o.y + o.h / 2, Math.max(o.w, o.h) / 2 + tol);
217
+ }
218
+ }
219
+ function fitStickerBox(natW, natH, boxSide) {
220
+ const side = Math.max(8, boxSide);
221
+ if (!(natW > 0) || !(natH > 0)) return { w: side, h: side };
222
+ const k = side / Math.max(natW, natH);
223
+ return { w: Math.max(8, Math.round(natW * k)), h: Math.max(8, Math.round(natH * k)) };
224
+ }
225
+ function scaleOverlay(o, ratio) {
226
+ const r = Math.max(0.05, ratio);
227
+ const c = overlayCenter(o);
228
+ switch (o.type) {
229
+ case "pen":
230
+ return { ...o, points: o.points.map((v, i) => i % 2 === 0 ? c.x + (v - c.x) * r : c.y + (v - c.y) * r) };
231
+ case "line":
232
+ case "arrow": {
233
+ const p1 = scalePoint(o.x1, o.y1, c.x, c.y, r);
234
+ const p2 = scalePoint(o.x2, o.y2, c.x, c.y, r);
235
+ return { ...o, x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y };
236
+ }
237
+ case "rect":
238
+ case "ellipse":
239
+ case "sticker":
240
+ return { ...o, w: Math.max(8, o.w * r), h: Math.max(8, o.h * r) };
241
+ case "text":
242
+ return { ...o, fontSize: Math.min(512, Math.max(8, o.fontSize * r)) };
243
+ default:
244
+ return o;
245
+ }
246
+ }
247
+ function rotateOverlay(o, deg) {
248
+ return { ...o, rotation: normalizeOverlayRotation(deg) };
249
+ }
250
+ function translateOverlay(o, dx, dy) {
251
+ switch (o.type) {
252
+ case "pen": {
253
+ const points = o.points.map((v, i) => i % 2 === 0 ? v + dx : v + dy);
254
+ return { ...o, points };
255
+ }
256
+ case "line":
257
+ case "arrow":
258
+ return { ...o, x1: o.x1 + dx, y1: o.y1 + dy, x2: o.x2 + dx, y2: o.y2 + dy };
259
+ case "rect":
260
+ case "ellipse":
261
+ case "sticker":
262
+ return { ...o, x: o.x + dx, y: o.y + dy };
263
+ case "text":
264
+ return { ...o, x: o.x + dx, y: o.y + dy };
265
+ }
266
+ }
267
+
268
+ // src/transform.ts
269
+ var DEG2RAD2 = Math.PI / 180;
270
+ function rotatedSize(w, h, deg) {
271
+ const norm = normalizeDeg(deg);
272
+ if (norm === 0 || norm === 180) return { w, h };
273
+ if (norm === 90 || norm === 270) return { w: h, h: w };
274
+ const rad = norm * DEG2RAD2;
275
+ return {
276
+ w: Math.round(Math.abs(w * Math.cos(rad)) + Math.abs(h * Math.sin(rad))),
277
+ h: Math.round(Math.abs(w * Math.sin(rad)) + Math.abs(h * Math.cos(rad)))
278
+ };
279
+ }
280
+ function normalizeDeg(deg) {
281
+ return (deg % 360 + 360) % 360;
282
+ }
283
+ function evenize(n) {
284
+ const v = Math.round(n);
285
+ return v - v % 2;
286
+ }
287
+ function centeredMaxRect(bounds, aspect) {
288
+ let width = bounds.w;
289
+ let height = width / aspect;
290
+ if (height > bounds.h) {
291
+ height = bounds.h;
292
+ width = height * aspect;
293
+ }
294
+ return {
295
+ x: Math.round((bounds.w - width) / 2),
296
+ y: Math.round((bounds.h - height) / 2),
297
+ width: Math.round(width),
298
+ height: Math.round(height)
299
+ };
300
+ }
301
+ function fitRects(crop, out, fit) {
302
+ const fullSrc = { x: 0, y: 0, width: crop.width, height: crop.height };
303
+ const fullDst = { x: 0, y: 0, width: out.w, height: out.h };
304
+ if (fit === "cover") {
305
+ return { src: centeredMaxRect({ w: crop.width, h: crop.height }, out.w / out.h), dst: fullDst };
306
+ }
307
+ if (fit === "contain") {
308
+ return { src: fullSrc, dst: centeredMaxRect({ w: out.w, h: out.h }, crop.width / crop.height) };
309
+ }
310
+ return { src: fullSrc, dst: fullDst };
311
+ }
312
+ function outputSize(source, state) {
313
+ if (state.scale) return { w: evenize(state.scale.width), h: evenize(state.scale.height) };
314
+ if (state.crop) return { w: evenize(state.crop.width), h: evenize(state.crop.height) };
315
+ const r = rotatedSize(source.w, source.h, state.rotation);
316
+ return { w: evenize(r.w), h: evenize(r.h) };
317
+ }
318
+
319
+ // src/export-form.ts
320
+ async function buildVideoExportFormData(engine, videoFiles, audioFiles = []) {
321
+ const plan = engine.getExportPlan();
322
+ const fd = new FormData();
323
+ plan.videoSrcOrder.forEach((srcIdx, slot) => {
324
+ const f = videoFiles[srcIdx];
325
+ if (f) fd.append(`video_${slot}`, f, f.name || `video_${slot}.mp4`);
326
+ });
327
+ plan.audioSrcOrder.forEach((srcIdx, slot) => {
328
+ const f = audioFiles[srcIdx];
329
+ if (f) fd.append(`audio_${slot}`, f, f.name || `audio_${slot}`);
330
+ });
331
+ const out = outputSize(plan.state.canvas, plan.state);
332
+ const overlay = await renderOverlaysToPng(plan.state.overlays, out.w, out.h);
333
+ if (overlay) fd.append("overlay", overlay, "overlay.png");
334
+ fd.append("editState", JSON.stringify(plan.state));
335
+ return fd;
336
+ }
337
+
338
+ // src/filters.ts
339
+ var FILTER_PRESETS = [
340
+ { id: "bw", label: "\u9ED1\u767D", vf: "hue=s=0", css: "grayscale(1)" },
341
+ {
342
+ id: "sepia",
343
+ label: "\u590D\u53E4",
344
+ vf: "colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131",
345
+ css: "sepia(0.85)"
346
+ },
347
+ { id: "warm", label: "\u6696\u9633", vf: "colorbalance=rs=.15:gs=.04:bs=-.15", css: "sepia(0.25) saturate(1.25) brightness(1.03)" },
348
+ { id: "cool", label: "\u51B7\u8C03", vf: "colorbalance=rs=-.14:bs=.16", css: "hue-rotate(12deg) saturate(0.95) brightness(1.02)" },
349
+ { id: "vivid", label: "\u9C9C\u8273", vf: "eq=saturation=1.45:contrast=1.08", css: "saturate(1.45) contrast(1.08)" }
350
+ ];
351
+ function findFilterPreset(id) {
352
+ return id ? FILTER_PRESETS.find((p) => p.id === id) : void 0;
353
+ }
354
+ function buildFilterCss(filters, presetId) {
355
+ const presetCss = findFilterPreset(presetId)?.css ?? "";
356
+ return [
357
+ `brightness(${1 + filters.brightness})`,
358
+ `contrast(${1 + filters.contrast})`,
359
+ `saturate(${1 + filters.saturation})`,
360
+ presetCss
361
+ ].filter(Boolean).join(" ");
362
+ }
363
+
364
+ // src/frame-compositor.ts
365
+ function drawVideoFrame(canvas, source, srcDims, canvasDims, state, k = 1, imageCache, withOverlays = true) {
366
+ const out = outputSize(canvasDims, state);
367
+ canvas.width = Math.max(2, Math.round(out.w * k));
368
+ canvas.height = Math.max(2, Math.round(out.h * k));
369
+ const ctx = canvas.getContext("2d");
370
+ if (!ctx) return;
371
+ const rb = rotatedSize(canvasDims.w, canvasDims.h, state.rotation);
372
+ const crop = state.crop ?? { x: 0, y: 0, width: rb.w, height: rb.h };
373
+ const fit = state.scale?.fit ?? "force";
374
+ const { src, dst } = fitRects({ width: crop.width, height: crop.height }, out, fit);
375
+ if (fit === "contain") {
376
+ ctx.fillStyle = "#000";
377
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
378
+ }
379
+ ctx.filter = buildFilterCss(state.filters, state.filterPreset);
380
+ ctx.save();
381
+ if (fit === "contain") {
382
+ ctx.beginPath();
383
+ ctx.rect(k * dst.x, k * dst.y, k * dst.width, k * dst.height);
384
+ ctx.clip();
385
+ }
386
+ ctx.translate(k * dst.x, k * dst.y);
387
+ ctx.scale(k * dst.width / src.width, k * dst.height / src.height);
388
+ ctx.translate(-(crop.x + src.x), -(crop.y + src.y));
389
+ ctx.translate(rb.w / 2, rb.h / 2);
390
+ ctx.rotate(state.rotation * DEG2RAD2);
391
+ ctx.scale(state.flipX ? -1 : 1, state.flipY ? -1 : 1);
392
+ const cov = fitRects({ width: srcDims.w, height: srcDims.h }, { w: canvasDims.w, h: canvasDims.h }, "cover");
393
+ ctx.drawImage(
394
+ source,
395
+ cov.src.x,
396
+ cov.src.y,
397
+ cov.src.width,
398
+ cov.src.height,
399
+ -canvasDims.w / 2,
400
+ -canvasDims.h / 2,
401
+ canvasDims.w,
402
+ canvasDims.h
403
+ );
404
+ ctx.restore();
405
+ ctx.filter = "none";
406
+ if (withOverlays && state.overlays?.length) {
407
+ ctx.setTransform(k, 0, 0, k, 0, 0);
408
+ drawOverlays(ctx, state.overlays, imageCache);
409
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
410
+ }
411
+ }
412
+ function seekVideo(el, t) {
413
+ return new Promise((resolve) => {
414
+ const onSeeked = () => {
415
+ el.removeEventListener("seeked", onSeeked);
416
+ resolve();
417
+ };
418
+ el.addEventListener("seeked", onSeeked);
419
+ el.currentTime = Math.min(Math.max(0, t), el.duration || t);
420
+ });
421
+ }
422
+ async function generateThumbnails(videoEl, count, maxW = 160) {
423
+ const dur = videoEl.duration;
424
+ if (!dur || !isFinite(dur) || count <= 0) return [];
425
+ const natW = videoEl.videoWidth || 16;
426
+ const natH = videoEl.videoHeight || 9;
427
+ const w = Math.min(maxW, natW);
428
+ const h = Math.max(1, Math.round(w * natH / natW));
429
+ const canvas = document.createElement("canvas");
430
+ canvas.width = w;
431
+ canvas.height = h;
432
+ const ctx = canvas.getContext("2d");
433
+ if (!ctx) return [];
434
+ const out = [];
435
+ for (let i = 0; i < count; i++) {
436
+ await seekVideo(videoEl, dur * (i + 0.5) / count);
437
+ ctx.drawImage(videoEl, 0, 0, w, h);
438
+ out.push(canvas.toDataURL("image/jpeg", 0.6));
439
+ }
440
+ return out;
441
+ }
442
+
443
+ // src/fullscreen.ts
444
+ function createFullscreenToggle(host, options = {}) {
445
+ const mode = options.mode ?? "overlay";
446
+ const btn = document.createElement("button");
447
+ btn.type = "button";
448
+ btn.className = ["me-fullscreen-toggle", options.className].filter(Boolean).join(" ");
449
+ btn.dataset.meFullscreenToggle = "true";
450
+ btn.dataset.mode = mode;
451
+ btn.title = "\u5168\u5C4F / \u9000\u51FA\u5168\u5C4F";
452
+ btn.style.cssText = [
453
+ mode === "overlay" ? "position:absolute;left:8px;bottom:8px;z-index:30;" : "position:static;",
454
+ "width:32px;height:32px;padding:0;",
455
+ "display:inline-flex;align-items:center;justify-content:center;",
456
+ "border:1px solid var(--me-border,#26262b);border-radius:6px;",
457
+ "background:var(--me-chip,#1c1c20);color:var(--me-fg,#e7e7ee);",
458
+ "cursor:pointer;font-size:15px;line-height:1;opacity:0.9;font:inherit;"
459
+ ].join("");
460
+ host.classList.add("me-fullscreen-host");
461
+ const sync = () => {
462
+ const isFullscreen = document.fullscreenElement === host;
463
+ btn.textContent = isFullscreen ? "\xD7" : "\u26F6";
464
+ btn.setAttribute("aria-label", isFullscreen ? "\u9000\u51FA\u5168\u5C4F" : "\u5168\u5C4F");
465
+ host.classList.toggle("me-is-fullscreen", isFullscreen);
466
+ host.dataset.meFullscreen = isFullscreen ? "true" : "false";
467
+ };
468
+ sync();
469
+ const onChange = () => sync();
470
+ const onClick = () => {
471
+ const action = document.fullscreenElement === host ? document.exitFullscreen?.() : host.requestFullscreen?.();
472
+ void action?.catch?.(() => {
473
+ });
474
+ };
475
+ btn.addEventListener("click", onClick);
476
+ document.addEventListener("fullscreenchange", onChange);
477
+ return {
478
+ button: btn,
479
+ dispose: () => {
480
+ document.removeEventListener("fullscreenchange", onChange);
481
+ btn.removeEventListener("click", onClick);
482
+ btn.remove();
483
+ host.classList.remove("me-fullscreen-host", "me-is-fullscreen");
484
+ delete host.dataset.meFullscreen;
485
+ }
486
+ };
487
+ }
488
+
489
+ exports.buildVideoExportFormData = buildVideoExportFormData;
490
+ exports.createFullscreenToggle = createFullscreenToggle;
491
+ exports.drawOverlay = drawOverlay;
492
+ exports.drawOverlays = drawOverlays;
493
+ exports.drawVideoFrame = drawVideoFrame;
494
+ exports.fitStickerBox = fitStickerBox;
495
+ exports.generateThumbnails = generateThumbnails;
496
+ exports.getOverlayRotation = getOverlayRotation;
497
+ exports.hitTestOverlay = hitTestOverlay;
498
+ exports.loadOverlayImages = loadOverlayImages;
499
+ exports.overlayBBox = overlayBBox;
500
+ exports.renderOverlaysToPng = renderOverlaysToPng;
501
+ exports.rotateOverlay = rotateOverlay;
502
+ exports.scaleOverlay = scaleOverlay;
503
+ exports.translateOverlay = translateOverlay;
504
+ //# sourceMappingURL=browser.cjs.map
505
+ //# sourceMappingURL=browser.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/overlay-render.ts","../src/transform.ts","../src/export-form.ts","../src/filters.ts","../src/frame-compositor.ts","../src/fullscreen.ts"],"names":["DEG2RAD"],"mappings":"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","file":"browser.cjs","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 * 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 * 把引擎导出计划 + 浏览器端 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 * 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","/**\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"]}