@vfrey/vfrey 0.0.1 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +78 -3
  3. package/accounts.example.json +61 -0
  4. package/accounts.first-run.json +41 -0
  5. package/bin/vfrey.mjs +36 -0
  6. package/integration-tools/README.md +43 -0
  7. package/integration-tools/image/pillow.md +32 -0
  8. package/integration-tools/image/playwright.md +33 -0
  9. package/integration-tools/image/resvg.md +36 -0
  10. package/integration-tools/image/satori.md +36 -0
  11. package/integration-tools/image/sharp.md +38 -0
  12. package/integration-tools/video/blender.md +34 -0
  13. package/integration-tools/video/ffmpeg.md +41 -0
  14. package/integration-tools/video/manim.md +37 -0
  15. package/integration-tools/video/motion-canvas.md +37 -0
  16. package/integration-tools/video/remotion.md +50 -0
  17. package/integration-tools/video/revideo.md +32 -0
  18. package/package.json +74 -6
  19. package/skills/vfrey-orchestrator/SKILL.md +15 -0
  20. package/skills/vfrey-orchestrator/channel-video/SKILL.md +41 -0
  21. package/skills/vfrey-product/SKILL.md +63 -0
  22. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-one.svg +14 -0
  23. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-two.svg +22 -0
  24. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/index.html +70 -0
  25. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-one.svg +14 -0
  26. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-two.svg +22 -0
  27. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/index.tsx +49 -0
  28. package/skills/vfrey-product/examples/concurrency-vs-parallelism/script.json +15 -0
  29. package/skills/vfrey-product/examples/octopus-facts/index.html +60 -0
  30. package/skills/vfrey-product/examples/octopus-facts/octopus.svg +8 -0
  31. package/skills/vfrey-product/examples/octopus-facts/script.json +14 -0
  32. package/skills/vfrey-product/push/SKILL.md +15 -0
  33. package/skills/vfrey-product/scenes/NOTICE +5 -0
  34. package/skills/vfrey-product/scenes/blocks.md +57 -0
  35. package/skills/vfrey-product/scenes/craft.md +118 -0
  36. package/skills/vfrey-product/scenes/motion.md +88 -0
  37. package/src/analytics/dashboard.ts +109 -0
  38. package/src/analytics/index.ts +260 -0
  39. package/src/api/client.ts +361 -0
  40. package/src/api/cloud-files.ts +197 -0
  41. package/src/api/cloud-runs.ts +75 -0
  42. package/src/api/cloud.ts +413 -0
  43. package/src/api/commands.ts +330 -0
  44. package/src/api/config.ts +34 -0
  45. package/src/api/creators.ts +463 -0
  46. package/src/api/credentials.ts +152 -0
  47. package/src/api/mail.ts +333 -0
  48. package/src/api/topics.ts +207 -0
  49. package/src/api/types.ts +273 -0
  50. package/src/cli.ts +468 -0
  51. package/src/cloud/bundle.ts +70 -0
  52. package/src/cloud/cloudrun-executor.ts +237 -0
  53. package/src/cloud/executor.ts +281 -0
  54. package/src/cloud/gcs-sign.ts +76 -0
  55. package/src/cloud/job.ts +106 -0
  56. package/src/cloud/remote-job.ts +67 -0
  57. package/src/cloud/render-job.ts +191 -0
  58. package/src/config.ts +309 -0
  59. package/src/dashboard-link.ts +180 -0
  60. package/src/dashboard-start.ts +103 -0
  61. package/src/desk/channel.ts +64 -0
  62. package/src/desk/cli.ts +216 -0
  63. package/src/desk/creators-route.ts +129 -0
  64. package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
  65. package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
  66. package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
  67. package/src/desk/http.ts +460 -0
  68. package/src/desk/mail-route.ts +103 -0
  69. package/src/desk/overlay.ts +112 -0
  70. package/src/desk/preview.ts +422 -0
  71. package/src/desk/screens.ts +149 -0
  72. package/src/desk/secrets.ts +143 -0
  73. package/src/desk/series.ts +127 -0
  74. package/src/desk/state.ts +77 -0
  75. package/src/desk/studio-route.ts +119 -0
  76. package/src/desk/tick-runner.ts +66 -0
  77. package/src/desk/tick.ts +56 -0
  78. package/src/desk/topics-route.ts +41 -0
  79. package/src/desk/ui/app.css +505 -0
  80. package/src/desk/ui/app.js +185 -0
  81. package/src/desk/ui/apple-icon.png +0 -0
  82. package/src/desk/ui/components.js +79 -0
  83. package/src/desk/ui/core.js +156 -0
  84. package/src/desk/ui/favicon.ico +0 -0
  85. package/src/desk/ui/icon.svg +1 -0
  86. package/src/desk/ui/icons.js +49 -0
  87. package/src/desk/ui/index.html +41 -0
  88. package/src/desk/ui/metrics-math.d.ts +22 -0
  89. package/src/desk/ui/metrics-math.js +135 -0
  90. package/src/desk/ui/theme.js +5 -0
  91. package/src/desk/ui/views-creators.js +209 -0
  92. package/src/desk/ui/views-keys.js +114 -0
  93. package/src/desk/ui/views-mail.js +188 -0
  94. package/src/desk/ui/views-misc.js +123 -0
  95. package/src/desk/ui/views-review.js +119 -0
  96. package/src/desk/ui/views-runs.js +350 -0
  97. package/src/desk/ui/views-screens.js +163 -0
  98. package/src/desk/ui/views-series.js +318 -0
  99. package/src/desk/ui/views-topics.js +87 -0
  100. package/src/desk/verbs.ts +361 -0
  101. package/src/doctor.ts +212 -0
  102. package/src/drain.ts +14 -0
  103. package/src/engage/index.ts +217 -0
  104. package/src/generate/index.ts +110 -0
  105. package/src/generate/script.ts +152 -0
  106. package/src/generate/title.ts +78 -0
  107. package/src/help.ts +252 -0
  108. package/src/home.ts +45 -0
  109. package/src/llm/client.ts +177 -0
  110. package/src/log.ts +7 -0
  111. package/src/oauth/tokens.ts +189 -0
  112. package/src/oauth/vault.ts +72 -0
  113. package/src/pipeline/review.ts +642 -0
  114. package/src/pipeline/run.ts +443 -0
  115. package/src/pipeline/series-guard.ts +26 -0
  116. package/src/pipeline/source-fetch.ts +69 -0
  117. package/src/pipeline/stages.ts +728 -0
  118. package/src/pipeline/topics-source.ts +90 -0
  119. package/src/product/commands.ts +296 -0
  120. package/src/product/config-file.ts +38 -0
  121. package/src/product/engine-choice.ts +89 -0
  122. package/src/product/engines.ts +103 -0
  123. package/src/product/insights.ts +50 -0
  124. package/src/product/keys.ts +67 -0
  125. package/src/product/paths.ts +18 -0
  126. package/src/product/probes.ts +88 -0
  127. package/src/product/push-flow.ts +90 -0
  128. package/src/product/render-video.ts +21 -0
  129. package/src/product/short.ts +62 -0
  130. package/src/product/update.ts +32 -0
  131. package/src/project/canonical.ts +14 -0
  132. package/src/project/commands.ts +177 -0
  133. package/src/project/dashboard-status.ts +28 -0
  134. package/src/project/discover.ts +19 -0
  135. package/src/project/index-file.ts +73 -0
  136. package/src/project/marker.ts +92 -0
  137. package/src/project/migrate.ts +201 -0
  138. package/src/project/names.ts +27 -0
  139. package/src/project/notice.ts +16 -0
  140. package/src/project/open.ts +88 -0
  141. package/src/project/scaffold.ts +112 -0
  142. package/src/project/templates.ts +42 -0
  143. package/src/project/videos.ts +64 -0
  144. package/src/publish/facebook.ts +91 -0
  145. package/src/publish/index.ts +12 -0
  146. package/src/publish/instagram.ts +97 -0
  147. package/src/publish/rate.ts +62 -0
  148. package/src/publish/session.ts +242 -0
  149. package/src/publish/tiktok.ts +202 -0
  150. package/src/publish/youtube.ts +177 -0
  151. package/src/queue/desk-ops.ts +1170 -0
  152. package/src/queue/seal.ts +3 -0
  153. package/src/queue/store.ts +1006 -0
  154. package/src/remotion/AiLabel.tsx +26 -0
  155. package/src/remotion/Root.tsx +73 -0
  156. package/src/remotion/defaults.ts +26 -0
  157. package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
  158. package/src/remotion/films/engine/EngineMark.tsx +17 -0
  159. package/src/remotion/films/rea/ReaShort.tsx +552 -0
  160. package/src/remotion/films/rea/drawings.tsx +907 -0
  161. package/src/remotion/films/rea/timing.ts +144 -0
  162. package/src/remotion/index.ts +4 -0
  163. package/src/remotion/templates/EditorialSplit.tsx +39 -0
  164. package/src/remotion/templates/KineticType.tsx +39 -0
  165. package/src/remotion/templates/SignalBoard.tsx +50 -0
  166. package/src/remotion/timing.ts +22 -0
  167. package/src/render/chrome.ts +78 -0
  168. package/src/render/engine-mark.ts +29 -0
  169. package/src/render/framey-template.ts +130 -0
  170. package/src/render/html-engine.ts +149 -0
  171. package/src/render/node-crypto-stub.ts +11 -0
  172. package/src/render/probe.ts +29 -0
  173. package/src/render/props.ts +17 -0
  174. package/src/render/vertical-short.ts +35 -0
  175. package/src/render/webpack.ts +33 -0
  176. package/src/render/worker.ts +65 -0
  177. package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
  178. package/src/scene/assets/fonts/titan-one.woff2 +0 -0
  179. package/src/scene/assets/gsap/LICENSE.txt +8 -0
  180. package/src/scene/assets/gsap/gsap.min.js +11 -0
  181. package/src/scene/audio.ts +54 -0
  182. package/src/scene/blocks/LICENSE +190 -0
  183. package/src/scene/blocks/NOTICE +5 -0
  184. package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
  185. package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
  186. package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
  187. package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
  188. package/src/scene/blocks/code-diff/code-diff.html +817 -0
  189. package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
  190. package/src/scene/blocks/code-typing/code-typing.html +764 -0
  191. package/src/scene/blocks/data-chart/data-chart.html +452 -0
  192. package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
  193. package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
  194. package/src/scene/blocks/index.json +824 -0
  195. package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
  196. package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
  197. package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
  198. package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
  199. package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
  200. package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
  201. package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
  202. package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
  203. package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
  204. package/src/scene/blocks/mk-background/mk-background.html +236 -0
  205. package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
  206. package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
  207. package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
  208. package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
  209. package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
  210. package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
  211. package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
  212. package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
  213. package/src/scene/blocks/snow/snow.html +205 -0
  214. package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
  215. package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
  216. package/src/scene/blocks/starfield/starfield.html +188 -0
  217. package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
  218. package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
  219. package/src/scene/blocks/x-post/x-post.html +437 -0
  220. package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
  221. package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
  222. package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
  223. package/src/scene/blocks.ts +229 -0
  224. package/src/scene/command.ts +272 -0
  225. package/src/scene/figure.ts +181 -0
  226. package/src/scene/glyphs.ts +107 -0
  227. package/src/scene/init.ts +86 -0
  228. package/src/scene/inspect/css-tree.d.ts +6 -0
  229. package/src/scene/inspect/page-scripts.ts +272 -0
  230. package/src/scene/inspect/report.ts +405 -0
  231. package/src/scene/inspect/run.ts +200 -0
  232. package/src/scene/inspect/source.ts +236 -0
  233. package/src/scene/label.ts +131 -0
  234. package/src/scene/net-guard.ts +74 -0
  235. package/src/scene/render.ts +292 -0
  236. package/src/scene/runtime/browser.ts +199 -0
  237. package/src/scene/runtime/core.ts +181 -0
  238. package/src/scene/runtime/react.tsx +115 -0
  239. package/src/scene/runtime/transitions.ts +133 -0
  240. package/src/scene/sanitize.ts +181 -0
  241. package/src/scene/scene.ts +152 -0
  242. package/src/scene/studio-command.ts +48 -0
  243. package/src/scene/studio-skin.ts +59 -0
  244. package/src/scene/studio.ts +337 -0
  245. package/src/scene/supply.ts +111 -0
  246. package/src/scene/timing.ts +288 -0
  247. package/src/scene/transitions/LICENSE +190 -0
  248. package/src/scene/transitions/NOTICE +5 -0
  249. package/src/scene/transitions/SOURCE.json +24 -0
  250. package/src/scene/transitions/transitions.global.js +38 -0
  251. package/src/scene/transitions.ts +26 -0
  252. package/src/service/all-projects.ts +153 -0
  253. package/src/service/commands.ts +256 -0
  254. package/src/service/due.ts +82 -0
  255. package/src/service/lock.ts +101 -0
  256. package/src/service/log-file.ts +56 -0
  257. package/src/service/state.ts +41 -0
  258. package/src/service/units.ts +90 -0
  259. package/src/service/worker.ts +51 -0
  260. package/src/skill-agents.ts +74 -0
  261. package/src/skill-install.ts +334 -0
  262. package/src/sync-write.ts +21 -0
  263. package/src/tick-report.ts +205 -0
  264. package/src/tts.ts +124 -0
  265. package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
  266. package/vendor/@vfrey/contracts/dist/account.js +27 -0
  267. package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
  268. package/vendor/@vfrey/contracts/dist/checks.js +1 -0
  269. package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
  270. package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
  271. package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
  272. package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
  273. package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
  274. package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
  275. package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
  276. package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
  277. package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
  278. package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
  279. package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
  280. package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
  281. package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
  282. package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
  283. package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
  284. package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
  285. package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
  286. package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
  287. package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
  288. package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
  289. package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
  290. package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
  291. package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
  292. package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
  293. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
  294. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
  295. package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
  296. package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
  297. package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
  298. package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
  299. package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
  300. package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
  301. package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
  302. package/vendor/@vfrey/contracts/dist/events.js +1 -0
  303. package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
  304. package/vendor/@vfrey/contracts/dist/http.js +37 -0
  305. package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
  306. package/vendor/@vfrey/contracts/dist/index.js +22 -0
  307. package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
  308. package/vendor/@vfrey/contracts/dist/log.js +10 -0
  309. package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
  310. package/vendor/@vfrey/contracts/dist/mail.js +1 -0
  311. package/vendor/@vfrey/contracts/package.json +18 -0
  312. package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
  313. package/vendor/@vfrey/ingest/dist/index.js +221 -0
  314. package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
  315. package/vendor/@vfrey/ingest/dist/parse.js +165 -0
  316. package/vendor/@vfrey/ingest/package.json +21 -0
  317. package/vendor/framey/LICENSE +190 -0
  318. package/vendor/framey/NOTICE +15 -0
  319. package/vendor/framey/SOURCE.json +24 -0
  320. package/vendor/framey/STUDIO-SOURCE.json +9 -0
  321. package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
  322. package/vendor/framey/bin/framey.mjs +16 -0
  323. package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
  324. package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
  325. package/vendor/framey/dist/api.d.ts +211 -0
  326. package/vendor/framey/dist/api.js +76 -0
  327. package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
  328. package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
  329. package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
  330. package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
  331. package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
  332. package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
  333. package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
  334. package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
  335. package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
  336. package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
  337. package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
  338. package/vendor/framey/dist/check-F5N544ML.js +111 -0
  339. package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
  340. package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
  341. package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
  342. package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
  343. package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
  344. package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
  345. package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
  346. package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
  347. package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
  348. package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
  349. package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
  350. package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
  351. package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
  352. package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
  353. package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
  354. package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
  355. package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
  356. package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
  357. package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
  358. package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
  359. package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
  360. package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
  361. package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
  362. package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
  363. package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
  364. package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
  365. package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
  366. package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
  367. package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
  368. package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
  369. package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
  370. package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
  371. package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
  372. package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
  373. package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
  374. package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
  375. package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
  376. package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
  377. package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
  378. package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
  379. package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
  380. package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
  381. package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
  382. package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
  383. package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
  384. package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
  385. package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
  386. package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
  387. package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
  388. package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
  389. package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
  390. package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
  391. package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
  392. package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
  393. package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
  394. package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
  395. package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
  396. package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
  397. package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
  398. package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
  399. package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
  400. package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
  401. package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
  402. package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
  403. package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
  404. package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
  405. package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
  406. package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
  407. package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
  408. package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
  409. package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
  410. package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
  411. package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
  412. package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
  413. package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
  414. package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
  415. package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
  416. package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
  417. package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
  418. package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
  419. package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
  420. package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
  421. package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
  422. package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
  423. package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
  424. package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
  425. package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
  426. package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
  427. package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
  428. package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
  429. package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
  430. package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
  431. package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
  432. package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
  433. package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
  434. package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
  435. package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
  436. package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
  437. package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
  438. package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
  439. package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
  440. package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
  441. package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
  442. package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
  443. package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
  444. package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
  445. package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
  446. package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
  447. package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
  448. package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
  449. package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
  450. package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
  451. package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
  452. package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
  453. package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
  454. package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
  455. package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
  456. package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
  457. package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
  458. package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
  459. package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
  460. package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
  461. package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
  462. package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
  463. package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
  464. package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
  465. package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
  466. package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
  467. package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
  468. package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
  469. package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
  470. package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
  471. package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
  472. package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
  473. package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
  474. package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
  475. package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
  476. package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
  477. package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
  478. package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
  479. package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
  480. package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
  481. package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
  482. package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
  483. package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
  484. package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
  485. package/vendor/framey/dist/cli.js +439 -0
  486. package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
  487. package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
  488. package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
  489. package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
  490. package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
  491. package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
  492. package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
  493. package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
  494. package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
  495. package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
  496. package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
  497. package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
  498. package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
  499. package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
  500. package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
  501. package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
  502. package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
  503. package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
  504. package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
  505. package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
  506. package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
  507. package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
  508. package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
  509. package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
  510. package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
  511. package/vendor/framey/dist/fontLocalizeCli.js +142 -0
  512. package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
  513. package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
  514. package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
  515. package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
  516. package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
  517. package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
  518. package/vendor/framey/dist/hyperframe.manifest.json +22 -0
  519. package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
  520. package/vendor/framey/dist/hyperframes-player.global.js +478 -0
  521. package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
  522. package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
  523. package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
  524. package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
  525. package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
  526. package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
  527. package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
  528. package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
  529. package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
  530. package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
  531. package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
  532. package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
  533. package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
  534. package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
  535. package/vendor/framey/dist/models-K363FYM4.js +195 -0
  536. package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
  537. package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
  538. package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
  539. package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
  540. package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
  541. package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
  542. package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
  543. package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
  544. package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
  545. package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
  546. package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
  547. package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
  548. package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
  549. package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
  550. package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
  551. package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
  552. package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
  553. package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
  554. package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
  555. package/vendor/framey/dist/renderSetupWorker.js +120 -0
  556. package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
  557. package/vendor/framey/dist/runtimeVersion.js +18 -0
  558. package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
  559. package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
  560. package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
  561. package/vendor/framey/dist/sherpaWorker.js +84 -0
  562. package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
  563. package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
  564. package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
  565. package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
  566. package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
  567. package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
  568. package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
  569. package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
  570. package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
  571. package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
  572. package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
  573. package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
  574. package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
  575. package/vendor/framey/dist/studio/favicon.svg +14 -0
  576. package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
  577. package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
  578. package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
  579. package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
  580. package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
  581. package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
  582. package/vendor/framey/dist/studio/index.html +23 -0
  583. package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
  584. package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
  585. package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
  586. package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
  587. package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
  588. package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
  589. package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
  590. package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
  591. package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
  592. package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
  593. package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
  594. package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
  595. package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
  596. package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
  597. package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
  598. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
  599. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
  600. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
  601. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
  602. package/vendor/framey/dist/warmCheck.js +220 -0
  603. package/vendor/framey/dist/warmCheckClient.js +139 -0
  604. package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
  605. package/vendor/framey-player/LICENSE +190 -0
  606. package/vendor/framey-player/NOTICE +16 -0
  607. package/vendor/framey-player/SOURCE.json +6 -0
  608. package/vendor/framey-player/hyperframes-player.global.js +478 -0
  609. package/vendor/framey.pin +1 -0
  610. package/bin/index.js +0 -3
