hyperframes 0.8.145 → 0.8.146

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 (186) hide show
  1. package/dist/{add-B6OUH46W.js → add-6J4TLUDW.js} +15 -15
  2. package/dist/{animatedGifPrep-MIWRDJIO.js → animatedGifPrep-TPYA45ZZ.js} +10 -10
  3. package/dist/{asset-XJ2B2PU3.js → asset-B4C6ZU4V.js} +2 -2
  4. package/dist/{assetCataloger-A5ZLSCMZ.js → assetCataloger-GX4B55VB.js} +4 -4
  5. package/dist/{auth-5HOVCZMV.js → auth-T2V3URGO.js} +2 -2
  6. package/dist/{autoUpdate-WVNL5K3D.js → autoUpdate-O4R7IOYP.js} +2 -2
  7. package/dist/{backgroundChecks-IGF54SFH.js → backgroundChecks-SQHGZCSH.js} +3 -3
  8. package/dist/backgroundChecksWorker.js +3 -3
  9. package/dist/{batchRender-T6JEGCQV.js → batchRender-T7S2CGJE.js} +5 -5
  10. package/dist/{beats-37T6Y6QP.js → beats-RNEXDM7U.js} +16 -16
  11. package/dist/{benchmark-ZVVLOWPP.js → benchmark-IVK6FCEU.js} +12 -12
  12. package/dist/{browser-4SSJOLH4.js → browser-WUE6VK2N.js} +5 -5
  13. package/dist/{bundleWithLocalizedFonts-XWK423QP.js → bundleWithLocalizedFonts-EEIRL7FT.js} +2 -2
  14. package/dist/{capture-2SF7YP57.js → capture-K3EONGGU.js} +2 -2
  15. package/dist/{capture-KZXOPBMO.js → capture-LEKIGJ4G.js} +13 -13
  16. package/dist/{catalog-NLD4A2C6.js → catalog-IXYQ2KXW.js} +15 -15
  17. package/dist/{catch-up-4BSRN6IR.js → catch-up-IIF7HKR6.js} +6 -6
  18. package/dist/{check-IA44QQWM.js → check-W7CDOXNP.js} +38 -38
  19. package/dist/{checkBrowser-VM35KZMW.js → checkBrowser-5VSXEHBZ.js} +118 -61
  20. package/dist/{chunk-ZF7SXQJ7.js → chunk-2NAUEDA6.js} +2 -2
  21. package/dist/{chunk-FXJJCPPB.js → chunk-3HSWLZ6S.js} +1 -1
  22. package/dist/{chunk-ZSVUAVMT.js → chunk-4RUILXS6.js} +5 -5
  23. package/dist/{chunk-FBCULCAL.js → chunk-54UXJKFF.js} +1 -1
  24. package/dist/{chunk-DIRJ322I.js → chunk-66SAATRI.js} +3 -3
  25. package/dist/{chunk-QLSM7K5S.js → chunk-6TTAXMDG.js} +2 -2
  26. package/dist/{chunk-5WVW7P23.js → chunk-A72OAGNB.js} +6 -6
  27. package/dist/{chunk-G75ENCEZ.js → chunk-AIJS74LG.js} +3 -3
  28. package/dist/{chunk-HB7FJOY4.js → chunk-AJ5R4GM6.js} +1 -1
  29. package/dist/{chunk-VRW6EBHV.js → chunk-BAKPN2D2.js} +101 -94
  30. package/dist/{chunk-OTHDVXOJ.js → chunk-CVPWZ5LY.js} +3 -3
  31. package/dist/{chunk-BIAC7IJT.js → chunk-DDNS2674.js} +1 -1
  32. package/dist/{chunk-QFSCCQIR.js → chunk-DMKI64EZ.js} +1 -1
  33. package/dist/{chunk-EPE2HRJK.js → chunk-DUU77E2S.js} +69 -64
  34. package/dist/{chunk-ZIYZ77MR.js → chunk-EGO6Z24R.js} +3 -3
  35. package/dist/{chunk-KC5XXX3X.js → chunk-EOOEC32M.js} +1 -1
  36. package/dist/{chunk-3IBMBNYY.js → chunk-ETNQF37F.js} +10 -10
  37. package/dist/{chunk-XIHCMVMG.js → chunk-FDL4HV44.js} +2 -2
  38. package/dist/{chunk-GBGJ7A3D.js → chunk-FJLHVAPO.js} +6 -6
  39. package/dist/{chunk-QZ3AZTXI.js → chunk-FJWEYVEM.js} +42 -16
  40. package/dist/{chunk-IHTRYDFN.js → chunk-FKLYMV3U.js} +1 -1
  41. package/dist/{chunk-PUGIRFPX.js → chunk-FMNVTKX2.js} +4 -4
  42. package/dist/{chunk-GEMJYBRU.js → chunk-HBGJYBGE.js} +2 -2
  43. package/dist/{chunk-U5QY7KTN.js → chunk-HTM4CIFS.js} +11 -8
  44. package/dist/{chunk-T42U2W2R.js → chunk-IXLUTE6N.js} +1 -1
  45. package/dist/{chunk-FDT6KQV4.js → chunk-JBQJKC23.js} +2 -2
  46. package/dist/{chunk-IEIJRMLZ.js → chunk-JDB65PPT.js} +62 -63
  47. package/dist/{chunk-USDEMXXL.js → chunk-JYVGYKXG.js} +1 -1
  48. package/dist/{chunk-PLR7Z6TC.js → chunk-K7ES5RSK.js} +1 -1
  49. package/dist/{chunk-VHFEMFYL.js → chunk-KFZUUXUN.js} +3 -3
  50. package/dist/{chunk-GRY3PN3K.js → chunk-KG265HQ7.js} +2 -2
  51. package/dist/{chunk-R42WWQVB.js → chunk-KPJMBC4K.js} +2 -2
  52. package/dist/{chunk-MAYCCGMQ.js → chunk-KVGDFUVO.js} +1 -1
  53. package/dist/{chunk-CFUXNBWH.js → chunk-LE7T4ML7.js} +1 -1
  54. package/dist/{chunk-MQZVBHEY.js → chunk-LFNQDTSH.js} +1 -1
  55. package/dist/{chunk-KIFHYXPB.js → chunk-MOL32UKR.js} +45 -11
  56. package/dist/{chunk-ICKDMTLA.js → chunk-QSSPIATO.js} +2 -2
  57. package/dist/{chunk-3KU3PFDW.js → chunk-R6R74HNZ.js} +74 -66
  58. package/dist/{chunk-ADF3X6GM.js → chunk-SYMSKGXI.js} +2 -2
  59. package/dist/{chunk-ZEUONDQG.js → chunk-SYUGVPYH.js} +1 -1
  60. package/dist/{chunk-BFACGEII.js → chunk-TBOMPYG6.js} +2 -2
  61. package/dist/{chunk-XBX4QJP7.js → chunk-TH4OXAWY.js} +1 -1
  62. package/dist/{chunk-GMAJB2P6.js → chunk-UOBYRLDD.js} +1 -1
  63. package/dist/{chunk-4QWD6JYN.js → chunk-UZUUVYAO.js} +3 -3
  64. package/dist/{chunk-PJ3HDUCY.js → chunk-VAS6HQX3.js} +39 -9
  65. package/dist/{chunk-6LGNTUZN.js → chunk-VT563F4O.js} +7 -7
  66. package/dist/{chunk-UXO2L7HJ.js → chunk-WU2B74TL.js} +267 -65
  67. package/dist/{chunk-OB5MJR4W.js → chunk-WUZ6TMAO.js} +1 -1
  68. package/dist/{chunk-GQJZORQP.js → chunk-XBSPQ52S.js} +1 -1
  69. package/dist/{chunk-4ORLNTET.js → chunk-XJUZEB44.js} +1 -1
  70. package/dist/{chunk-LAFJSYDL.js → chunk-XVIYZU3D.js} +1 -1
  71. package/dist/{chunk-GXJEGZL2.js → chunk-Z5C4LEAD.js} +17 -18
  72. package/dist/chunk-Z6FLHIDV.js +3795 -0
  73. package/dist/{chunk-DDIVWXN7.js → chunk-ZFN6GQU4.js} +4 -4
  74. package/dist/{chunk-DWUKJQTO.js → chunk-ZVZSFDW3.js} +2 -2
  75. package/dist/{chunk-5NRXZGKK.js → chunk-ZZ7H4IJ6.js} +9 -9
  76. package/dist/{clean-RDKJB5FK.js → clean-2GDD2B4F.js} +23 -23
  77. package/dist/cli.js +52 -52
  78. package/dist/{cloud-QVPVVNCW.js → cloud-LUKGDTTE.js} +4 -4
  79. package/dist/{cloudrun-3RE2UCQG.js → cloudrun-NQF5KFQI.js} +6 -6
  80. package/dist/{compare-LEDOY7MO.js → compare-4P6O4ONG.js} +32 -32
  81. package/dist/{compiler-F54OZZPM.js → compiler-ACCPOZMQ.js} +6 -6
  82. package/dist/{component-N42M67WY.js → component-SDDOLNJD.js} +3 -3
  83. package/dist/{compositions-VB2J2LZI.js → compositions-P2L6HUVQ.js} +15 -15
  84. package/dist/{delete-Q6RWMJ4Z.js → delete-Q6S4BJ3F.js} +2 -2
  85. package/dist/{deterministicFonts-U2BIMGPG.js → deterministicFonts-C5JQLCTS.js} +2 -2
  86. package/dist/{dist-Q4BI5A73.js → dist-GPDOV3IQ.js} +4 -4
  87. package/dist/{dist-KDJTFJHA.js → dist-HUMFCJ6T.js} +3 -3
  88. package/dist/{doctor-JMMUHDRV.js → doctor-NL73UKHV.js} +15 -15
  89. package/dist/{events-RGUAHIBW.js → events-AVOPOKO3.js} +5 -5
  90. package/dist/{events-6ZBSIBE5.js → events-X7KPU7LG.js} +4 -4
  91. package/dist/{feedback-FIID6MZW.js → feedback-GJZ5NXSH.js} +10 -10
  92. package/dist/{ffmpeg-T5SH2EFJ.js → ffmpeg-5V4FP3R6.js} +2 -2
  93. package/dist/{figma-BL3JJC36.js → figma-V7SVQQI5.js} +3 -3
  94. package/dist/fontLocalizeCli.js +14 -14
  95. package/dist/{get-P46GS7S6.js → get-FO3YZYEU.js} +2 -2
  96. package/dist/{gpuPolicy-AQ2BPLBK.js → gpuPolicy-QGS4TFWP.js} +10 -10
  97. package/dist/{grade-compare-GDCWU7ZZ.js → grade-compare-7ICSN7KE.js} +33 -33
  98. package/dist/{help-HJR3RWFG.js → help-Y5LYZG7K.js} +2 -2
  99. package/dist/{history-GGO5AWJB.js → history-RKGBRNLD.js} +49 -22
  100. package/dist/hyperframe-runtime.js +214 -68
  101. package/dist/hyperframe.manifest.json +1 -1
  102. package/dist/hyperframe.runtime.iife.js +214 -68
  103. package/dist/hyperframes-player.global.js +4 -5
  104. package/dist/hyperframes-slideshow.global.js +3 -4
  105. package/dist/{info-3GFWUBJC.js → info-GGUTL2NR.js} +11 -11
  106. package/dist/{init-36OPU2ZG.js → init-PG7NA5SQ.js} +31 -31
  107. package/dist/{inspect-F2HEL5ON.js → inspect-FCXUB6DE.js} +33 -33
  108. package/dist/{installer-NI6P6GC4.js → installer-LZ4X5TZZ.js} +6 -6
  109. package/dist/{keyframes-7OY3LMAZ.js → keyframes-R3K6WJ3N.js} +8 -8
  110. package/dist/{lambda-6GJIWNJ3.js → lambda-3GAKHMC3.js} +7 -7
  111. package/dist/{layout-FTMLNL5A.js → layout-XNIZIGA2.js} +33 -33
  112. package/dist/{lint-U6POHUON.js → lint-4KDS2F4O.js} +11 -11
  113. package/dist/{lintProject-UBZ3TDHU.js → lintProject-SSEXWCH6.js} +3 -3
  114. package/dist/{list-IP5KI5Q2.js → list-OVPURFPK.js} +2 -2
  115. package/dist/{login-4VWTVPHG.js → login-EE2AX2PE.js} +4 -4
  116. package/dist/{manager-YKMHR6LN.js → manager-5ORDVWJB.js} +3 -3
  117. package/dist/{media-treatment-XGV44AGV.js → media-treatment-UDUEOP67.js} +82 -54
  118. package/dist/{models-UCXB6UR5.js → models-LPK2O4B2.js} +14 -14
  119. package/dist/{motionShot-WPVNBXKA.js → motionShot-G76XBOYI.js} +35 -29
  120. package/dist/{normalize-audio-TYJ3UEHO.js → normalize-audio-TUKWZ3OR.js} +10 -10
  121. package/dist/{open-HENOLVB2.js → open-7XB2TGVB.js} +6 -6
  122. package/dist/{parakeetRunner-VFQ6WFTD.js → parakeetRunner-DL556HXL.js} +14 -14
  123. package/dist/{pipeline-6WPSC3H4.js → pipeline-34N5DLWU.js} +11 -11
  124. package/dist/{play-OI53WNUM.js → play-DDA2UUQF.js} +26 -26
  125. package/dist/{preflight-B4AFK3RG.js → preflight-ONF5AJNO.js} +5 -5
  126. package/dist/{present-NGMEQ4NO.js → present-LLNRKXF5.js} +23 -23
  127. package/dist/{preview-VT2HWRWZ.js → preview-H3ZZS46F.js} +57 -26
  128. package/dist/{producer-7TYEAUF7.js → producer-IFQOZK2G.js} +1 -1
  129. package/dist/{projectConfig-B2AF5DXY.js → projectConfig-SBRMQZGG.js} +8 -8
  130. package/dist/{publication-2PANQVC6.js → publication-5BQICRZO.js} +4 -4
  131. package/dist/{publish-O5OL42BG.js → publish-XDUZA3E3.js} +27 -26
  132. package/dist/{remove-background-T2JM6UVP.js → remove-background-GNKRMFQS.js} +12 -12
  133. package/dist/{render-Z253WHBK.js → render-JM6KNRIA.js} +27 -27
  134. package/dist/{render-OLPKOJRU.js → render-KTTC3EE5.js} +12 -12
  135. package/dist/{render-W7OFXDOJ.js → render-PCFO45RK.js} +5 -5
  136. package/dist/{render-batch-46IIBFKL.js → render-batch-7R2NRNVJ.js} +5 -5
  137. package/dist/{renderCancellation-QTZOCDJ2.js → renderCancellation-GP3XD2FS.js} +10 -10
  138. package/dist/renderSetupWorker.js +3 -3
  139. package/dist/{resolver-J2PL5FVJ.js → resolver-C4FPX72I.js} +6 -6
  140. package/dist/{sherpa-ZF42V3RN.js → sherpa-MZP3MV2X.js} +14 -14
  141. package/dist/skills/media-use/references/media-treatments.md +5 -1
  142. package/dist/{skills-ACDOO3PX.js → skills-OET4XSHR.js} +7 -7
  143. package/dist/{skillsUpdateCheck-L5OXVVPU.js → skillsUpdateCheck-IPFSKKJD.js} +3 -3
  144. package/dist/{slideshow-4OJEPWNZ.js → slideshow-YTWATJRT.js} +1 -1
  145. package/dist/{snapshot-UUVNZOW5.js → snapshot-EC4N75MS.js} +34 -34
  146. package/dist/{src-BSLKXEGX.js → src-LIERUCFW.js} +11 -9
  147. package/dist/{src-KS3AWFGT.js → src-ZZQJOKO6.js} +13 -13
  148. package/dist/{staticProjectServer-2TTVGPQH.js → staticProjectServer-YH2RHYKW.js} +20 -20
  149. package/dist/{status-LXPGSSKY.js → status-PTKNQD2E.js} +2 -2
  150. package/dist/studio/assets/{hyperframes-player-DZ5JrMDg.js → hyperframes-player-tkxyWf5H.js} +3 -3
  151. package/dist/studio/assets/{index-BqFRhNZa.js → index-BrdqOkqP.js} +1 -1
  152. package/dist/studio/assets/{index-D8W0a0Z9.js → index-Cg48BxAo.js} +135 -135
  153. package/dist/studio/assets/{index-BOs6C0aZ.js → index-Dllxg4aU.js} +1 -1
  154. package/dist/studio/index.html +1 -1
  155. package/dist/{studio-api-WYWF7XRC.js → studio-api-T2TS2CHL.js} +16 -14
  156. package/dist/{studioServer-3FG4YTP7.js → studioServer-GJVVJUEL.js} +50 -50
  157. package/dist/{system-OQLOGGPJ.js → system-OXRG57F2.js} +2 -2
  158. package/dist/{telemetry-PAOOB4T4.js → telemetry-ZQ5XVE6Z.js} +5 -5
  159. package/dist/{timeline-JIIJKKPC.js → timeline-I2T5WIPD.js} +34 -25
  160. package/dist/{tokens-3QRAM75Z.js → tokens-ONUWOXEX.js} +2 -2
  161. package/dist/{transcribe-QSBP5MUG.js → transcribe-BCQMA537.js} +12 -12
  162. package/dist/{transcribe-SZB6UMXE.js → transcribe-ZLJF7V5Y.js} +13 -13
  163. package/dist/{updateCheck-V3DSB26K.js → updateCheck-ZWHDXF73.js} +2 -2
  164. package/dist/{upgrade-L5GISOEV.js → upgrade-32JGFZWS.js} +2 -2
  165. package/dist/{urlDownloader-52FERT4X.js → urlDownloader-EVDP43GM.js} +9 -9
  166. package/dist/{validate-HVVLX7KO.js → validate-G4PUGQCI.js} +27 -27
  167. package/dist/{video-MEOWRMFG.js → video-TILEY3VJ.js} +10 -10
  168. package/package.json +3 -2
  169. package/dist/chunk-AUWHD7RA.js +0 -3753
  170. package/dist/studio/chunk-6JY3MTIX.js +0 -1204
  171. package/dist/studio/chunk-EEXSYY5F.js +0 -190
  172. package/dist/studio/chunk-NZPJUZKT.js +0 -1538
  173. package/dist/studio/chunk-PZ5AY32C.js +0 -10
  174. package/dist/studio/chunk-TP6D3U37.js +0 -845
  175. package/dist/studio/chunk-Y2OHHNM2.js +0 -970
  176. package/dist/studio/domEditingLayers-PTP2ICGM.js +0 -47
  177. package/dist/studio/index.css +0 -165
  178. package/dist/studio/index.d.ts +0 -4318
  179. package/dist/studio/index.js +0 -100952
  180. package/dist/studio/player.d.ts +0 -30
  181. package/dist/studio/player.js +0 -10
  182. package/dist/studio/styles/tailwind-preset.d.ts +0 -39
  183. package/dist/studio/styles/tailwind-preset.js +0 -50
  184. package/dist/studio/styles.css +0 -1
  185. package/dist/studio/ui.d.ts +0 -297
  186. package/dist/studio/ui.js +0 -66
