hyperframes 0.8.189 → 0.8.191

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 (181) hide show
  1. package/dist/{add-TIKUM2YX.js → add-S2ZQYG52.js} +11 -11
  2. package/dist/{animatedGifPrep-25X4G5IE.js → animatedGifPrep-3JA2CQ3U.js} +6 -6
  3. package/dist/api.js +14 -14
  4. package/dist/{asset-TPKLIP4R.js → asset-2CNTAPOC.js} +2 -2
  5. package/dist/{assetCataloger-PQAIV3FI.js → assetCataloger-5HXLXL7C.js} +6 -6
  6. package/dist/{audio-6RLPKB5X.js → audio-DZTSYHXS.js} +12 -12
  7. package/dist/{auth-O7QSTP6Y.js → auth-GX3M6TJ4.js} +1 -1
  8. package/dist/{autoUpdate-TIEJODP7.js → autoUpdate-EDIWE4Z5.js} +2 -2
  9. package/dist/{backgroundChecks-K2AXYDYG.js → backgroundChecks-VPUPJ7UI.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-ORVWYJAH.js → batchRender-JHIIDBJR.js} +3 -3
  12. package/dist/{beats-2VTB2ATR.js → beats-PZRVTRYW.js} +4 -4
  13. package/dist/{benchmark-NLNBL6YR.js → benchmark-22UFDW2N.js} +8 -8
  14. package/dist/{browser-M5UV6VJB.js → browser-VRDWYIUM.js} +3 -3
  15. package/dist/{bundleWithLocalizedFonts-EDD2XDS2.js → bundleWithLocalizedFonts-23QDKFSN.js} +2 -2
  16. package/dist/{capture-WHWEE5FE.js → capture-NFCBXHDE.js} +2 -2
  17. package/dist/{capture-JSYVNFKO.js → capture-TOCLXYMJ.js} +9 -9
  18. package/dist/{captureCompositionFrame-JANGQCIA.js → captureCompositionFrame-BEM6MF7F.js} +13 -11
  19. package/dist/{catalog-MPOOKNSZ.js → catalog-NXS35KM7.js} +11 -11
  20. package/dist/{catch-up-6KZV3UMZ.js → catch-up-6WJBUI2C.js} +4 -4
  21. package/dist/{check-G273NWK7.js → check-WVEBMWN5.js} +33 -33
  22. package/dist/{checkBrowser-G53E2ZQI.js → checkBrowser-RT45HJ36.js} +28 -28
  23. package/dist/{chunk-ZPMF6GAQ.js → chunk-2WNVHZHA.js} +11 -7
  24. package/dist/{chunk-TSFA2Y5C.js → chunk-3NRB7YXW.js} +3 -2
  25. package/dist/{chunk-44TJOEH5.js → chunk-3WJT2JCX.js} +32 -25
  26. package/dist/{chunk-VRQU564T.js → chunk-3XI7MIZB.js} +1 -1
  27. package/dist/{chunk-AYBKDHYD.js → chunk-7A65UCMI.js} +1 -1
  28. package/dist/{chunk-HUG47UEE.js → chunk-7FF36MAD.js} +1 -1
  29. package/dist/{chunk-6RA4TWGV.js → chunk-7LUJE3II.js} +1 -1
  30. package/dist/{chunk-GWYMAII7.js → chunk-7NKJS5KM.js} +1 -1
  31. package/dist/{chunk-37EPEFXM.js → chunk-7ZJEQY7Q.js} +1 -1
  32. package/dist/{chunk-AQ3L7DVB.js → chunk-ALEF2F5N.js} +2 -2
  33. package/dist/{chunk-74Y43RJZ.js → chunk-AQB5M53R.js} +3 -3
  34. package/dist/{chunk-M6FHSQZ3.js → chunk-BFFLKQVB.js} +3 -3
  35. package/dist/{chunk-CTF7BYCV.js → chunk-CINKQY6M.js} +3 -3
  36. package/dist/{chunk-BZQLTNMB.js → chunk-COETAXRN.js} +1 -1
  37. package/dist/{chunk-SGFMCNLY.js → chunk-COWQITWP.js} +1 -1
  38. package/dist/{chunk-3X6LH25W.js → chunk-CXMXJEVY.js} +1 -1
  39. package/dist/{chunk-NDBWI7OA.js → chunk-DOOSC34Z.js} +5 -5
  40. package/dist/{chunk-F45HHA3M.js → chunk-EFCKV7MY.js} +1 -1
  41. package/dist/{chunk-R5FS7GFU.js → chunk-FBDOHH3Q.js} +1 -1
  42. package/dist/{chunk-3OLOVRWS.js → chunk-GLG5JWLI.js} +1 -1
  43. package/dist/{chunk-WYCFMNU3.js → chunk-GM3WIOO6.js} +1 -1
  44. package/dist/{chunk-FJF5JBYU.js → chunk-HYW6HTAK.js} +1 -1
  45. package/dist/{chunk-KS4HMJJD.js → chunk-JGTRVG32.js} +1 -1
  46. package/dist/{chunk-Z2BW2WJS.js → chunk-JJJCFKMF.js} +1 -1
  47. package/dist/{chunk-4DZ3HBKF.js → chunk-JOLZ3BSL.js} +1 -1
  48. package/dist/{chunk-IFXOMIBP.js → chunk-JTPHFYZI.js} +3 -3
  49. package/dist/{chunk-TREMHDWT.js → chunk-JYSSPQDT.js} +56 -21
  50. package/dist/{chunk-OHXHBMF4.js → chunk-KAC2WR7P.js} +1 -1
  51. package/dist/{chunk-JZDVIDFH.js → chunk-KGMHMYWI.js} +2 -2
  52. package/dist/{chunk-2CYM34M7.js → chunk-KHCTBZGJ.js} +3 -3
  53. package/dist/{chunk-TPTQHOXU.js → chunk-KV72BP7O.js} +9 -9
  54. package/dist/{chunk-5HJJEHGE.js → chunk-LBNEH6IQ.js} +1 -1
  55. package/dist/chunk-LM265QNK.js +3896 -0
  56. package/dist/{chunk-ASZ4IQB4.js → chunk-MSM6VRQ4.js} +2 -2
  57. package/dist/{chunk-GBT7P3OQ.js → chunk-NJGTNWQY.js} +5 -5
  58. package/dist/{chunk-HXM2ISEK.js → chunk-NMDUSCCE.js} +377 -233
  59. package/dist/{chunk-5544QB3U.js → chunk-OV6KHXLX.js} +1 -1
  60. package/dist/{chunk-QYQ2EYOI.js → chunk-RE3EEBWC.js} +3 -3
  61. package/dist/{chunk-XJVXROOL.js → chunk-RQBB7PYT.js} +2 -2
  62. package/dist/{chunk-TFUAKV6O.js → chunk-RWYUK7LM.js} +1 -1
  63. package/dist/{chunk-JIPUWKLA.js → chunk-SMEF3TRJ.js} +26 -14
  64. package/dist/{chunk-CSYSEPWL.js → chunk-T5YF32WV.js} +5 -5
  65. package/dist/{chunk-B634ZCY2.js → chunk-TADJOIFW.js} +1 -1
  66. package/dist/{chunk-IPEP346Y.js → chunk-TFGO5YMI.js} +1 -1
  67. package/dist/{chunk-HQIFMCQN.js → chunk-TFMZ4RKM.js} +85 -38
  68. package/dist/{chunk-565X6Q4X.js → chunk-TJKE4EYX.js} +16 -8
  69. package/dist/{chunk-WMJJCHVQ.js → chunk-TRZVS6TL.js} +2 -2
  70. package/dist/{chunk-NSJ5HD6A.js → chunk-U5GTDAQL.js} +5 -5
  71. package/dist/{chunk-4QFKGRTB.js → chunk-UNR3P7IF.js} +2 -2
  72. package/dist/{chunk-SMF6YAUL.js → chunk-VYQYVYQ5.js} +2 -2
  73. package/dist/{chunk-T37XXYRK.js → chunk-W3CS2KFV.js} +1 -1
  74. package/dist/{chunk-KLWUB37U.js → chunk-WHAEJX26.js} +7 -7
  75. package/dist/{chunk-ANYBRVPF.js → chunk-WJEVUPVD.js} +1 -1
  76. package/dist/{chunk-QMFI4N7J.js → chunk-WQ3X5OH4.js} +1 -1
  77. package/dist/{chunk-HNMDLKA4.js → chunk-WY3TQ2PT.js} +1 -1
  78. package/dist/{chunk-B52BJM5K.js → chunk-XMSQRDAK.js} +2 -2
  79. package/dist/{chunk-E7TI5PAQ.js → chunk-XWOCXIKR.js} +1 -1
  80. package/dist/{chunk-E676Y7AY.js → chunk-ZHKUIC7X.js} +42 -14
  81. package/dist/{clean-PS4VYGQ6.js → clean-3VIU2BSK.js} +14 -14
  82. package/dist/cli.js +53 -53
  83. package/dist/{cloud-E47CE5VQ.js → cloud-NA3J4XW2.js} +4 -4
  84. package/dist/{cloudrun-3J4SQBXE.js → cloudrun-4MHOF7UT.js} +4 -4
  85. package/dist/commands/layout-audit.browser.js +64 -3
  86. package/dist/{compare-EAKHXBDO.js → compare-ZR7XRPPT.js} +29 -26
  87. package/dist/{compiler-23MT6CX6.js → compiler-MA2ELZPG.js} +3 -3
  88. package/dist/{component-QBOXYJJS.js → component-ZJSOPUAM.js} +3 -3
  89. package/dist/{compositions-QC3EO3MJ.js → compositions-WA5V2SHF.js} +10 -10
  90. package/dist/{delete-TXEOLPC6.js → delete-UC427UEA.js} +2 -2
  91. package/dist/{deploy-3B3WJ6PM.js → deploy-B5UO4UIK.js} +1 -1
  92. package/dist/{dist-F4UJFK4S.js → dist-BPK37SAB.js} +2 -2
  93. package/dist/{dist-JH32CBQL.js → dist-XGPSPKKP.js} +1 -1
  94. package/dist/docs/rendering.md +2 -2
  95. package/dist/{doctor-2CRFH4B3.js → doctor-ZERCTKEK.js} +10 -10
  96. package/dist/{events-GUIOSBIB.js → events-CNIXB2QK.js} +3 -3
  97. package/dist/{events-KVTX3QFV.js → events-DCOZQERS.js} +2 -2
  98. package/dist/{feedback-VQIOSTIB.js → feedback-YBD5ITTY.js} +6 -6
  99. package/dist/{ffmpeg-BPCZGXFW.js → ffmpeg-V4BBFDTG.js} +6 -6
  100. package/dist/{figma-QIOKCH26.js → figma-Z45ZYVGE.js} +3 -3
  101. package/dist/fontLocalizeCli.js +8 -8
  102. package/dist/{get-TU45SNXF.js → get-23NXQWCD.js} +2 -2
  103. package/dist/{gpuPolicy-AWAJBGYY.js → gpuPolicy-H6ABHVEB.js} +6 -6
  104. package/dist/{grade-compare-LDNUXX3Q.js → grade-compare-ZPX2G3UV.js} +26 -26
  105. package/dist/{help-YUCHJKKL.js → help-EP4CDPLO.js} +1 -1
  106. package/dist/{history-MMHFUMIG.js → history-E5OSXO74.js} +6 -6
  107. package/dist/hyperframe.manifest.json +1 -1
  108. package/dist/hyperframe.runtime.iife.js +61 -61
  109. package/dist/hyperframes-player.global.js +3 -3
  110. package/dist/{info-HBHOFSC2.js → info-2HHGSW5H.js} +7 -7
  111. package/dist/{init-3E4GUXIZ.js → init-ENEG6RZT.js} +26 -26
  112. package/dist/{inspect-YNUPJVIH.js → inspect-PVQK4E2A.js} +26 -26
  113. package/dist/{installer-WLCRP33K.js → installer-YGGLEOSF.js} +4 -4
  114. package/dist/{keyframes-Z47GHCGO.js → keyframes-UWSYS2SL.js} +6 -6
  115. package/dist/{lambda-CA4PEUO2.js → lambda-L3LPXC2M.js} +7 -7
  116. package/dist/{layout-YPV6PIKF.js → layout-JVL4QREC.js} +26 -26
  117. package/dist/{lint-3AVVQ74A.js → lint-JXQ72DDB.js} +7 -7
  118. package/dist/{lintProject-XM3DLUKG.js → lintProject-F7IC7WY4.js} +1 -1
  119. package/dist/{list-JH52Y735.js → list-UFMLM3VV.js} +2 -2
  120. package/dist/{login-G7NPJUAW.js → login-CKGMWQJN.js} +4 -4
  121. package/dist/{manager-2LSMMZY4.js → manager-U6OP3EXB.js} +7 -7
  122. package/dist/{media-treatment-BVMMD5EN.js → media-treatment-MFMEWCDY.js} +12 -12
  123. package/dist/{models-P3TNRVRV.js → models-QA3TJ75Y.js} +10 -10
  124. package/dist/{motionShot-LK62QHNE.js → motionShot-NV2OPJHD.js} +14 -14
  125. package/dist/{normalize-audio-Y7BAQ7AR.js → normalize-audio-JWJRUKK2.js} +4 -4
  126. package/dist/{open-CCFFLAT7.js → open-PTJNDRER.js} +11 -11
  127. package/dist/{parakeetRunner-N2BWSOSD.js → parakeetRunner-B5FCWWOO.js} +11 -11
  128. package/dist/{pipeline-3VT2DQGU.js → pipeline-N26NA6ZG.js} +7 -7
  129. package/dist/{play-G4I5IFHO.js → play-45D6X6TV.js} +17 -17
  130. package/dist/{preflight-2KU2QLCZ.js → preflight-MFOHPUOI.js} +7 -7
  131. package/dist/{present-EJ7XHGQO.js → present-IFBUDI4D.js} +13 -13
  132. package/dist/{preview-O23BYFAY.js → preview-MQRLXQOV.js} +18 -17
  133. package/dist/{producer-UJQVLKLP.js → producer-2QG7HLAW.js} +1 -1
  134. package/dist/{projectConfig-QFVIBT37.js → projectConfig-I4FTZXHB.js} +6 -6
  135. package/dist/{publication-4UYGFB2X.js → publication-3GOFXCGU.js} +2 -2
  136. package/dist/{publish-MHLVJLCR.js → publish-3B2TZCFH.js} +8 -8
  137. package/dist/{remove-background-N7AHTZWP.js → remove-background-RK4BJDBF.js} +8 -8
  138. package/dist/{render-6HQV4LZJ.js → render-BV6FWFX3.js} +7 -6
  139. package/dist/{render-EI2ODKOP.js → render-PW3XGS7B.js} +28 -28
  140. package/dist/{render-CDATEVDJ.js → render-SJ4HFPFU.js} +13 -13
  141. package/dist/{render-batch-F7HMC7XH.js → render-batch-GKX54O6N.js} +7 -6
  142. package/dist/renderSetupWorker.js +1 -1
  143. package/dist/{resolver-63DB5JCY.js → resolver-RQJ7CNXD.js} +4 -4
  144. package/dist/{sherpa-AK3MTPL3.js → sherpa-XZPG7QFF.js} +10 -10
  145. package/dist/{sites-5PWHAMEG.js → sites-Q2S3DZY4.js} +2 -1
  146. package/dist/skills/hyperframes/references/captions.md +1 -1
  147. package/dist/skills/hyperframes/references/motion.md +1 -1
  148. package/dist/skills/hyperframes-cli/references/cloudrun.md +1 -1
  149. package/dist/skills/hyperframes-cli/references/lambda.md +1 -1
  150. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +2 -2
  151. package/dist/skills/hyperframes-cli/references/preview-render.md +1 -1
  152. package/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +0 -8
  153. package/dist/skills/media-use/audio/references/transcribe.md +2 -2
  154. package/dist/skills/media-use/references/audio.md +1 -1
  155. package/dist/{skills-EVIDL7PV.js → skills-EYLB2V6F.js} +5 -5
  156. package/dist/{skillsUpdateCheck-YCNJYDJO.js → skillsUpdateCheck-TE6K5ROM.js} +3 -3
  157. package/dist/{snapshot-WSYZKR3C.js → snapshot-FE4T3SCN.js} +48 -33
  158. package/dist/{src-KTD6WTEV.js → src-SEJ7LNNB.js} +7 -7
  159. package/dist/{src-YNXBU4ZQ.js → src-ZOXSEJCD.js} +5 -5
  160. package/dist/{staticProjectServer-D2D3BKBP.js → staticProjectServer-LSVIRDRO.js} +14 -14
  161. package/dist/studio/assets/{hyperframes-player-CkK8Zijf.js → hyperframes-player-Bv9hQ3v7.js} +1 -1
  162. package/dist/studio/assets/index-CBO8uz7-.css +1 -0
  163. package/dist/studio/assets/{index-B2JcCaRF.js → index-D_QqfWhx.js} +133 -132
  164. package/dist/studio/assets/{index-ATnRoBug.js → index-Df14bh-L.js} +1 -1
  165. package/dist/studio/index.html +2 -2
  166. package/dist/{studio-api-3ZGQPE5J.js → studio-api-SL2Z76NU.js} +7 -7
  167. package/dist/{studioServer-VWM4J7ZP.js → studioServer-BADWVIHU.js} +44 -44
  168. package/dist/{telemetry-BEVI64BB.js → telemetry-RN6VYEID.js} +3 -3
  169. package/dist/{timeline-P57FUXJQ.js → timeline-JBTCIPLU.js} +15 -15
  170. package/dist/{tokens-OUQY6LPD.js → tokens-A7V7UHNK.js} +2 -2
  171. package/dist/{transcribe-CK66VIU4.js → transcribe-E4BOSNM4.js} +9 -9
  172. package/dist/{transcribe-QUPX67KC.js → transcribe-NTUCJGFI.js} +16 -16
  173. package/dist/{updateCheck-XZ43CH3L.js → updateCheck-M7UAYLUR.js} +2 -2
  174. package/dist/{upgrade-7QQNGI7I.js → upgrade-A2COSIMB.js} +2 -2
  175. package/dist/{urlDownloader-ESAEL6YX.js → urlDownloader-MBSQYART.js} +5 -5
  176. package/dist/{validate-5GZ6KFRU.js → validate-NODZYBHY.js} +20 -20
  177. package/dist/{video-AQNVR6PE.js → video-LBCUUYK7.js} +6 -6
  178. package/dist/warmCheck.js +33 -33
  179. package/package.json +1 -1
  180. package/dist/chunk-BPX7LZG6.js +0 -3896
  181. package/dist/studio/assets/index-CESvLzz0.css +0 -1
