hyperframes 0.8.190 → 0.8.192

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 (222) hide show
  1. package/dist/{add-DBKN5H7H.js → add-TZU2UW7A.js} +17 -17
  2. package/dist/{animatedGifPrep-YVBKKLQY.js → animatedGifPrep-NLAXC3VV.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-2OHQKUMQ.js → asset-JAJXA6LB.js} +2 -2
  6. package/dist/{assetCataloger-O3QAUWIK.js → assetCataloger-4WTX3J4I.js} +13 -12
  7. package/dist/{audio-IR3JGCMM.js → audio-XLWC7JKS.js} +22 -21
  8. package/dist/{auth-J6TAJLGD.js → auth-5K6X3NPJ.js} +4 -4
  9. package/dist/{autoUpdate-D7BJJUT2.js → autoUpdate-RNV7SKGB.js} +4 -4
  10. package/dist/{backgroundChecks-AILHY2YZ.js → backgroundChecks-QXLVZVGX.js} +5 -5
  11. package/dist/backgroundChecksWorker.js +5 -5
  12. package/dist/{batchRender-QZKFVWEI.js → batchRender-THKSPDZR.js} +14 -7
  13. package/dist/{beats-6LOEKZPB.js → beats-K7CGCFVL.js} +53 -15
  14. package/dist/{benchmark-RJMHI3YW.js → benchmark-PHRDIXNL.js} +18 -14
  15. package/dist/{browser-Q3Q36FE3.js → browser-GN6R5ZSK.js} +7 -7
  16. package/dist/{bundleWithLocalizedFonts-RWHFMSFL.js → bundleWithLocalizedFonts-C325UNR4.js} +3 -3
  17. package/dist/{capture-2PNTGVYV.js → capture-6UBQFHZQ.js} +76 -68
  18. package/dist/{capture-FO3ZZCT4.js → capture-BZ7APOGQ.js} +3 -3
  19. package/dist/{captureCompositionFrame-WTMLWVEJ.js → captureCompositionFrame-VORSCTWC.js} +19 -16
  20. package/dist/{catalog-LUZYPUYT.js → catalog-PHU2RUZ3.js} +18 -18
  21. package/dist/{catch-up-TUTLUTFP.js → catch-up-HCNRM46J.js} +7 -7
  22. package/dist/{check-K2TBTJZS.js → check-TJ5ZLB4I.js} +43 -42
  23. package/dist/{checkBrowser-JT7CXDT6.js → checkBrowser-DWP7ZXJ7.js} +38 -37
  24. package/dist/{chunk-STJ2ANMF.js → chunk-2HP5GIQ3.js} +3 -3
  25. package/dist/{chunk-L34DPWY4.js → chunk-2J3NA3OB.js} +13 -13
  26. package/dist/{chunk-B2A56S5C.js → chunk-2MCXIY4B.js} +13 -10
  27. package/dist/{chunk-DCAI5DBR.js → chunk-2ST4WAFY.js} +9 -1
  28. package/dist/{chunk-TSFA2Y5C.js → chunk-2VXY3PEF.js} +99 -69
  29. package/dist/{chunk-AYFF3GX6.js → chunk-32NB4VMH.js} +1 -1
  30. package/dist/{chunk-IXLUTE6N.js → chunk-3422KMTD.js} +5 -1
  31. package/dist/{chunk-JB7LML5B.js → chunk-3CXIX6XS.js} +68 -7
  32. package/dist/{chunk-F6DNM676.js → chunk-3FV5BVWS.js} +2 -2
  33. package/dist/{chunk-OTQXYTQZ.js → chunk-4E75LHAL.js} +23 -3
  34. package/dist/{chunk-TMBUBLZB.js → chunk-4HCJOFMB.js} +166 -46
  35. package/dist/{chunk-UZ7RJDEC.js → chunk-5IPKQHOL.js} +17 -6
  36. package/dist/{chunk-WBUO6WH6.js → chunk-5TRFLZ5Z.js} +2 -2
  37. package/dist/{chunk-HRPWRZGF.js → chunk-6N65ZMC5.js} +1 -1
  38. package/dist/{chunk-XUXGIA7H.js → chunk-6NLPPKBO.js} +1 -2
  39. package/dist/{chunk-3QLT727N.js → chunk-6WNLQI63.js} +4 -4
  40. package/dist/{chunk-XNLYMHX2.js → chunk-6XVKMBUA.js} +9 -6
  41. package/dist/{chunk-JLSXXMRU.js → chunk-7JJMT6LN.js} +1 -1
  42. package/dist/{chunk-7JHTNUF2.js → chunk-7LLRMYP6.js} +2 -2
  43. package/dist/{chunk-BT64TTSE.js → chunk-7RSY7SZN.js} +2 -2
  44. package/dist/{chunk-DX7VEUBO.js → chunk-7UZC4N62.js} +1 -1
  45. package/dist/{chunk-YT5VLUHM.js → chunk-A4OI5ZNX.js} +1 -1
  46. package/dist/{chunk-TSQAPPRS.js → chunk-AEXVVABM.js} +83 -45
  47. package/dist/{chunk-Y5L5I4US.js → chunk-AMZJFCOX.js} +8 -8
  48. package/dist/{chunk-WCT6KGGT.js → chunk-AR46ND2Q.js} +1 -1
  49. package/dist/chunk-B2XLXD7V.js +3897 -0
  50. package/dist/{chunk-KNQQZRB2.js → chunk-BEOK6F26.js} +2 -2
  51. package/dist/{chunk-76ITJYXX.js → chunk-BPKLUHFT.js} +7 -7
  52. package/dist/{chunk-OOAVKK2W.js → chunk-BV6YE455.js} +2 -2
  53. package/dist/{chunk-XGHHVYC7.js → chunk-BY6OQ6XP.js} +2 -2
  54. package/dist/{chunk-JQYJXUJW.js → chunk-C6KE4AFW.js} +1 -1
  55. package/dist/{chunk-TMK4Q7JA.js → chunk-CFUCHO4T.js} +20 -5
  56. package/dist/{chunk-FANFO5HI.js → chunk-CXRZBWSH.js} +11 -11
  57. package/dist/chunk-CZGHFATT.js +31 -0
  58. package/dist/{chunk-CYBXXSC4.js → chunk-DIKAPMMF.js} +2 -2
  59. package/dist/{chunk-7L37AB57.js → chunk-E3P3LJG6.js} +9 -9
  60. package/dist/{chunk-EU5HTY3E.js → chunk-E5V6WEMK.js} +58 -23
  61. package/dist/{chunk-HJZ5CPZA.js → chunk-EKGGSAWR.js} +6 -5
  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-EI7FP7F3.js → chunk-FBVUAH7N.js} +12 -2
  65. package/dist/{chunk-TTZTGXKG.js → chunk-GANST5K3.js} +2 -2
  66. package/dist/{chunk-EQF6TVWB.js → chunk-IMSI7IFW.js} +65 -29
  67. package/dist/{chunk-W64L7IFS.js → chunk-IW5G323T.js} +1 -1
  68. package/dist/{chunk-RBGNU7VD.js → chunk-J2ASTCU6.js} +2 -2
  69. package/dist/{chunk-SUSSMCWL.js → chunk-J2BSUF6X.js} +1 -1
  70. package/dist/{chunk-GGVGOY6M.js → chunk-JCDYDF54.js} +2 -2
  71. package/dist/{chunk-EPOYPP36.js → chunk-K2AKVYNR.js} +2 -2
  72. package/dist/{chunk-XBGEWNGQ.js → chunk-KZOZN4PI.js} +4 -4
  73. package/dist/{chunk-E7DXKMKU.js → chunk-L2YGSAOL.js} +3 -3
  74. package/dist/{chunk-2FFOLLU2.js → chunk-LOKCBZYF.js} +3 -3
  75. package/dist/{chunk-56IDMP37.js → chunk-MEE4NTPZ.js} +2 -2
  76. package/dist/{chunk-56IOFIYB.js → chunk-MGBUWPXX.js} +2 -2
  77. package/dist/{chunk-K4664CDS.js → chunk-MVIJTXN5.js} +35 -14
  78. package/dist/{chunk-S2IEO6TH.js → chunk-ODBYZIOH.js} +28 -16
  79. package/dist/{chunk-45U3KY7Z.js → chunk-OQL4AJ4X.js} +6 -6
  80. package/dist/{chunk-5C7R55BJ.js → chunk-P2I4RLJE.js} +1 -1
  81. package/dist/{chunk-S7C6EM7N.js → chunk-PFRG5P32.js} +1 -1
  82. package/dist/{chunk-RUOG4VB7.js → chunk-PKZ7RK5N.js} +5 -4
  83. package/dist/{chunk-LLFQA7XF.js → chunk-QFPBRZJD.js} +1 -1
  84. package/dist/{chunk-CWVSJA52.js → chunk-QWLES6YV.js} +3 -3
  85. package/dist/{chunk-OAPYPSEB.js → chunk-QX4TB4NH.js} +292 -79
  86. package/dist/{chunk-BWPY64WA.js → chunk-R2U2G4OS.js} +1 -1
  87. package/dist/{chunk-46HEFGXJ.js → chunk-REUL2KH2.js} +1 -1
  88. package/dist/{chunk-R4QASDTN.js → chunk-RHYOWDI6.js} +2 -2
  89. package/dist/{chunk-DYAPHNV6.js → chunk-RWGASWT7.js} +1 -1
  90. package/dist/chunk-RXATE6FZ.js +385 -0
  91. package/dist/{chunk-CWYS2UNQ.js → chunk-SBBQFPCJ.js} +1 -1
  92. package/dist/{chunk-RDHEG7RX.js → chunk-SK7TR7BL.js} +4 -4
  93. package/dist/{chunk-KNU5COPB.js → chunk-T2EUWCJE.js} +1 -1
  94. package/dist/{chunk-6HYHHMX3.js → chunk-T6O5OLN2.js} +3 -3
  95. package/dist/{chunk-FVD44EQX.js → chunk-ULTKB5FC.js} +65 -23
  96. package/dist/{chunk-B7JFAXDP.js → chunk-VNPADTDD.js} +3 -3
  97. package/dist/{chunk-FUHI34T4.js → chunk-VOM2HLUI.js} +4 -4
  98. package/dist/{chunk-IARWN467.js → chunk-VRAXIQ6I.js} +2 -2
  99. package/dist/{chunk-NAUKCKCJ.js → chunk-W24SZ5FL.js} +4 -4
  100. package/dist/{chunk-ZFFKWHXN.js → chunk-WOKVXK4J.js} +1 -1
  101. package/dist/{chunk-WLG4OYH7.js → chunk-XF77MK3J.js} +1 -1
  102. package/dist/{chunk-DRTIIAIZ.js → chunk-XX2PA4L3.js} +2 -2
  103. package/dist/{chunk-A5YHWTSP.js → chunk-YMQQXPD5.js} +2 -2
  104. package/dist/{chunk-KUMUK6QS.js → chunk-YWRQHRDY.js} +17 -12
  105. package/dist/{chunk-EUUHVDMN.js → chunk-ZEMDV6W2.js} +29 -59
  106. package/dist/{clean-UVTWBPXK.js → clean-2RNCTDBT.js} +40 -27
  107. package/dist/cli.js +69 -67
  108. package/dist/{cloud-M42IPKFD.js → cloud-NFIKESNZ.js} +4 -4
  109. package/dist/{cloudrun-CTNX64R6.js → cloudrun-7224BCX3.js} +9 -9
  110. package/dist/commands/contrast-audit.browser.js +1 -1
  111. package/dist/commands/layout-audit.browser.js +64 -3
  112. package/dist/{compare-MQI7TG5M.js → compare-HL44MXVX.js} +80 -48
  113. package/dist/{compiler-EJE3HLCS.js → compiler-WF5QTXV7.js} +8 -7
  114. package/dist/{component-QSYOSFVV.js → component-ZBZXSJBR.js} +3 -3
  115. package/dist/{compositions-ITDFE7K4.js → compositions-76P7LDDX.js} +19 -17
  116. package/dist/{contactSheet-CAGMKI3E.js → contactSheet-43ISAESM.js} +2 -2
  117. package/dist/{delete-NTGTENKJ.js → delete-4YZBYOHJ.js} +7 -7
  118. package/dist/{deploy-AOJOXEYX.js → deploy-UGUUGYLF.js} +1 -1
  119. package/dist/{deterministicFonts-EGAAE7QL.js → deterministicFonts-RO2TCMLZ.js} +3 -3
  120. package/dist/{dist-NHW2JQCA.js → dist-5KKCRFPT.js} +5 -5
  121. package/dist/{dist-JH32CBQL.js → dist-QQ26RUDV.js} +5 -4
  122. package/dist/docs/rendering.md +2 -2
  123. package/dist/{doctor-Q6DAYVSQ.js → doctor-GGVUK4NB.js} +20 -19
  124. package/dist/{events-BQIBYPCF.js → events-OXPTHVDB.js} +4 -4
  125. package/dist/{events-PV3CDO4A.js → events-V2VU4J3B.js} +5 -5
  126. package/dist/{feedback-BZH26JQE.js → feedback-HFZ5SCUK.js} +16 -16
  127. package/dist/{ffmpeg-KU7RNT3U.js → ffmpeg-3VHY7GO3.js} +13 -12
  128. package/dist/{figma-PBGZUEIL.js → figma-7SEZTLBJ.js} +3 -3
  129. package/dist/fontLocalizeCli.js +14 -13
  130. package/dist/{get-MM2JZ5ET.js → get-Y2S2PXCM.js} +7 -7
  131. package/dist/{gpuPolicy-DQE2CD5T.js → gpuPolicy-UHPOWRV5.js} +11 -10
  132. package/dist/{grade-compare-YTDQ7YXW.js → grade-compare-4VTXSQM5.js} +38 -37
  133. package/dist/{gsapParserAcorn-SKODXC2N.js → gsapParserAcorn-OOTY2MVN.js} +2 -2
  134. package/dist/{help-M4B2DN7E.js → help-HXNOACHI.js} +1 -1
  135. package/dist/{history-ZW4UYKAJ.js → history-XDJUI4LC.js} +39 -16
  136. package/dist/hyperframe.manifest.json +1 -1
  137. package/dist/hyperframe.runtime.iife.js +64 -64
  138. package/dist/hyperframes-player.global.js +3 -3
  139. package/dist/hyperframes-slideshow.global.js +1 -1
  140. package/dist/{info-L7LQAXLK.js → info-KYRI3EZV.js} +56 -22
  141. package/dist/{init-HTSQ535A.js → init-IL7EWMT5.js} +38 -45
  142. package/dist/{inspect-EWF2THRR.js → inspect-TBNH23UC.js} +36 -35
  143. package/dist/{installer-PQKH2S7C.js → installer-O2YMFSI4.js} +8 -8
  144. package/dist/{keyframes-X2QKJ4DP.js → keyframes-4GF62KAJ.js} +13 -14
  145. package/dist/{lambda-BURM66GP.js → lambda-JFL6M4XZ.js} +12 -12
  146. package/dist/{layout-3Z3SJGZZ.js → layout-7MAEFR65.js} +36 -35
  147. package/dist/{lint-OMNZ2K5J.js → lint-4AYHKYAM.js} +23 -16
  148. package/dist/{lintProject-XM3DLUKG.js → lintProject-52SLJPRC.js} +5 -4
  149. package/dist/{list-5ZSQEH6N.js → list-3DP3D3MW.js} +7 -7
  150. package/dist/{login-YNCQPHLA.js → login-T54WQYRQ.js} +7 -7
  151. package/dist/{logout-DDC4QLVK.js → logout-JYFWWUGK.js} +3 -3
  152. package/dist/{manager-UHWEKPXC.js → manager-MZIJY73J.js} +3 -3
  153. package/dist/{manager-N6XXRQN3.js → manager-QROK2IH3.js} +14 -13
  154. package/dist/{media-treatment-EOKBRJPY.js → media-treatment-4CXF7MSG.js} +20 -19
  155. package/dist/{models-6T4CCKUV.js → models-IS3I6JKU.js} +18 -17
  156. package/dist/{motionShot-KXKMYZ3A.js → motionShot-DVYJZOTQ.js} +21 -20
  157. package/dist/{normalize-3AYFSN2F.js → normalize-FASIPBUM.js} +1 -1
  158. package/dist/{normalize-audio-VWB7RHHA.js → normalize-audio-4527JIK4.js} +12 -8
  159. package/dist/{open-32SQCNUP.js → open-5JE46SAX.js} +18 -18
  160. package/dist/{parakeetRunner-BXW2WX6Q.js → parakeetRunner-7JIJGJJ7.js} +20 -19
  161. package/dist/{pipeline-V5ONFRCY.js → pipeline-YEN3WFD2.js} +15 -14
  162. package/dist/{play-BBL262JE.js → play-WFX67I7M.js} +27 -26
  163. package/dist/{policies-MBWGLMWB.js → policies-GHVXA5PE.js} +1 -1
  164. package/dist/{preflight-LCNGQFNY.js → preflight-D377HVUZ.js} +15 -14
  165. package/dist/{present-RY4HO4ZQ.js → present-XTSEKAC7.js} +24 -23
  166. package/dist/{preview-BLLPCCLG.js → preview-5XH7EK6O.js} +28 -26
  167. package/dist/{producer-QG4AQ35S.js → producer-TFFYF4ZM.js} +1 -1
  168. package/dist/{projectConfig-LN3NR5OM.js → projectConfig-6YUJHMCL.js} +10 -10
  169. package/dist/{publication-TXMCS4KM.js → publication-JK33Y55E.js} +5 -5
  170. package/dist/{publish-57VURD7Z.js → publish-JHDGXWXU.js} +18 -17
  171. package/dist/{refresh-RXTOPRBB.js → refresh-USSFPJAU.js} +3 -3
  172. package/dist/{remove-background-VEWVIO3A.js → remove-background-P44MYAPJ.js} +16 -15
  173. package/dist/{render-SP7WAUB4.js → render-HJ34EGMN.js} +10 -9
  174. package/dist/{render-XMN3NJIQ.js → render-RBINWWP5.js} +43 -42
  175. package/dist/{render-4E7QDVOI.js → render-RJ3I4E3A.js} +26 -25
  176. package/dist/{render-batch-7ULP5RIJ.js → render-batch-3D6XQYUC.js} +11 -10
  177. package/dist/renderSetupWorker.js +9 -8
  178. package/dist/{resolver-D3XERO6U.js → resolver-HCLTFZUW.js} +7 -7
  179. package/dist/{screenshotCapture-UBY6TT75.js → screenshotCapture-I5EDCITF.js} +6 -3
  180. package/dist/{sherpa-5B5G426W.js → sherpa-IPOUJM6Q.js} +19 -18
  181. package/dist/{sites-5PWHAMEG.js → sites-Q2S3DZY4.js} +2 -1
  182. package/dist/skills/hyperframes/references/captions.md +1 -1
  183. package/dist/skills/hyperframes/references/skill-lifecycle.md +8 -4
  184. package/dist/skills/hyperframes-cli/references/cloudrun.md +1 -1
  185. package/dist/skills/hyperframes-cli/references/init-and-scaffold.md +1 -1
  186. package/dist/skills/hyperframes-cli/references/lambda.md +1 -1
  187. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +2 -2
  188. package/dist/skills/hyperframes-cli/references/preview-render.md +1 -1
  189. package/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +0 -8
  190. package/dist/skills/media-use/audio/references/transcribe.md +2 -2
  191. package/dist/skills/media-use/references/audio.md +1 -1
  192. package/dist/{skills-RXHRF7O7.js → skills-P67QEERC.js} +13 -75
  193. package/dist/{skillsUpdateCheck-JOTDZJAE.js → skillsUpdateCheck-IFMLRVIF.js} +5 -5
  194. package/dist/{slideshow-YTWATJRT.js → slideshow-SJGK4RQS.js} +1 -1
  195. package/dist/{snapshot-DN4MP4VN.js → snapshot-4YM4NNWJ.js} +66 -48
  196. package/dist/{src-W6Y5ZYRQ.js → src-DCD3YMXX.js} +13 -12
  197. package/dist/{src-XSDYRKLG.js → src-SSV66L3F.js} +14 -9
  198. package/dist/{staticProjectServer-JMFGTPMX.js → staticProjectServer-C7PPGLEQ.js} +22 -21
  199. package/dist/{status-CM7IQTU2.js → status-H5WLKQDS.js} +3 -3
  200. package/dist/studio/assets/{hyperframes-player-0HXJPmYC.js → hyperframes-player-ChN3cOr0.js} +3 -3
  201. package/dist/studio/assets/{index-DsSfhjUS.js → index-BYbFcRR0.js} +1 -1
  202. package/dist/studio/assets/{index-BYw97F07.js → index-CHu83hHM.js} +126 -125
  203. package/dist/studio/assets/{index-B3vk3hfU.css → index-CYbvOVp-.css} +1 -1
  204. package/dist/studio/index.html +2 -2
  205. package/dist/{studio-api-SZ4OMFPN.js → studio-api-6YZ7PIQR.js} +17 -14
  206. package/dist/{studioServer-LWO33H7D.js → studioServer-EWHSE4GC.js} +60 -59
  207. package/dist/{telemetry-QG5AANZ4.js → telemetry-4K6CPMNT.js} +2 -2
  208. package/dist/{telemetry-K3AFDKOP.js → telemetry-GGLBHZRZ.js} +5 -5
  209. package/dist/{timeline-NYQOAQDH.js → timeline-NKHQJXJ2.js} +65 -43
  210. package/dist/{tokens-K7YWUVOK.js → tokens-FWNNDJ6R.js} +2 -2
  211. package/dist/{transcribe-QAUMODXM.js → transcribe-TRPKXZ7L.js} +27 -26
  212. package/dist/{transcribe-ANPUQDZD.js → transcribe-VD2TMMC2.js} +17 -16
  213. package/dist/{tts-A2WILYGN.js → tts-5I2AJNLM.js} +1 -1
  214. package/dist/{updateCheck-RNR4HMDI.js → updateCheck-CUPS6LU3.js} +4 -4
  215. package/dist/{upgrade-MKUGZZPA.js → upgrade-23XO6MEX.js} +4 -4
  216. package/dist/{urlDownloader-5USPXLCS.js → urlDownloader-YOAOONCK.js} +10 -9
  217. package/dist/{validate-OJHPDLC5.js → validate-BWIW24G5.js} +30 -29
  218. package/dist/{video-BCKRR6LU.js → video-XRXJS4GC.js} +12 -11
  219. package/dist/warmCheck.js +43 -42
  220. package/package.json +2 -1
  221. package/dist/chunk-DIV37NUE.js +0 -3896
  222. package/dist/chunk-I5JRXMCV.js +0 -6077