@@ -11,15 +11,15 @@ import {
11
11
  iterateFontFamilyDeclarations,
12
12
  normalizeSystemFontPrimaryFamilies,
13
13
  resolveFontFamilyDeclarationFamilies
14
- } from "./chunk-PUGIRFPX.js";
14
+ } from "./chunk-FMNVTKX2.js";
15
15
  import {
16
16
  EncoderInterruptedError,
17
17
  encoderFailureError,
18
18
  prepareAnimatedGifInputs
19
- } from "./chunk-GRY3PN3K.js";
19
+ } from "./chunk-KG265HQ7.js";
20
20
  import {
21
21
  createStudioPositionSeekReapplyScript
22
- } from "./chunk-KC5XXX3X.js";
22
+ } from "./chunk-EOOEC32M.js";
23
23
  import {
24
24
  BROWSER_GPU_NOT_SOFTWARE,
25
25
  CaptureFailure,
@@ -105,6 +105,7 @@ import {
105
105
  isNotMediaPayload,
106
106
  isTransientBrowserError,
107
107
  isVideoFrameFormat,
108
+ isVideoPastTimelineEnd,
108
109
  mergeWorkerFrames,
109
110
  muxVideoWithAudio,
110
111
  normalizeObjectFit,
@@ -144,7 +145,7 @@ import {
144
145
  validateEngineConfigSnapshot,
145
146
  verifyDiskDrawElementSamples,
146
147
  writeCapturedFrame
147
- } from "./chunk-UXO2L7HJ.js";
148
+ } from "./chunk-WU2B74TL.js";
148
149
  import {
149
150
  assignBundledRuntimeCompositionIds,
150
151
  buildVariablesByCompScript,
@@ -157,12 +158,12 @@ import {
157
158
  isTemplateEntry,
158
159
  parsesAsScript,
159
160
  prepareFlattenedInnerRoot
160
- } from "./chunk-FDT6KQV4.js";
161
+ } from "./chunk-JBQJKC23.js";
161
162
  import {
162
163
  LOW_MEMORY_TOTAL_MB_THRESHOLD,
163
164
  getCgroupMemoryLimitMb,
164
165
  getSystemTotalMb
165
- } from "./chunk-USDEMXXL.js";
166
+ } from "./chunk-JYVGYKXG.js";
166
167
  import {
167
168
  HF_VFX_ATTR,
168
169
  MEDIA_START_BASIS_ATTR,
@@ -178,7 +179,7 @@ import {
178
179
  resolveAbsoluteMediaStartSeconds,
179
180
  resolveAuthoredTimingWindow,
180
181
  toFps
181
- } from "./chunk-VRW6EBHV.js";
182
+ } from "./chunk-BAKPN2D2.js";
182
183
  import {
183
184
  COMPOSITION_SOURCE_URL,
184
185
  HF_COLOR_GRADING_ATTR,
@@ -205,7 +206,7 @@ import {
205
206
  shouldClampResolvedMediaDuration,
206
207
  sourceTimeAt,
207
208
  styleElementsFor
208
- } from "./chunk-AUWHD7RA.js";
209
+ } from "./chunk-Z6FLHIDV.js";
209
210
  import {
210
211
  MAX_AUDIO_GAIN
211
212
  } from "./chunk-YA62XGXS.js";