@@ -28,7 +28,8 @@ async function runSitesCreate(args) {
28
28
  projectDir,
29
29
  bucketName: stack.bucketName,
30
30
  region: stack.region,
31
- siteId: args.siteId
31
+ siteId: args.siteId,
32
+ onNotice: (message) => console.error(c.dim(message))
32
33
  });
33
34
  if (args.json) {
34
35
  console.log(JSON.stringify(handle, null, 2));
@@ -3,7 +3,7 @@
3
3
  ## Words and timings
4
4
 
5
5
  - `npx hyperframes transcribe <file> --json` and a HeyGen voiceover (`/media-use`) give every word's start and end. Work from those as `[{ "id": "w0", "text": "Hello", "start": 0.0, "end": 0.5 }, …]`.
6
- - Local transcription defaults to `small.en`, which **translates** non-English speech into English. Pass the model: `npx hyperframes transcribe <file> --model small.en` for English, `--model small --language <code>` otherwise, `--model medium.en` for speech over music. It writes `assets/transcript.json` (its JSON names the path) and overwrites it on the next run; `--to srt` or `--to vtt` writes a sidecar.
6
+ - `npx hyperframes transcribe` defaults to the `small.en` whisper model, which **translates** non-English speech into English. Pass the model: `npx hyperframes transcribe <file> --model small.en` for English, `--model small --language <code>` otherwise, `--model medium.en` for speech over music. It writes `assets/transcript.json` (its JSON names the path) and overwrites it on the next run; `--to srt` or `--to vtt` writes a sidecar.
7
7
  - For Chinese, Japanese and other unspaced scripts, local transcription returns a whole sentence as one "word", sometimes in the other script (Traditional for Simplified speech). Split each segment's text into short phrases and spread its time across them by character count; check the characters against what is said.
8
8
  - Whisper invents "Thank you." over silence and repeats lines over a silent tail: drop words that start inside a final silence (`silencedetect=noise=-35dB:d=0.6`; real speech sits around −16 to −26 dB).
9
9
  - Never put two words in one timed entry, and match transcript words to caption words by position, not text, or a repeated word takes the wrong time.
@@ -5,7 +5,7 @@
5
5
  Measured frame by frame from the official HyperFrames launch films. These are defaults: a reference the person gave, or a Moment that does otherwise on purpose, wins for its own beat.
6
6
 
7
7
  - **Moves**: a fast move takes 0.3–0.6 s and carries motion blur on its own ease, peaking at its fastest frame: 6–12 px on text-sized elements, 15–20 px full-frame, horizontal-only on a horizontal move. One move is one tween.
8
- - **Render-time blur**: for fast 2D movers, `data-motion-blur="on"` on the composition root smears them along their real path in preview and render (opt-in; also `data-motion-blur-shutter`, `-samples`, `-events="on"` for callback-driven motion). Suggest it when the person asks for blur or a filmic look and the piece moves fast; skip it when the composition has a WebGL canvas, a 3D flip with `backface-visibility`, a root transform or opacity, or an HDR render, because blur turns itself off there. After adding it run `hyperframes check`: `motion_blur_off` names the cause. About 1.7x render time. Guide: /guides/motion-blur.
8
+ - **Render-time blur**: for fast 2D movers, `data-motion-blur="on"` on the composition root smears them along their real path in preview and render (opt-in; also `data-motion-blur-shutter` for a longer smear, 360 is strong; `-events="on"` when the motion is set from a timeline callback such as a `render(t)` function). Suggest it when the person asks for blur or a filmic look and the piece moves fast. It picks how to draw on its own: a cheap per-element filter for translation, the truer capture for spins and zooms; it works over WebGL and in any Chrome, and is off only for HDR and distributed renders. Opt a subtree out with `data-motion-blur="off"`, e.g. a seam that already carries its own blur. After adding it run `hyperframes check`. Guide: /guides/motion-blur.
9
9
  - **Arrive slow, leave clean**: long-tailed ease-outs on arrivals; landing takes longer than leaving. An exit is one smooth motion, never slide, stop, then leave. Entrances that are too snappy read as glitches; slowing the whole video by about a second often fixes it.
10
10
  - **Ease by role**: an arrival lands on a long tail (`expo.out`, `power4.out`), a camera move or a colour flood eases both ways (`power2.inOut`), a zoom through or an exit accelerates (`power3.in`). The same `power2.out` at 0.5 s on everything is the flat default that makes a film feel generated. Linear only for rotation, progress and constant speed that is the point.
11
11
  - **Springs** are named by damping ratio: 1.0 never bounces, 0.7-0.85 reads premium, 0.4-0.6 playful, under 0.3 a cartoon. Position and size may bounce; opacity and colour never do. GSAP's `elastic.out(1, 0.5)` and `back.out(1.4)` are the nearest built-ins; a closed-form spring of `t` keeps any frame renderable on its own.
@@ -22,7 +22,7 @@ npx hyperframes cloudrun destroy --project <gcp-project>
22
22
 
23
23
  `sites create` uploads a content-addressed project archive for reuse by `render-batch`; pass its `--site-id` to that command to skip the batch upload. Single `cloudrun render` currently resolves the project from its directory and does not consume `--site-id`. Both render commands require `--width` and `--height`; supported output formats are `mp4`, `mov`, `png-sequence`, and `webm`. Use `--output-resolution 4k` to supersample an authored composition without changing its layout dimensions.
24
24
 
25
- Common render flags are `--fps 24|30|60`, `--quality draft|standard|high`, `--codec h264|h265` for MP4, `--chunk-size`, `--max-parallel-chunks`, `--target-chunk-frames`, `--render-id`, `--output-key`, `--wait`, and `--wait-interval-ms`. Use `--json` for machine-readable output.
25
+ Common render flags are `--fps 24|25|30|60`, `--quality draft|standard|high`, `--codec h264|h265` for MP4, `--chunk-size`, `--max-parallel-chunks`, `--target-chunk-frames`, `--render-id`, `--output-key`, `--wait`, and `--wait-interval-ms`. Use `--json` for machine-readable output.
26
26
 
27
27
  For a variable-driven single render:
28
28
 
@@ -84,7 +84,7 @@ Starts a Step Functions execution. Returns immediately with a `renderId` unless
84
84
  | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
85
85
  | `--width` / `--height` | Output dimensions in pixels |
86
86
  | `--output-resolution` | Supersampling preset (engages Chrome `deviceScaleFactor`) — `landscape` / `landscape-4k` / `portrait` / `portrait-4k` / `square` / `square-4k`, plus aliases (`1080p`, `4k`, `uhd`, `hd`, `1080p-portrait`, `4k-portrait`, `1080p-square`, `4k-square`). Use this to render an authored-at-1080p composition at 4K without re-laying-out — see footgun below. |
87
- | `--fps` | `24` / `30` / `60` |
87
+ | `--fps` | `24` / `25` / `30` / `60` |
88
88
  | `--format` | `mp4` / `mov` / `png-sequence` / `webm` (default `mp4`) |
89
89
  | `--codec` | `h264` / `h265` (mp4 only) |
90
90
  | `--quality` | `draft` / `standard` / `high` |
@@ -111,7 +111,7 @@ Drop a `*.motion.json` sidecar next to the composition (matching the html basena
111
111
  npx hyperframes snapshot # 5 key frames as PNG
112
112
  npx hyperframes snapshot ./my-project # specific project
113
113
  npx hyperframes snapshot --frames 10 # evenly-spaced N frames
114
- npx hyperframes snapshot --range 3:5 --frames 8 # 8 frames within root-timeline seconds 3–5
114
+ npx hyperframes snapshot --range 3,5 --frames 8 # 8 frames within root-timeline seconds 3–5
115
115
  npx hyperframes snapshot --composition intro --frames 8 # 8 frames within this data-composition-id
116
116
  npx hyperframes snapshot --review # beat sheet, seam strips, phone sheet
117
117
  npx hyperframes snapshot --review --json # same, with paths and times as JSON
@@ -119,7 +119,7 @@ npx hyperframes snapshot --review --json # same, with paths and times as J
119
119
 
120
120
  Still PNGs. Each run writes `.hyperframes/artifacts/snapshots/<id>/` unless `--output` is set. `snapshot` is the standalone capture; `check --snapshots` is the gate.
121
121
 
122
- One of `--at`, `--range START:END` (seconds), or `--composition <data-composition-id>` (not a CSS selector). `--frames` defaults to 5. Range and composition sample just before the end and add no extra end frame; `--at` adds one unless `--no-end`.
122
+ One of `--at`, `--range START,END` (seconds), or `--composition <data-composition-id>` (not a CSS selector). `--frames` defaults to 5. Range and composition sample just before the end and add no extra end frame; `--at` adds one unless `--no-end`.
123
123
 
124
124
  `--review` picks the frames that show a film over time. Scenes are the composition's top-level timed clips and sub-composition hosts, as `timeline` lists them (captions and audio excluded); `--composition` scopes to one. It writes `review-beats.jpg` (each scene at its start + 0.3 s and at its middle, and each timed `data-beat="name"` element at its start + 0.3 s, labelled with time and id), `review-seam-NN.jpg` (frames at −0.2, −0.1, 0, +0.1, +0.2 s around every cut) and `review-phone.jpg` (the beat frames 360 px wide, to judge legibility at phone size), beside the `beat-*.png` and `seam-*.png` stills. With fewer than two scenes the beats spread evenly. `--json` prints `{ok, outputDir, frames[{path,time,role,label}], contactSheets, review{window, scenes, beats, seams[{time,from,to,times,paths,sheet}], sheets, notes}}`.
125
125
 
@@ -120,7 +120,7 @@ npx hyperframes render --docker # byte-identical
120
120
  | `dir` (positional) | path | cwd | Project directory. Omit to use current working directory. |
121
121
  | `--composition`, `-c` | path to composition file | `index.html` | Render a specific composition file (e.g. `compositions/intro.html`) instead of the project's `index.html`. |
122
122
  | `--output`, `-o` | path | `renders/<project>_<ts>.<ext>` | Output path. Default is timestamped (`<project-name>_YYYY-MM-DD_HH-MM-SS.<ext>`). |
123
- | `--fps` | 24, 30, 60 | 30 | 60fps doubles render time |
123
+ | `--fps` | 1–240, or a rational such as `30000/1001` | root `data-fps`, else 30 | 60fps doubles render time. `lambda` and `cloudrun` accept only 24, 25, 30, 60 |
124
124
  | `--quality` | draft, looks, delivery, standard, high | looks | `looks` is CRF 16 on the standard preset. `delivery` is `high`. draft for iterating |
125
125
  | `--format` | mp4, webm, mov, gif, png-sequence, hls | mp4 | WebM/MOV render with transparency; gif for inline autoplay in GitHub PRs/READMEs/docs (two-pass palette encode, fps capped at 30 — prefer `--fps 15` — no audio, 1-bit transparency only, HDR falls back to SDR); png-sequence writes RGBA frames to a directory (AE/Nuke/Fusion ingest); hls writes an HLS VOD directory (master.m3u8 + video/audio playlists + MPEG-TS segments), SDR only, rejects `--gpu`, unavailable on lambda/cloudrun |
126
126
  | `--gif-loop` | 0-65535 | 0 | GIF loop count; `0` loops forever. Only with `--format gif`. |
@@ -132,11 +132,3 @@ Run `npx hyperframes usage --json` at the start of a video workflow and again at
132
132
  Known results contain `status: "known"`, `harness`, `planTier`, `session`, `weekly`, and `spend`. Each available window contains `usedPercent`, `remainingPercent`, and `resetsAt`; an unavailable window is `null`. `planTier` is the readable subscription tier when available, otherwise `null`. Claude Code reports its shared five-hour and weekly windows; a spend-metered plan (such as Enterprise) has neither and reports `spend`, the share of its billing-period spend limit already used, with `resetsAt: null`. Codex reports its shared session and weekly windows when available. Grok reports its included weekly allowance with `session: null`. Only Claude Code reports `spend`; it is `null` elsewhere. When no window is available the result is `status: "unknown"` with `reason: "no_usage_windows"`.
133
133
 
134
134
  Unknown results contain `status: "unknown"` and a token-free `reason`. Missing, expired, unsupported, ambiguous, or unreadable logins and unavailable provider responses return unknown. Report the unknown state without guessing allowance. The command reads existing credentials without refreshing or rewriting them and emits no tokens or telemetry. Usage is a snapshot; it does not reserve allowance or estimate the next video's cost. Keep scope and workflow choices with the user.
135
-
136
- ## Remaining harness usage
137
-
138
- Run `npx hyperframes usage --json` at the start of a video workflow and again at milestones such as after drafting and before rendering. A fresh read at handoff can serve as the start read. Use `--harness claude-code`, `--harness codex`, or `--harness grok` to select explicitly.
139
-
140
- Known results contain `status: "known"`, `harness`, `planTier`, `session`, `weekly`, and `spend`. Each available window contains `usedPercent`, `remainingPercent`, and `resetsAt`; an unavailable window is `null`. `planTier` is the readable subscription tier when available, otherwise `null`. Claude Code reports its shared five-hour and weekly windows; a spend-metered plan (such as Enterprise) has neither and reports `spend`, the share of its billing-period spend limit already used, with `resetsAt: null`. Codex reports its shared session and weekly windows when available. Grok reports its included weekly allowance with `session: null`. Only Claude Code reports `spend`; it is `null` elsewhere. When no window is available the result is `status: "unknown"` with `reason: "no_usage_windows"`.
141
-
142
- Unknown results contain `status: "unknown"` and a token-free `reason`. Missing, expired, unsupported, ambiguous, or unreadable logins and unavailable provider responses return unknown. Report the unknown state without guessing allowance. The command reads existing credentials without refreshing or rewriting them and emits no tokens or telemetry. Usage is a snapshot; it does not reserve allowance or estimate the next video's cost. Keep scope and workflow choices with the user.
@@ -1,6 +1,6 @@
1
1
  # Transcription
2
2
 
3
- Create normalized word-level timestamps. **Always specify `--model` explicitly** — the CLI default is `small.en`, which silently translates non-English audio into English.
3
+ Create normalized word-level timestamps. **Always specify `--model` explicitly** — `npx hyperframes transcribe` uses `small.en` as its default whisper model, which silently translates non-English audio into English.
4
4
 
5
5
  ```bash
6
6
  npx hyperframes transcribe audio.mp3 --model small.en # known English
@@ -19,7 +19,7 @@ npx hyperframes transcribe openai-response.json
19
19
  2. **Known non-English** → `--model small --language <iso-code>` (no `.en` suffix)
20
20
  3. **Unknown language** → `--model small` (whisper auto-detects)
21
21
 
22
- **CLI default is `small.en`** — do not rely on it; always pass `--model` to make the choice explicit. `--language` also filters out non-target-language segments from mixed-language audio.
22
+ **The CLI's default whisper model is `small.en`** — do not rely on it; always pass `--model` to make the choice explicit. `--language` also filters out non-target-language segments from mixed-language audio.
23
23
 
24
24
  ## Model Sizes
25
25
 
@@ -17,4 +17,4 @@ node <SKILL_DIR>/audio/scripts/audio.mjs --request ./audio_request.json --out ./
17
17
 
18
18
  Single-shot helpers: `audio/scripts/heygen-tts.mjs` (one voice file). Transcription / background removal / captions use the `hyperframes` CLI (`transcribe`, `remove-background`), see the per-topic guides in `audio/references/` (`tts.md`, `bgm.md`, `sfx.md`, `transcribe.md`, `remove-background.md`, `captions/`).
19
19
 
20
- Transcription defaults to Parakeet (better than whisper.cpp: 6.05% vs 7.44% WER, 5-10x faster) via `scripts/transcribe.mjs`, with whisper.cpp auto-fallback (see `references/operations.md`).
20
+ Transcription through `scripts/transcribe.mjs` defaults to Parakeet (better than whisper.cpp: 6.05% vs 7.44% WER, 5-10x faster), with whisper.cpp auto-fallback (see `references/operations.md`). `npx hyperframes transcribe` picks its own engine: Parakeet when installed, otherwise whisper with the `small.en` model by default.
@@ -15,8 +15,8 @@ import {
15
15
  } from "./chunk-WMQNIQDJ.js";
16
16
  import {
17
17
  trackSkillsInstallSkipped
18
- } from "./chunk-IPEP346Y.js";
19
- import "./chunk-T37XXYRK.js";
18
+ } from "./chunk-TFGO5YMI.js";
19
+ import "./chunk-W3CS2KFV.js";
20
20
  import {
21
21
  diag
22
22
  } from "./chunk-VWG7OQKU.js";
@@ -47,15 +47,15 @@ import {
47
47
  presentSkills,
48
48
  pruneOrphanedLockEntries,
49
49
  retiredSkillNotice
50
- } from "./chunk-R5FS7GFU.js";
50
+ } from "./chunk-FBDOHH3Q.js";
51
51
  import {
52
52
  withMeta
53
- } from "./chunk-OHXHBMF4.js";
53
+ } from "./chunk-KAC2WR7P.js";
54
54
  import "./chunk-K4WIOZFP.js";
55
55
  import "./chunk-XUXGIA7H.js";
56
56
  import "./chunk-WERLJGIC.js";
57
57
  import "./chunk-ISN5GRYI.js";
58
- import "./chunk-ASZ4IQB4.js";
58
+ import "./chunk-MSM6VRQ4.js";
59
59
  import "./chunk-KNU5COPB.js";
60
60
  import "./chunk-M2WBOQ2Q.js";
61
61
 
@@ -9,13 +9,13 @@ import {
9
9
  printSkillsUpdateNotice,
10
10
  refreshSkillsCache,
11
11
  skillsCheckDue
12
- } from "./chunk-R5FS7GFU.js";
13
- import "./chunk-OHXHBMF4.js";
12
+ } from "./chunk-FBDOHH3Q.js";
13
+ import "./chunk-KAC2WR7P.js";
14
14
  import "./chunk-K4WIOZFP.js";
15
15
  import "./chunk-XUXGIA7H.js";
16
16
  import "./chunk-WERLJGIC.js";
17
17
  import "./chunk-ISN5GRYI.js";
18
- import "./chunk-ASZ4IQB4.js";
18
+ import "./chunk-MSM6VRQ4.js";
19
19
  import "./chunk-KNU5COPB.js";
20
20
  import "./chunk-M2WBOQ2Q.js";
21
21
  export {
@@ -25,7 +25,7 @@ import {
25
25
  findFFmpeg,
26
26
  findFFprobe,
27
27
  getFFmpegInstallHint
28
- } from "./chunk-3OLOVRWS.js";
28
+ } from "./chunk-GLG5JWLI.js";
29
29
  import {
30
30
  pngDimensions,
31
31
  reportArtifacts,
@@ -33,20 +33,20 @@ import {
33
33
  } from "./chunk-57GN6KWT.js";
34
34
  import {
35
35
  captureArtifactRevision
36
- } from "./chunk-AYBKDHYD.js";
37
- import "./chunk-4DZ3HBKF.js";
36
+ } from "./chunk-7A65UCMI.js";
37
+ import "./chunk-JOLZ3BSL.js";
38
38
  import "./chunk-X7MTZ4T2.js";
39
39
  import {
40
40
  resolveProject
41
- } from "./chunk-37EPEFXM.js";
41
+ } from "./chunk-7ZJEQY7Q.js";
42
42
  import {
43
43
  serveStaticProjectHtml
44
- } from "./chunk-CSYSEPWL.js";
45
- import "./chunk-AQ3L7DVB.js";
44
+ } from "./chunk-T5YF32WV.js";
45
+ import "./chunk-ALEF2F5N.js";
46
46
  import "./chunk-X7MTZ4T2.js";
47
47
  import "./chunk-XUHOIDKG.js";
48
- import "./chunk-ZPMF6GAQ.js";
49
- import "./chunk-2CYM34M7.js";
48
+ import "./chunk-2WNVHZHA.js";
49
+ import "./chunk-KHCTBZGJ.js";
50
50
  import "./chunk-6JR2XUEE.js";
51
51
  import "./chunk-EI7FP7F3.js";
52
52
  import {
@@ -56,10 +56,11 @@ import {
56
56
  recordArtifacts,
57
57
  retainSnapshotOutput
58
58
  } from "./chunk-TMBUBLZB.js";
59
- import "./chunk-BZQLTNMB.js";
59
+ import "./chunk-COETAXRN.js";
60
60
  import "./chunk-ALVXFXUG.js";
61
61
  import {
62
62
  DEFAULT_ZOOM_SCALE,
63
+ SCREENSHOT_IMAGE_WAIT_MS,
63
64
  captureRegionCrop,
64
65
  openSettledCompositionPage,
65
66
  parseZoomTarget,
@@ -67,37 +68,37 @@ import {
67
68
  runFfmpegOnce,
68
69
  seekCompositionTimelineOnly,
69
70
  settleCompositionSeek
70
- } from "./chunk-TREMHDWT.js";
71
- import "./chunk-HNMDLKA4.js";
71
+ } from "./chunk-JYSSPQDT.js";
72
+ import "./chunk-WY3TQ2PT.js";
72
73
  import "./chunk-MOEGCMKI.js";
73
- import "./chunk-565X6Q4X.js";
74
+ import "./chunk-TJKE4EYX.js";
74
75
  import "./chunk-DKPNNYBZ.js";
75
- import "./chunk-HUG47UEE.js";
76
+ import "./chunk-7FF36MAD.js";
76
77
  import "./chunk-K2FLNJVB.js";
77
78
  import "./chunk-EHSBBBR2.js";
78
- import "./chunk-SGFMCNLY.js";
79
+ import "./chunk-COWQITWP.js";
79
80
  import "./chunk-442JNXRM.js";
80
81
  import "./chunk-DQBY7FRR.js";
81
82
  import {
82
83
  resolveLocalBrowserGpuMode
83
- } from "./chunk-B52BJM5K.js";
84
- import "./chunk-Z2BW2WJS.js";
84
+ } from "./chunk-XMSQRDAK.js";
85
+ import "./chunk-JJJCFKMF.js";
85
86
  import "./chunk-XT7X6QCP.js";
86
87
  import "./chunk-4YYJOFKS.js";
87
88
  import "./chunk-HVW7ABXD.js";
88
- import "./chunk-VRQU564T.js";
89
+ import "./chunk-3XI7MIZB.js";
89
90
  import {
90
91
  runWithConcurrencyLimit
91
92
  } from "./chunk-JHOCK3DG.js";
92
- import "./chunk-WMJJCHVQ.js";
93
- import "./chunk-5HJJEHGE.js";
93
+ import "./chunk-TRZVS6TL.js";
94
+ import "./chunk-LBNEH6IQ.js";
94
95
  import "./chunk-AWDFDFI3.js";
95
96
  import "./chunk-P6LJ4Y32.js";
96
97
  import "./chunk-GMECXFAN.js";
97
98
  import "./chunk-7L37AB57.js";
98
99
  import "./chunk-EOVYQ3IG.js";
99
- import "./chunk-IPEP346Y.js";
100
- import "./chunk-T37XXYRK.js";
100
+ import "./chunk-TFGO5YMI.js";
101
+ import "./chunk-W3CS2KFV.js";
101
102
  import "./chunk-VWG7OQKU.js";
102
103
  import {
103
104
  defineCommand
@@ -113,20 +114,20 @@ import {
113
114
  import "./chunk-KLIKCX6Q.js";
114
115
  import "./chunk-EVMY7IPL.js";
115
116
  import "./chunk-7FMUTGOH.js";
116
- import "./chunk-HXM2ISEK.js";
117
+ import "./chunk-NMDUSCCE.js";
117
118
  import "./chunk-IZCW2NKT.js";
118
119
  import {
119
120
  createRuntimeStartTimeResolver,
120
121
  isClipVisibleAt,
121
122
  isInClipWindow
122
- } from "./chunk-WYCFMNU3.js";
123
+ } from "./chunk-GM3WIOO6.js";
123
124
  import "./chunk-RQVDTPGD.js";
124
- import "./chunk-SMF6YAUL.js";
125
+ import "./chunk-VYQYVYQ5.js";
125
126
  import {
126
127
  readElementRateSpec,
127
128
  sourceTimeAt,
128
129
  timeAtSourceTime
129
- } from "./chunk-BPX7LZG6.js";
130
+ } from "./chunk-LM265QNK.js";
130
131
  import "./chunk-VC76R6W2.js";
131
132
  import "./chunk-X7HBSTCZ.js";
132
133
  import {
@@ -150,7 +151,7 @@ import "./chunk-XT6MXC7A.js";
150
151
  import "./chunk-4UMPIPCQ.js";
151
152
  import {
152
153
  lintProject
153
- } from "./chunk-TSFA2Y5C.js";
154
+ } from "./chunk-3NRB7YXW.js";
154
155
  import "./chunk-VAS6HQX3.js";
155
156
  import "./chunk-6BNTGNGD.js";
156
157
  import "./chunk-RUOG4VB7.js";
@@ -164,12 +165,12 @@ import "./chunk-I5JRXMCV.js";
164
165
  import "./chunk-W2LGJSEN.js";
165
166
  import {
166
167
  withMeta
167
- } from "./chunk-OHXHBMF4.js";
168
+ } from "./chunk-KAC2WR7P.js";
168
169
  import "./chunk-K4WIOZFP.js";
169
170
  import "./chunk-XUXGIA7H.js";
170
171
  import "./chunk-WERLJGIC.js";
171
172
  import "./chunk-ISN5GRYI.js";
172
- import "./chunk-ASZ4IQB4.js";
173
+ import "./chunk-MSM6VRQ4.js";
173
174
  import {
174
175
  normalizeErrorMessage
175
176
  } from "./chunk-KNU5COPB.js";
@@ -695,7 +696,7 @@ function serveCapturePage(projectDir, html, proxy) {
695
696
  }
696
697
  async function captureSnapshots(projectDir, opts) {
697
698
  const log = opts.log ?? ((message) => console.log(message));
698
- const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-EDD2XDS2.js");
699
+ const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-23QDKFSN.js");
699
700
  const capture = await captureArtifactRevision(projectDir).catch(warnSnapshotsNotRecorded);
700
701
  const invocation = randomUUID();
701
702
  const artifacts = [];
@@ -756,7 +757,7 @@ async function captureSnapshots(projectDir, opts) {
756
757
  return 0;
757
758
  });
758
759
  if (duration <= 0 && !opts.at?.length) {
759
- return { paths: [] };
760
+ return { paths: [], warnings };
760
761
  }
761
762
  const readTiming = () => page.evaluate(() => ({
762
763
  html: document.documentElement.outerHTML,
@@ -827,7 +828,7 @@ async function captureSnapshots(projectDir, opts) {
827
828
  let syncVideoFrameVisibility = null;
828
829
  let extractMediaMetadata = null;
829
830
  try {
830
- const engine = await import("./src-YNXBU4ZQ.js");
831
+ const engine = await import("./src-ZOXSEJCD.js");
831
832
  injectVideoFramesBatch = engine.injectVideoFramesBatch;
832
833
  syncVideoFrameVisibility = engine.syncVideoFrameVisibility;
833
834
  extractMediaMetadata = engine.extractMediaMetadata;
@@ -852,7 +853,7 @@ async function captureSnapshots(projectDir, opts) {
852
853
  }
853
854
  for (let i = 0; i < positions.length; i++) {
854
855
  const time = positions[i];
855
- const seekOptions = { exactTime: true };
856
+ const seekOptions = { exactTime: true, waitForImagesMs: SCREENSHOT_IMAGE_WAIT_MS };
856
857
  await seekCompositionTimelineOnly(page, time, seekOptions);
857
858
  if (cameraExpr) await page.evaluate(cameraExpr);
858
859
  if (injectVideoFramesBatch && syncVideoFrameVisibility) {
@@ -963,7 +964,7 @@ async function captureSnapshots(projectDir, opts) {
963
964
  );
964
965
  }
965
966
  }
966
- await settleCompositionSeek(page, seekOptions);
967
+ warnUnsettledImages(await settleCompositionSeek(page, seekOptions), time, warnings);
967
968
  await recaptureSnapshotComposite(page);
968
969
  const timeLabel = formatSnapshotTimestamp(time);
969
970
  const slot = opts.keep ? `at-${timeLabel}` : `${String(i).padStart(2, "0")}-at-${timeLabel}`;
@@ -1057,6 +1058,7 @@ async function captureSnapshots(projectDir, opts) {
1057
1058
  }
1058
1059
  return {
1059
1060
  paths: savedPaths,
1061
+ warnings,
1060
1062
  ...review && reviewList ? {
1061
1063
  review: {
1062
1064
  plan: review,
@@ -1068,6 +1070,18 @@ async function captureSnapshots(projectDir, opts) {
1068
1070
  } : {}
1069
1071
  };
1070
1072
  }
1073
+ function warnUnsettledImages(images, time, warnings) {
1074
+ const groups = [
1075
+ [images.pending, `did not finish loading within ${SCREENSHOT_IMAGE_WAIT_MS} ms`],
1076
+ [images.failed, "failed to load"]
1077
+ ];
1078
+ for (const [sources, what] of groups) {
1079
+ if (sources.length === 0) continue;
1080
+ const message = `${sources.length} image(s) ${what} at ${time}s, so the frame may be missing them: ${sources.join(", ")}`;
1081
+ warnings.push(message);
1082
+ console.warn(` ${c.warn("\u26A0")} ${message}`);
1083
+ }
1084
+ }
1071
1085
  function warnSnapshotsNotRecorded(error) {
1072
1086
  console.warn(` ${c.warn("\u26A0")} Snapshots were not recorded: ${normalizeErrorMessage(error)}`);
1073
1087
  return void 0;
@@ -1102,6 +1116,7 @@ function snapshotEnvelope(projectDir, outputDir, captured, extra) {
1102
1116
  outputDir,
1103
1117
  frames,
1104
1118
  contactSheets: extra.contactSheets.map((sheet) => resolve(sheet)),
1119
+ ...captured.warnings.length > 0 ? { warnings: captured.warnings } : {},
1105
1120
  ...extra.describedPath ? { descriptions: extra.describedPath } : {},
1106
1121
  ...review ? {
1107
1122
  review: {
@@ -69,10 +69,10 @@ import {
69
69
  serializeRenderRequest,
70
70
  startServer,
71
71
  validatePlanV2MaterializedTarget
72
- } from "./chunk-HQIFMCQN.js";
72
+ } from "./chunk-TFMZ4RKM.js";
73
73
  import {
74
74
  prepareAnimatedGifInputs
75
- } from "./chunk-XJVXROOL.js";
75
+ } from "./chunk-RQBB7PYT.js";
76
76
  import "./chunk-BZ56MTDX.js";
77
77
  import {
78
78
  FONT_FETCH_FAILED,
@@ -98,14 +98,14 @@ import {
98
98
  isTransientBrowserError,
99
99
  prepareCaptureSessionForReuse,
100
100
  resolveConfig
101
- } from "./chunk-HXM2ISEK.js";
101
+ } from "./chunk-NMDUSCCE.js";
102
102
  import "./chunk-IZCW2NKT.js";
103
103
  import {
104
104
  quantizeTimeToFrame
105
- } from "./chunk-WYCFMNU3.js";
105
+ } from "./chunk-GM3WIOO6.js";
106
106
  import "./chunk-RQVDTPGD.js";
107
- import "./chunk-SMF6YAUL.js";
108
- import "./chunk-BPX7LZG6.js";
107
+ import "./chunk-VYQYVYQ5.js";
108
+ import "./chunk-LM265QNK.js";
109
109
  import "./chunk-VC76R6W2.js";
110
110
  import "./chunk-X7HBSTCZ.js";
111
111
  import "./chunk-B2A56S5C.js";
@@ -115,7 +115,7 @@ import "./chunk-3GXQPCJC.js";
115
115
  import "./chunk-634HSJ3J.js";
116
116
  import "./chunk-FXMKHHPO.js";
117
117
  import "./chunk-4UMPIPCQ.js";
118
- import "./chunk-TSFA2Y5C.js";
118
+ import "./chunk-3NRB7YXW.js";
119
119
  import "./chunk-VAS6HQX3.js";
120
120
  import "./chunk-6BNTGNGD.js";
121
121
  import "./chunk-RUOG4VB7.js";
@@ -223,15 +223,15 @@ import {
223
223
  waitForImagesReady,
224
224
  writeCapturedFrame,
225
225
  writeUrlDownloadTelemetry
226
- } from "./chunk-HXM2ISEK.js";
226
+ } from "./chunk-NMDUSCCE.js";
227
227
  import "./chunk-IZCW2NKT.js";
228
228
  import {
229
229
  MEDIA_VISUAL_STYLE_PROPERTIES,
230
230
  quantizeTimeToFrame
231
- } from "./chunk-WYCFMNU3.js";
231
+ } from "./chunk-GM3WIOO6.js";
232
232
  import "./chunk-RQVDTPGD.js";
233
- import "./chunk-SMF6YAUL.js";
234
- import "./chunk-BPX7LZG6.js";
233
+ import "./chunk-VYQYVYQ5.js";
234
+ import "./chunk-LM265QNK.js";
235
235
  import "./chunk-VC76R6W2.js";
236
236
  import "./chunk-X7HBSTCZ.js";
237
237
  import "./chunk-B2A56S5C.js";
@@ -253,7 +253,7 @@ import {
253
253
  import {
254
254
  resolveReferencedDuration,
255
255
  resolveReferencedStart
256
- } from "./chunk-TSFA2Y5C.js";
256
+ } from "./chunk-3NRB7YXW.js";
257
257
  import {
258
258
  FFMPEG_PATH_ENV,
259
259
  FFPROBE_PATH_ENV
@@ -7,27 +7,27 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  inProcessAnswer,
9
9
  serveStaticProjectHtml
10
- } from "./chunk-CSYSEPWL.js";
11
- import "./chunk-AQ3L7DVB.js";
10
+ } from "./chunk-T5YF32WV.js";
11
+ import "./chunk-ALEF2F5N.js";
12
12
  import "./chunk-X7MTZ4T2.js";
13
13
  import "./chunk-XUHOIDKG.js";
14
- import "./chunk-ZPMF6GAQ.js";
15
- import "./chunk-2CYM34M7.js";
14
+ import "./chunk-2WNVHZHA.js";
15
+ import "./chunk-KHCTBZGJ.js";
16
16
  import "./chunk-6JR2XUEE.js";
17
17
  import "./chunk-EI7FP7F3.js";
18
18
  import "./chunk-TMBUBLZB.js";
19
- import "./chunk-BZQLTNMB.js";
19
+ import "./chunk-COETAXRN.js";
20
20
  import "./chunk-ALVXFXUG.js";
21
- import "./chunk-SGFMCNLY.js";
21
+ import "./chunk-COWQITWP.js";
22
22
  import "./chunk-442JNXRM.js";
23
- import "./chunk-Z2BW2WJS.js";
23
+ import "./chunk-JJJCFKMF.js";
24
24
  import "./chunk-XT7X6QCP.js";
25
25
  import "./chunk-4YYJOFKS.js";
26
26
  import "./chunk-HVW7ABXD.js";
27
- import "./chunk-VRQU564T.js";
27
+ import "./chunk-3XI7MIZB.js";
28
28
  import "./chunk-JHOCK3DG.js";
29
- import "./chunk-WMJJCHVQ.js";
30
- import "./chunk-5HJJEHGE.js";
29
+ import "./chunk-TRZVS6TL.js";
30
+ import "./chunk-LBNEH6IQ.js";
31
31
  import "./chunk-AWDFDFI3.js";
32
32
  import "./chunk-P6LJ4Y32.js";
33
33
  import "./chunk-GMECXFAN.js";
@@ -37,10 +37,10 @@ import "./chunk-KLIKCX6Q.js";
37
37
  import "./chunk-EVMY7IPL.js";
38
38
  import "./chunk-7FMUTGOH.js";
39
39
  import "./chunk-IZCW2NKT.js";
40
- import "./chunk-WYCFMNU3.js";
40
+ import "./chunk-GM3WIOO6.js";
41
41
  import "./chunk-RQVDTPGD.js";
42
- import "./chunk-SMF6YAUL.js";
43
- import "./chunk-BPX7LZG6.js";
42
+ import "./chunk-VYQYVYQ5.js";
43
+ import "./chunk-LM265QNK.js";
44
44
  import "./chunk-VC76R6W2.js";
45
45
  import "./chunk-X7HBSTCZ.js";
46
46
  import "./chunk-B2A56S5C.js";
@@ -48,7 +48,7 @@ import "./chunk-OFQWTKPW.js";
48
48
  import "./chunk-DPVXBVLL.js";
49
49
  import "./chunk-634HSJ3J.js";
50
50
  import "./chunk-FXMKHHPO.js";
51
- import "./chunk-TSFA2Y5C.js";
51
+ import "./chunk-3NRB7YXW.js";
52
52
  import "./chunk-VAS6HQX3.js";
53
53
  import "./chunk-6BNTGNGD.js";
54
54
  import "./chunk-RUOG4VB7.js";
@@ -1,4 +1,4 @@
1
- var xe=Object.defineProperty;var Ie=(r,i,e)=>i in r?xe(r,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[i]=e;var l=(r,i,e)=>Ie(r,typeof i!="symbol"?i+"":i,e);import{S as Oe,r as Ne,a as fe,i as Fe,b as w,c as _e,p as Ve,d as Ue,e as He,f as ze,s as We,g as ge,F as ye}from"./index-B2JcCaRF.js";function $e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function x(r){return typeof r=="object"&&r!==null}function je(r){return x(r)&&typeof r.getDuration=="function"}function Be(r){return x(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function qe(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const z=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:qe("0.0.0-dev");function $(r){if(r===null)return null;const i=Number.parseInt(r,10);return Number.isFinite(i)&&i>0?i:null}function Ge(r){const i=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!i)return null;const e=$(i.getAttribute("data-width")),t=$(i.getAttribute("data-height"));return e!==null&&t!==null?{width:e,height:t}:null}function Ye(r){return Array.isArray(r)?r.find(i=>typeof i=="string"&&i.trim()!==""&&i!=="[object Event]")??null:null}class Xe{constructor(i,e){l(this,"_interval",null);l(this,"_runtimeInjected",!1);l(this,"_runtimeScript",null);l(this,"_failure",null);this._iframe=i,this._callbacks=e}get failed(){return this._failure!==null&&this._failure.document===this._iframe.contentDocument}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._failure=null,this._runtimeInjected=!1;let i=0;this._interval=setInterval(()=>{i++;let e=null;try{e=this._poll(i)}catch(t){t instanceof DOMException&&t.name==="SecurityError"||(e={kind:"error",message:t instanceof Error?t.message:String(t)})}e??(e=this._deadlineOutcome(i)),e&&(this.stop(),e.kind==="error"?(this._failure={document:this._iframe.contentDocument},this._callbacks.onError(e.message)):this._callbacks.onReady(e.result))},200)}_deadlineOutcome(i){var e,t;return i<40||(t=(e=this._callbacks).hostOwnsDeadline)!=null&&t.call(e)?null:{kind:"error",message:"Composition timeline not found after 8s"}}_poll(i){const e=this._iframe.contentWindow;if(!e)return null;const t=Ye(Reflect.get(e,Oe));if(t!==null)return{kind:"error",message:t};const s=this._iframe.contentDocument,n=Reflect.get(e,"__timelines"),o=this.hasRuntimeBridge(e);if($e({hasRuntime:o,hasTimelines:x(n)&&Object.keys(n).length>0,hasNestedCompositions:!!(s!=null&&s.querySelector("[data-composition-src]")),runtimeInjected:this._runtimeInjected,attempts:i}))return this._injectRuntime(),null;if(this._runtimeInjected&&!o)return null;const a=this._resolveReadyResult(e,s);return a?{kind:"ready",result:a}:null}_resolveReadyResult(i,e){var n;const t=this._resolvePlaybackDurationAdapter(i)??{kind:"document",getDuration:()=>0};let s=t.getDuration();if(!Number.isFinite(s)||s<=0){if(t.kind==="direct-timeline")return null;s=e?((n=Ne(e))==null?void 0:n.durationSeconds)??0:0}return s<=0?null:{duration:s,adapter:{...t,getDuration:()=>s},compositionSize:Ge(e)}}stop(){this._runtimeScript&&(this._runtimeScript.onerror=null,this._runtimeScript=null),this.failed||(this._failure=null),this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const i=this._iframe.contentWindow;return i?this._resolveDirectTimelineAdapterFromWindow(i):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(i){return this._resolveDirectTimelineAdapterFromWindow(i)}hasRuntimeBridge(i){return x(Reflect.get(i,"__player"))}_injectRuntime(){var i,e,t,s;this._runtimeInjected=!0;try{const n=this._iframe.contentDocument;if(!n)return;const o=n.createElement("script");o.src=((e=(i=this._callbacks).resolveRuntimeUrl)==null?void 0:e.call(i))??z,this._runtimeScript=o,o.onerror=()=>{this._runtimeScript!==o||this._iframe.contentDocument!==n||(this.stop(),this._failure={document:n},this._callbacks.onError("HyperFrames runtime failed to load from "+o.src))},(n.head||n.documentElement).appendChild(o),(s=(t=this._callbacks).onRuntimeInjected)==null||s.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(i){var a,c;if(this.hasRuntimeBridge(i))return null;const e=Reflect.get(i,"__timelines");if(!x(e))return null;const t=Object.keys(e);if(t.length===0)return null;const s=(c=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:c.getAttribute("data-composition-id"),n=s&&s in e?s:t[t.length-1],o=e[n];return Be(o)?o:null}_resolvePlaybackDurationAdapter(i){const e=Reflect.get(i,"__player");if(je(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const t=this._resolveDirectTimelineAdapterFromWindow(i);return t?{kind:"direct-timeline",timeline:t,getDuration:()=>t.duration()}:null}}const Ze=`
1
+ var xe=Object.defineProperty;var Ie=(r,i,e)=>i in r?xe(r,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[i]=e;var l=(r,i,e)=>Ie(r,typeof i!="symbol"?i+"":i,e);import{S as Oe,r as Ne,a as fe,i as Fe,b as w,c as _e,p as Ve,d as Ue,e as He,f as ze,s as We,g as ge,F as ye}from"./index-D_QqfWhx.js";function $e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function x(r){return typeof r=="object"&&r!==null}function je(r){return x(r)&&typeof r.getDuration=="function"}function Be(r){return x(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function qe(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const z=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:qe("0.0.0-dev");function $(r){if(r===null)return null;const i=Number.parseInt(r,10);return Number.isFinite(i)&&i>0?i:null}function Ge(r){const i=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!i)return null;const e=$(i.getAttribute("data-width")),t=$(i.getAttribute("data-height"));return e!==null&&t!==null?{width:e,height:t}:null}function Ye(r){return Array.isArray(r)?r.find(i=>typeof i=="string"&&i.trim()!==""&&i!=="[object Event]")??null:null}class Xe{constructor(i,e){l(this,"_interval",null);l(this,"_runtimeInjected",!1);l(this,"_runtimeScript",null);l(this,"_failure",null);this._iframe=i,this._callbacks=e}get failed(){return this._failure!==null&&this._failure.document===this._iframe.contentDocument}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._failure=null,this._runtimeInjected=!1;let i=0;this._interval=setInterval(()=>{i++;let e=null;try{e=this._poll(i)}catch(t){t instanceof DOMException&&t.name==="SecurityError"||(e={kind:"error",message:t instanceof Error?t.message:String(t)})}e??(e=this._deadlineOutcome(i)),e&&(this.stop(),e.kind==="error"?(this._failure={document:this._iframe.contentDocument},this._callbacks.onError(e.message)):this._callbacks.onReady(e.result))},200)}_deadlineOutcome(i){var e,t;return i<40||(t=(e=this._callbacks).hostOwnsDeadline)!=null&&t.call(e)?null:{kind:"error",message:"Composition timeline not found after 8s"}}_poll(i){const e=this._iframe.contentWindow;if(!e)return null;const t=Ye(Reflect.get(e,Oe));if(t!==null)return{kind:"error",message:t};const s=this._iframe.contentDocument,n=Reflect.get(e,"__timelines"),o=this.hasRuntimeBridge(e);if($e({hasRuntime:o,hasTimelines:x(n)&&Object.keys(n).length>0,hasNestedCompositions:!!(s!=null&&s.querySelector("[data-composition-src]")),runtimeInjected:this._runtimeInjected,attempts:i}))return this._injectRuntime(),null;if(this._runtimeInjected&&!o)return null;const a=this._resolveReadyResult(e,s);return a?{kind:"ready",result:a}:null}_resolveReadyResult(i,e){var n;const t=this._resolvePlaybackDurationAdapter(i)??{kind:"document",getDuration:()=>0};let s=t.getDuration();if(!Number.isFinite(s)||s<=0){if(t.kind==="direct-timeline")return null;s=e?((n=Ne(e))==null?void 0:n.durationSeconds)??0:0}return s<=0?null:{duration:s,adapter:{...t,getDuration:()=>s},compositionSize:Ge(e)}}stop(){this._runtimeScript&&(this._runtimeScript.onerror=null,this._runtimeScript=null),this.failed||(this._failure=null),this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const i=this._iframe.contentWindow;return i?this._resolveDirectTimelineAdapterFromWindow(i):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(i){return this._resolveDirectTimelineAdapterFromWindow(i)}hasRuntimeBridge(i){return x(Reflect.get(i,"__player"))}_injectRuntime(){var i,e,t,s;this._runtimeInjected=!0;try{const n=this._iframe.contentDocument;if(!n)return;const o=n.createElement("script");o.src=((e=(i=this._callbacks).resolveRuntimeUrl)==null?void 0:e.call(i))??z,this._runtimeScript=o,o.onerror=()=>{this._runtimeScript!==o||this._iframe.contentDocument!==n||(this.stop(),this._failure={document:n},this._callbacks.onError("HyperFrames runtime failed to load from "+o.src))},(n.head||n.documentElement).appendChild(o),(s=(t=this._callbacks).onRuntimeInjected)==null||s.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(i){var a,c;if(this.hasRuntimeBridge(i))return null;const e=Reflect.get(i,"__timelines");if(!x(e))return null;const t=Object.keys(e);if(t.length===0)return null;const s=(c=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:c.getAttribute("data-composition-id"),n=s&&s in e?s:t[t.length-1],o=e[n];return Be(o)?o:null}_resolvePlaybackDurationAdapter(i){const e=Reflect.get(i,"__player");if(je(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const t=this._resolveDirectTimelineAdapterFromWindow(i);return t?{kind:"direct-timeline",timeline:t,getDuration:()=>t.duration()}:null}}const Ze=`
2
2
  :host {
3
3
  display: block;
4
4
  position: relative;