@@ -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";
@@ -5599,7 +5584,8 @@ var IMAGE_SRC_EXT = /* @__PURE__ */ new Set([
5599
5584
  "heic",
5600
5585
  "heif",
5601
5586
  "tiff",
5602
- "ico"
5587
+ "ico",
5588
+ "avif"
5603
5589
  ]);
5604
5590
  var VIDEO_SRC_EXT = /* @__PURE__ */ new Set([
5605
5591
  "mp4",
@@ -5613,7 +5599,7 @@ var VIDEO_SRC_EXT = /* @__PURE__ */ new Set([
5613
5599
  "mpg",
5614
5600
  "mpeg"
5615
5601
  ]);
5616
- var AUDIO_SRC_EXT = /* @__PURE__ */ new Set(["mp3", "wav", "aac", "flac", "opus", "aiff", "wma"]);
5602
+ var AUDIO_SRC_EXT = /* @__PURE__ */ new Set(["mp3", "wav", "aac", "flac", "opus", "aiff", "wma", "m4a"]);
5617
5603
  var SRC_KIND_NOUN = {
5618
5604
  image: "an image",
5619
5605
  video: "a video",
@@ -6456,7 +6442,7 @@ function callsFor(script) {
6456
6442
  if (cached) return cached;
6457
6443
  const calls = [];
6458
6444
  try {
6459
- const ast = parse(script.content, {
6445
+ const ast = parse2(script.content, {
6460
6446
  ecmaVersion: "latest",
6461
6447
  sourceType: "script",
6462
6448
  allowReturnOutsideFunction: true
@@ -6782,6 +6768,16 @@ function variablesDeclarationFindings(tag, tags) {
6782
6768
  });
6783
6769
  continue;
6784
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
+ }
6785
6781
  const id = String(e.id);
6786
6782
  if ((e.type === "image" || varSrcIds.has(id)) && typeof e.default === "string" && e.default.length > 0 && !isSafeMediaUrl(e.default)) {
6787
6783
  findings.push({
@@ -7680,11 +7676,11 @@ function deriveDurationFromClips(tags, rootTag) {
7680
7676
  return resolveCompositionDuration({ authoredDurationSeconds: null, clipEndsSeconds: clipEnds });
7681
7677
  }
7682
7678
  async function loadParseGsapScript() {
7683
- const mod = await import("./gsapParserAcorn-SKODXC2N.js");
7679
+ const mod = await import("./gsapParserAcorn-OOTY2MVN.js");
7684
7680
  return mod.parseGsapScriptAcorn;
7685
7681
  }
7686
7682
  async function loadGsapScriptMotionPathFirstUseIndex() {
7687
- const mod = await import("./gsapParserAcorn-SKODXC2N.js");
7683
+ const mod = await import("./gsapParserAcorn-OOTY2MVN.js");
7688
7684
  return mod.gsapScriptMotionPathFirstUseIndex;
7689
7685
  }
7690
7686
  var SCENE_BOUNDARY_EPSILON_SECONDS = 0.05;
@@ -8818,7 +8814,7 @@ ${right.raw}`)
8818
8814
  return findings;
8819
8815
  },
8820
8816
  // gsap_timeline_registered_before_async_build — registering window.__timelines[id]
8821
- // BEFORE the timeline is built inside document.fonts.ready (or any async callback)
8817
+ // BEFORE the timeline is built inside a font-ready callback
8822
8818
  // leaves an EMPTY timeline registered. The runtime's sub-composition readiness gate
8823
8819
  // treats "key present" as "ready" and nests the child ONCE, while still empty — so the
8824
8820
  // animation never renders when this composition is mounted as a sub-composition.
@@ -8827,9 +8823,11 @@ ${right.raw}`)
8827
8823
  const findings = [];
8828
8824
  for (const script of scripts) {
8829
8825
  const content = stripJsComments(script.content);
8830
- 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
+ );
8831
8829
  if (regIdx < 0) continue;
8832
- 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*\()/);
8833
8831
  if (fontsReadyIdx < 0) continue;
8834
8832
  if (regIdx >= fontsReadyIdx) continue;
8835
8833
  const tail = content.slice(fontsReadyIdx);
@@ -8837,8 +8835,8 @@ ${right.raw}`)
8837
8835
  findings.push({
8838
8836
  code: "gsap_timeline_registered_before_async_build",
8839
8837
  severity: "error",
8840
- 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.',
8841
- 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."
8842
8840
  });
8843
8841
  }
8844
8842
  return findings;
@@ -9867,22 +9865,29 @@ var GENERIC_FAMILIES = /* @__PURE__ */ new Set([
9867
9865
  "unset",
9868
9866
  "revert"
9869
9867
  ]);
9870
- function stripCssComments2(css) {
9871
- 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;
9872
9882
  }
9873
9883
  function extractFontFaceFamilies(styles) {
9874
9884
  const families = /* @__PURE__ */ new Set();
9875
- const fontFaceRe = /@font-face\s*\{[^}]*\}/gi;
9876
- const familyRe = /font-family\s*:\s*(['"]?)([^;'"]+)\1/i;
9877
9885
  for (const style of styles) {
9878
- const content = stripCssComments2(style.content);
9879
- let match;
9880
- while ((match = fontFaceRe.exec(content)) !== null) {
9881
- const familyMatch = match[0].match(familyRe);
9882
- if (familyMatch?.[2]) {
9883
- families.add(familyMatch[2].trim().toLowerCase());
9884
- }
9885
- }
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
+ });
9886
9891
  }
9887
9892
  return families;
9888
9893
  }
@@ -9891,22 +9896,43 @@ function normalizeUsedFontName(part) {
9891
9896
  if (!name || name.includes("(") || name.includes(")")) return null;
9892
9897
  return name;
9893
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
+ }
9894
9922
  function extractUsedFontFamilies(styles) {
9895
9923
  const used = [];
9896
9924
  const seen = /* @__PURE__ */ new Set();
9897
- const propRe = /font-family\s*:\s*([^;}{]+)/gi;
9925
+ const properties = collectFontCustomProperties(styles);
9898
9926
  for (const style of styles) {
9899
- const withoutFontFace = stripCssComments2(style.content).replace(/@font-face\s*\{[^}]*\}/gi, "");
9900
- let match;
9901
- while ((match = propRe.exec(withoutFontFace)) !== null) {
9902
- for (const part of match[1].split(",")) {
9903
- const name = normalizeUsedFontName(part);
9904
- 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)) {
9905
9931
  seen.add(name);
9906
9932
  used.push(name);
9907
9933
  }
9908
9934
  }
9909
- }
9935
+ });
9910
9936
  }
9911
9937
  return used;
9912
9938
  }
@@ -10009,15 +10035,12 @@ var fontRules = [
10009
10035
  ];
10010
10036
  function uniqueFontLocation(styles, families, locate) {
10011
10037
  const locations = [];
10038
+ const properties = collectFontCustomProperties(styles);
10012
10039
  for (const style of styles) {
10013
10040
  try {
10014
10041
  postcss3.parse(style.content).walkDecls(/^font-family$/i, (decl) => {
10015
- let parent = decl.parent;
10016
- while (parent) {
10017
- if (parent.type === "atrule" && parent.name.toLowerCase() === "font-face") return;
10018
- parent = parent.parent;
10019
- }
10020
- 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)))
10021
10044
  return;
10022
10045
  locations.push(locate(style, decl.source?.start?.offset));
10023
10046
  });
@@ -10025,7 +10048,7 @@ function uniqueFontLocation(styles, families, locate) {
10025
10048
  return {};
10026
10049
  }
10027
10050
  }
10028
- return locations.length === 1 ? locations[0] : {};
10051
+ return locations.length === 1 ? locations[0] ?? {} : {};
10029
10052
  }
10030
10053
  function parseTiming(raw) {
10031
10054
  const startStr = readAttr(raw, "data-start");
@@ -10294,7 +10317,7 @@ function withoutComments(source) {
10294
10317
  function staticShaders(source) {
10295
10318
  const shaders = [];
10296
10319
  try {
10297
- const ast = parse(source, {
10320
+ const ast = parse3(source, {
10298
10321
  ecmaVersion: "latest",
10299
10322
  sourceType: "module",
10300
10323
  allowReturnOutsideFunction: true
@@ -10825,6 +10848,7 @@ function contentDigest(html) {
10825
10848
  return createHash("sha256").update(html).digest("hex").slice(0, 16);
10826
10849
  }
10827
10850
  var AUDIO_EXTENSIONS = /* @__PURE__ */ new Set([".mp3", ".wav", ".aac", ".ogg", ".m4a", ".flac", ".opus"]);
10851
+ var CSS_URL_RE = /\burl\(\s*(?:"([^"]+)"|'([^']+)'|([^"')\s]+))\s*\)/gi;
10828
10852
  var MASK_IMAGE_URL_RE = /\b(?:-webkit-)?mask-image\s*:\s*[^;{}]*url\(\s*(?:"([^"]+)"|'([^']+)'|([^"')\s]+))\s*\)/gi;
10829
10853
  function isLocalStylesheetHref(href) {
10830
10854
  return !!href && !/^(https?:|data:|blob:|\/\/)/i.test(href);
@@ -11117,9 +11141,16 @@ function lintTextureMaskAssetNotFound(projectDir, htmlSources) {
11117
11141
  for (const { html, compSrcPath } of htmlSources) {
11118
11142
  const file = sourceFile(projectDir, compSrcPath);
11119
11143
  for (const cssSource of collectCssSources(projectDir, html, compSrcPath)) {
11120
- let match;
11121
- const pattern = new RegExp(MASK_IMAGE_URL_RE.source, MASK_IMAGE_URL_RE.flags);
11122
- 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) {
11123
11154
  const rawUrl = match[1] ?? match[2] ?? match[3] ?? "";
11124
11155
  if (isUnresolvedAssetPlaceholder(rawUrl)) continue;
11125
11156
  const url = cleanAssetUrl(rawUrl);
@@ -11321,7 +11352,6 @@ export {
11321
11352
  resolveReferencedStart,
11322
11353
  resolveReferencedDuration,
11323
11354
  require_dist,
11324
- resolveCompositionDuration,
11325
11355
  LINT_RULE_COUNT,
11326
11356
  LINT_RULE_GROUP_COUNTS,
11327
11357
  lintHyperframeHtml,
@@ -27,7 +27,7 @@ import {
27
27
  } from "./chunk-GMECXFAN.js";
28
28
  import {
29
29
  ITEM_TYPE_DIRS
30
- } from "./chunk-56IOFIYB.js";
30
+ } from "./chunk-MGBUWPXX.js";
31
31
  import {
32
32
  realProjectRoot
33
33
  } from "./chunk-OFQWTKPW.js";
@@ -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");
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  loadOptionalPackage,
9
9
  loadSharp
10
- } from "./chunk-QH3T4WI2.js";
10
+ } from "./chunk-EXAX37XR.js";
11
11
  import {
12
12
  downloadFile
13
13
  } from "./chunk-WQ6ZXHFQ.js";
@@ -15,13 +15,16 @@ import {
15
15
  findFFmpeg,
16
16
  findFFprobe,
17
17
  getFFmpegInstallHint
18
- } from "./chunk-IARWN467.js";
18
+ } from "./chunk-VRAXIQ6I.js";
19
19
  import {
20
20
  DEFAULT_VP9_CPU_USED,
21
21
  SDR_RGB_TO_BT709_FILTER,
22
22
  SDR_RGB_TO_TAGGED_BT709_FILTER,
23
23
  renderProvenanceArgs
24
- } from "./chunk-OAPYPSEB.js";
24
+ } from "./chunk-QX4TB4NH.js";
25
+ import {
26
+ runCancellableProcess
27
+ } from "./chunk-RWGASWT7.js";
25
28
 
26
29
  // src/background-removal/pipeline.ts
27
30
  import { spawn } from "child_process";
@@ -135,11 +138,29 @@ async function createSession(options = {}) {
135
138
  const maskBuf = Buffer.allocUnsafe(INPUT_PLANE);
136
139
  let rgbaBuf = null;
137
140
  let rgbaBgBuf = null;
141
+ let retried = false;
142
+ const run = async (tensor) => {
143
+ try {
144
+ return await session.run({ [inputName]: tensor });
145
+ } catch (err) {
146
+ if (providerUsed === "CPU" || retried) throw err;
147
+ retried = true;
148
+ options.onProgress?.(
149
+ `${providerUsed} failed while running a frame (${err.message}); continuing on CPU.`
150
+ );
151
+ await session.release().catch(() => void 0);
152
+ session = await tryCreate(["cpu"]);
153
+ providerUsed = "CPU";
154
+ return await session.run({ [inputName]: tensor });
155
+ }
156
+ };
138
157
  return {
139
- provider: providerUsed,
158
+ get provider() {
159
+ return providerUsed;
160
+ },
140
161
  async process(rgb, width, height, withBackground = false) {
141
162
  const tensor = await preprocess(sharp, ort, rgb, width, height, inputData);
142
- const outputs = await session.run({ [inputName]: tensor });
163
+ const outputs = await run(tensor);
143
164
  const output = outputs[outputName];
144
165
  if (!output) throw new Error(`Model did not return output '${outputName}'`);
145
166
  const expectedBytes = width * height * 4;
@@ -260,16 +281,56 @@ function inferInputKind(inputPath) {
260
281
  `Unsupported input: ${ext}. Use a video (mp4/mov/webm/mkv/avi) or image (jpg/png/webp).`
261
282
  );
262
283
  }
284
+ async function decoderTransposesDimensions(inputPath) {
285
+ const ffprobePath = findFFprobe();
286
+ if (!ffprobePath) throw new Error(`ffprobe is required. Install: ${getFFmpegInstallHint()}`);
287
+ const { stdout } = await runCancellableProcess(
288
+ ffprobePath,
289
+ [
290
+ "-v",
291
+ "error",
292
+ "-select_streams",
293
+ "v:0",
294
+ "-show_streams",
295
+ "-print_format",
296
+ "json",
297
+ "--",
298
+ inputPath
299
+ ],
300
+ { timeoutMs: 3e4, maxBufferBytes: 256 * 1024 }
301
+ );
302
+ const probe = JSON.parse(stdout);
303
+ if (typeof probe !== "object" || probe === null || !("streams" in probe) || !Array.isArray(probe.streams))
304
+ return false;
305
+ const stream = probe.streams[0];
306
+ if (typeof stream !== "object" || stream === null) return false;
307
+ const sideData = "side_data_list" in stream && Array.isArray(stream.side_data_list) ? stream.side_data_list : [];
308
+ const matrix = sideData.find(
309
+ (entry) => typeof entry === "object" && entry !== null && "side_data_type" in entry && entry.side_data_type === "Display Matrix"
310
+ );
311
+ let rotation = typeof matrix === "object" && matrix !== null && "rotation" in matrix ? matrix.rotation : void 0;
312
+ if (rotation === void 0 && "tags" in stream && typeof stream.tags === "object" && stream.tags !== null && "rotate" in stream.tags)
313
+ rotation = Number(stream.tags.rotate);
314
+ if (typeof rotation !== "number" || !Number.isFinite(rotation)) return false;
315
+ const angle = (rotation % 360 + 360) % 360;
316
+ return Math.abs(angle - 90) < 1 || Math.abs(angle - 270) < 1;
317
+ }
263
318
  async function probeMedia(inputPath) {
264
319
  const isImage = inferInputKind(inputPath) === "image";
265
- const engine = await import("./src-XSDYRKLG.js");
320
+ const engine = await import("./src-SSV66L3F.js");
266
321
  const meta = await engine.extractMediaMetadata(inputPath);
267
322
  if (isImage) {
268
323
  return { width: meta.width, height: meta.height, fps: 0, frameCount: 1 };
269
324
  }
270
325
  const fps = meta.fps || 30;
271
326
  const frameCount = meta.durationSeconds ? Math.round(meta.durationSeconds * fps) : 0;
272
- return { width: meta.width, height: meta.height, fps, frameCount };
327
+ const transposed = await decoderTransposesDimensions(inputPath);
328
+ return {
329
+ width: transposed ? meta.height : meta.width,
330
+ height: transposed ? meta.width : meta.height,
331
+ fps,
332
+ frameCount
333
+ };
273
334
  }
274
335
  function buildEncoderArgs(format, width, height, fps, outputPath, quality = DEFAULT_QUALITY) {
275
336
  const base = [
@@ -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.190" : "0.0.0-dev";
10
- var PRODUCER_VERSION = true ? "0.8.190" : "0.0.0-dev";
9
+ var VERSION = true ? "0.8.192" : "0.0.0-dev";
10
+ var PRODUCER_VERSION = true ? "0.8.192" : "0.0.0-dev";
11
11
 
12
12
  export {
13
13
  VERSION,
@@ -9,14 +9,14 @@ import {
9
9
  } from "./chunk-K2FLNJVB.js";
10
10
  import {
11
11
  trackCommandFailure
12
- } from "./chunk-OOAVKK2W.js";
12
+ } from "./chunk-BV6YE455.js";
13
13
  import {
14
14
  failCommand
15
15
  } from "./chunk-JVBRJMOP.js";
16
16
 
17
17
  // src/utils/project.ts
18
18
  import { existsSync, statSync } from "fs";
19
- import { resolve, basename } from "path";
19
+ import { basename, dirname, join, relative, resolve, sep } from "path";
20
20
  var InvalidProjectError = class extends Error {
21
21
  title;
22
22
  hint;
@@ -65,8 +65,28 @@ function resolveProject(dirArg, options = {}) {
65
65
  throw err;
66
66
  }
67
67
  }
68
+ function projectHolding(file) {
69
+ for (let dir = dirname(file); ; dir = dirname(dir)) {
70
+ if (existsSync(join(dir, "index.html"))) return dir;
71
+ if (dirname(dir) === dir) return dirname(file);
72
+ }
73
+ }
74
+ function resolveLintTarget(arg) {
75
+ const file = arg === void 0 ? void 0 : resolve(arg);
76
+ if (file === void 0 || !statSync(file, { throwIfNoEntry: false })?.isFile()) {
77
+ return { project: resolveProject(arg) };
78
+ }
79
+ const dir = projectHolding(file);
80
+ const project = resolveProject(dir, { requireIndex: false });
81
+ return file === project.indexPath ? { project } : { project, entryFile: file };
82
+ }
83
+ function isUnderCompositions(projectDir, file) {
84
+ return relative(projectDir, file).split(sep)[0] === "compositions";
85
+ }
68
86
 
69
87
  export {
70
88
  resolveProjectOrThrow,
71
- resolveProject
89
+ resolveProject,
90
+ resolveLintTarget,
91
+ isUnderCompositions
72
92
  };