@@ -219,7 +220,7 @@ import {
219
220
  isAspectAgnosticResolutionAlias,
220
221
  normalizeResolutionFlag,
221
222
  suggestMatchingPreset
222
- } from "./chunk-MQZVBHEY.js";
223
+ } from "./chunk-LFNQDTSH.js";
223
224
  import {
224
225
  redactKnownPaths,
225
226
  redactTelemetryString
@@ -229,7 +230,7 @@ import {
229
230
  } from "./chunk-TWWSYAKJ.js";
230
231
  import {
231
232
  lintHyperframeHtml
232
- } from "./chunk-IEIJRMLZ.js";
233
+ } from "./chunk-JDB65PPT.js";
233
234
  import {
234
235
  isUnresolvedAssetPlaceholder,
235
236
  readProjectFile,
@@ -486,7 +487,7 @@ function buildVirtualTimeShim(options) {
486
487
  const seedRandomFromFrame = options.seedRandomFromFrame === true;
487
488
  const seededRandomBlock = seedRandomFromFrame ? String.raw`
488
489
  // Seeded Math.random / crypto.getRandomValues, keyed by virtual time.
489
- // Mulberry32 — single uint32 state, deterministic, fast.
490
+ // Mulberry32: single uint32 state, deterministic, fast.
490
491
  var rngState = 0;
491
492
  function mulberry32() {
492
493
  rngState |= 0; rngState = (rngState + 0x6D2B79F5) | 0;
@@ -497,7 +498,7 @@ function buildVirtualTimeShim(options) {
497
498
  }
498
499
  function reseedRngFromTime(ms) {
499
500
  var ms32 = Math.max(0, Math.floor(Number(ms) || 0)) | 0;
500
- // Knuth's multiplicative hash + golden-ratio offset — gives a well-
501
+ // Knuth's multiplicative hash + golden-ratio offset gives a well-
501
502
  // distributed seed even for frame 0 (otherwise rngState=0 degenerates
502
503
  // the PRNG's first few outputs).
503
504
  rngState = (Math.imul(ms32, -1640531527) + 0x9E3779B9) | 0;
@@ -739,7 +740,7 @@ function buildRenderModeScript(fps) {
739
740
  };
740
741
  window.__playerReady = true;
741
742
  // Media-fallback player has no timeline to bind, so render-ready is immediate.
742
- // init.ts defers __renderReady until the timeline is bound \u2014 different runtime.
743
+ // init.ts defers __renderReady until the timeline is bound (a different runtime).
743
744
  window.__renderReady = true;
744
745
  return true;
745
746
  }
@@ -2266,7 +2267,7 @@ function blitHdrVideoLayer(canvas, el, time, fps, hdrVideoFrameSources, hdrStart
2266
2267
  if (matrix && !isTranslationOnly) {
2267
2268
  if (clipped && log) {
2268
2269
  log.debug(
2269
- `HDR clip rect on affine-transformed element ${el.id} \u2014 clip not applied (affine scissor not yet supported)`
2270
+ `HDR clip rect on affine-transformed element ${el.id}: clip not applied (affine scissor not yet supported)`
2270
2271
  );
2271
2272
  }
2272
2273
  blitRgb48leAffine(
@@ -2323,7 +2324,7 @@ function blitHdrImageLayer(canvas, el, hdrImageBuffers, hdrImageTransferCache, w
2323
2324
  return;
2324
2325
  }
2325
2326
  if (el.clipRect && log) {
2326
- log.debug(`HDR clip rect on image element ${el.id} \u2014 clip not yet supported for images`);
2327
+ log.debug(`HDR clip rect on image element ${el.id}: clip not yet supported for images`);
2327
2328
  }
2328
2329
  try {
2329
2330
  if (hdrPerf) hdrPerf.hdrImageLayerBlits += 1;
@@ -4474,7 +4475,7 @@ async function validateCompletedSegments(manifest, expectedHash, probeFrames) {
4474
4475
  function formatDowngradeWarning(outputFormat, forcedHdrWithoutSources) {
4475
4476
  const hdrSourceReason = forcedHdrWithoutSources ? "HDR was forced without detected HDR sources" : "HDR source detected";
4476
4477
  const formatReason = outputFormat === "hls" ? "HLS output is SDR-only (H.264 in MPEG-TS)" : "HDR + alpha is not supported";
4477
- return `[Render] ${hdrSourceReason}, but format is "${outputFormat}" \u2014 falling back to SDR. ${formatReason}. Use --format mp4 for HDR10 output.`;
4478
+ return `[Render] ${hdrSourceReason}, but format is "${outputFormat}", so falling back to SDR. ${formatReason}. Use --format mp4 for HDR10 output.`;
4478
4479
  }
4479
4480
  function findRenderHdrAutoPromotionTrigger(input) {
4480
4481
  for (const extracted of input.extractionResult?.extracted ?? []) {
@@ -4487,12 +4488,12 @@ function findRenderHdrAutoPromotionTrigger(input) {
4487
4488
  function logHdrResolution(input, hdrMode, effectiveHdr, forcedHdrWithoutSources) {
4488
4489
  if (forcedHdrWithoutSources) {
4489
4490
  input.log.warn(
4490
- "[Render] HDR forced by --hdr flag, but no HDR sources were detected \u2014 defaulting to HLG. SDR-only compositions may look perceptually wrong on HDR displays."
4491
+ "[Render] HDR forced by --hdr flag, but no HDR sources were detected, defaulting to HLG. SDR-only compositions may look perceptually wrong on HDR displays."
4491
4492
  );
4492
4493
  }
4493
4494
  if (!effectiveHdr) {
4494
4495
  input.log.info(
4495
- hdrMode === "force-sdr" ? "[Render] SDR forced by --sdr flag" : "[Render] No HDR sources detected \u2014 rendering SDR"
4496
+ hdrMode === "force-sdr" ? "[Render] SDR forced by --sdr flag" : "[Render] No HDR sources detected, rendering SDR"
4496
4497
  );
4497
4498
  return;
4498
4499
  }
@@ -4507,9 +4508,9 @@ function logHdrResolution(input, hdrMode, effectiveHdr, forcedHdrWithoutSources)
4507
4508
  );
4508
4509
  return;
4509
4510
  }
4510
- const reason = forcedHdrWithoutSources ? "forced by --hdr flag (no HDR sources detected \u2014 defaulting to HLG)" : "forced by --hdr flag";
4511
+ const reason = forcedHdrWithoutSources ? "forced by --hdr flag (no HDR sources detected, defaulting to HLG)" : "forced by --hdr flag";
4511
4512
  input.log.info(
4512
- `[Render] HDR ${reason} \u2014 output: ${effectiveHdr.transfer.toUpperCase()} (BT.2020, 10-bit H.265)`
4513
+ `[Render] HDR ${reason}, output: ${effectiveHdr.transfer.toUpperCase()} (BT.2020, 10-bit H.265)`
4513
4514
  );
4514
4515
  }
4515
4516
  function resolveEffectiveHdrMode(input) {
@@ -4596,14 +4597,14 @@ function resolveRenderWorkerCount(totalFrames, requestedWorkers, cfg, compiled,
4596
4597
  const reasonCodes = new Set(compiled.renderModeHints.reasons.map((r) => r.code));
4597
4598
  if (reasonCodes.has("htmlInCanvas")) {
4598
4599
  log.warn(
4599
- "[Render] html-in-canvas (drawElementImage) detected \u2014 pinning to 1 worker (Chrome concurrency limitation).",
4600
+ "[Render] html-in-canvas (drawElementImage) detected, pinning to 1 worker (Chrome concurrency limitation).",
4600
4601
  { requestedWorkers }
4601
4602
  );
4602
4603
  return 1;
4603
4604
  }
4604
4605
  if (cfg.lowMemoryMode && requestedWorkers === void 0) {
4605
4606
  log.info(
4606
- "[Render] Low-memory profile \u2014 pinning to 1 capture worker (auto-worker calibration skipped)."
4607
+ "[Render] Low-memory profile, pinning to 1 capture worker (auto-worker calibration skipped)."
4607
4608
  );
4608
4609
  return 1;
4609
4610
  }
@@ -5227,7 +5228,7 @@ function assertVideoFrameCoverage(reports, threshold) {
5227
5228
  const thresholdPct = (threshold * 100).toFixed(1);
5228
5229
  const suffix = sorted.length > 1 ? ` (+${sorted.length - 1} more clip(s) below threshold)` : "";
5229
5230
  throw new VideoFrameCoverageError(
5230
- `Video "${worst.videoId}" captured ${worst.capturedFrames} of expected ${worst.expectedFrames} frames (coverage ${pct}%, threshold ${thresholdPct}%). check/snapshot may pass while the encoded MP4 renders this clip blank \u2014 aborting render to prevent shipping a wrong MP4.${suffix} Set HF_VIDEO_COVERAGE_THRESHOLD=0 to disable this gate.`,
5231
+ `Video "${worst.videoId}" captured ${worst.capturedFrames} of expected ${worst.expectedFrames} frames (coverage ${pct}%, threshold ${thresholdPct}%). check/snapshot may pass while the encoded MP4 renders this clip blank, so the render is aborted to prevent shipping a wrong MP4.${suffix} Set HF_VIDEO_COVERAGE_THRESHOLD=0 to disable this gate.`,
5231
5232
  { threshold, worst, failedReports: sorted }
5232
5233
  );
5233
5234
  }
@@ -5334,7 +5335,7 @@ function collectRenderMedia(html) {
5334
5335
  }
5335
5336
 
5336
5337
  // ../core/dist/generated/position-edits-render-inline.js
5337
- var POSITION_EDITS_RENDER_IIFE = '"use strict";(()=>{function T(){return globalThis}function P(e,t){if(typeof window>"u")return;let o=T(),r=o.__hf?.onSwallowed;if(r)try{r({label:e,error:t})}catch(s){}(o.__hfDebug||o.__HYPERFRAMES_DEBUG)&&console.debug(`[hyperframes] ${e} swallowed:`,t)}var x=null;function R(e,t){if(x)try{x({source:"hf-preview",type:"analytics",event:e,properties:t??{}})}catch(o){P("runtime.analytics.site1",o)}}var W="http://www.w3.org/1999/xhtml";function N(e){return e!=null&&e.nodeType===1}function _(e){return N(e)&&(e.namespaceURI===W||e.namespaceURI==="http://www.w3.org/2000/svg")}var w="data-hf-edit-base-x",y="data-hf-edit-base-y",m="data-hf-edit-original-translate",k=e=>{let t=parseFloat(e??"");return Number.isFinite(t)?t:0},O=e=>{let t=[],o=0,r="";for(let s of e.trim())s==="("&&(o+=1),s===")"&&(o=Math.max(0,o-1)),/\\s/.test(s)&&o===0?(r&&t.push(r),r=""):r+=s;return r&&t.push(r),t},L=/^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)px$/,E=(e,t)=>L.test(e)&&L.test(t)?`${parseFloat(e)+parseFloat(t)}px`:`calc(${e} + ${t})`,V=(e,t,o)=>{if(!e||e==="none")return`${t} ${o}`;let[r,s,a]=O(e);if(r===void 0)return`${t} ${o}`;if(s===void 0)return`${E(r,t)} ${o}`;let i=a===void 0?"":` ${a}`;return`${E(r,t)} ${E(s,o)}${i}`},j=e=>{try{e.ownerDocument.defaultView?.gsap?.getProperty?.(e,"x")}catch{}},G=e=>{let t=e.style.getPropertyValue("translate").trim();if(t)return t==="none"?"":t;try{let o=e.ownerDocument.defaultView,r=o?o.getComputedStyle(e).getPropertyValue("translate").trim():"";return r==="none"?"":r}catch{return""}},b=new WeakMap;function B(e,t){let o=b.get(e);if(!t?.force&&o!==void 0&&e.style.getPropertyValue("translate")!==o){R("position_edit_fold_skipped",{hfId:e.getAttribute("data-hf-id")});return}let r=k(e.getAttribute("data-x"))-k(e.getAttribute(w)),s=k(e.getAttribute("data-y"))-k(e.getAttribute(y));e.hasAttribute(m)||e.setAttribute(m,G(e)),o===void 0&&j(e);let a=e.getAttribute(m)??"",i=V(a,`${r}px`,`${s}px`);e.style.setProperty("translate",i),b.set(e,e.style.getPropertyValue("translate"))}function S(e,t){let o=e.querySelectorAll(`[${m}]:not([${w}]):not([${y}])`);for(let a=0;a<o.length;a++){let i=o[a];if(i===void 0||!_(i))continue;let g=i.getAttribute(m)??"";g===""?i.style.removeProperty("translate"):i.style.setProperty("translate",g),i.removeAttribute(m),b.delete(i)}let r=e.querySelectorAll(`[${w}], [${y}]`),s=0;for(let a=0;a<r.length;a++){let i=r[a];i===void 0||!_(i)||(B(i,t),s+=1)}return s}var $="__hfPositionEditsSeekReapplyWrapped",D=new WeakSet,M=new WeakMap,H=new WeakMap;function F(e){let t=e,o=()=>{try{S(t.document)}catch{}},r=n=>typeof n=="function"&&(D.has(n)||!!n[$]),s=n=>{D.add(n);try{Object.defineProperty(n,$,{value:!0})}catch{}},a=n=>{if(typeof n!="function"||r(n))return n;let l=function(...u){let d=n.apply(this,u);return o(),d};return s(l),l},i=(n,l)=>{let u=M.get(n);if(u?.has(l))return!0;let d=Object.getOwnPropertyDescriptor(n,l);if(d?.configurable===!1){let c=n[l];return typeof c=="function"&&(n[l]=a(c),o()),!1}let p=n[l],f=d?.set;return Object.defineProperty(n,l,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>p,set:c=>{p=a(c),f?.call(n,c)}}),p=a(p),u??(u=new Set),u.add(l),M.set(n,u),o(),!0},g=(n,l)=>{let u=H.get(t),d=Object.getOwnPropertyDescriptor(t,n);if(!u?.has(n)){if(d?.configurable===!1){let c=t[n];return c?i(c,l):!1}let f=t[n];Object.defineProperty(t,n,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>f,set:c=>{f=c,f&&i(f,l)}}),u??(u=new Set),u.add(n),H.set(t,u)}let p=t[n];return p?i(p,l):!1},v=()=>{let n=g("__hf","seek"),l=g("__player","renderSeek");return n&&l};if(v())return;let h=120,A=t.setInterval(()=>{if(v()){t.clearInterval(A);return}h-=1,h<=0&&t.clearInterval(A)},50)}function I(){document.querySelector(`[${w}], [${y}]`)&&(S(document),F(window))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",I,{once:!0}):I();})();\n';
5338
+ var POSITION_EDITS_RENDER_IIFE = '"use strict";(()=>{function T(){return globalThis}function P(e,t){if(typeof window>"u")return;let o=T(),r=o.__hf?.onSwallowed;if(r)try{r({label:e,error:t})}catch(s){}(o.__hfDebug||o.__HYPERFRAMES_DEBUG)&&console.debug(`[hyperframes] ${e} swallowed:`,t)}var x=null;function R(e,t){if(x)try{x({source:"hf-preview",type:"analytics",event:e,properties:t??{}})}catch(o){P("runtime.analytics.site1",o)}}var W="http://www.w3.org/1999/xhtml";function N(e){return e!=null&&e.nodeType===1}function k(e){return N(e)&&(e.namespaceURI===W||e.namespaceURI==="http://www.w3.org/2000/svg")}var w="data-hf-edit-base-x",y="data-hf-edit-base-y",m="data-hf-edit-original-translate",_=e=>{let t=parseFloat(e??"");return Number.isFinite(t)?t:0},O=e=>{let t=[],o=0,r="";for(let s of e.trim())s==="("&&(o+=1),s===")"&&(o=Math.max(0,o-1)),/\\s/.test(s)&&o===0?(r&&t.push(r),r=""):r+=s;return r&&t.push(r),t},L=/^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)px$/,E=(e,t)=>L.test(e)&&L.test(t)?`${parseFloat(e)+parseFloat(t)}px`:`calc(${e} + ${t})`,V=(e,t,o)=>{if(!e||e==="none")return`${t} ${o}`;let[r,s,a]=O(e);if(r===void 0)return`${t} ${o}`;if(s===void 0)return`${E(r,t)} ${o}`;let i=a===void 0?"":` ${a}`;return`${E(r,t)} ${E(s,o)}${i}`},j=e=>{try{e.ownerDocument.defaultView?.gsap?.getProperty?.(e,"x")}catch{}},C=e=>{let t=e.style.getPropertyValue("translate").trim();if(t)return t==="none"?"":t;try{let o=e.ownerDocument.defaultView,r=o?o.getComputedStyle(e).getPropertyValue("translate").trim():"";return r==="none"?"":r}catch{return""}},b=new WeakMap;function G(e,t){let o=b.get(e);if(!t?.force&&o!==void 0&&e.style.getPropertyValue("translate")!==o){R("position_edit_fold_skipped",{hfId:e.getAttribute("data-hf-id")});return}let r=_(e.getAttribute("data-x"))-_(e.getAttribute(w)),s=_(e.getAttribute("data-y"))-_(e.getAttribute(y));e.hasAttribute(m)||e.setAttribute(m,C(e)),o===void 0&&j(e);let a=e.getAttribute(m)??"",i=V(a,`${r}px`,`${s}px`);e.style.setProperty("translate",i),b.set(e,e.style.getPropertyValue("translate"))}function S(e,t){let o=e.querySelectorAll(`[${m}]:not([${w}]):not([${y}])`);for(let a=0;a<o.length;a++){let i=o[a];if(i===void 0||!k(i))continue;let g=i.getAttribute(m)??"";g===""?i.style.removeProperty("translate"):i.style.setProperty("translate",g),i.removeAttribute(m),b.delete(i)}let r=e.querySelectorAll(`[${w}], [${y}]`),s=0;for(let a=0;a<r.length;a++){let i=r[a];i===void 0||!k(i)||(G(i,t),s+=1)}return s}var $="__hfPositionEditsSeekReapplyWrapped",D=new WeakSet,M=new WeakMap,H=new WeakMap;function F(e){let t=e,o=()=>{try{S(t.document)}catch{}},r=n=>typeof n=="function"&&(D.has(n)||!!n[$]),s=n=>{D.add(n);try{Object.defineProperty(n,$,{value:!0})}catch{}},a=n=>{if(typeof n!="function"||r(n))return n;let l=function(...u){let d=n.apply(this,u);return o(),d};return s(l),l},i=(n,l)=>{let u=M.get(n);if(u?.has(l))return!0;let d=Object.getOwnPropertyDescriptor(n,l);if(d?.configurable===!1){let c=n[l];return typeof c=="function"&&(n[l]=a(c),o()),!1}let p=n[l],f=d?.set;return Object.defineProperty(n,l,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>p,set:c=>{p=a(c),f?.call(n,c)}}),p=a(p),u??(u=new Set),u.add(l),M.set(n,u),o(),!0},g=(n,l)=>{let u=H.get(t),d=Object.getOwnPropertyDescriptor(t,n);if(!u?.has(n)){if(d?.configurable===!1){let c=t[n];return c?i(c,l):!1}let f=t[n];Object.defineProperty(t,n,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>f,set:c=>{f=c,f&&i(f,l)}}),u??(u=new Set),u.add(n),H.set(t,u)}let p=t[n];return p?i(p,l):!1},h=()=>{let n=g("__hf","seek"),l=g("__player","renderSeek");return n&&l};if(h())return;let v=120,A=t.setInterval(()=>{if(h()){t.clearInterval(A);return}v-=1,v<=0&&t.clearInterval(A)},50)}function I(){document.querySelector(`[${w}], [${y}]`)&&(S(document),F(window))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",I,{once:!0}):I();})();\n';
5338
5339
  function getPositionEditsRenderScript() {
5339
5340
  return POSITION_EDITS_RENDER_IIFE;
5340
5341
  }
@@ -5724,7 +5725,7 @@ async function resolveMediaDuration(src, mediaStart, playbackRate, baseDir, down
5724
5725
  if (tagName !== "video") {
5725
5726
  if (error instanceof NotMediaPayloadError) {
5726
5727
  log?.warn(
5727
- `[compile] Audio "${elementIdentity}" (${src}) is a text document, not a media file \u2014 the element is dropped from the render. Point it at a rendered media file.`
5728
+ `[compile] Audio "${elementIdentity}" (${src}) is a text document, not a media file, so the element is dropped from the render. Point it at a rendered media file.`
5728
5729
  );
5729
5730
  }
5730
5731
  return { duration: null, resolvedPath: filePath };
@@ -5813,7 +5814,7 @@ async function compileHtmlFile(html, baseDir, downloadDir, log) {
5813
5814
  if (r.maxDuration != null && shouldClampResolvedMediaDuration(r.tagName, r.duration, r.maxDuration)) {
5814
5815
  clampList.push({ id: r.id, duration: r.maxDuration });
5815
5816
  log?.warn(
5816
- `[compile] Audio "${r.id}" (${r.src}) is ${r.maxDuration.toFixed(2)}s but its data-duration is ${r.duration.toFixed(2)}s \u2014 the slot is shortened to the media length. Set data-duration to ~${r.maxDuration.toFixed(2)}s, trim data-media-start, or use a longer/looping source if that isn't intended.`
5817
+ `[compile] Audio "${r.id}" (${r.src}) is ${r.maxDuration.toFixed(2)}s but its data-duration is ${r.duration.toFixed(2)}s, so the slot is shortened to the media length. Set data-duration to ~${r.maxDuration.toFixed(2)}s, trim data-media-start, or use a longer/looping source if that isn't intended.`
5817
5818
  );
5818
5819
  }
