hyperframes 0.8.191 → 0.8.193

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 (213) hide show
  1. package/dist/{add-S2ZQYG52.js → add-JC6DKZKC.js} +17 -17
  2. package/dist/{animatedGifPrep-3JA2CQ3U.js → animatedGifPrep-S6KXJGEL.js} +11 -10
  3. package/dist/api.js +24 -23
  4. package/dist/{appHistory-TH3TL6N6.js → appHistory-QVCSAOI4.js} +1 -1
  5. package/dist/{asset-2CNTAPOC.js → asset-XITFIFE6.js} +2 -2
  6. package/dist/{assetCataloger-5HXLXL7C.js → assetCataloger-K5FNKG35.js} +13 -12
  7. package/dist/{audio-DZTSYHXS.js → audio-364UHTY4.js} +22 -21
  8. package/dist/{auth-GX3M6TJ4.js → auth-5JEESRE6.js} +4 -4
  9. package/dist/{autoUpdate-EDIWE4Z5.js → autoUpdate-RVVYEHAA.js} +5 -5
  10. package/dist/{backgroundChecks-VPUPJ7UI.js → backgroundChecks-DCBIYWIQ.js} +5 -5
  11. package/dist/backgroundChecksWorker.js +5 -5
  12. package/dist/{batchRender-JHIIDBJR.js → batchRender-ZZ4QMBAA.js} +14 -7
  13. package/dist/{beats-PZRVTRYW.js → beats-YEL65M6G.js} +53 -15
  14. package/dist/{benchmark-22UFDW2N.js → benchmark-RBTRPA76.js} +18 -14
  15. package/dist/{browser-VRDWYIUM.js → browser-BVAYXT4R.js} +7 -7
  16. package/dist/{bundleWithLocalizedFonts-23QDKFSN.js → bundleWithLocalizedFonts-JLB2OYMT.js} +3 -3
  17. package/dist/{capture-TOCLXYMJ.js → capture-GBXTMYLZ.js} +76 -68
  18. package/dist/{capture-NFCBXHDE.js → capture-NIFX6IRS.js} +3 -3
  19. package/dist/{captureCompositionFrame-BEM6MF7F.js → captureCompositionFrame-ATNNKUL5.js} +17 -16
  20. package/dist/{catalog-NXS35KM7.js → catalog-AGIF5SM5.js} +18 -18
  21. package/dist/{catch-up-6WJBUI2C.js → catch-up-SZ3ULDTI.js} +7 -7
  22. package/dist/{check-WVEBMWN5.js → check-YLQS3TF4.js} +43 -42
  23. package/dist/{checkBrowser-RT45HJ36.js → checkBrowser-QH4FMCBO.js} +38 -37
  24. package/dist/{chunk-JOLZ3BSL.js → chunk-2LSCYS2H.js} +2 -2
  25. package/dist/{chunk-B2A56S5C.js → chunk-2MCXIY4B.js} +13 -10
  26. package/dist/{chunk-TADJOIFW.js → chunk-2NERNYCJ.js} +4 -4
  27. package/dist/{chunk-KGMHMYWI.js → chunk-2SFDWMSW.js} +2 -2
  28. package/dist/{chunk-DCAI5DBR.js → chunk-2ST4WAFY.js} +9 -1
  29. package/dist/{chunk-3NRB7YXW.js → chunk-2VXY3PEF.js} +96 -67
  30. package/dist/{chunk-IXLUTE6N.js → chunk-3422KMTD.js} +5 -1
  31. package/dist/{chunk-VYQYVYQ5.js → chunk-3W4B6G7Y.js} +83 -45
  32. package/dist/{chunk-JYSSPQDT.js → chunk-4LXZJIVY.js} +11 -11
  33. package/dist/{chunk-WHAEJX26.js → chunk-4PPWAQYV.js} +17 -12
  34. package/dist/{chunk-COWQITWP.js → chunk-4TKJWWPL.js} +1 -1
  35. package/dist/{chunk-NXMYHJAL.js → chunk-4VYPICIA.js} +29 -1
  36. package/dist/{chunk-RE3EEBWC.js → chunk-5J6TWLFG.js} +4 -4
  37. package/dist/{chunk-TFMZ4RKM.js → chunk-6DLCOQR4.js} +474 -429
  38. package/dist/{chunk-KV72BP7O.js → chunk-6LWUPIKD.js} +11 -11
  39. package/dist/{chunk-HRPWRZGF.js → chunk-6N65ZMC5.js} +1 -1
  40. package/dist/{chunk-XUXGIA7H.js → chunk-6NLPPKBO.js} +1 -2
  41. package/dist/{chunk-JJJCFKMF.js → chunk-6XUJVEY2.js} +17 -6
  42. package/dist/{chunk-GM3WIOO6.js → chunk-7HTH5PFK.js} +2 -2
  43. package/dist/{chunk-LBNEH6IQ.js → chunk-7QNIXBQD.js} +1 -1
  44. package/dist/{chunk-OV6KHXLX.js → chunk-7YKJF5JV.js} +1 -1
  45. package/dist/{chunk-COETAXRN.js → chunk-7YSFE4SZ.js} +2 -2
  46. package/dist/{chunk-3WJT2JCX.js → chunk-AR3DQYRR.js} +52 -23
  47. package/dist/{chunk-HYW6HTAK.js → chunk-BJAS2JLW.js} +2 -2
  48. package/dist/{chunk-RWYUK7LM.js → chunk-BP4EMEGH.js} +2 -2
  49. package/dist/{chunk-XGHHVYC7.js → chunk-BY6OQ6XP.js} +2 -2
  50. package/dist/{chunk-TMBUBLZB.js → chunk-C4Y3ZREE.js} +185 -46
  51. package/dist/{chunk-JQYJXUJW.js → chunk-C6KE4AFW.js} +1 -1
  52. package/dist/{chunk-TMK4Q7JA.js → chunk-CFUCHO4T.js} +20 -5
  53. package/dist/{chunk-JGTRVG32.js → chunk-CGTZOY53.js} +1 -1
  54. package/dist/chunk-CZGHFATT.js +31 -0
  55. package/dist/{chunk-NJGTNWQY.js → chunk-D625D4TV.js} +6 -6
  56. package/dist/{chunk-CYBXXSC4.js → chunk-DIKAPMMF.js} +2 -2
  57. package/dist/{chunk-CXMXJEVY.js → chunk-DSQ72G5I.js} +1 -1
  58. package/dist/{chunk-GLG5JWLI.js → chunk-DYNHVCBF.js} +2 -2
  59. package/dist/{chunk-7L37AB57.js → chunk-E3P3LJG6.js} +9 -9
  60. package/dist/{chunk-EFCKV7MY.js → chunk-E77ALFLW.js} +1 -1
  61. package/dist/{chunk-WQ3X5OH4.js → chunk-EFXMETRK.js} +2 -2
  62. package/dist/{chunk-7KVVNF7B.js → chunk-ELP5QZWL.js} +1 -1
  63. package/dist/{chunk-QH3T4WI2.js → chunk-EXAX37XR.js} +8 -2
  64. package/dist/{chunk-7A65UCMI.js → chunk-F5LLORBP.js} +2 -2
  65. package/dist/{chunk-EI7FP7F3.js → chunk-FBVUAH7N.js} +12 -2
  66. package/dist/{chunk-XWOCXIKR.js → chunk-GKHMSSGY.js} +1 -1
  67. package/dist/{chunk-DOOSC34Z.js → chunk-GR5DQKDR.js} +8 -8
  68. package/dist/{chunk-W64L7IFS.js → chunk-IW5G323T.js} +1 -1
  69. package/dist/{chunk-NAUKCKCJ.js → chunk-KU3UFQN7.js} +9 -12
  70. package/dist/{chunk-NMDUSCCE.js → chunk-L4JB7LI4.js} +478 -129
  71. package/dist/{chunk-ALEF2F5N.js → chunk-L5YLA54L.js} +2 -2
  72. package/dist/{chunk-MSM6VRQ4.js → chunk-LFUVTS6V.js} +2 -2
  73. package/dist/{chunk-7ZJEQY7Q.js → chunk-LMNZLZMJ.js} +23 -3
  74. package/dist/{chunk-AQB5M53R.js → chunk-M3KZBDPB.js} +3 -3
  75. package/dist/{chunk-BFFLKQVB.js → chunk-MFUNDJEV.js} +4 -4
  76. package/dist/{chunk-7NKJS5KM.js → chunk-OFV3WSOE.js} +1 -1
  77. package/dist/{chunk-CINKQY6M.js → chunk-OFYW4J7Y.js} +3 -3
  78. package/dist/{chunk-5C7R55BJ.js → chunk-P2I4RLJE.js} +1 -1
  79. package/dist/{chunk-RUOG4VB7.js → chunk-PKZ7RK5N.js} +5 -4
  80. package/dist/{chunk-LLFQA7XF.js → chunk-QFPBRZJD.js} +1 -1
  81. package/dist/{chunk-TRZVS6TL.js → chunk-QKX7ITER.js} +3 -3
  82. package/dist/{chunk-46HEFGXJ.js → chunk-REUL2KH2.js} +1 -1
  83. package/dist/{chunk-TFGO5YMI.js → chunk-RTLPWOO6.js} +2 -2
  84. package/dist/{chunk-DYAPHNV6.js → chunk-RWGASWT7.js} +1 -1
  85. package/dist/chunk-RXATE6FZ.js +385 -0
  86. package/dist/{chunk-U5GTDAQL.js → chunk-SOY2FPOR.js} +7 -7
  87. package/dist/{chunk-KNU5COPB.js → chunk-T2EUWCJE.js} +1 -1
  88. package/dist/{chunk-RQBB7PYT.js → chunk-TY3LDJA3.js} +5 -12
  89. package/dist/{chunk-KAC2WR7P.js → chunk-TZEKVLPV.js} +3 -3
  90. package/dist/{chunk-TJKE4EYX.js → chunk-UB7BIDBS.js} +3 -3
  91. package/dist/{chunk-WY3TQ2PT.js → chunk-UIC7B5KW.js} +2 -2
  92. package/dist/{chunk-2WNVHZHA.js → chunk-UNATIAOT.js} +13 -13
  93. package/dist/chunk-USWPZXEA.js +3897 -0
  94. package/dist/{chunk-FBDOHH3Q.js → chunk-V7ZA2BNW.js} +29 -59
  95. package/dist/{chunk-7LUJE3II.js → chunk-VLLFORE2.js} +1 -1
  96. package/dist/{chunk-T5YF32WV.js → chunk-VPC4XIVI.js} +6 -5
  97. package/dist/{chunk-7FF36MAD.js → chunk-VW63MHQU.js} +9 -6
  98. package/dist/{chunk-ZHKUIC7X.js → chunk-WFS6S65A.js} +21 -14
  99. package/dist/{chunk-UNR3P7IF.js → chunk-WIVOXGEP.js} +3 -3
  100. package/dist/{chunk-3XI7MIZB.js → chunk-X5CECNCK.js} +1 -1
  101. package/dist/{chunk-KHCTBZGJ.js → chunk-XQPA4W3M.js} +4 -4
  102. package/dist/{chunk-XMSQRDAK.js → chunk-YS4JUGNI.js} +2 -2
  103. package/dist/{chunk-SMEF3TRJ.js → chunk-ZH7J2ZUL.js} +15 -15
  104. package/dist/{chunk-WJEVUPVD.js → chunk-ZT45TCY3.js} +1 -1
  105. package/dist/{chunk-JTPHFYZI.js → chunk-ZTKFRXJB.js} +68 -7
  106. package/dist/{chunk-W3CS2KFV.js → chunk-ZZPBXRYQ.js} +2 -2
  107. package/dist/{clean-3VIU2BSK.js → clean-5HGESK5A.js} +40 -27
  108. package/dist/cli.js +70 -68
  109. package/dist/{cloud-NA3J4XW2.js → cloud-746PHS32.js} +4 -4
  110. package/dist/{cloudrun-4MHOF7UT.js → cloudrun-DO7WFLSM.js} +9 -9
  111. package/dist/commands/contrast-audit.browser.js +1 -1
  112. package/dist/{compare-ZR7XRPPT.js → compare-66YPRNG2.js} +76 -47
  113. package/dist/{compiler-MA2ELZPG.js → compiler-R4UYDWXO.js} +8 -7
  114. package/dist/{component-ZJSOPUAM.js → component-EQ3H6RFP.js} +3 -3
  115. package/dist/{compositions-WA5V2SHF.js → compositions-ZZ7P5HT2.js} +19 -17
  116. package/dist/{contactSheet-CAGMKI3E.js → contactSheet-SZBJDOMT.js} +2 -2
  117. package/dist/{delete-UC427UEA.js → delete-Z5MSLJSR.js} +7 -7
  118. package/dist/{deploy-B5UO4UIK.js → deploy-RGSAC2K5.js} +1 -1
  119. package/dist/{deterministicFonts-EGAAE7QL.js → deterministicFonts-RO2TCMLZ.js} +3 -3
  120. package/dist/{dist-XGPSPKKP.js → dist-QQ26RUDV.js} +5 -4
  121. package/dist/{dist-BPK37SAB.js → dist-RKK4YLAD.js} +5 -5
  122. package/dist/{doctor-ZERCTKEK.js → doctor-W4ZZDRTU.js} +20 -19
  123. package/dist/{events-DCOZQERS.js → events-BSSL4A4W.js} +4 -4
  124. package/dist/{events-CNIXB2QK.js → events-UACT7PX3.js} +5 -5
  125. package/dist/{feedback-YBD5ITTY.js → feedback-47ILDLQG.js} +16 -16
  126. package/dist/{ffmpeg-V4BBFDTG.js → ffmpeg-IEHSUNUT.js} +13 -12
  127. package/dist/{figma-Z45ZYVGE.js → figma-PLFIIYRU.js} +3 -3
  128. package/dist/fontLocalizeCli.js +14 -13
  129. package/dist/{get-23NXQWCD.js → get-PDWGJYNL.js} +7 -7
  130. package/dist/{gpuPolicy-H6ABHVEB.js → gpuPolicy-6UBXO6ME.js} +11 -10
  131. package/dist/{grade-compare-ZPX2G3UV.js → grade-compare-5VWLQGM7.js} +38 -37
  132. package/dist/{gsapParserAcorn-SKODXC2N.js → gsapParserAcorn-OOTY2MVN.js} +2 -2
  133. package/dist/{help-EP4CDPLO.js → help-DS3KMWYO.js} +1 -1
  134. package/dist/{history-E5OSXO74.js → history-OC326NVZ.js} +41 -17
  135. package/dist/hyperframe.manifest.json +1 -1
  136. package/dist/hyperframe.runtime.iife.js +62 -62
  137. package/dist/hyperframes-player.global.js +3 -3
  138. package/dist/hyperframes-slideshow.global.js +1 -1
  139. package/dist/{info-2HHGSW5H.js → info-AUIFV6MX.js} +56 -22
  140. package/dist/{init-ENEG6RZT.js → init-MRTWWDFW.js} +38 -45
  141. package/dist/{inspect-PVQK4E2A.js → inspect-55NOAXI2.js} +36 -35
  142. package/dist/{installer-YGGLEOSF.js → installer-YSFFGBBV.js} +8 -8
  143. package/dist/{keyframes-UWSYS2SL.js → keyframes-OO2BX2IB.js} +13 -14
  144. package/dist/{lambda-L3LPXC2M.js → lambda-CXXY6QT3.js} +11 -11
  145. package/dist/{layout-JVL4QREC.js → layout-57GJXKDK.js} +36 -35
  146. package/dist/{lint-JXQ72DDB.js → lint-J4FK3Z6G.js} +23 -16
  147. package/dist/{lintProject-F7IC7WY4.js → lintProject-52SLJPRC.js} +5 -4
  148. package/dist/{list-UFMLM3VV.js → list-VDQUJ76B.js} +7 -7
  149. package/dist/{login-CKGMWQJN.js → login-TJSEALWW.js} +7 -7
  150. package/dist/{logout-DDC4QLVK.js → logout-JYFWWUGK.js} +3 -3
  151. package/dist/{manager-U6OP3EXB.js → manager-4PLYEEWP.js} +14 -13
  152. package/dist/{manager-UHWEKPXC.js → manager-MZIJY73J.js} +3 -3
  153. package/dist/{media-treatment-MFMEWCDY.js → media-treatment-GXP4PMJH.js} +20 -19
  154. package/dist/{models-QA3TJ75Y.js → models-HQQQKEEP.js} +18 -17
  155. package/dist/{motionShot-NV2OPJHD.js → motionShot-2BT5D7DC.js} +21 -20
  156. package/dist/{normalize-3AYFSN2F.js → normalize-FASIPBUM.js} +1 -1
  157. package/dist/{normalize-audio-JWJRUKK2.js → normalize-audio-SOLFMHNP.js} +12 -8
  158. package/dist/{open-PTJNDRER.js → open-KHEUODFQ.js} +18 -18
  159. package/dist/{parakeetRunner-B5FCWWOO.js → parakeetRunner-BHU5NCAX.js} +20 -19
  160. package/dist/{pipeline-N26NA6ZG.js → pipeline-WFV5HDTD.js} +15 -14
  161. package/dist/{play-45D6X6TV.js → play-GB34CANJ.js} +27 -26
  162. package/dist/{policies-MBWGLMWB.js → policies-GHVXA5PE.js} +1 -1
  163. package/dist/{preflight-MFOHPUOI.js → preflight-REF3VSJ7.js} +15 -14
  164. package/dist/{present-IFBUDI4D.js → present-SIUTA7TD.js} +24 -23
  165. package/dist/{preview-MQRLXQOV.js → preview-T2GE7Z4A.js} +27 -26
  166. package/dist/{producer-2QG7HLAW.js → producer-23KVQZAB.js} +1 -1
  167. package/dist/{projectConfig-I4FTZXHB.js → projectConfig-DBSNBPNP.js} +10 -10
  168. package/dist/{publication-3GOFXCGU.js → publication-IXPUKYWJ.js} +5 -5
  169. package/dist/{publish-3B2TZCFH.js → publish-3BA5VHXJ.js} +18 -17
  170. package/dist/{refresh-RXTOPRBB.js → refresh-USSFPJAU.js} +3 -3
  171. package/dist/{remove-background-RK4BJDBF.js → remove-background-RMSCJVVQ.js} +16 -15
  172. package/dist/{render-SJ4HFPFU.js → render-6RNE2MLU.js} +26 -25
  173. package/dist/{render-PW3XGS7B.js → render-XGOZMMWX.js} +42 -41
  174. package/dist/{render-BV6FWFX3.js → render-Y6CTQ3YW.js} +8 -8
  175. package/dist/{render-batch-GKX54O6N.js → render-batch-VUR6N6EY.js} +9 -9
  176. package/dist/renderSetupWorker.js +9 -8
  177. package/dist/{resolver-RQJ7CNXD.js → resolver-GJCUH57W.js} +7 -7
  178. package/dist/{screenshotCapture-UBY6TT75.js → screenshotCapture-I5EDCITF.js} +6 -3
  179. package/dist/{sherpa-XZPG7QFF.js → sherpa-VVAKRCPL.js} +19 -18
  180. package/dist/skills/hyperframes/references/format.md +1 -0
  181. package/dist/skills/hyperframes/references/skill-lifecycle.md +8 -4
  182. package/dist/skills/hyperframes-cli/references/init-and-scaffold.md +1 -1
  183. package/dist/{skills-EYLB2V6F.js → skills-ZHBURVQG.js} +13 -75
  184. package/dist/{skillsUpdateCheck-TE6K5ROM.js → skillsUpdateCheck-VMDAL2O2.js} +5 -5
  185. package/dist/{slideshow-YTWATJRT.js → slideshow-SJGK4RQS.js} +1 -1
  186. package/dist/{snapshot-FE4T3SCN.js → snapshot-KEOG56SL.js} +61 -53
  187. package/dist/{src-ZOXSEJCD.js → src-BH5NICGQ.js} +24 -9
  188. package/dist/{src-SEJ7LNNB.js → src-TZLGFRRX.js} +13 -12
  189. package/dist/{staticProjectServer-LSVIRDRO.js → staticProjectServer-BKXL5CXB.js} +22 -21
  190. package/dist/{status-CM7IQTU2.js → status-H5WLKQDS.js} +3 -3
  191. package/dist/studio/assets/{hyperframes-player-Bv9hQ3v7.js → hyperframes-player-BMcUdmDb.js} +3 -3
  192. package/dist/studio/assets/{index-CBO8uz7-.css → index-CYbvOVp-.css} +1 -1
  193. package/dist/studio/assets/{index-D_QqfWhx.js → index-Ca-mgTnS.js} +122 -122
  194. package/dist/studio/assets/{index-Df14bh-L.js → index-Ci6GuloR.js} +1 -1
  195. package/dist/studio/index.html +2 -2
  196. package/dist/{studio-api-SL2Z76NU.js → studio-api-A5U6QAMC.js} +19 -14
  197. package/dist/{studioServer-BADWVIHU.js → studioServer-5EC5CP4W.js} +60 -59
  198. package/dist/{telemetry-QG5AANZ4.js → telemetry-4K6CPMNT.js} +2 -2
  199. package/dist/{telemetry-RN6VYEID.js → telemetry-BCKJXDSW.js} +5 -5
  200. package/dist/{timeline-JBTCIPLU.js → timeline-AZWAXTAY.js} +65 -43
  201. package/dist/{tokens-A7V7UHNK.js → tokens-X7NC3V7C.js} +2 -2
  202. package/dist/{transcribe-E4BOSNM4.js → transcribe-7NCY7QZ2.js} +17 -16
  203. package/dist/{transcribe-NTUCJGFI.js → transcribe-SH26H755.js} +26 -25
  204. package/dist/{tts-A2WILYGN.js → tts-5I2AJNLM.js} +1 -1
  205. package/dist/{updateCheck-M7UAYLUR.js → updateCheck-Y7FUWQM4.js} +4 -4
  206. package/dist/{upgrade-A2COSIMB.js → upgrade-ZHGEVL65.js} +4 -4
  207. package/dist/{urlDownloader-MBSQYART.js → urlDownloader-FPILIT7M.js} +10 -9
  208. package/dist/{validate-NODZYBHY.js → validate-KQOZR4F6.js} +30 -29
  209. package/dist/{video-LBCUUYK7.js → video-N2QAETFB.js} +12 -11
  210. package/dist/warmCheck.js +43 -42
  211. package/package.json +2 -1
  212. package/dist/chunk-I5JRXMCV.js +0 -6077
  213. package/dist/chunk-LM265QNK.js +0 -3896