@@ -0,0 +1,956 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+
8
+ // ../parsers/dist/compositionContract.js
9
+ var COMPOSITION_CONTRACT_VERSION = 1;
10
+ var COMPOSITION_ATTRIBUTES = Object.freeze({
11
+ start: "data-start",
12
+ duration: "data-duration",
13
+ trackIndex: "data-track-index",
14
+ derivedEnd: "data-end",
15
+ legacyTrack: "data-layer"
16
+ });
17
+ var CANONICAL_AUTHORED_TIMING_ATTRIBUTES = Object.freeze([
18
+ COMPOSITION_ATTRIBUTES.start,
19
+ COMPOSITION_ATTRIBUTES.duration,
20
+ COMPOSITION_ATTRIBUTES.trackIndex
21
+ ]);
22
+ var DERIVED_TIMING_ATTRIBUTES = Object.freeze([
23
+ COMPOSITION_ATTRIBUTES.derivedEnd
24
+ ]);
25
+ var LEGACY_TIMING_ATTRIBUTES = Object.freeze([
26
+ COMPOSITION_ATTRIBUTES.derivedEnd,
27
+ COMPOSITION_ATTRIBUTES.legacyTrack
28
+ ]);
29
+ var ClipTimingWriteError = class extends Error {
30
+ code;
31
+ constructor(code, message) {
32
+ super(message);
33
+ this.name = "ClipTimingWriteError";
34
+ this.code = code;
35
+ }
36
+ };
37
+ function parseNumeric(value) {
38
+ if (value == null || value.trim() === "") return null;
39
+ const parsed = Number(value);
40
+ return Number.isFinite(parsed) ? parsed : null;
41
+ }
42
+ var REFERENCE_ID_PATTERN = /^[A-Za-z0-9_.:-]+$/;
43
+ function isAsciiDigitAt(value, index) {
44
+ const code = value.charCodeAt(index);
45
+ return code >= 48 && code <= 57;
46
+ }
47
+ function skipDigitsLeft(value, start) {
48
+ let cursor = start;
49
+ while (cursor >= 0 && isAsciiDigitAt(value, cursor)) cursor--;
50
+ return cursor;
51
+ }
52
+ function skipWhitespaceLeft(value, start) {
53
+ let cursor = start;
54
+ while (cursor >= 0 && (value[cursor] ?? "").trim() === "") cursor--;
55
+ return cursor;
56
+ }
57
+ function findMagnitudeStart(value) {
58
+ const last = value.length - 1;
59
+ if (!isAsciiDigitAt(value, last)) return null;
60
+ let cursor = skipDigitsLeft(value, last);
61
+ if (value[cursor] === ".") cursor = skipDigitsLeft(value, cursor - 1);
62
+ return cursor + 1;
63
+ }
64
+ function parseReferenceOffset(value) {
65
+ const magnitudeStart = findMagnitudeStart(value);
66
+ if (magnitudeStart == null) return null;
67
+ const operatorIndex = skipWhitespaceLeft(value, magnitudeStart - 1);
68
+ const operator = value[operatorIndex];
69
+ if (operator !== "+" && operator !== "-") return null;
70
+ const refId = value.slice(0, operatorIndex).trim();
71
+ if (!REFERENCE_ID_PATTERN.test(refId)) return null;
72
+ const magnitude = Number(value.slice(magnitudeStart));
73
+ if (!Number.isFinite(magnitude)) return null;
74
+ return { refId, operator, magnitude };
75
+ }
76
+ function parseStartExpression(raw) {
77
+ const normalized = (raw ?? "").trim();
78
+ if (!normalized) return null;
79
+ const absolute = parseNumeric(normalized);
80
+ if (absolute != null) return { kind: "absolute", value: absolute };
81
+ if (REFERENCE_ID_PATTERN.test(normalized)) {
82
+ return { kind: "reference", refId: normalized, offset: 0 };
83
+ }
84
+ const reference = parseReferenceOffset(normalized);
85
+ if (!reference) return null;
86
+ return {
87
+ kind: "reference",
88
+ refId: reference.refId,
89
+ offset: reference.operator === "-" ? -reference.magnitude : reference.magnitude
90
+ };
91
+ }
92
+ function pushDiagnostic(diagnostics, code, attribute, value) {
93
+ diagnostics.push({ code, attribute, value });
94
+ }
95
+ function resolveStart(expression, rawStart, options, diagnostics) {
96
+ if (rawStart == null || rawStart.trim() === "") {
97
+ return options.defaultStart === void 0 ? 0 : options.defaultStart;
98
+ }
99
+ if (!expression) {
100
+ pushDiagnostic(diagnostics, "invalid-start", COMPOSITION_ATTRIBUTES.start, rawStart);
101
+ return null;
102
+ }
103
+ if (expression.kind === "absolute") return Math.max(0, expression.value);
104
+ const referencedEnd = options.resolveReferenceEnd?.(expression.refId);
105
+ if (referencedEnd == null || !Number.isFinite(referencedEnd)) {
106
+ pushDiagnostic(
107
+ diagnostics,
108
+ "unresolved-start-reference",
109
+ COMPOSITION_ATTRIBUTES.start,
110
+ rawStart
111
+ );
112
+ return null;
113
+ }
114
+ return Math.max(0, referencedEnd + expression.offset);
115
+ }
116
+ var DERIVED_END_EQUALITY_EPSILON_SECONDS = 1e-9;
117
+ function derivedEndsAreConsistent(parsedEnd, canonicalEnd) {
118
+ return Math.abs(parsedEnd - canonicalEnd) <= DERIVED_END_EQUALITY_EPSILON_SECONDS;
119
+ }
120
+ function diagnoseDerivedEnd(rawEnd, canonicalEnd, diagnostics) {
121
+ const parsedEnd = parseNumeric(rawEnd);
122
+ if (parsedEnd == null) {
123
+ pushDiagnostic(diagnostics, "deprecated-end", COMPOSITION_ATTRIBUTES.derivedEnd, rawEnd);
124
+ pushDiagnostic(diagnostics, "invalid-end", COMPOSITION_ATTRIBUTES.derivedEnd, rawEnd);
125
+ return;
126
+ }
127
+ if (canonicalEnd == null) {
128
+ pushDiagnostic(diagnostics, "deprecated-end", COMPOSITION_ATTRIBUTES.derivedEnd, rawEnd);
129
+ return;
130
+ }
131
+ if (derivedEndsAreConsistent(parsedEnd, canonicalEnd)) {
132
+ return;
133
+ }
134
+ pushDiagnostic(diagnostics, "deprecated-end", COMPOSITION_ATTRIBUTES.derivedEnd, rawEnd);
135
+ pushDiagnostic(diagnostics, "conflicting-end", COMPOSITION_ATTRIBUTES.derivedEnd, rawEnd);
136
+ }
137
+ function readCanonicalDuration(rawDuration, start, diagnostics) {
138
+ const duration = parseNumeric(rawDuration);
139
+ if (duration == null || duration < 0) {
140
+ pushDiagnostic(diagnostics, "invalid-duration", COMPOSITION_ATTRIBUTES.duration, rawDuration);
141
+ return { duration: null, end: null, durationSource: "invalid" };
142
+ }
143
+ return {
144
+ duration,
145
+ end: start == null ? null : start + duration,
146
+ durationSource: "duration"
147
+ };
148
+ }
149
+ function readLegacyEnd(rawEnd, start, diagnostics) {
150
+ pushDiagnostic(diagnostics, "deprecated-end", COMPOSITION_ATTRIBUTES.derivedEnd, rawEnd);
151
+ const end = parseNumeric(rawEnd);
152
+ if (end == null) {
153
+ pushDiagnostic(diagnostics, "invalid-end", COMPOSITION_ATTRIBUTES.derivedEnd, rawEnd);
154
+ return { duration: null, end: null, durationSource: "invalid" };
155
+ }
156
+ if (start == null) return { duration: null, end, durationSource: "legacy-end" };
157
+ if (end < start) {
158
+ pushDiagnostic(diagnostics, "end-before-start", COMPOSITION_ATTRIBUTES.derivedEnd, rawEnd);
159
+ return { duration: null, end: null, durationSource: "invalid" };
160
+ }
161
+ return { duration: end - start, end, durationSource: "legacy-end" };
162
+ }
163
+ function readDuration(attributes, start, diagnostics) {
164
+ const rawDuration = attributes.getAttribute(COMPOSITION_ATTRIBUTES.duration);
165
+ const rawEnd = attributes.getAttribute(COMPOSITION_ATTRIBUTES.derivedEnd);
166
+ if (rawDuration == null) {
167
+ return rawEnd == null ? { duration: null, end: null, durationSource: "missing" } : readLegacyEnd(rawEnd, start, diagnostics);
168
+ }
169
+ const canonical = readCanonicalDuration(rawDuration, start, diagnostics);
170
+ if (rawEnd != null) diagnoseDerivedEnd(rawEnd, canonical.end, diagnostics);
171
+ return canonical;
172
+ }
173
+ function readTrackValue(rawValue, attribute, source, diagnostics) {
174
+ const trackIndex = parseNumeric(rawValue);
175
+ if (trackIndex == null || !Number.isInteger(trackIndex)) {
176
+ pushDiagnostic(diagnostics, "invalid-track-index", attribute, rawValue);
177
+ return { trackIndex: 0, trackSource: "invalid" };
178
+ }
179
+ return { trackIndex, trackSource: source };
180
+ }
181
+ function readTrack(attributes, diagnostics) {
182
+ const rawTrack = attributes.getAttribute(COMPOSITION_ATTRIBUTES.trackIndex);
183
+ const rawLayer = attributes.getAttribute(COMPOSITION_ATTRIBUTES.legacyTrack);
184
+ if (rawTrack == null && rawLayer == null) return { trackIndex: 0, trackSource: "default" };
185
+ if (rawTrack == null && rawLayer != null) {
186
+ pushDiagnostic(diagnostics, "deprecated-layer", COMPOSITION_ATTRIBUTES.legacyTrack, rawLayer);
187
+ return readTrackValue(
188
+ rawLayer,
189
+ COMPOSITION_ATTRIBUTES.legacyTrack,
190
+ "legacy-layer",
191
+ diagnostics
192
+ );
193
+ }
194
+ const canonical = readTrackValue(
195
+ rawTrack ?? "",
196
+ COMPOSITION_ATTRIBUTES.trackIndex,
197
+ "track-index",
198
+ diagnostics
199
+ );
200
+ if (rawLayer == null) return canonical;
201
+ pushDiagnostic(diagnostics, "deprecated-layer", COMPOSITION_ATTRIBUTES.legacyTrack, rawLayer);
202
+ const parsedLayer = parseNumeric(rawLayer);
203
+ if (parsedLayer != null && parsedLayer !== canonical.trackIndex) {
204
+ pushDiagnostic(diagnostics, "conflicting-layer", COMPOSITION_ATTRIBUTES.legacyTrack, rawLayer);
205
+ }
206
+ return canonical;
207
+ }
208
+ function readClipTiming(attributes, options = {}) {
209
+ const diagnostics = [];
210
+ const rawStart = attributes.getAttribute(COMPOSITION_ATTRIBUTES.start);
211
+ const startExpression = parseStartExpression(rawStart);
212
+ const start = resolveStart(startExpression, rawStart, options, diagnostics);
213
+ const duration = readDuration(attributes, start, diagnostics);
214
+ const track = readTrack(attributes, diagnostics);
215
+ return { startExpression, start, ...duration, ...track, diagnostics };
216
+ }
217
+ function serializeStartNumber(start) {
218
+ if (!Number.isFinite(start)) {
219
+ throw new ClipTimingWriteError("invalid-start", "start must be finite");
220
+ }
221
+ return String(start);
222
+ }
223
+ function serializeStartReference(start) {
224
+ if (start.kind === "absolute") return serializeStartNumber(start.value);
225
+ if (!start.refId || !Number.isFinite(start.offset)) {
226
+ throw new ClipTimingWriteError(
227
+ "invalid-start",
228
+ "reference start must have an id and finite offset"
229
+ );
230
+ }
231
+ if (start.offset === 0) return start.refId;
232
+ return `${start.refId} ${start.offset < 0 ? "-" : "+"} ${Math.abs(start.offset)}`;
233
+ }
234
+ function serializeStart(start) {
235
+ if (typeof start === "number") return serializeStartNumber(start);
236
+ if (typeof start === "object" && start != null) return serializeStartReference(start);
237
+ if (typeof start === "string" && parseStartExpression(start)) return start.trim();
238
+ throw new ClipTimingWriteError("invalid-start", `invalid start expression: ${start ?? ""}`);
239
+ }
240
+ function writeDuration(attributes, duration, current) {
241
+ if (duration === null) {
242
+ attributes.removeAttribute(COMPOSITION_ATTRIBUTES.duration);
243
+ return;
244
+ }
245
+ if (duration === void 0) {
246
+ if (attributes.getAttribute(COMPOSITION_ATTRIBUTES.duration) == null && current.duration != null) {
247
+ attributes.setAttribute(COMPOSITION_ATTRIBUTES.duration, String(current.duration));
248
+ }
249
+ return;
250
+ }
251
+ if (!Number.isFinite(duration) || duration < 0) {
252
+ throw new ClipTimingWriteError(
253
+ "invalid-duration",
254
+ "duration must be a finite, non-negative number"
255
+ );
256
+ }
257
+ attributes.setAttribute(COMPOSITION_ATTRIBUTES.duration, String(duration));
258
+ }
259
+ function writeTrack(attributes, trackIndex, current) {
260
+ if (trackIndex === null) {
261
+ attributes.removeAttribute(COMPOSITION_ATTRIBUTES.trackIndex);
262
+ return;
263
+ }
264
+ if (trackIndex === void 0) {
265
+ if (attributes.getAttribute(COMPOSITION_ATTRIBUTES.trackIndex) == null && current.trackSource === "legacy-layer") {
266
+ attributes.setAttribute(COMPOSITION_ATTRIBUTES.trackIndex, String(current.trackIndex));
267
+ }
268
+ return;
269
+ }
270
+ if (!Number.isFinite(trackIndex) || !Number.isInteger(trackIndex)) {
271
+ throw new ClipTimingWriteError("invalid-track-index", "trackIndex must be a finite integer");
272
+ }
273
+ attributes.setAttribute(COMPOSITION_ATTRIBUTES.trackIndex, String(trackIndex));
274
+ }
275
+ function writeClipTiming(attributes, update) {
276
+ const current = readClipTiming(attributes);
277
+ if (update.start !== void 0) {
278
+ attributes.setAttribute(COMPOSITION_ATTRIBUTES.start, serializeStart(update.start));
279
+ }
280
+ writeDuration(attributes, update.duration, current);
281
+ writeTrack(attributes, update.trackIndex, current);
282
+ const preserveUnresolvedLegacyEnd = update.duration === void 0 && attributes.getAttribute(COMPOSITION_ATTRIBUTES.duration) == null && attributes.getAttribute(COMPOSITION_ATTRIBUTES.derivedEnd) != null && current.duration == null;
283
+ if (!preserveUnresolvedLegacyEnd) {
284
+ attributes.removeAttribute(COMPOSITION_ATTRIBUTES.derivedEnd);
285
+ }
286
+ attributes.removeAttribute(COMPOSITION_ATTRIBUTES.legacyTrack);
287
+ return readClipTiming(attributes);
288
+ }
289
+
290
+ // ../parsers/dist/subCompositionValidity.js
291
+ function resolveSubCompositionContent(html, document) {
292
+ const template = document.querySelector("template");
293
+ if (template) return { contentHtml: template.innerHTML ?? "", hasTemplate: true };
294
+ const body = document.querySelector("body");
295
+ if (body) return { contentHtml: body.innerHTML ?? "", hasTemplate: false };
296
+ const contentHtml = document.querySelector("html") ? "" : html;
297
+ return { contentHtml, hasTemplate: false };
298
+ }
299
+ function checkSubCompositionUsability(html, parseHtml) {
300
+ if (html == null || !html.trim()) {
301
+ return {
302
+ ok: false,
303
+ reason: "empty",
304
+ detail: "the file is empty (0 bytes or whitespace-only)"
305
+ };
306
+ }
307
+ const compDoc = parseHtml(html);
308
+ if (!compDoc.documentElement) {
309
+ return {
310
+ ok: false,
311
+ reason: "unparsable",
312
+ detail: "the file's contents could not be parsed as HTML"
313
+ };
314
+ }
315
+ const { contentHtml } = resolveSubCompositionContent(html, compDoc);
316
+ if (!contentHtml.trim()) {
317
+ return {
318
+ ok: false,
319
+ reason: "no-content",
320
+ detail: "the file has no <template> or <body> content to render"
321
+ };
322
+ }
323
+ const contentDoc = parseHtml(contentHtml);
324
+ if (!contentDoc.documentElement) {
325
+ return {
326
+ ok: false,
327
+ reason: "unparsable",
328
+ detail: "the file's resolved contents could not be parsed as HTML"
329
+ };
330
+ }
331
+ if (!contentDoc.querySelector("[data-composition-id]")) {
332
+ return {
333
+ ok: false,
334
+ reason: "no-composition-root",
335
+ detail: "the file's resolved content has no element with a data-composition-id attribute"
336
+ };
337
+ }
338
+ return { ok: true };
339
+ }
340
+
341
+ // ../parsers/dist/colorGradingContract.js
342
+ var COLOR_GRADING_CONTRACT_VERSION = 2;
343
+ var COLOR_GRADING_COLOR_SPACE = "rec709";
344
+ var COLOR_GRADING_MAX_CURVE_POINTS = 16;
345
+ var COLOR_GRADING_MAX_SECONDARIES = 4;
346
+ var COLOR_GRADING_SOURCE_TAGS = ["video", "img", "canvas"];
347
+ var COLOR_GRADING_ADVANCED_LIMITS = {
348
+ hueDegrees: { min: 0, max: 360, inclusiveMax: false },
349
+ unit: { min: 0, max: 1 },
350
+ signedUnit: { min: -1, max: 1 },
351
+ secondaryHueRange: { min: 0, max: 180 },
352
+ secondaryHueSoftness: { min: 0, max: 180 },
353
+ secondaryHueCombinedMax: 180,
354
+ secondarySoftRangeSoftness: { min: 0, max: 0.5 },
355
+ secondaryHueShift: { min: -180, max: 180 },
356
+ effects: {
357
+ asciiStyle: { min: 0, max: 7 },
358
+ bloom: { min: 0, max: 3 },
359
+ bloomRadius: { min: 1, max: 100 },
360
+ monoScreenShape: { min: 0, max: 4 }
361
+ }
362
+ };
363
+ var COLOR_GRADING_TOP_LEVEL_KEYS = [
364
+ "enabled",
365
+ "preset",
366
+ "intensity",
367
+ "adjust",
368
+ "wheels",
369
+ "curves",
370
+ "hueCurves",
371
+ "secondaries",
372
+ "details",
373
+ "effects",
374
+ "palette",
375
+ "lut",
376
+ "colorSpace"
377
+ ];
378
+ var COLOR_GRADING_ADJUST_KEYS = [
379
+ "exposure",
380
+ "contrast",
381
+ "highlights",
382
+ "shadows",
383
+ "whites",
384
+ "blacks",
385
+ "temperature",
386
+ "tint",
387
+ "vibrance",
388
+ "saturation"
389
+ ];
390
+ var COLOR_GRADING_EXAMPLE = {
391
+ adjust: { exposure: 0.1, contrast: 0.05, temperature: 0.08 },
392
+ details: { vignette: 0.15 }
393
+ };
394
+ var COLOR_GRADING_WHEEL_KEYS = ["shadows", "midtones", "highlights"];
395
+ var COLOR_GRADING_CURVE_KEYS = ["master", "red", "green", "blue"];
396
+ var COLOR_GRADING_HUE_CURVE_KEYS = ["hueVsHue", "hueVsSaturation", "hueVsLuma"];
397
+ var COLOR_GRADING_WHEEL_CONTROL_KEYS = ["hue", "amount", "level"];
398
+ var COLOR_GRADING_SECONDARY_KEYS = ["enabled", "key", "correction"];
399
+ var COLOR_GRADING_SECONDARY_KEY_KEYS = ["hue", "saturation", "luma"];
400
+ var COLOR_GRADING_HUE_RANGE_KEYS = ["center", "range", "softness"];
401
+ var COLOR_GRADING_SOFT_RANGE_KEYS = ["min", "max", "softness"];
402
+ var COLOR_GRADING_SECONDARY_CORRECTION_KEYS = [
403
+ "hueShift",
404
+ "saturation",
405
+ "luma",
406
+ "temperature",
407
+ "tint"
408
+ ];
409
+ var COLOR_GRADING_DETAIL_KEYS = [
410
+ "vignette",
411
+ "vignetteMidpoint",
412
+ "vignetteRoundness",
413
+ "vignetteFeather",
414
+ "grain",
415
+ "grainSize",
416
+ "grainRoughness"
417
+ ];
418
+ var COLOR_GRADING_EFFECT_KEYS = [
419
+ "blur",
420
+ "pixelate",
421
+ "chromaBleed",
422
+ "tapeDamage",
423
+ "tapeTracking",
424
+ "tapeNoise",
425
+ "tapeSpeed",
426
+ "filmArtifacts",
427
+ "halftone",
428
+ "halftoneSize",
429
+ "twoInkPrint",
430
+ "twoInkPrintSize",
431
+ "ascii",
432
+ "asciiSize",
433
+ "asciiInvert",
434
+ "asciiStyle",
435
+ "asciiColor",
436
+ "asciiRotation",
437
+ "dither",
438
+ "ditherSize",
439
+ "bloom",
440
+ "bloomRadius",
441
+ "monoScreen",
442
+ "monoScreenSize",
443
+ "monoScreenAngle",
444
+ "monoScreenSpread",
445
+ "monoScreenShape",
446
+ "monoScreenInvert",
447
+ "scanlines",
448
+ "scanlineCount",
449
+ "scanlineSoftness",
450
+ "chromaticAberration",
451
+ "chromaticAngle",
452
+ "crtCurvature",
453
+ "digitalGlitch",
454
+ "digitalGlitchColorSplit",
455
+ "digitalGlitchLineTear",
456
+ "digitalGlitchPixelate",
457
+ "digitalGlitchBlockAmount",
458
+ "digitalGlitchBlockDisplacement",
459
+ "digitalGlitchBlockOpacity",
460
+ "digitalGlitchSpeed",
461
+ "engraving",
462
+ "engravingSpacing",
463
+ "engravingMinThickness",
464
+ "engravingMaxThickness",
465
+ "engravingAngle",
466
+ "engravingContrast",
467
+ "engravingSharpness",
468
+ "engravingWave",
469
+ "engravingWaveFrequency",
470
+ "crosshatch",
471
+ "crosshatchSpacing",
472
+ "crosshatchThickness",
473
+ "crosshatchAngle",
474
+ "crosshatchContrast",
475
+ "crosshatchEdges",
476
+ "crosshatchLineWeight",
477
+ "crosshatchWave",
478
+ "crosshatchWaveFrequency",
479
+ "kuwahara",
480
+ "kuwaharaRadius",
481
+ "kuwaharaSharpness",
482
+ "kuwaharaSaturation"
483
+ ];
484
+ var COLOR_GRADING_LUT_KEYS = ["src", "intensity"];
485
+ var UNIT_LIMIT = COLOR_GRADING_ADVANCED_LIMITS.unit;
486
+ var SIGNED_UNIT_LIMIT = COLOR_GRADING_ADVANCED_LIMITS.signedUnit;
487
+ var EFFECT_LIMIT_OVERRIDES = COLOR_GRADING_ADVANCED_LIMITS.effects;
488
+ var VARIABLE_REF = /^\$(?:\{[A-Za-z0-9_.:-]+\}|[A-Za-z0-9_.:-]+)$/;
489
+ var PALETTE_COLOR = /^#[0-9a-f]{6}$/i;
490
+ var OBJECT_SECTIONS = [
491
+ ["adjust", COLOR_GRADING_ADJUST_KEYS],
492
+ ["details", COLOR_GRADING_DETAIL_KEYS],
493
+ ["effects", COLOR_GRADING_EFFECT_KEYS],
494
+ ["lut", COLOR_GRADING_LUT_KEYS]
495
+ ];
496
+ function isRecord(value) {
497
+ return typeof value === "object" && value !== null && !Array.isArray(value);
498
+ }
499
+ function isColorGradingVariableRef(value) {
500
+ return typeof value === "string" && VARIABLE_REF.test(value.trim());
501
+ }
502
+ function unknownKeysHint(path, unknown) {
503
+ if (path !== "grading") return `Correct or remove the unsupported "${path}" keys.`;
504
+ const sections = new Set(
505
+ unknown.flatMap(
506
+ (key) => OBJECT_SECTIONS.filter(([, keys]) => keys.includes(key)).map(
507
+ ([section]) => section
508
+ )
509
+ )
510
+ );
511
+ return sections.size === 1 ? `Move those controls under "${[...sections][0]}".` : `Top-level keys are ${COLOR_GRADING_TOP_LEVEL_KEYS.map((key) => `"${key}"`).join(", ")}.`;
512
+ }
513
+ function validateObject(value, path, keys, issues) {
514
+ if (isColorGradingVariableRef(value)) return null;
515
+ if (!isRecord(value)) {
516
+ issues.push({ path, message: "must be an object or variable reference" });
517
+ return null;
518
+ }
519
+ const allowed = new Set(keys);
520
+ const unknown = Object.keys(value).filter((key) => !allowed.has(key));
521
+ if (unknown.length > 0) {
522
+ issues.push({
523
+ path,
524
+ message: `has unsupported key(s): ${unknown.join(", ")}`,
525
+ hint: unknownKeysHint(path, unknown)
526
+ });
527
+ }
528
+ return value;
529
+ }
530
+ function isNumberInRange(value, limit, inclusiveMax) {
531
+ if (typeof value !== "number" || !Number.isFinite(value) || value < limit.min) return false;
532
+ return inclusiveMax ? value <= limit.max : value < limit.max;
533
+ }
534
+ function validateNumericField(value, key, path, limit, issues, inclusiveMax = true) {
535
+ const candidate = value[key];
536
+ if (candidate === void 0 || isColorGradingVariableRef(candidate)) return;
537
+ if (isNumberInRange(candidate, limit, inclusiveMax)) return;
538
+ issues.push({
539
+ path: path ? `${path}.${key}` : key,
540
+ message: `must be a finite number from ${limit.min} ${inclusiveMax ? "through" : "up to"} ${limit.max}`
541
+ });
542
+ }
543
+ function isFiniteTuple(value) {
544
+ return Array.isArray(value) && value.length === 2 && value.every((coordinate) => typeof coordinate === "number" && Number.isFinite(coordinate));
545
+ }
546
+ function validateCurve(value, path, issues) {
547
+ if (isColorGradingVariableRef(value)) return;
548
+ if (!Array.isArray(value) || value.length < 2 || value.length > COLOR_GRADING_MAX_CURVE_POINTS) {
549
+ issues.push({
550
+ path,
551
+ message: `must contain 2 to ${COLOR_GRADING_MAX_CURVE_POINTS} [input, output] points`
552
+ });
553
+ return;
554
+ }
555
+ const inputs = /* @__PURE__ */ new Set();
556
+ value.forEach((point, index) => {
557
+ if (!isFiniteTuple(point)) {
558
+ issues.push({ path: `${path}[${index}]`, message: "must be a finite [input, output] tuple" });
559
+ return;
560
+ }
561
+ const [input, output] = point;
562
+ if (input < 0 || input > 1 || output < 0 || output > 1) {
563
+ issues.push({ path: `${path}[${index}]`, message: "coordinates must be between 0 and 1" });
564
+ }
565
+ if (inputs.has(input)) issues.push({ path, message: `contains duplicate input ${input}` });
566
+ inputs.add(input);
567
+ });
568
+ const inferredPointCount = value.length + (inputs.has(0) ? 0 : 1) + (inputs.has(1) ? 0 : 1);
569
+ if (inferredPointCount > COLOR_GRADING_MAX_CURVE_POINTS) {
570
+ issues.push({
571
+ path,
572
+ message: `must contain at most ${COLOR_GRADING_MAX_CURVE_POINTS} points including inferred 0 and 1 endpoints`
573
+ });
574
+ }
575
+ }
576
+ function validateHueCurve(value, path, outputMin, outputMax, issues) {
577
+ if (isColorGradingVariableRef(value)) return;
578
+ if (!Array.isArray(value) || value.length < 3 || value.length > COLOR_GRADING_MAX_CURVE_POINTS) {
579
+ issues.push({
580
+ path,
581
+ message: `must contain 3 to ${COLOR_GRADING_MAX_CURVE_POINTS} [hueDegrees, delta] points`
582
+ });
583
+ return;
584
+ }
585
+ const hues = /* @__PURE__ */ new Set();
586
+ value.forEach((point, index) => {
587
+ if (!isFiniteTuple(point)) {
588
+ issues.push({ path: `${path}[${index}]`, message: "must be a finite [hue, delta] tuple" });
589
+ return;
590
+ }
591
+ const [hue, delta] = point;
592
+ if (hue < 0 || hue >= 360) {
593
+ issues.push({ path: `${path}[${index}][0]`, message: "must be from 0 up to 360 degrees" });
594
+ }
595
+ if (delta < outputMin || delta > outputMax) {
596
+ issues.push({
597
+ path: `${path}[${index}][1]`,
598
+ message: `must be between ${outputMin} and ${outputMax}`
599
+ });
600
+ }
601
+ if (hues.has(hue)) issues.push({ path, message: `contains duplicate hue ${hue}` });
602
+ hues.add(hue);
603
+ });
604
+ }
605
+ function validateNumericSection(value, path, keys, limitFor, issues) {
606
+ for (const key of keys) validateNumericField(value, key, path, limitFor(key), issues);
607
+ }
608
+ function validatePalette(value, issues) {
609
+ if (value === void 0 || value === null || isColorGradingVariableRef(value)) return;
610
+ const hint = 'Use 2 to 6 colors in the intended mapping order, each written as exact "#RRGGBB", or use a project variable reference.';
611
+ if (!Array.isArray(value) || value.length < 2 || value.length > 6) {
612
+ issues.push({ path: "palette", message: "must contain 2 to 6 hex colors", hint });
613
+ return;
614
+ }
615
+ value.forEach((color, index) => {
616
+ if (typeof color !== "string" || !PALETTE_COLOR.test(color)) {
617
+ issues.push({
618
+ path: `palette[${index}]`,
619
+ message: "must be a six-digit hex color",
620
+ hint
621
+ });
622
+ }
623
+ });
624
+ }
625
+ function validateLut(value, object, issues) {
626
+ if (typeof value === "string") {
627
+ if (!value.trim()) issues.push({ path: "lut", message: "must not be empty" });
628
+ return;
629
+ }
630
+ if (!object) return;
631
+ if (!isColorGradingVariableRef(object.src) && (typeof object.src !== "string" || !object.src.trim())) {
632
+ issues.push({
633
+ path: "lut.src",
634
+ message: "must be a non-empty string or variable reference"
635
+ });
636
+ }
637
+ validateNumericField(object, "intensity", "lut", UNIT_LIMIT, issues);
638
+ }
639
+ function validateEnabled(grading, issues) {
640
+ if (grading.enabled !== void 0 && !isColorGradingVariableRef(grading.enabled) && typeof grading.enabled !== "boolean") {
641
+ issues.push({ path: "enabled", message: "must be a boolean or variable reference" });
642
+ }
643
+ }
644
+ function validatePreset(grading, issues) {
645
+ if (grading.preset !== void 0 && grading.preset !== null && !isColorGradingVariableRef(grading.preset) && (typeof grading.preset !== "string" || !grading.preset.trim())) {
646
+ issues.push({
647
+ path: "preset",
648
+ message: "must be a non-empty string, null, or variable reference"
649
+ });
650
+ }
651
+ }
652
+ function validateColorSpace(grading, issues) {
653
+ if (grading.colorSpace !== void 0 && !isColorGradingVariableRef(grading.colorSpace) && grading.colorSpace !== COLOR_GRADING_COLOR_SPACE) {
654
+ issues.push({
655
+ path: "colorSpace",
656
+ message: `must be "${COLOR_GRADING_COLOR_SPACE}" or a variable reference`
657
+ });
658
+ }
659
+ }
660
+ function validateTopLevel(grading, issues) {
661
+ validateEnabled(grading, issues);
662
+ validateNumericField(grading, "intensity", "", UNIT_LIMIT, issues);
663
+ validatePreset(grading, issues);
664
+ validateColorSpace(grading, issues);
665
+ }
666
+ function validateSection(grading, key, keys, issues) {
667
+ const section = grading[key];
668
+ if (section === void 0 || key === "lut" && section === null) return;
669
+ if (key === "lut" && typeof section === "string") {
670
+ validateLut(section, null, issues);
671
+ return;
672
+ }
673
+ const object = validateObject(section, key, keys, issues);
674
+ if (!object) return;
675
+ if (key === "lut") return validateLut(section, object, issues);
676
+ const limitFor = (control) => {
677
+ if (key === "adjust" && control === "exposure") return { min: -2, max: 2 };
678
+ if (key === "adjust" || key === "details" && control === "vignetteRoundness") {
679
+ return SIGNED_UNIT_LIMIT;
680
+ }
681
+ return key === "effects" ? EFFECT_LIMIT_OVERRIDES[control] ?? UNIT_LIMIT : UNIT_LIMIT;
682
+ };
683
+ validateNumericSection(object, key, keys, limitFor, issues);
684
+ }
685
+ function validateSections(grading, issues) {
686
+ for (const [key, keys] of OBJECT_SECTIONS) validateSection(grading, key, keys, issues);
687
+ }
688
+ function validateWheels(value, issues) {
689
+ if (value === void 0 || isColorGradingVariableRef(value)) return;
690
+ const wheels = validateObject(value, "wheels", COLOR_GRADING_WHEEL_KEYS, issues);
691
+ if (!wheels) return;
692
+ for (const wheel of COLOR_GRADING_WHEEL_KEYS) {
693
+ if (wheels[wheel] === void 0) continue;
694
+ const path = `wheels.${wheel}`;
695
+ const controls = validateObject(wheels[wheel], path, COLOR_GRADING_WHEEL_CONTROL_KEYS, issues);
696
+ if (!controls) continue;
697
+ validateNumericField(
698
+ controls,
699
+ "hue",
700
+ path,
701
+ COLOR_GRADING_ADVANCED_LIMITS.hueDegrees,
702
+ issues,
703
+ COLOR_GRADING_ADVANCED_LIMITS.hueDegrees.inclusiveMax
704
+ );
705
+ validateNumericField(controls, "amount", path, UNIT_LIMIT, issues);
706
+ validateNumericField(controls, "level", path, SIGNED_UNIT_LIMIT, issues);
707
+ }
708
+ }
709
+ function validateCurves(value, issues) {
710
+ if (value === void 0 || isColorGradingVariableRef(value)) return;
711
+ const curves = validateObject(value, "curves", COLOR_GRADING_CURVE_KEYS, issues);
712
+ if (!curves) return;
713
+ for (const key of COLOR_GRADING_CURVE_KEYS) {
714
+ if (curves[key] !== void 0) validateCurve(curves[key], `curves.${key}`, issues);
715
+ }
716
+ }
717
+ function validateHueCurves(value, issues) {
718
+ if (value === void 0 || isColorGradingVariableRef(value)) return;
719
+ const curves = validateObject(value, "hueCurves", COLOR_GRADING_HUE_CURVE_KEYS, issues);
720
+ if (!curves) return;
721
+ const limits = {
722
+ hueVsHue: [-180, 180],
723
+ hueVsSaturation: [-1, 1],
724
+ hueVsLuma: [-1, 1]
725
+ };
726
+ for (const key of COLOR_GRADING_HUE_CURVE_KEYS) {
727
+ if (curves[key] !== void 0) {
728
+ validateHueCurve(curves[key], `hueCurves.${key}`, limits[key][0], limits[key][1], issues);
729
+ }
730
+ }
731
+ }
732
+ function validateSoftRange(value, path, issues) {
733
+ const range = validateObject(value, path, COLOR_GRADING_SOFT_RANGE_KEYS, issues);
734
+ if (!range) return;
735
+ validateNumericField(range, "min", path, UNIT_LIMIT, issues);
736
+ validateNumericField(range, "max", path, UNIT_LIMIT, issues);
737
+ validateNumericField(
738
+ range,
739
+ "softness",
740
+ path,
741
+ COLOR_GRADING_ADVANCED_LIMITS.secondarySoftRangeSoftness,
742
+ issues
743
+ );
744
+ if (typeof range.min === "number" && typeof range.max === "number" && range.min >= range.max) {
745
+ issues.push({ path, message: "min must be smaller than max" });
746
+ }
747
+ }
748
+ function validateSecondaryHue(value, path, issues) {
749
+ const hue = validateObject(value, path, COLOR_GRADING_HUE_RANGE_KEYS, issues);
750
+ if (!hue) return;
751
+ validateNumericField(
752
+ hue,
753
+ "center",
754
+ path,
755
+ COLOR_GRADING_ADVANCED_LIMITS.hueDegrees,
756
+ issues,
757
+ COLOR_GRADING_ADVANCED_LIMITS.hueDegrees.inclusiveMax
758
+ );
759
+ validateNumericField(hue, "range", path, COLOR_GRADING_ADVANCED_LIMITS.secondaryHueRange, issues);
760
+ validateNumericField(
761
+ hue,
762
+ "softness",
763
+ path,
764
+ COLOR_GRADING_ADVANCED_LIMITS.secondaryHueSoftness,
765
+ issues
766
+ );
767
+ if (typeof hue.range === "number" && typeof hue.softness === "number" && hue.range + hue.softness > COLOR_GRADING_ADVANCED_LIMITS.secondaryHueCombinedMax) {
768
+ issues.push({
769
+ path,
770
+ message: `range plus softness must not exceed ${COLOR_GRADING_ADVANCED_LIMITS.secondaryHueCombinedMax} degrees`
771
+ });
772
+ }
773
+ }
774
+ function validateSecondaryKey(value, path, issues) {
775
+ const key = validateObject(value, path, COLOR_GRADING_SECONDARY_KEY_KEYS, issues);
776
+ if (!key) return;
777
+ if (key.hue !== void 0) validateSecondaryHue(key.hue, `${path}.hue`, issues);
778
+ if (key.saturation !== void 0) validateSoftRange(key.saturation, `${path}.saturation`, issues);
779
+ if (key.luma !== void 0) validateSoftRange(key.luma, `${path}.luma`, issues);
780
+ }
781
+ function validateSecondaryCorrection(value, path, issues) {
782
+ const correction = validateObject(value, path, COLOR_GRADING_SECONDARY_CORRECTION_KEYS, issues);
783
+ if (!correction) return;
784
+ validateNumericField(
785
+ correction,
786
+ "hueShift",
787
+ path,
788
+ COLOR_GRADING_ADVANCED_LIMITS.secondaryHueShift,
789
+ issues
790
+ );
791
+ for (const key of ["saturation", "luma", "temperature", "tint"]) {
792
+ validateNumericField(correction, key, path, SIGNED_UNIT_LIMIT, issues);
793
+ }
794
+ }
795
+ function validateSecondary(value, index, issues) {
796
+ const path = `secondaries[${index}]`;
797
+ const secondary = validateObject(value, path, COLOR_GRADING_SECONDARY_KEYS, issues);
798
+ if (!secondary) return;
799
+ if (secondary.enabled !== void 0 && typeof secondary.enabled !== "boolean" && !isColorGradingVariableRef(secondary.enabled)) {
800
+ issues.push({ path: `${path}.enabled`, message: "must be a boolean" });
801
+ }
802
+ validateSecondaryKey(secondary.key, `${path}.key`, issues);
803
+ validateSecondaryCorrection(secondary.correction, `${path}.correction`, issues);
804
+ }
805
+ function validateSecondaries(value, issues) {
806
+ if (value === void 0 || isColorGradingVariableRef(value)) return;
807
+ if (!Array.isArray(value) || value.length > COLOR_GRADING_MAX_SECONDARIES) {
808
+ issues.push({
809
+ path: "secondaries",
810
+ message: `must be an array of at most ${COLOR_GRADING_MAX_SECONDARIES} selections`
811
+ });
812
+ return;
813
+ }
814
+ value.forEach((secondary, index) => validateSecondary(secondary, index, issues));
815
+ }
816
+ function validateColorGradingContract(value) {
817
+ if (typeof value === "string") {
818
+ return value.trim() ? [] : [{ path: "grading", message: "is empty" }];
819
+ }
820
+ const issues = [];
821
+ const grading = validateObject(value, "grading", COLOR_GRADING_TOP_LEVEL_KEYS, issues);
822
+ if (!grading) return issues;
823
+ validateTopLevel(grading, issues);
824
+ validateSections(grading, issues);
825
+ validateWheels(grading.wheels, issues);
826
+ validateCurves(grading.curves, issues);
827
+ validateHueCurves(grading.hueCurves, issues);
828
+ validateSecondaries(grading.secondaries, issues);
829
+ validatePalette(grading.palette, issues);
830
+ return issues;
831
+ }
832
+
833
+ // ../parsers/dist/mediaTiming.js
834
+ var COMPOSITION_ATTRIBUTES2 = Object.freeze({
835
+ start: "data-start",
836
+ duration: "data-duration",
837
+ trackIndex: "data-track-index",
838
+ derivedEnd: "data-end",
839
+ legacyTrack: "data-layer"
840
+ });
841
+ var CANONICAL_AUTHORED_TIMING_ATTRIBUTES2 = Object.freeze([
842
+ COMPOSITION_ATTRIBUTES2.start,
843
+ COMPOSITION_ATTRIBUTES2.duration,
844
+ COMPOSITION_ATTRIBUTES2.trackIndex
845
+ ]);
846
+ var DERIVED_TIMING_ATTRIBUTES2 = Object.freeze([
847
+ COMPOSITION_ATTRIBUTES2.derivedEnd
848
+ ]);
849
+ var LEGACY_TIMING_ATTRIBUTES2 = Object.freeze([
850
+ COMPOSITION_ATTRIBUTES2.derivedEnd,
851
+ COMPOSITION_ATTRIBUTES2.legacyTrack
852
+ ]);
853
+ function parseNumeric2(value) {
854
+ if (value == null || value.trim() === "") return null;
855
+ const parsed = Number(value);
856
+ return Number.isFinite(parsed) ? parsed : null;
857
+ }
858
+ var nonNegative = (raw) => {
859
+ const value = parseNumeric2(raw);
860
+ return value !== null && value >= 0 ? value : null;
861
+ };
862
+ function readMediaOffsetSeconds(getAttr) {
863
+ return nonNegative(getAttr("data-playback-start")) ?? nonNegative(getAttr("data-media-start")) ?? 0;
864
+ }
865
+ var MEDIA_START_BASIS_ATTR = "data-hf-media-start-basis";
866
+ function readMediaStartBasis(value) {
867
+ return value?.trim().toLowerCase() === "global" ? "global" : "local";
868
+ }
869
+ function resolveAbsoluteMediaStartSeconds(input) {
870
+ return readMediaStartBasis(input.basis) === "global" ? input.authoredStart : input.hostStart + input.authoredStart;
871
+ }
872
+ function resolveMediaStartSeconds(input) {
873
+ if (!hasLiteralNestedStart(input)) return input.ordinaryStart();
874
+ return resolveAbsoluteMediaStartSeconds({
875
+ authoredStart: input.authoredStart,
876
+ hostStart: input.hostStart,
877
+ basis: input.basis
878
+ });
879
+ }
880
+ function isRootGlobalMediaStart(input) {
881
+ return hasLiteralNestedStart(input) && readMediaStartBasis(input.basis) === "global";
882
+ }
883
+ function hasLiteralNestedStart(input) {
884
+ return !input.hasAutoStart && input.authoredStart != null && input.hostStart !== 0;
885
+ }
886
+ function hostInPointSeconds(host) {
887
+ return readMediaOffsetSeconds((name) => host.getAttribute(name));
888
+ }
889
+ function compositionOriginSeconds(hostStart, host) {
890
+ return hostStart - hostInPointSeconds(host);
891
+ }
892
+ function cutToHostSlots(span, hosts) {
893
+ return hosts.reduce((kept, host) => {
894
+ const start = Math.max(kept.start, host.start);
895
+ return { start, end: Math.max(start, Math.min(kept.end, host.end)) };
896
+ }, span);
897
+ }
898
+
899
+ // ../parsers/dist/timeSpans.js
900
+ var instantTolerance = (time) => 4 * Number.EPSILON * Math.max(1, Math.abs(time));
901
+ function sameInstant(a, b) {
902
+ if (!Number.isFinite(a) || !Number.isFinite(b)) return a === b;
903
+ return Math.abs(a - b) <= instantTolerance(Math.max(Math.abs(a), Math.abs(b)));
904
+ }
905
+ var isBefore = (a, b) => a < b && !sameInstant(a, b);
906
+ function spansOverlap(aStart, aEnd, bStart, bEnd) {
907
+ return isBefore(aStart, bEnd) && isBefore(bStart, aEnd);
908
+ }
909
+ function spansShareTime(aStart, aEnd, bStart, bEnd) {
910
+ return isBefore(Math.max(aStart, bStart), Math.min(aEnd, bEnd));
911
+ }
912
+ var isInsideSpan = (time, start, end) => isBefore(start, time) && isBefore(time, end);
913
+
914
+ export {
915
+ COMPOSITION_CONTRACT_VERSION,
916
+ COMPOSITION_ATTRIBUTES,
917
+ CANONICAL_AUTHORED_TIMING_ATTRIBUTES,
918
+ DERIVED_TIMING_ATTRIBUTES,
919
+ LEGACY_TIMING_ATTRIBUTES,
920
+ ClipTimingWriteError,
921
+ parseNumeric,
922
+ parseStartExpression,
923
+ readClipTiming,
924
+ writeClipTiming,
925
+ resolveSubCompositionContent,
926
+ checkSubCompositionUsability,
927
+ COLOR_GRADING_CONTRACT_VERSION,
928
+ COLOR_GRADING_COLOR_SPACE,
929
+ COLOR_GRADING_MAX_CURVE_POINTS,
930
+ COLOR_GRADING_MAX_SECONDARIES,
931
+ COLOR_GRADING_SOURCE_TAGS,
932
+ COLOR_GRADING_ADVANCED_LIMITS,
933
+ COLOR_GRADING_TOP_LEVEL_KEYS,
934
+ COLOR_GRADING_ADJUST_KEYS,
935
+ COLOR_GRADING_EXAMPLE,
936
+ COLOR_GRADING_WHEEL_KEYS,
937
+ COLOR_GRADING_CURVE_KEYS,
938
+ COLOR_GRADING_HUE_CURVE_KEYS,
939
+ COLOR_GRADING_DETAIL_KEYS,
940
+ COLOR_GRADING_EFFECT_KEYS,
941
+ COLOR_GRADING_LUT_KEYS,
942
+ isColorGradingVariableRef,
943
+ validateColorGradingContract,
944
+ MEDIA_START_BASIS_ATTR,
945
+ readMediaStartBasis,
946
+ resolveAbsoluteMediaStartSeconds,
947
+ resolveMediaStartSeconds,
948
+ isRootGlobalMediaStart,
949
+ hostInPointSeconds,
950
+ compositionOriginSeconds,
951
+ cutToHostSlots,
952
+ sameInstant,
953
+ spansOverlap,
954
+ spansShareTime,
955
+ isInsideSpan
956
+ };