5819
5820
  }
@@ -6202,7 +6203,7 @@ ${safeText}
6202
6203
  } else {
6203
6204
  if (download.reason instanceof ScriptIntegrityError) throw download.reason;
6204
6205
  defaultLogger.warn(
6205
- `[Compiler] WARNING: Failed to download CDN script: ${src} \u2014 ${download.reason}. The render may fail if this script is required (e.g. GSAP). Consider bundling it locally in your project.`
6206
+ `[Compiler] WARNING: Failed to download CDN script: ${src} (${download.reason}). The render may fail if this script is required (e.g. GSAP). Consider bundling it locally in your project.`
6206
6207
  );
6207
6208
  }
6208
6209
  }
@@ -6254,7 +6255,7 @@ function collectExternalAssets(html, projectDir) {
6254
6255
  }
6255
6256
  if (externalAssets.size > 0) {
6256
6257
  defaultLogger.info(
6257
- `[Compiler] Found ${externalAssets.size} asset(s) outside project directory \u2014 will copy to render output`
6258
+ `[Compiler] Found ${externalAssets.size} asset(s) outside project directory, will copy to render output`
6258
6259
  );
6259
6260
  }
6260
6261
  return {
@@ -6279,7 +6280,7 @@ async function downloadAndRewriteUrls(urlSet, html, remoteDir, warnLabel, logLab
6279
6280
  urlToLocal.set(url, localPath);
6280
6281
  } catch (err) {
6281
6282
  const identity = safeDownloadUrlIdentity(url);
6282
- defaultLogger.warn(`[Compiler] ${warnLabel} \u2014 using original URL as fallback.`, {
6283
+ defaultLogger.warn(`[Compiler] ${warnLabel}, using original URL as fallback.`, {
6283
6284
  urlFingerprint: identity.urlFingerprint,
6284
6285
  host: identity.host,
6285
6286
  error: err instanceof Error ? err.message : String(err)
@@ -6372,7 +6373,7 @@ async function fetchExternalStylesheetCss(href) {
6372
6373
  timeoutMs: 15e3
6373
6374
  });
6374
6375
  } catch (err) {
6375
- defaultLogger.warn("[Compiler] External stylesheet fetch failed \u2014 preserving link tag.", {
6376
+ defaultLogger.warn("[Compiler] External stylesheet fetch failed, preserving link tag.", {
6376
6377
  urlFingerprint: identity.urlFingerprint,
6377
6378
  host: identity.host,
6378
6379
  error: err instanceof Error ? err.message : String(err)
@@ -6507,7 +6508,7 @@ async function readLocalFont(absPath) {
6507
6508
  return { kind: "inline", buffer: Buffer.concat(chunks, totalBytes) };
6508
6509
  }
6509
6510
  async function embedLocalFontFaces(html, projectDir) {
6510
- const { fontToDataUri: toDataUri } = await import("./deterministicFonts-U2BIMGPG.js");
6511
+ const { fontToDataUri: toDataUri } = await import("./deterministicFonts-C5JQLCTS.js");
6511
6512
  const styleBlockRe = /<style\b[^>]*>([\s\S]*?)<\/style>/gi;
6512
6513
  const fontFaceRe = /@font-face\s*\{([^}]*)\}/gi;
6513
6514
  let result = html;
@@ -7016,12 +7017,15 @@ async function resolveCompositionDurations(page, unresolved) {
7016
7017
  const resolved = [];
7017
7018
  for (const id of compIds) {
7018
7019
  const tl = timelines[id];
7019
- if (tl && typeof tl.duration === "function") {
7020
- const dur = tl.duration();
7021
- if (dur > 0) {
7022
- resolved.push({ id, duration: dur, source: "__timelines" });
7023
- continue;
7024
- }
7020
+ let dur = 0;
7021
+ try {
7022
+ dur = typeof tl?.duration === "function" ? Number(tl.duration()) : 0;
7023
+ } catch {
7024
+ dur = 0;
7025
+ }
7026
+ if (dur > 0) {
7027
+ resolved.push({ id, duration: dur, source: "__timelines" });
7028
+ continue;
7025
7029
  }
7026
7030
  const el = document.getElementById(id);
7027
7031
  if (el) {
@@ -7117,28 +7121,28 @@ async function runCompileStage(input) {
7117
7121
  cfg.useDrawElement = false;
7118
7122
  deCompileGate = "3d";
7119
7123
  log.info(
7120
- "[Render] Fast capture: composition uses a CSS 3D rendering context (perspective / preserve-3d / backface-visibility) \u2014 disabling drawElementImage for this render. Capture uses the platform's baseline route."
7124
+ "[Render] Fast capture: composition uses a CSS 3D rendering context (perspective / preserve-3d / backface-visibility), so disabling drawElementImage for this render. Capture uses the platform's baseline route."
7121
7125
  );
7122
7126
  }
7123
7127
  if (cfg.useDrawElement && process.env.HF_FAST_CAPTURE_BLEND !== "true" && compiled.usesMixBlendMode) {
7124
7128
  cfg.useDrawElement = false;
7125
7129
  deCompileGate = "mix_blend_mode";
7126
7130
  log.info(
7127
- "[Render] Fast capture: composition uses mix-blend-mode \u2014 disabling drawElementImage for this render. Capture uses the platform's baseline route."
7131
+ "[Render] Fast capture: composition uses mix-blend-mode, so disabling drawElementImage for this render. Capture uses the platform's baseline route."
7128
7132
  );
7129
7133
  }
7130
7134
  if (cfg.useDrawElement && process.env.HF_FAST_CAPTURE_ANCESTOR_BG !== "true" && compiled.hasAncestorBackgroundImage) {
7131
7135
  cfg.useDrawElement = false;
7132
7136
  deCompileGate = "ancestor_background_image";
7133
7137
  log.info(
7134
- "[Render] Fast capture: composition root's ancestors (body/html/wrapper) carry a background-image \u2014 disabling drawElementImage for this render. Capture uses the platform's baseline route."
7138
+ "[Render] Fast capture: composition root's ancestors (body/html/wrapper) carry a background-image, so disabling drawElementImage for this render. Capture uses the platform's baseline route."
7135
7139
  );
7136
7140
  }
7137
7141
  if (cfg.useDrawElement && process.env.PRODUCER_EXPERIMENTAL_FAST_CAPTURE !== "true" && compiled.hasShaderTransitions) {
7138
7142
  cfg.useDrawElement = false;
7139
7143
  deCompileGate = "shader_transitions";
7140
7144
  log.info(
7141
- "[Render] Fast capture: composition uses shader transitions \u2014 disabling drawElementImage so page-side compositing stays available."
7145
+ "[Render] Fast capture: composition uses shader transitions, so disabling drawElementImage so page-side compositing stays available."
7142
7146
  );
7143
7147
  }
7144
7148
  if (!cfg.useDrawElement && cfg.pageSideCompositingAutoDisabled) {
@@ -7453,7 +7457,7 @@ async function runProbeStage(input) {
7453
7457
  } else {
7454
7458
  beginFrameStalled = true;
7455
7459
  log.warn(
7456
- "[Render] BeginFrame liveness probe timed out \u2014 this composition stalls BeginFrame on this host (SwiftShader heavy-layer pattern). Relaunching the probe browser in screenshot capture mode; the render will use screenshot capture throughout.",
7460
+ "[Render] BeginFrame liveness probe timed out: this composition stalls BeginFrame on this host (SwiftShader heavy-layer pattern). Relaunching the probe browser in screenshot capture mode; the render will use screenshot capture throughout.",
7457
7461
  { probeTimeoutMs }
7458
7462
  );
7459
7463
  lastBrowserConsole = probeSession.browserConsoleBuffer;
@@ -7667,7 +7671,7 @@ async function runProbeStage(input) {
7667
7671
  video.start = win.visibleStart;
7668
7672
  video.end = win.visibleEnd;
7669
7673
  log.info(
7670
- `[Probe] Runtime video discovery: ${video.id} visible ${win.visibleStart.toFixed(2)}s\u2013${win.visibleEnd.toFixed(2)}s`
7674
+ `[Probe] Runtime video discovery: ${video.id} visible ${win.visibleStart.toFixed(2)}s to ${win.visibleEnd.toFixed(2)}s`
7671
7675
  );
7672
7676
  }
7673
7677
  }
@@ -7715,7 +7719,7 @@ async function runProbeStage(input) {
7715
7719
  });
7716
7720
  if (!timelinesInfo.gsapLoaded) {
7717
7721
  diagnostics.push(
7718
- "GSAP is not loaded \u2014 CDN script may have failed to download. Bundle GSAP locally in your project instead of using a CDN <script src>."
7722
+ "GSAP is not loaded. The CDN script may have failed to download. Bundle GSAP locally in your project instead of using a CDN <script src>."
7719
7723
  );
7720
7724
  } else if (timelinesInfo.timelineKeys.length === 0) {
7721
7725
  diagnostics.push(
@@ -7732,10 +7736,10 @@ async function runProbeStage(input) {
7732
7736
  log.warn("Failed to gather browser diagnostics for zero-duration composition", {
7733
7737
  error: err instanceof Error ? err.message : String(err)
7734
7738
  });
7735
- diagnostics.push("(Could not gather browser diagnostics \u2014 page may have crashed)");
7739
+ diagnostics.push("(Could not gather browser diagnostics. The page may have crashed.)");
7736
7740
  }
7737
7741
  const hint = diagnostics.length > 0 ? "\n\nDiagnostics:\n - " + diagnostics.join("\n - ") : "\n\nCheck that GSAP timelines are registered on window.__timelines.";
7738
- throw new Error("Composition duration is 0 \u2014 this would produce a black video." + hint);
7742
+ throw new Error("Composition duration is 0, so this would produce a black video." + hint);
7739
7743
  }
7740
7744
  if (probeSession) {
7741
7745
  const failedRequests = probeSession.browserConsoleBuffer.filter(isActionableProbeFailure);
@@ -7791,7 +7795,7 @@ function validateNoGpuEncode(config) {
7791
7795
  if (config.useGpu === true) {
7792
7796
  throw new PlanValidationError(
7793
7797
  BROWSER_GPU_NOT_SOFTWARE,
7794
- "[planValidation] GPU encode is banned in distributed mode: config.useGpu === true. Distributed retries must be byte-identical, but NVENC/QSV/VAAPI produce different output across machines. Set useGpu=false (the default) \u2014 software libx264/libx265 is the only supported encoder in distributed mode."
7798
+ "[planValidation] GPU encode is banned in distributed mode: config.useGpu === true. Distributed retries must be byte-identical, but NVENC/QSV/VAAPI produce different output across machines. Set useGpu=false (the default): software libx264/libx265 is the only supported encoder in distributed mode."
7795
7799
  );
7796
7800
  }
7797
7801
  if (config.browserGpuMode !== void 0 && config.browserGpuMode !== "software") {
@@ -8050,6 +8054,9 @@ async function runExtractVideosStage(input) {
8050
8054
  } = input;
8051
8055
  const stage2Start = Date.now();
8052
8056
  const extractionPolicy = resolveVideoExtractionPolicy();
8057
+ composition.videos = composition.videos.filter(
8058
+ (video) => !isVideoPastTimelineEnd(video, composition.duration)
8059
+ );
8053
8060
  let frameLookup = null;
8054
8061
  let extractionResult = null;
8055
8062
  let failureToEnforce = null;
@@ -8136,7 +8143,8 @@ async function runExtractVideosStage(input) {
8136
8143
  timelineEnd: composition.duration,
8137
8144
  maxTransientRetries: extractionPolicy.maxTransientRetries,
8138
8145
  collectProbeFailures: extractionPolicy.failureMode === "enforce",
8139
- deferRangeExtraction
8146
+ deferRangeExtraction,
8147
+ contentKeyedDirs: [join15(compiledDir, REMOTE_MEDIA_SUBDIR)]
8140
8148
  },
8141
8149
  abortSignal,
8142
8150
  cfg,
@@ -10698,7 +10706,7 @@ async function executeDiskCaptureWithAdaptiveRetry(options) {
10698
10706
  const madeProgress = captureAttemptMadeProgress(frameCount, remainingCount);
10699
10707
  if (!madeProgress) {
10700
10708
  options.log.warn(
10701
- "[Render] Capture attempt made no forward progress; composition is likely structurally broken \u2014 not retrying.",
10709
+ "[Render] Capture attempt made no forward progress; composition is likely structurally broken, not retrying.",
10702
10710
  { attempt, frameCount, remainingCount, workers: currentWorkers }
10703
10711
  );
10704
10712
  }
@@ -10767,7 +10775,7 @@ async function executeDiskCaptureWithAdaptiveRetry(options) {
10767
10775
  }
10768
10776
  if (!madeProgress) {
10769
10777
  options.log.warn(
10770
- "[Render] Capture attempt made no forward progress; composition is likely structurally broken \u2014 not retrying.",
10778
+ "[Render] Capture attempt made no forward progress; composition is likely structurally broken, not retrying.",
10771
10779
  { attempt, frameCount, remainingCount, workers: currentWorkers }
10772
10780
  );
10773
10781
  }
@@ -11230,7 +11238,7 @@ async function executeRenderJob(job, projectDir, outputPath, progressSink, abort
11230
11238
  execution.defer("remove workDir", () => {
11231
11239
  if (job.config.debug) return;
11232
11240
  if (job.status === "complete" && process.env.KEEP_TEMP === "1") {
11233
- log.info("KEEP_TEMP=1 \u2014 leaving workDir on disk for inspection", { workDir });
11241
+ log.info("KEEP_TEMP=1, leaving workDir on disk for inspection", { workDir });
11234
11242
  return;
11235
11243
  }
11236
11244
  rmSync8(workDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
@@ -11467,7 +11475,7 @@ async function executeRenderPipeline(input) {
11467
11475
  captureForceScreenshot = true;
11468
11476
  updateCaptureObservability({ forceScreenshot: captureForceScreenshot });
11469
11477
  log.info(
11470
- "[Render] Low-memory render profile active \u2014 screenshot capture, auto-worker calibration skipped" + (job.config.workers === void 0 ? ", pinned to 1 worker" : "") + ". Override with --no-low-memory-mode or PRODUCER_LOW_MEMORY_MODE=false.",
11478
+ "[Render] Low-memory render profile active: screenshot capture, auto-worker calibration skipped" + (job.config.workers === void 0 ? ", pinned to 1 worker" : "") + ". Override with --no-low-memory-mode or PRODUCER_LOW_MEMORY_MODE=false.",
11471
11479
  { totalMemMb: getSystemTotalMb(), thresholdMb: LOW_MEMORY_TOTAL_MB_THRESHOLD }
11472
11480
  );
11473
11481
  }
@@ -12035,7 +12043,7 @@ async function executeRenderPipeline(input) {
12035
12043
  cfg.useDrawElement = false;
12036
12044
  deClampReason = workerCount > 1 ? "parallel" : "disk_path";
12037
12045
  log.info(
12038
- "[Render] Fast capture: default-on drawElement disabled for this render \u2014 " + (workerCount > 1 ? "parallel capture" : "the disk capture path") + " has no runtime self-verification. Set PRODUCER_EXPERIMENTAL_FAST_CAPTURE=true to override."
12046
+ "[Render] Fast capture: default-on drawElement disabled for this render: " + (workerCount > 1 ? "parallel capture" : "the disk capture path") + " has no runtime self-verification. Set PRODUCER_EXPERIMENTAL_FAST_CAPTURE=true to override."
12039
12047
  );
12040
12048
  if (probeSession && probeSession.captureMode === "drawelement") {
12041
12049
  lastBrowserConsole = probeSession.browserConsoleBuffer;
@@ -12131,7 +12139,7 @@ async function executeRenderPipeline(input) {
12131
12139
  });
12132
12140
  updateCaptureObservability({ forceScreenshot: captureForceScreenshot });
12133
12141
  log.info(
12134
- `[Render] Page-side compositing enabled \u2014 bypassing Node-side layered shader-blend path. Engine will capture one ${needsAlpha ? "RGBA PNG" : "opaque RGB"} screenshot per output frame.`
12142
+ `[Render] Page-side compositing enabled, bypassing Node-side layered shader-blend path. Engine will capture one ${needsAlpha ? "RGBA PNG" : "opaque RGB"} screenshot per output frame.`
12135
12143
  );
12136
12144
  }
12137
12145
  const useLayeredComposite = !usePageSideCompositingForTransitions && shouldUseLayeredComposite({
@@ -12628,7 +12636,7 @@ async function executeRenderPipeline(input) {
12628
12636
  cfg.useDrawElement = false;
12629
12637
  deClampReason = deClampReason ?? "disk_path";
12630
12638
  log.info(
12631
- "[Render] Fast capture: drawElement disabled for the disk fallback \u2014 streaming encoder spawn failed and the disk path has no runtime self-verification."
12639
+ "[Render] Fast capture: drawElement disabled for the disk fallback: streaming encoder spawn failed and the disk path has no runtime self-verification."
12632
12640
  );
12633
12641
  if (probeSession && probeSession.captureMode === "drawelement") {
12634
12642
  lastBrowserConsole = probeSession.browserConsoleBuffer;
@@ -13167,10 +13175,10 @@ function validateJsonSafeValue(value, field) {
13167
13175
  walkVariables(value, field, /* @__PURE__ */ new WeakSet());
13168
13176
  }
13169
13177
  var LEAF_REJECTIONS = {
13170
- undefined: "undefined leaves are silently dropped by JSON.stringify \u2014 use null if you mean an absent value",
13178
+ undefined: "undefined leaves are silently dropped by JSON.stringify. Use null if you mean an absent value",
13171
13179
  function: "functions are not JSON-serializable",
13172
13180
  symbol: "Symbols are not JSON-serializable",
13173
- bigint: "BigInt values throw at JSON.stringify \u2014 encode as a string if you need 64-bit integers"
13181
+ bigint: "BigInt values throw at JSON.stringify. Encode as a string if you need 64-bit integers"
13174
13182
  };
13175
13183
  function walkVariables(value, path, seen) {
13176
13184
  const t = typeof value;
@@ -13191,7 +13199,7 @@ function walkVariables(value, path, seen) {
13191
13199
  if (seen.has(value)) {
13192
13200
  throw new InvalidConfigError(
13193
13201
  path,
13194
- "circular reference detected \u2014 JSON.stringify cannot serialize cycles"
13202
+ "circular reference detected: JSON.stringify cannot serialize cycles"
13195
13203
  );
13196
13204
  }
13197
13205
  seen.add(value);
@@ -13853,7 +13861,7 @@ function validateOutputResolutionOverride(body) {
13853
13861
  return `Invalid outputResolution "${body.outputResolution}". Must be one of: landscape, portrait, landscape-4k, portrait-4k, square, square-4k (aliases: 1080p, 4k, \u2026).`;
13854
13862
  }
13855
13863
  if (normalized !== void 0 && (body.format === "webm" || body.format === "mov")) {
13856
- return `outputResolution is not supported with format "${body.format}" \u2014 the alpha (webm/mov) capture path can't supersample. Use format "mp4", or omit outputResolution to render at the composition's native dimensions.`;
13864
+ return `outputResolution is not supported with format "${body.format}": the alpha (webm/mov) capture path can't supersample. Use format "mp4", or omit outputResolution to render at the composition's native dimensions.`;
13857
13865
  }
13858
13866
  return void 0;
13859
13867
  }
@@ -14300,7 +14308,7 @@ function startServer(options = {}) {
14300
14308
  });
14301
14309
  async function shutdown(signal) {
14302
14310
  log.info(`Received ${signal}, shutting down`);
14303
- const { drainBrowserPool } = await import("./src-BSLKXEGX.js");
14311
+ const { drainBrowserPool } = await import("./src-LIERUCFW.js");
14304
14312
  await drainBrowserPool().catch(() => {
14305
14313
  });
14306
14314
  const handle = await Promise.race([
@@ -14560,7 +14568,7 @@ function collectPlanAssetShas(planDir) {
14560
14568
  }
14561
14569
  if (compositionHtml === null) {
14562
14570
  throw new Error(
14563
- `[freezePlan] compiled HTML missing at ${COMPILED_INDEX_RELATIVE_PATH} \u2014 upstream compile stage did not materialize the expected file.`
14571
+ `[freezePlan] compiled HTML missing at ${COMPILED_INDEX_RELATIVE_PATH} (upstream compile stage did not materialize the expected file).`
14564
14572
  );
14565
14573
  }
14566
14574
  return { compositionHtml, assets };
@@ -15139,7 +15147,7 @@ var PlanTooLargeError = class extends Error {
15139
15147
  const breakdownSuffix = breakdown ? ` Breakdown: video-frames=${formatBytes(breakdown.videoFramesBytes)}, compiled=${formatBytes(breakdown.compiledBytes)} (source-media=${formatBytes(breakdown.sourceMediaBytes)}), audio=${formatBytes(breakdown.audioBytes)}, metadata=${formatBytes(breakdown.metadataBytes)}, other=${formatBytes(breakdown.otherBytes)}, files=${breakdown.fileCount}.` : "";
15140
15148
  const observationSuffix = observedAt ? ` Observed at ${observedAt}.` : "";
15141
15149
  super(
15142
- `[plan] planDir size ${formatBytes(sizeBytes)} exceeds the configured ceiling ${formatBytes(limitBytes)} (PLAN_TOO_LARGE). The default 2 GB cap fits inside AWS Lambda's 10 GB /tmp budget alongside the chunk worker's frame buffer and ffmpeg's working set. To unblock: use the content-addressed \`planV2()\` transport, shorten the composition, lower the framerate, or use the in-process renderer (\`executeRenderJob\`) \u2014 it has no planDir size cap.` + observationSuffix + breakdownSuffix
15150
+ `[plan] planDir size ${formatBytes(sizeBytes)} exceeds the configured ceiling ${formatBytes(limitBytes)} (PLAN_TOO_LARGE). The default 2 GB cap fits inside AWS Lambda's 10 GB /tmp budget alongside the chunk worker's frame buffer and ffmpeg's working set. To unblock: use the content-addressed \`planV2()\` transport, shorten the composition, lower the framerate, or use the in-process renderer (\`executeRenderJob\`), which has no planDir size cap.` + observationSuffix + breakdownSuffix
15143
15151
  );
15144
15152
  this.name = "PlanTooLargeError";
15145
15153
  this.sizeBytes = sizeBytes;
@@ -15156,7 +15164,7 @@ var FormatNotSupportedInDistributedError = class extends Error {
15156
15164
  reason;
15157
15165
  constructor(format, reason) {
15158
15166
  super(
15159
- `[plan] format ${JSON.stringify(format)} is not supported in distributed mode: ${reason}. Render with the in-process renderer (\`executeRenderJob\`) \u2014 it has full format support \u2014 or pick a distributed-supported format: mp4 SDR, mov ProRes 4444, png-sequence, or webm VP9.`
15167
+ `[plan] format ${JSON.stringify(format)} is not supported in distributed mode: ${reason}. Render with the in-process renderer (\`executeRenderJob\`), which has full format support, or pick a distributed-supported format: mp4 SDR, mov ProRes 4444, png-sequence, or webm VP9.`
15160
15168
  );
15161
15169
  this.name = "FormatNotSupportedInDistributedError";
15162
15170
  this.format = format;
@@ -15245,7 +15253,7 @@ async function readFontSnapshotSha() {
15245
15253
  const data = module.EMBEDDED_FONT_DATA;
15246
15254
  if (!data || typeof data !== "object") {
15247
15255
  throw new Error(
15248
- "[plan] EMBEDDED_FONT_DATA missing from @hyperframes/core/fonts/embedded-data \u2014 was `bun run build:fonts` run?"
15256
+ "[plan] EMBEDDED_FONT_DATA missing from @hyperframes/core/fonts/embedded-data. Was `bun run build:fonts` run?"
15249
15257
  );
15250
15258
  }
15251
15259
  const dataObj = data;
@@ -15295,7 +15303,7 @@ function resolveEncoderTriple(config) {
15295
15303
  }
15296
15304
  if (config.codec !== void 0) {
15297
15305
  throw new Error(
15298
- `[plan] DistributedRenderConfig.codec is only valid for format="mp4"; received codec=${JSON.stringify(config.codec)} with format=${JSON.stringify(config.format)}. Omit codec for non-mp4 formats \u2014 mov is always ProRes 4444, webm is always libvpx-vp9, and png-sequence has no encoder.`
15306
+ `[plan] DistributedRenderConfig.codec is only valid for format="mp4"; received codec=${JSON.stringify(config.codec)} with format=${JSON.stringify(config.format)}. Omit codec for non-mp4 formats: mov is always ProRes 4444, webm is always libvpx-vp9, and png-sequence has no encoder.`
15299
15307
  );
15300
15308
  }
15301
15309
  return resolveNonMp4EncoderTriple(config.format, config.quality ?? "standard");
@@ -15485,7 +15493,7 @@ async function buildLocalExecutionPlan(projectDir, config, executionPlanDir, opt
15485
15493
  if (probeResult.fileServer) closeFileServerSafely(probeResult.fileServer, "plan", log);
15486
15494
  if (probeResult.probeSession) {
15487
15495
  try {
15488
- const { closeCaptureSession: closeCaptureSession2 } = await import("./src-BSLKXEGX.js");
15496
+ const { closeCaptureSession: closeCaptureSession2 } = await import("./src-LIERUCFW.js");
15489
15497
  await closeCaptureSession2(probeResult.probeSession);
15490
15498
  } catch (err) {
15491
15499
  log.warn("[plan] probe session close failed", {
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveConfig,
9
9
  usesSoftwareWebGpu
10
- } from "./chunk-UXO2L7HJ.js";
10
+ } from "./chunk-WU2B74TL.js";
11
11
 
12
12
  // src/browser/gpuPolicy.ts
13
13
  function resolveLocalBrowserGpuMode(browserGpuArg, envMode = process.env.PRODUCER_BROWSER_GPU_MODE) {
@@ -17,7 +17,7 @@ function resolveLocalBrowserGpuMode(browserGpuArg, envMode = process.env.PRODUCE
17
17
  return "auto";
18
18
  }
19
19
  async function resolveCaptureBrowserGpuMode(requestedMode, chromePath) {
20
- const { resolveBrowserGpuMode } = await import("./src-BSLKXEGX.js");
20
+ const { resolveBrowserGpuMode } = await import("./src-LIERUCFW.js");
21
21
  return resolveBrowserGpuMode(requestedMode, { chromePath });
22
22
  }
23
23
  function resolveLocalWebGpu(browserGpuMode, requiresWebGpu) {
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-BYSBRF24.js";
13
13
  import {
14
14
  findFfBinary
15
- } from "./chunk-PJ3HDUCY.js";
15
+ } from "./chunk-VAS6HQX3.js";
16
16
 
17
17
  // src/browser/ffmpeg.ts
18
18
  import { execFileSync as execFileSync2 } from "child_process";
@@ -6,8 +6,8 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
 
8
8
  // src/version.ts
9
- var VERSION = true ? "0.8.145" : "0.0.0-dev";
10
- var PRODUCER_VERSION = true ? "0.8.145" : "0.0.0-dev";
9
+ var VERSION = true ? "0.8.146" : "0.0.0-dev";
10
+ var PRODUCER_VERSION = true ? "0.8.146" : "0.0.0-dev";
11
11
 
12
12
  export {
13
13
  VERSION,
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-K2FLNJVB.js";
10
10
  import {
11
11
  trackCommandFailure
12
- } from "./chunk-ICKDMTLA.js";
12
+ } from "./chunk-QSSPIATO.js";
13
13
  import {
14
14
  failCommand
15
15
  } from "./chunk-PBN6GBJE.js";
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  VERSION
9
- } from "./chunk-BFACGEII.js";
9
+ } from "./chunk-TBOMPYG6.js";
10
10
 
11
11
  // src/registry/compatibility.ts
12
12
  import { compareVersions } from "compare-versions";
@@ -7,14 +7,14 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  trackLintReport,
9
9
  trackLintRuleStreak
10
- } from "./chunk-ICKDMTLA.js";
10
+ } from "./chunk-QSSPIATO.js";
11
11
  import {
12
12
  shouldTrack
13
- } from "./chunk-ZF7SXQJ7.js";
13
+ } from "./chunk-2NAUEDA6.js";
14
14
  import {
15
15
  LINT_RULE_COUNT,
16
16
  LINT_RULE_GROUP_COUNTS
17
- } from "./chunk-IEIJRMLZ.js";
17
+ } from "./chunk-JDB65PPT.js";
18
18
 
19
19
  // src/telemetry/lintStreaks.ts
20
20
  import { createHash } from "crypto";