@@ -19,6 +19,10 @@ import {
19
19
  resolveLocalAssetCandidates,
20
20
  resolveProjectRelativeSrc
21
21
  } from "./chunk-6BNTGNGD.js";
22
+ import {
23
+ TIMING_TOLERANCE_SECONDS,
24
+ resolveCompositionDuration
25
+ } from "./chunk-CZGHFATT.js";
22
26
  import {
23
27
  COMPOSITION_VARIABLE_TYPES,
24
28
  FONT_ALIAS_KEYS,
@@ -26,9 +30,10 @@ import {
26
30
  HTML_BODY_CSS_WIDTH_FIRST_RE,
27
31
  VIEWPORT_META_SIZE_RE,
28
32
  extractMediaSrcMutations,
33
+ isCompositionVariable,
29
34
  isSafeMediaUrl,
30
35
  resolveAliasDisplayName
31
- } from "./chunk-RUOG4VB7.js";
36
+ } from "./chunk-PKZ7RK5N.js";
32
37
  import {
33
38
  COLOR_GRADING_SOURCE_TAGS,
34
39
  COMPOSITION_ATTRIBUTES,
@@ -56,14 +61,12 @@ import {
56
61
  isSceneLikeCompositionId,
57
62
  parseSlideshowManifest,
58
63
  resolveSlideshow
59
- } from "./chunk-IXLUTE6N.js";
64
+ } from "./chunk-3422KMTD.js";
60
65
  import {
61
66
  base,
62
- parse,
63
- parseExpressionAt,
64
67
  recursive,
65
68
  simple
66
- } from "./chunk-I5JRXMCV.js";
69
+ } from "./chunk-RXATE6FZ.js";
67
70
  import {
68
71
  __commonJS,
69
72
  __require,
@@ -3708,30 +3711,10 @@ var require_dist = __commonJS({
3708
3711
  });
3709
3712
 
3710
3713
  // ../lint/dist/index.js
3714
+ import { parse } from "acorn";
3711
3715
  var import_postcss_selector_parser = __toESM(require_dist(), 1);
3712
3716
  import postcss from "postcss";
3713
-
3714
- // ../parsers/dist/compositionDuration.js
3715
- var TIMING_TOLERANCE_SECONDS = 0.05;
3716
- var isPositiveFinite = (value) => value !== null && Number.isFinite(value) && value > 0;
3717
- function resolveCompositionDuration(input) {
3718
- const pendingClips = input.clipEndsSeconds.filter((end) => end === null).length;
3719
- if (isPositiveFinite(input.authoredDurationSeconds)) {
3720
- return { seconds: input.authoredDurationSeconds, source: "authored", pendingClips };
3721
- }
3722
- const known = input.clipEndsSeconds.filter(isPositiveFinite);
3723
- if (known.length > 0) {
3724
- return { seconds: Math.max(...known), source: "derived", pendingClips };
3725
- }
3726
- return {
3727
- seconds: null,
3728
- source: "unresolved",
3729
- pendingClips,
3730
- reason: pendingClips > 0 ? "every clip's length is still pending" : "no authored duration and no clip with a length"
3731
- };
3732
- }
3733
-
3734
- // ../lint/dist/index.js
3717
+ import { parse as parse2 } from "acorn";
3735
3718
  import postcss2 from "postcss";
3736
3719
  import postcss3 from "postcss";
3737
3720
 
@@ -3770,6 +3753,7 @@ function trackKindOf(node) {
3770
3753
  }
3771
3754
 
3772
3755
  // ../lint/dist/index.js
3756
+ import { parse as parse3, parseExpressionAt } from "acorn";
3773
3757
  import { createHash } from "crypto";
3774
3758
  import { existsSync as existsSync2, readFileSync, readdirSync } from "fs";
3775
3759
  import { dirname as dirname2, extname, join as join3, relative as relative2, resolve } from "path";
@@ -3895,6 +3879,7 @@ function resolveReferencedDuration(doc, el, startCache, visiting) {
3895
3879
  }
3896
3880
 
3897
3881
  // ../lint/dist/index.js
3882
+ import postcss4 from "postcss";
3898
3883
  import { execFile } from "child_process";
3899
3884
  import { existsSync } from "fs";
3900
3885
  import { join } from "path";
@@ -6457,7 +6442,7 @@ function callsFor(script) {
6457
6442
  if (cached) return cached;
6458
6443
  const calls = [];
6459
6444
  try {
6460
- const ast = parse(script.content, {
6445
+ const ast = parse2(script.content, {
6461
6446
  ecmaVersion: "latest",
6462
6447
  sourceType: "script",
6463
6448
  allowReturnOutsideFunction: true
@@ -6783,6 +6768,16 @@ function variablesDeclarationFindings(tag, tags) {
6783
6768
  });
6784
6769
  continue;
6785
6770
  }
6771
+ if (!isCompositionVariable(e)) {
6772
+ findings.push({
6773
+ code: "invalid_composition_variables_declaration",
6774
+ severity: "error",
6775
+ message: `data-composition-variables entry [${i}] has a default that does not match its type, or an enum without an options array.`,
6776
+ fixHint: "Use number defaults for number variables, boolean defaults for boolean variables, and string defaults for other types. Enum variables also require an options array.",
6777
+ snippet: truncateSnippet(tag.raw)
6778
+ });
6779
+ continue;
6780
+ }
6786
6781
  const id = String(e.id);
6787
6782
  if ((e.type === "image" || varSrcIds.has(id)) && typeof e.default === "string" && e.default.length > 0 && !isSafeMediaUrl(e.default)) {
6788
6783
  findings.push({
@@ -7681,11 +7676,11 @@ function deriveDurationFromClips(tags, rootTag) {
7681
7676
  return resolveCompositionDuration({ authoredDurationSeconds: null, clipEndsSeconds: clipEnds });
7682
7677
  }
7683
7678
  async function loadParseGsapScript() {
7684
- const mod = await import("./gsapParserAcorn-SKODXC2N.js");
7679
+ const mod = await import("./gsapParserAcorn-OOTY2MVN.js");
7685
7680
  return mod.parseGsapScriptAcorn;
7686
7681
  }
7687
7682
  async function loadGsapScriptMotionPathFirstUseIndex() {
7688
- const mod = await import("./gsapParserAcorn-SKODXC2N.js");
7683
+ const mod = await import("./gsapParserAcorn-OOTY2MVN.js");
7689
7684
  return mod.gsapScriptMotionPathFirstUseIndex;
7690
7685
  }
7691
7686
  var SCENE_BOUNDARY_EPSILON_SECONDS = 0.05;
@@ -8819,7 +8814,7 @@ ${right.raw}`)
8819
8814
  return findings;
8820
8815
  },
8821
8816
  // gsap_timeline_registered_before_async_build — registering window.__timelines[id]
8822
- // BEFORE the timeline is built inside document.fonts.ready (or any async callback)
8817
+ // BEFORE the timeline is built inside a font-ready callback
8823
8818
  // leaves an EMPTY timeline registered. The runtime's sub-composition readiness gate
8824
8819
  // treats "key present" as "ready" and nests the child ONCE, while still empty — so the
8825
8820
  // animation never renders when this composition is mounted as a sub-composition.
@@ -8828,9 +8823,11 @@ ${right.raw}`)
8828
8823
  const findings = [];
8829
8824
  for (const script of scripts) {
8830
8825
  const content = stripJsComments(script.content);
8831
- const regIdx = content.search(/window\s*\.\s*__timelines\s*\[/);
8826
+ const regIdx = content.search(
8827
+ /window\s*\.\s*__timelines\s*(?:\[[^\]]+\]|\.\s*[A-Za-z_$][\w$]*)\s*=\s*(?!=)/
8828
+ );
8832
8829
  if (regIdx < 0) continue;
8833
- const fontsReadyIdx = content.search(/document\s*\.\s*fonts\s*\.\s*ready/);
8830
+ const fontsReadyIdx = content.search(/document\s*\.\s*fonts\s*\.\s*(?:ready\b|load\s*\()/);
8834
8831
  if (fontsReadyIdx < 0) continue;
8835
8832
  if (regIdx >= fontsReadyIdx) continue;
8836
8833
  const tail = content.slice(fontsReadyIdx);
@@ -8838,8 +8835,8 @@ ${right.raw}`)
8838
8835
  findings.push({
8839
8836
  code: "gsap_timeline_registered_before_async_build",
8840
8837
  severity: "error",
8841
- message: 'window.__timelines is assigned BEFORE the timeline is built inside document.fonts.ready. An empty timeline registered early gets nested empty when this composition is used as a sub-composition (the readiness gate treats "key present" as "ready" and never re-nests), so the animation renders blank.',
8842
- fixHint: "Move the `window.__timelines[id] = tl;` assignment to the END of the document.fonts.ready callback, after the tweens are added. Optionally call window.__hfForceTimelineRebind() right after, to re-nest the populated timeline."
8838
+ message: 'window.__timelines is assigned BEFORE the timeline is built inside document.fonts.ready or document.fonts.load(). An empty timeline registered early gets nested empty when this composition is used as a sub-composition (the readiness gate treats "key present" as "ready" and never re-nests), so the animation renders blank.',
8839
+ fixHint: "Move the `window.__timelines[id] = tl;` assignment to the END of the font-ready callback, after the tweens are added. Optionally call window.__hfForceTimelineRebind() right after, to re-nest the populated timeline."
8843
8840
  });
8844
8841
  }
8845
8842
  return findings;
@@ -9868,22 +9865,29 @@ var GENERIC_FAMILIES = /* @__PURE__ */ new Set([
9868
9865
  "unset",
9869
9866
  "revert"
9870
9867
  ]);
9871
- function stripCssComments2(css) {
9872
- return css.replace(/\/\*[\s\S]*?\*\//g, " ");
9868
+ function parseFontCss(css) {
9869
+ try {
9870
+ return postcss3.parse(css);
9871
+ } catch {
9872
+ return null;
9873
+ }
9874
+ }
9875
+ function isFontFaceDeclaration(decl) {
9876
+ let parent = decl.parent;
9877
+ while (parent) {
9878
+ if (parent.type === "atrule" && parent.name.toLowerCase() === "font-face") return true;
9879
+ parent = parent.parent;
9880
+ }
9881
+ return false;
9873
9882
  }
9874
9883
  function extractFontFaceFamilies(styles) {
9875
9884
  const families = /* @__PURE__ */ new Set();
9876
- const fontFaceRe = /@font-face\s*\{[^}]*\}/gi;
9877
- const familyRe = /font-family\s*:\s*(['"]?)([^;'"]+)\1/i;
9878
9885
  for (const style of styles) {
9879
- const content = stripCssComments2(style.content);
9880
- let match;
9881
- while ((match = fontFaceRe.exec(content)) !== null) {
9882
- const familyMatch = match[0].match(familyRe);
9883
- if (familyMatch?.[2]) {
9884
- families.add(familyMatch[2].trim().toLowerCase());
9885
- }
9886
- }
9886
+ parseFontCss(style.content)?.walkDecls(/^font-family$/i, (decl) => {
9887
+ if (!isFontFaceDeclaration(decl)) return;
9888
+ const name = normalizeUsedFontName(decl.value);
9889
+ if (name) families.add(name);
9890
+ });
9887
9891
  }
9888
9892
  return families;
9889
9893
  }
@@ -9892,22 +9896,43 @@ function normalizeUsedFontName(part) {
9892
9896
  if (!name || name.includes("(") || name.includes(")")) return null;
9893
9897
  return name;
9894
9898
  }
9899
+ function collectFontCustomProperties(styles) {
9900
+ const properties = /* @__PURE__ */ new Map();
9901
+ for (const style of styles) {
9902
+ parseFontCss(style.content)?.walkDecls(/^--/, (decl) => {
9903
+ if (!isFontFaceDeclaration(decl)) properties.set(decl.prop, decl.value);
9904
+ });
9905
+ }
9906
+ return properties;
9907
+ }
9908
+ function resolveUsedFontNames(value, properties, resolving = /* @__PURE__ */ new Set()) {
9909
+ return postcss3.list.comma(value).flatMap((part) => {
9910
+ const variable = /^var\(\s*(--[^\s,()]+)\s*(?:,[\s\S]*)?\)$/i.exec(part.trim());
9911
+ if (!variable) {
9912
+ const name = normalizeUsedFontName(part);
9913
+ return name ? [name] : [];
9914
+ }
9915
+ const property = variable[1];
9916
+ if (!property || resolving.has(property) || resolving.size >= 8) return [];
9917
+ const referenced = properties.get(property);
9918
+ if (referenced === void 0) return [];
9919
+ return resolveUsedFontNames(referenced, properties, new Set(resolving).add(property));
9920
+ });
9921
+ }
9895
9922
  function extractUsedFontFamilies(styles) {
9896
9923
  const used = [];
9897
9924
  const seen = /* @__PURE__ */ new Set();
9898
- const propRe = /font-family\s*:\s*([^;}{]+)/gi;
9925
+ const properties = collectFontCustomProperties(styles);
9899
9926
  for (const style of styles) {
9900
- const withoutFontFace = stripCssComments2(style.content).replace(/@font-face\s*\{[^}]*\}/gi, "");
9901
- let match;
9902
- while ((match = propRe.exec(withoutFontFace)) !== null) {
9903
- for (const part of match[1].split(",")) {
9904
- const name = normalizeUsedFontName(part);
9905
- if (name && !GENERIC_FAMILIES.has(name) && !seen.has(name)) {
9927
+ parseFontCss(style.content)?.walkDecls(/^font-family$/i, (decl) => {
9928
+ if (isFontFaceDeclaration(decl)) return;
9929
+ for (const name of resolveUsedFontNames(decl.value, properties)) {
9930
+ if (!GENERIC_FAMILIES.has(name) && !seen.has(name)) {
9906
9931
  seen.add(name);
9907
9932
  used.push(name);
9908
9933
  }
9909
9934
  }
9910
- }
9935
+ });
9911
9936
  }
9912
9937
  return used;
9913
9938
  }
@@ -10010,15 +10035,12 @@ var fontRules = [
10010
10035
  ];
10011
10036
  function uniqueFontLocation(styles, families, locate) {
10012
10037
  const locations = [];
10038
+ const properties = collectFontCustomProperties(styles);
10013
10039
  for (const style of styles) {
10014
10040
  try {
10015
10041
  postcss3.parse(style.content).walkDecls(/^font-family$/i, (decl) => {
10016
- let parent = decl.parent;
10017
- while (parent) {
10018
- if (parent.type === "atrule" && parent.name.toLowerCase() === "font-face") return;
10019
- parent = parent.parent;
10020
- }
10021
- if (!decl.value.split(",").some((part) => families.includes(normalizeUsedFontName(part) ?? "")))
10042
+ if (isFontFaceDeclaration(decl)) return;
10043
+ if (!resolveUsedFontNames(decl.value, properties).some((name) => families.includes(name)))
10022
10044
  return;
10023
10045
  locations.push(locate(style, decl.source?.start?.offset));
10024
10046
  });
@@ -10026,7 +10048,7 @@ function uniqueFontLocation(styles, families, locate) {
10026
10048
  return {};
10027
10049
  }
10028
10050
  }
10029
- return locations.length === 1 ? locations[0] : {};
10051
+ return locations.length === 1 ? locations[0] ?? {} : {};
10030
10052
  }
10031
10053
  function parseTiming(raw) {
10032
10054
  const startStr = readAttr(raw, "data-start");
@@ -10295,7 +10317,7 @@ function withoutComments(source) {
10295
10317
  function staticShaders(source) {
10296
10318
  const shaders = [];
10297
10319
  try {
10298
- const ast = parse(source, {
10320
+ const ast = parse3(source, {
10299
10321
  ecmaVersion: "latest",
10300
10322
  sourceType: "module",
10301
10323
  allowReturnOutsideFunction: true
@@ -10826,6 +10848,7 @@ function contentDigest(html) {
10826
10848
  return createHash("sha256").update(html).digest("hex").slice(0, 16);
10827
10849
  }
10828
10850
  var AUDIO_EXTENSIONS = /* @__PURE__ */ new Set([".mp3", ".wav", ".aac", ".ogg", ".m4a", ".flac", ".opus"]);
10851
+ var CSS_URL_RE = /\burl\(\s*(?:"([^"]+)"|'([^']+)'|([^"')\s]+))\s*\)/gi;
10829
10852
  var MASK_IMAGE_URL_RE = /\b(?:-webkit-)?mask-image\s*:\s*[^;{}]*url\(\s*(?:"([^"]+)"|'([^']+)'|([^"')\s]+))\s*\)/gi;
10830
10853
  function isLocalStylesheetHref(href) {
10831
10854
  return !!href && !/^(https?:|data:|blob:|\/\/)/i.test(href);
@@ -11118,9 +11141,16 @@ function lintTextureMaskAssetNotFound(projectDir, htmlSources) {
11118
11141
  for (const { html, compSrcPath } of htmlSources) {
11119
11142
  const file = sourceFile(projectDir, compSrcPath);
11120
11143
  for (const cssSource of collectCssSources(projectDir, html, compSrcPath)) {
11121
- let match;
11122
- const pattern = new RegExp(MASK_IMAGE_URL_RE.source, MASK_IMAGE_URL_RE.flags);
11123
- while ((match = pattern.exec(cssSource.content)) !== null) {
11144
+ let matches = [];
11145
+ try {
11146
+ postcss4.parse(cssSource.content).walkDecls(/^(?:-webkit-)?mask-image$/i, (declaration) => {
11147
+ matches.push(...declaration.value.matchAll(CSS_URL_RE));
11148
+ });
11149
+ } catch (error) {
11150
+ if (!(error instanceof postcss4.CssSyntaxError)) throw error;
11151
+ matches = [...cssSource.content.matchAll(MASK_IMAGE_URL_RE)];
11152
+ }
11153
+ for (const match of matches) {
11124
11154
  const rawUrl = match[1] ?? match[2] ?? match[3] ?? "";
11125
11155
  if (isUnresolvedAssetPlaceholder(rawUrl)) continue;
11126
11156
  const url = cleanAssetUrl(rawUrl);
@@ -11322,7 +11352,6 @@ export {
11322
11352
  resolveReferencedStart,
11323
11353
  resolveReferencedDuration,
11324
11354
  require_dist,
11325
- resolveCompositionDuration,
11326
11355
  LINT_RULE_COUNT,
11327
11356
  LINT_RULE_GROUP_COUNTS,
11328
11357
  lintHyperframeHtml,
@@ -10,7 +10,11 @@ var SLIDESHOW_MANIFEST_VERSION = 1;
10
10
  var SLIDESHOW_ISLAND_TYPE = "application/hyperframes-slideshow+json";
11
11
  function slideshowIslandRegex(flags = "i") {
12
12
  const escaped = SLIDESHOW_ISLAND_TYPE.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
13
- return new RegExp(`<script[^>]*type=["']${escaped}["'][^>]*>([\\s\\S]*?)<\\/script>`, flags);
13
+ const htmlWhitespace = "[\\t\\n\\f\\r ]*";
14
+ return new RegExp(
15
+ `<script[^>]*type${htmlWhitespace}=${htmlWhitespace}["']${escaped}["'][^>]*>([\\s\\S]*?)<\\/script>`,
16
+ flags
17
+ );
14
18
  }
15
19
  function parseSlideshowManifest(html) {
16
20
  const re = slideshowIslandRegex("i");
@@ -38,7 +38,7 @@ import {
38
38
  stripEmbeddedRuntimeScripts,
39
39
  styleElementsFor,
40
40
  warnUnknownEnumValues
41
- } from "./chunk-LM265QNK.js";
41
+ } from "./chunk-USWPZXEA.js";
42
42
  import {
43
43
  cssVariableName
44
44
  } from "./chunk-VC76R6W2.js";
@@ -48,7 +48,7 @@ import {
48
48
  } from "./chunk-OFQWTKPW.js";
49
49
  import {
50
50
  lintHyperframeHtml
51
- } from "./chunk-3NRB7YXW.js";
51
+ } from "./chunk-2VXY3PEF.js";
52
52
  import {
53
53
  checkSubCompositionUsability,
54
54
  resolveSubCompositionContent
@@ -69,9 +69,6 @@ import {
69
69
  import {
70
70
  parseHTML
71
71
  } from "./chunk-SDYDNHEE.js";
72
- import {
73
- parse
74
- } from "./chunk-I5JRXMCV.js";
75
72
 
76
73
  // ../core/dist/compiler/htmlCompiler.js
77
74
  import { resolve } from "path";
@@ -170,7 +167,16 @@ function ensureExternalScriptTag(doc, src, attributes = {}) {
170
167
  }
171
168
 
172
169
  // ../core/dist/compiler/importMaps.js
173
- var rebaseEntries = (entries, rebase) => entries && Object.fromEntries(Object.entries(entries).map(([specifier, url]) => [specifier, rebase(url)]));
170
+ function isRecord(value) {
171
+ return typeof value === "object" && value !== null && !Array.isArray(value);
172
+ }
173
+ function isScopeMap(value) {
174
+ return isRecord(value) && Object.values(value).every(isRecord);
175
+ }
176
+ var rebaseEntries = (entries, rebase) => entries && Object.fromEntries(Object.entries(entries).map(([specifier, url]) => [
177
+ specifier,
178
+ typeof url === "string" ? rebase(url) : null
179
+ ]));
174
180
  function parseImportMap(json, rebase) {
175
181
  let parsed;
176
182
  try {
@@ -178,9 +184,13 @@ function parseImportMap(json, rebase) {
178
184
  } catch {
179
185
  return null;
180
186
  }
181
- if (!parsed || typeof parsed !== "object")
187
+ if (!isRecord(parsed))
182
188
  return null;
183
189
  const { imports, scopes } = parsed;
190
+ if (imports !== void 0 && !isRecord(imports))
191
+ return null;
192
+ if (scopes !== void 0 && !isScopeMap(scopes))
193
+ return null;
184
194
  return {
185
195
  imports: rebaseEntries(imports, rebase),
186
196
  scopes: scopes && Object.fromEntries(Object.entries(scopes).map(([prefix, entries]) => [
@@ -191,9 +201,14 @@ function parseImportMap(json, rebase) {
191
201
  }
192
202
  function mergeEntries(into, from, where) {
193
203
  for (const [specifier, url] of Object.entries(from ?? {})) {
194
- if (!(specifier in into))
195
- into[specifier] = url;
196
- else if (into[specifier] !== url) {
204
+ if (!Object.hasOwn(into, specifier)) {
205
+ Object.defineProperty(into, specifier, {
206
+ value: url,
207
+ enumerable: true,
208
+ configurable: true,
209
+ writable: true
210
+ });
211
+ } else if (into[specifier] !== url) {
197
212
  console.warn(`[HyperFrames] import map conflict for "${specifier}"${where}: keeping ${into[specifier]}, ignoring ${url}.`);
198
213
  }
199
214
  }
@@ -213,7 +228,9 @@ function mergeImportMapsIntoDocument(doc, maps) {
213
228
  for (const map of maps) {
214
229
  mergeEntries(imports, map.imports, "");
215
230
  for (const [prefix, entries] of Object.entries(map.scopes ?? {})) {
216
- mergeEntries(scopes[prefix] ??= {}, entries, ` in scope ${prefix}`);
231
+ const scope = (Object.hasOwn(scopes, prefix) ? scopes[prefix] : void 0) ?? {};
232
+ Object.defineProperty(scopes, prefix, { value: scope, enumerable: true });
233
+ mergeEntries(scope, entries, ` in scope ${prefix}`);
217
234
  }
218
235
  }
219
236
  if (!el) {
@@ -270,6 +287,7 @@ function sanitizeCssValue(value) {
270
287
  // ../core/dist/compiler/htmlBundler.js
271
288
  import { AsyncLocalStorage } from "async_hooks";
272
289
  import { readFileSync, existsSync, statSync } from "fs";
290
+ import { parse as parseJs } from "acorn";
273
291
  import { resolve as resolve2, relative, dirname, isAbsolute, sep } from "path";
274
292
 
275
293
  // ../core/dist/compiler/standaloneEntry.js
@@ -2252,20 +2270,41 @@ function rebaseRelativePath(urlValue, fromDir, toDir) {
2252
2270
  const rebased = encodeUrlPath(relative(resolve2(toDir), absolutePath).split(sep).join("/"));
2253
2271
  return appendSuffixToUrl(rebased, suffix);
2254
2272
  }
2255
- function rebaseSrcsetPaths(srcsetValue, fromDir, toDir) {
2256
- if (!srcsetValue)
2257
- return srcsetValue;
2258
- return srcsetValue.split(",").map((rawCandidate) => {
2259
- const candidate = rawCandidate.trim();
2260
- if (!candidate)
2261
- return candidate;
2262
- const parts = candidate.split(/\s+/);
2263
- const first = parts[0] ?? "";
2264
- if (parts.length === 0 || !isRelativeUrl(first))
2265
- return candidate;
2266
- parts[0] = rebaseRelativePath(first, fromDir, toDir);
2267
- return parts.join(" ");
2268
- }).join(", ");
2273
+ function rewriteSrcsetUrls(srcset, rewriteUrl) {
2274
+ const parts = [];
2275
+ let position = 0;
2276
+ let written = 0;
2277
+ while (position < srcset.length) {
2278
+ while (position < srcset.length && /[ \t\n\r\f,]/.test(srcset.charAt(position)))
2279
+ position++;
2280
+ const start = position;
2281
+ while (position < srcset.length && !/[ \t\n\r\f]/.test(srcset.charAt(position)))
2282
+ position++;
2283
+ let end = position;
2284
+ while (end > start && srcset.charAt(end - 1) === ",")
2285
+ end--;
2286
+ if (end > start) {
2287
+ const url = srcset.slice(start, end);
2288
+ const rewritten = rewriteUrl(url);
2289
+ if (rewritten !== url) {
2290
+ parts.push(srcset.slice(written, start), rewritten);
2291
+ written = end;
2292
+ }
2293
+ }
2294
+ if (end < position)
2295
+ continue;
2296
+ let inParens = false;
2297
+ while (position < srcset.length) {
2298
+ const char = srcset.charAt(position++);
2299
+ if (char === "(")
2300
+ inParens = true;
2301
+ else if (char === ")")
2302
+ inParens = false;
2303
+ else if (char === "," && !inParens)
2304
+ break;
2305
+ }
2306
+ }
2307
+ return parts.length > 0 ? parts.join("") + srcset.slice(written) : srcset;
2269
2308
  }
2270
2309
  function rebaseColorGradingLutPath(value, fromDir, toDir) {
2271
2310
  if (!value.trim().startsWith("{"))
@@ -2317,7 +2356,7 @@ function rebaseEntryAuthoredAssetPaths(document, sourceDir, projectDir) {
2317
2356
  for (const el of [...document.querySelectorAll("[srcset]")]) {
2318
2357
  const srcset = el.getAttribute("srcset");
2319
2358
  if (srcset)
2320
- el.setAttribute("srcset", rebaseSrcsetPaths(srcset, sourceDir, projectDir));
2359
+ el.setAttribute("srcset", rewriteSrcsetUrls(srcset, (url) => isRelativeUrl(url) ? rebaseRelativePath(url, sourceDir, projectDir) : url));
2321
2360
  }
2322
2361
  for (const el of [...document.querySelectorAll(`[${HF_COLOR_GRADING_ATTR}]`)]) {
2323
2362
  const value = el.getAttribute(HF_COLOR_GRADING_ATTR);
@@ -2410,6 +2449,7 @@ var INLINE_MIME = {
2410
2449
  ".avif": "image/avif"
2411
2450
  };
2412
2451
  var MAX_INLINE_ASSET_BYTES = 2 * 1024 * 1024;
2452
+ var MAX_INLINED_BUNDLE_CHARS = 256 * 1024 * 1024;
2413
2453
  function safeStatSize(filePath) {
2414
2454
  try {
2415
2455
  return statSync(filePath).size;
@@ -2421,8 +2461,13 @@ function warnAssetTooLargeToInline(assetPath, byteLength) {
2421
2461
  const mb = (byteLength / (1024 * 1024)).toFixed(1);
2422
2462
  console.warn(`[HyperFrames] Not inlining "${assetPath}" (${mb} MB exceeds the ${MAX_INLINE_ASSET_BYTES / (1024 * 1024)} MB inline limit). The bundle may not be self-contained.`);
2423
2463
  }
2464
+ function warnInlineBudgetExhausted(assetPath) {
2465
+ console.warn(`[HyperFrames] Not inlining "${assetPath}" and later assets: the bundle already inlines ${MAX_INLINED_BUNDLE_CHARS / (1024 * 1024)} MB of data URLs. The bundle may not be self-contained.`);
2466
+ }
2424
2467
  function createAssetInliner(resolveProjectPath, inlineAssets) {
2425
2468
  const assets = /* @__PURE__ */ new Map();
2469
+ let inlinedChars = 0;
2470
+ let budgetExhausted = false;
2426
2471
  const readAsset = (filePath, mimeType) => {
2427
2472
  const byteLength = safeStatSize(filePath);
2428
2473
  if (byteLength !== null && byteLength > MAX_INLINE_ASSET_BYTES)
@@ -2458,7 +2503,16 @@ function createAssetInliner(resolveProjectPath, inlineAssets) {
2458
2503
  warnAssetTooLargeToInline(basePath, asset.tooLarge);
2459
2504
  return null;
2460
2505
  }
2461
- return asset.dataUrl === null ? null : appendSuffixToUrl(asset.dataUrl, suffix);
2506
+ if (asset.dataUrl === null)
2507
+ return null;
2508
+ if (budgetExhausted || inlinedChars + asset.dataUrl.length > MAX_INLINED_BUNDLE_CHARS) {
2509
+ if (!budgetExhausted)
2510
+ warnInlineBudgetExhausted(basePath);
2511
+ budgetExhausted = true;
2512
+ return null;
2513
+ }
2514
+ inlinedChars += asset.dataUrl.length;
2515
+ return appendSuffixToUrl(asset.dataUrl, suffix);
2462
2516
  };
2463
2517
  }
2464
2518
  function isExternalSvgFragmentUse(el, attr, urlValue) {
@@ -2514,22 +2568,6 @@ function rewriteColorGradingLutWithInlinedAssets(value, inlineAsset) {
2514
2568
  Reflect.set(lut, "src", inlined);
2515
2569
  return JSON.stringify(parsed);
2516
2570
  }
2517
- function rewriteSrcsetWithInlinedAssets(srcsetValue, inlineAsset) {
2518
- if (!srcsetValue)
2519
- return srcsetValue;
2520
- return srcsetValue.split(",").map((rawCandidate) => {
2521
- const candidate = rawCandidate.trim();
2522
- if (!candidate)
2523
- return candidate;
2524
- const parts = candidate.split(/\s+/);
2525
- if (parts.length === 0)
2526
- return candidate;
2527
- const maybeInlined = inlineAsset(parts[0] ?? "");
2528
- if (maybeInlined)
2529
- parts[0] = maybeInlined;
2530
- return parts.join(" ");
2531
- }).join(", ");
2532
- }
2533
2571
  function rewriteCssUrlsWithInlinedAssets(cssText, inlineAsset) {
2534
2572
  if (!cssText)
2535
2573
  return cssText;
@@ -2792,7 +2830,7 @@ function joinJsChunks(chunks) {
2792
2830
  }
2793
2831
  function parsesAsScript(source) {
2794
2832
  try {
2795
- parse(source, { ecmaVersion: "latest", sourceType: "script" });
2833
+ parseJs(source, { ecmaVersion: "latest", sourceType: "script" });
2796
2834
  return true;
2797
2835
  } catch {
2798
2836
  return false;
@@ -3222,7 +3260,7 @@ async function bundleProject(projectDir, options) {
3222
3260
  for (const el of [...document.querySelectorAll("[srcset]")]) {
3223
3261
  const srcset = el.getAttribute("srcset");
3224
3262
  if (srcset)
3225
- el.setAttribute("srcset", rewriteSrcsetWithInlinedAssets(srcset, inlineAsset));
3263
+ el.setAttribute("srcset", rewriteSrcsetUrls(srcset, (url) => inlineAsset(url) ?? url));
3226
3264
  }
3227
3265
  const liveStyles = [...document.querySelectorAll("style")].filter(isAlwaysAppliedStyle);
3228
3266
  const liveCss = liveStyles.map((el) => el.textContent || "");
@@ -8,34 +8,34 @@ import {
8
8
  launchManagedBrowser,
9
9
  resolveManagedGpuMode,
10
10
  rethrowAfterBrowserCleanup
11
- } from "./chunk-WY3TQ2PT.js";
11
+ } from "./chunk-UIC7B5KW.js";
12
12
  import {
13
13
  gotoWhenSent
14
14
  } from "./chunk-MOEGCMKI.js";
15
15
  import {
16
16
  pageNavigationTimeoutMs,
17
17
  windowsChromeCrashRemediation
18
- } from "./chunk-TJKE4EYX.js";
18
+ } from "./chunk-UB7BIDBS.js";
19
19
  import {
20
20
  oneProcessOverPipe
21
21
  } from "./chunk-DKPNNYBZ.js";
22
22
  import {
23
23
  resolveCompositionViewportFromHtml
24
- } from "./chunk-COWQITWP.js";
24
+ } from "./chunk-4TKJWWPL.js";
25
25
  import {
26
26
  resolveLocalBrowserGpuMode,
27
27
  resolveLocalWebGpu
28
- } from "./chunk-XMSQRDAK.js";
28
+ } from "./chunk-YS4JUGNI.js";
29
29
  import {
30
30
  c
31
31
  } from "./chunk-ZTZA4UWZ.js";
32
32
  import {
33
33
  assertWebGpuAdapterAvailable,
34
34
  compositionRequiresWebGpu
35
- } from "./chunk-NMDUSCCE.js";
35
+ } from "./chunk-L4JB7LI4.js";
36
36
  import {
37
37
  normalizeErrorMessage
38
- } from "./chunk-KNU5COPB.js";
38
+ } from "./chunk-T2EUWCJE.js";
39
39
 
40
40
  // src/capture/captureCompositionFrame.ts
41
41
  import { spawn } from "child_process";
@@ -140,7 +140,7 @@ async function waitForCompositionSettle(page, options) {
140
140
  console.warn(` ${c.warn("\u26A0")} Shader transitions did not finish pre-rendering`);
141
141
  });
142
142
  await waitForLateSubresources(page, options.lateSubresourceTimeoutMs ?? CAPTURE_SETTLE_MS);
143
- const { resolveConfig, waitForImagesReady } = await import("./src-ZOXSEJCD.js");
143
+ const { resolveConfig, waitForImagesReady } = await import("./src-BH5NICGQ.js");
144
144
  const imageTimeoutMs = resolveConfig().playerReadyTimeout;
145
145
  await waitForImagesReady(
146
146
  page,
@@ -189,7 +189,7 @@ async function installPageFunctionGuard(page) {
189
189
  async function openSettledCompositionPage(html, url, options) {
190
190
  const viewport = resolveCompositionViewportFromHtml(html);
191
191
  const requiresWebGpu = compositionRequiresWebGpu(html);
192
- const answer = (await import("./staticProjectServer-LSVIRDRO.js")).inProcessAnswer(url);
192
+ const answer = (await import("./staticProjectServer-BKXL5CXB.js")).inProcessAnswer(url);
193
193
  const noListen = answer !== void 0;
194
194
  let chromeBrowser;
195
195
  try {
@@ -200,7 +200,7 @@ async function openSettledCompositionPage(html, url, options) {
200
200
  options.onBrowserReady?.();
201
201
  const page = await chromeBrowser.newPage();
202
202
  await installPageFunctionGuard(page);
203
- const { installMediaRenderIdBridge } = await import("./src-ZOXSEJCD.js");
203
+ const { installMediaRenderIdBridge } = await import("./src-BH5NICGQ.js");
204
204
  await installMediaRenderIdBridge(page);
205
205
  await page.setViewport(viewport);
206
206
  if (answer) await answerPageInProcess(page, url, answer);
@@ -216,10 +216,10 @@ async function openSettledCompositionPage(html, url, options) {
216
216
  }
217
217
  async function launchCompositionBrowser(html, noListen, options) {
218
218
  const viewport = resolveCompositionViewportFromHtml(html);
219
- const { ensureBrowser, findSystemBrowser } = await import("./manager-UHWEKPXC.js");
219
+ const { ensureBrowser, findSystemBrowser } = await import("./manager-MZIJY73J.js");
220
220
  const browser = await ensureBrowser({ signal: options.signal });
221
221
  const puppeteer = await import("puppeteer-core");
222
- const { buildChromeArgs } = await import("./src-ZOXSEJCD.js");
222
+ const { buildChromeArgs } = await import("./src-BH5NICGQ.js");
223
223
  const requestedGpuMode = options.browserGpuMode ?? resolveCliChromeGpuMode();
224
224
  const requiresWebGpu = compositionRequiresWebGpu(html);
225
225
  let softwareWebGpu = false;