hyperframes 0.8.192 → 0.8.194

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 (189) hide show
  1. package/dist/{add-TZU2UW7A.js → add-47UAIWY4.js} +12 -12
  2. package/dist/{animatedGifPrep-NLAXC3VV.js → animatedGifPrep-TFSQZWK6.js} +8 -7
  3. package/dist/api.js +18 -17
  4. package/dist/{asset-JAJXA6LB.js → asset-AU7PZHXA.js} +2 -2
  5. package/dist/{assetCataloger-4WTX3J4I.js → assetCataloger-HC5N6WPT.js} +8 -7
  6. package/dist/{audio-XLWC7JKS.js → audio-7AWMZWBM.js} +14 -13
  7. package/dist/{auth-5K6X3NPJ.js → auth-GXH3QNDJ.js} +1 -1
  8. package/dist/{autoUpdate-RNV7SKGB.js → autoUpdate-GVGP5O2I.js} +3 -3
  9. package/dist/{backgroundChecks-QXLVZVGX.js → backgroundChecks-IUJM2Q35.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-THKSPDZR.js → batchRender-3XS2Y2Y4.js} +4 -4
  12. package/dist/{beats-K7CGCFVL.js → beats-U64B4S7Z.js} +9 -9
  13. package/dist/{benchmark-PHRDIXNL.js → benchmark-2YUPAI76.js} +9 -9
  14. package/dist/{browser-GN6R5ZSK.js → browser-DBFH7KXM.js} +5 -5
  15. package/dist/{bundleWithLocalizedFonts-C325UNR4.js → bundleWithLocalizedFonts-XWL7KSQJ.js} +2 -2
  16. package/dist/{capture-BZ7APOGQ.js → capture-E4VW75NM.js} +2 -2
  17. package/dist/{capture-6UBQFHZQ.js → capture-YWH7BPBI.js} +13 -12
  18. package/dist/{captureCompositionFrame-VORSCTWC.js → captureCompositionFrame-IG6S2OHG.js} +13 -12
  19. package/dist/{catalog-PHU2RUZ3.js → catalog-LZIZLZ34.js} +12 -12
  20. package/dist/{catch-up-HCNRM46J.js → catch-up-ZVNPIACY.js} +4 -4
  21. package/dist/{check-TJ5ZLB4I.js → check-EKEOD4UM.js} +38 -37
  22. package/dist/{checkBrowser-DWP7ZXJ7.js → checkBrowser-MYH6HPHH.js} +33 -32
  23. package/dist/{chunk-XF77MK3J.js → chunk-2AJU7PZ6.js} +1 -1
  24. package/dist/chunk-2D5WP2NI.js +3901 -0
  25. package/dist/{chunk-FBVUAH7N.js → chunk-2OYYNKJ4.js} +1 -1
  26. package/dist/{chunk-R2U2G4OS.js → chunk-37IHQVNQ.js} +1 -1
  27. package/dist/{chunk-IMSI7IFW.js → chunk-3OSBSUN3.js} +18 -18
  28. package/dist/{chunk-RHYOWDI6.js → chunk-3S3CXF4W.js} +2 -2
  29. package/dist/{chunk-YMQQXPD5.js → chunk-452UK7E7.js} +5 -12
  30. package/dist/{chunk-L2YGSAOL.js → chunk-4FVNEXSV.js} +3 -3
  31. package/dist/{chunk-7UZC4N62.js → chunk-4GMDL4N5.js} +1 -1
  32. package/dist/{chunk-YWRQHRDY.js → chunk-4PIPQPCW.js} +7 -7
  33. package/dist/{chunk-J2ASTCU6.js → chunk-4VSV56F2.js} +2 -2
  34. package/dist/{chunk-NXMYHJAL.js → chunk-4VYPICIA.js} +29 -1
  35. package/dist/{chunk-QX4TB4NH.js → chunk-52YJKWV3.js} +379 -127
  36. package/dist/{chunk-GANST5K3.js → chunk-54PZ2EQZ.js} +1 -1
  37. package/dist/{chunk-5IPKQHOL.js → chunk-B3GG3HJB.js} +1 -1
  38. package/dist/{chunk-2MCXIY4B.js → chunk-B7RJV74O.js} +28 -11
  39. package/dist/{chunk-VOM2HLUI.js → chunk-BK5YCT54.js} +3 -3
  40. package/dist/{chunk-RWGASWT7.js → chunk-BL4U6U52.js} +1 -0
  41. package/dist/{chunk-T6O5OLN2.js → chunk-BYADARIC.js} +2 -2
  42. package/dist/{chunk-VNPADTDD.js → chunk-CEUBYYVJ.js} +2 -2
  43. package/dist/{chunk-JCDYDF54.js → chunk-CEZH4AQT.js} +12 -2
  44. package/dist/{chunk-BY6OQ6XP.js → chunk-CZNSLFYD.js} +3 -1
  45. package/dist/{chunk-SBBQFPCJ.js → chunk-DT3JESJ6.js} +1 -1
  46. package/dist/{chunk-3CXIX6XS.js → chunk-DVQDBWQG.js} +4 -4
  47. package/dist/{chunk-K2AKVYNR.js → chunk-EB3XXHNO.js} +2 -2
  48. package/dist/{chunk-3FV5BVWS.js → chunk-EY7GKVPS.js} +2 -2
  49. package/dist/{chunk-W24SZ5FL.js → chunk-F2ASNL2K.js} +6 -9
  50. package/dist/{chunk-ODBYZIOH.js → chunk-F3B7CE3Q.js} +14 -14
  51. package/dist/{chunk-E3P3LJG6.js → chunk-FLREUEHW.js} +28 -11
  52. package/dist/{chunk-6XVKMBUA.js → chunk-FUA22HO4.js} +1 -1
  53. package/dist/{chunk-AEXVVABM.js → chunk-GAFEU6AB.js} +13 -10
  54. package/dist/{chunk-DIKAPMMF.js → chunk-GQVTTWZF.js} +144 -39
  55. package/dist/{chunk-7LLRMYP6.js → chunk-HCLBM2LQ.js} +2 -2
  56. package/dist/{chunk-AMZJFCOX.js → chunk-HG5ECUOR.js} +5 -5
  57. package/dist/{chunk-KZOZN4PI.js → chunk-HPGQPRHY.js} +3 -3
  58. package/dist/{chunk-BPKLUHFT.js → chunk-HQD7ODQB.js} +5 -5
  59. package/dist/{chunk-SK7TR7BL.js → chunk-JU4T4VAA.js} +4 -4
  60. package/dist/{chunk-MGBUWPXX.js → chunk-JVTWX5G3.js} +33 -8
  61. package/dist/{chunk-2J3NA3OB.js → chunk-JXTPNUSO.js} +83 -51
  62. package/dist/{chunk-2VXY3PEF.js → chunk-K2VXPQKC.js} +107 -94
  63. package/dist/chunk-K4MJX7SR.js +17 -0
  64. package/dist/{chunk-XX2PA4L3.js → chunk-KDEV5RIE.js} +7 -3
  65. package/dist/{chunk-MVIJTXN5.js → chunk-LMIDZIW2.js} +12 -12
  66. package/dist/{chunk-6WNLQI63.js → chunk-LOGKDQ3G.js} +3 -3
  67. package/dist/{chunk-IW5G323T.js → chunk-LTGTN2TH.js} +8 -9
  68. package/dist/{chunk-MEE4NTPZ.js → chunk-LZ4WPR3B.js} +2 -2
  69. package/dist/{chunk-32NB4VMH.js → chunk-M2VXARYK.js} +3 -2
  70. package/dist/{chunk-7RSY7SZN.js → chunk-MCFPMUMT.js} +2 -2
  71. package/dist/{chunk-BEOK6F26.js → chunk-MGSNFWGR.js} +2 -2
  72. package/dist/{chunk-ZEMDV6W2.js → chunk-MO6RTNYD.js} +1 -1
  73. package/dist/{chunk-7JJMT6LN.js → chunk-N33FO44R.js} +1 -1
  74. package/dist/{chunk-A4OI5ZNX.js → chunk-N3M3IU6S.js} +1 -1
  75. package/dist/{chunk-CXRZBWSH.js → chunk-NVVIFW3C.js} +10 -10
  76. package/dist/{chunk-E5V6WEMK.js → chunk-O2ILONGK.js} +10 -10
  77. package/dist/{chunk-4HCJOFMB.js → chunk-OJNNKHAZ.js} +94 -22
  78. package/dist/{chunk-QWLES6YV.js → chunk-PEHST4UY.js} +3 -3
  79. package/dist/{chunk-BV6YE455.js → chunk-POFJH2IS.js} +1 -1
  80. package/dist/{chunk-AR46ND2Q.js → chunk-PXK3ICU6.js} +1 -1
  81. package/dist/{chunk-LOKCBZYF.js → chunk-Q4HKC3O7.js} +3 -3
  82. package/dist/{chunk-J2BSUF6X.js → chunk-QJQTWTM7.js} +8 -3
  83. package/dist/{chunk-QFPBRZJD.js → chunk-ROEW726S.js} +1 -1
  84. package/dist/{chunk-OQL4AJ4X.js → chunk-RUPGFW5B.js} +6 -6
  85. package/dist/{chunk-5TRFLZ5Z.js → chunk-RZWJJCI7.js} +2 -2
  86. package/dist/{chunk-2HP5GIQ3.js → chunk-SNECH6QA.js} +1 -1
  87. package/dist/{chunk-REUL2KH2.js → chunk-ST35C4K6.js} +1 -1
  88. package/dist/{chunk-4E75LHAL.js → chunk-ST4SHO3S.js} +1 -1
  89. package/dist/{chunk-ULTKB5FC.js → chunk-TDYKVJTU.js} +548 -429
  90. package/dist/{chunk-WOKVXK4J.js → chunk-VHIBBDEI.js} +1 -1
  91. package/dist/{chunk-EKGGSAWR.js → chunk-VPON6DF2.js} +5 -5
  92. package/dist/{chunk-VRAXIQ6I.js → chunk-XYGULBFV.js} +2 -2
  93. package/dist/{chunk-PFRG5P32.js → chunk-Y3BT27Y7.js} +1 -1
  94. package/dist/{clean-2RNCTDBT.js → clean-NS2SDRK7.js} +21 -20
  95. package/dist/cli.js +54 -54
  96. package/dist/{cloud-NFIKESNZ.js → cloud-K4XQPWTY.js} +4 -4
  97. package/dist/{cloudrun-7224BCX3.js → cloudrun-BKOKXTXV.js} +6 -6
  98. package/dist/{compare-HL44MXVX.js → compare-ZAV773OL.js} +31 -30
  99. package/dist/{compiler-WF5QTXV7.js → compiler-CWHFCE3H.js} +5 -5
  100. package/dist/{component-ZBZXSJBR.js → component-OXA2ZWX3.js} +3 -3
  101. package/dist/{compositions-76P7LDDX.js → compositions-NKRVWCPE.js} +12 -11
  102. package/dist/{contactSheet-43ISAESM.js → contactSheet-5APX35L3.js} +1 -1
  103. package/dist/{delete-4YZBYOHJ.js → delete-HZ2LBCLC.js} +2 -2
  104. package/dist/{deploy-UGUUGYLF.js → deploy-FNDTZFF7.js} +1 -1
  105. package/dist/{deterministicFonts-RO2TCMLZ.js → deterministicFonts-RADD3BSX.js} +2 -2
  106. package/dist/{dist-5KKCRFPT.js → dist-2YTN2UGY.js} +3 -3
  107. package/dist/{dist-QQ26RUDV.js → dist-7OCZHNLY.js} +1 -1
  108. package/dist/{doctor-GGVUK4NB.js → doctor-6QWJGO5P.js} +14 -13
  109. package/dist/{events-V2VU4J3B.js → events-HTHOBIUN.js} +3 -3
  110. package/dist/{events-OXPTHVDB.js → events-MBKHVGXX.js} +2 -2
  111. package/dist/{feedback-HFZ5SCUK.js → feedback-X5QWTLEX.js} +8 -8
  112. package/dist/{ffmpeg-3VHY7GO3.js → ffmpeg-7GESJCCT.js} +9 -8
  113. package/dist/{figma-7SEZTLBJ.js → figma-SXOHFVJI.js} +3 -3
  114. package/dist/fontLocalizeCli.js +11 -10
  115. package/dist/{get-Y2S2PXCM.js → get-T2HI5FCK.js} +2 -2
  116. package/dist/{gpuPolicy-UHPOWRV5.js → gpuPolicy-5FABKW5G.js} +8 -7
  117. package/dist/{grade-compare-4VTXSQM5.js → grade-compare-JATGHA6Q.js} +37 -35
  118. package/dist/{gsapParser-UP3PNPC2.js → gsapParser-IEUSLYDJ.js} +11 -11
  119. package/dist/{gsapParserAcorn-OOTY2MVN.js → gsapParserAcorn-LZJKCFQI.js} +1 -1
  120. package/dist/{help-HXNOACHI.js → help-G6CIKCGS.js} +1 -1
  121. package/dist/{history-XDJUI4LC.js → history-CSJUHYTD.js} +9 -8
  122. package/dist/hyperframe.manifest.json +1 -1
  123. package/dist/hyperframe.runtime.iife.js +71 -65
  124. package/dist/hyperframes-player.global.js +3 -3
  125. package/dist/hyperframes-slideshow.global.js +1 -1
  126. package/dist/{info-KYRI3EZV.js → info-MTTUMW2C.js} +8 -8
  127. package/dist/{init-IL7EWMT5.js → init-LJYNI5EK.js} +30 -29
  128. package/dist/{inspect-TBNH23UC.js → inspect-HGDM2VJE.js} +31 -30
  129. package/dist/{installer-O2YMFSI4.js → installer-3XHURUDG.js} +5 -5
  130. package/dist/{keyframes-4GF62KAJ.js → keyframes-MSU7N53X.js} +59 -33
  131. package/dist/{lambda-JFL6M4XZ.js → lambda-2I2TIUSD.js} +8 -8
  132. package/dist/{layout-7MAEFR65.js → layout-KWOXZMN7.js} +31 -30
  133. package/dist/{lint-4AYHKYAM.js → lint-N53TLHFG.js} +7 -7
  134. package/dist/{lintProject-52SLJPRC.js → lintProject-EOUZA4EG.js} +1 -1
  135. package/dist/{list-3DP3D3MW.js → list-SHYPQC7U.js} +2 -2
  136. package/dist/{login-T54WQYRQ.js → login-TEB6PA3Y.js} +4 -4
  137. package/dist/{manager-MZIJY73J.js → manager-COSJVRAE.js} +2 -2
  138. package/dist/{manager-QROK2IH3.js → manager-PLRSZH5G.js} +10 -9
  139. package/dist/{media-treatment-4CXF7MSG.js → media-treatment-XTUKMIGE.js} +15 -14
  140. package/dist/{models-IS3I6JKU.js → models-4WKAPP2L.js} +14 -13
  141. package/dist/{motionShot-DVYJZOTQ.js → motionShot-PTKB4ILH.js} +17 -16
  142. package/dist/{normalize-audio-4527JIK4.js → normalize-audio-3NG326I2.js} +6 -6
  143. package/dist/{open-5JE46SAX.js → open-6S2LMF7R.js} +12 -12
  144. package/dist/{parakeetRunner-7JIJGJJ7.js → parakeetRunner-OEI35DVO.js} +15 -14
  145. package/dist/{pipeline-YEN3WFD2.js → pipeline-543FUKH4.js} +10 -9
  146. package/dist/{play-WFX67I7M.js → play-ETEGHP3B.js} +21 -21
  147. package/dist/{preflight-D377HVUZ.js → preflight-Y5IYUF2T.js} +11 -10
  148. package/dist/{present-XTSEKAC7.js → present-ZRSLMJ6J.js} +17 -17
  149. package/dist/{preview-5XH7EK6O.js → preview-CEJ3SVTY.js} +100 -65
  150. package/dist/{producer-TFFYF4ZM.js → producer-JFVFIV26.js} +1 -1
  151. package/dist/{projectConfig-6YUJHMCL.js → projectConfig-7EK3BS72.js} +7 -7
  152. package/dist/{publication-JK33Y55E.js → publication-Y54GYFMV.js} +3 -3
  153. package/dist/{publish-JHDGXWXU.js → publish-S3UJTPCV.js} +10 -10
  154. package/dist/{remove-background-P44MYAPJ.js → remove-background-YTATNQSI.js} +11 -10
  155. package/dist/{render-RBINWWP5.js → render-IIPXMSBO.js} +35 -34
  156. package/dist/{render-RJ3I4E3A.js → render-RN3W6YL4.js} +17 -16
  157. package/dist/{render-HJ34EGMN.js → render-WNIG4B3J.js} +6 -6
  158. package/dist/{render-batch-3D6XQYUC.js → render-batch-OYS3UQDB.js} +6 -6
  159. package/dist/renderSetupWorker.js +42 -4
  160. package/dist/{resolver-HCLTFZUW.js → resolver-OVCXVEDX.js} +5 -5
  161. package/dist/{sherpa-IPOUJM6Q.js → sherpa-NCSFD7S3.js} +14 -13
  162. package/dist/skills/hyperframes/references/format.md +1 -0
  163. package/dist/skills/media-use/scripts/lib/duck.mjs +18 -2
  164. package/dist/skills/media-use/scripts/lib/duck.test.mjs +79 -0
  165. package/dist/{skills-P67QEERC.js → skills-IUV3K3X7.js} +5 -5
  166. package/dist/{skillsUpdateCheck-IFMLRVIF.js → skillsUpdateCheck-NACBXMWW.js} +3 -3
  167. package/dist/{snapshot-4YM4NNWJ.js → snapshot-7S5USJ2I.js} +52 -46
  168. package/dist/{src-DCD3YMXX.js → src-CAR6PHI4.js} +10 -9
  169. package/dist/{src-SSV66L3F.js → src-HITT6NWG.js} +19 -6
  170. package/dist/{staticProjectServer-C7PPGLEQ.js → staticProjectServer-QR6VZBPT.js} +18 -18
  171. package/dist/studio/assets/{hyperframes-player-ChN3cOr0.js → hyperframes-player-DLOUZUct.js} +1 -1
  172. package/dist/studio/assets/{index-CHu83hHM.js → index-CAQ7OcNJ.js} +163 -163
  173. package/dist/studio/assets/{index-BYbFcRR0.js → index-D9kA6JUX.js} +1 -1
  174. package/dist/studio/index.html +1 -1
  175. package/dist/{studio-api-6YZ7PIQR.js → studio-api-HVNOJILH.js} +13 -11
  176. package/dist/{studioServer-EWHSE4GC.js → studioServer-3BG5FRJL.js} +53 -52
  177. package/dist/{telemetry-GGLBHZRZ.js → telemetry-PET2GFQG.js} +3 -3
  178. package/dist/{timeline-NKHQJXJ2.js → timeline-PVIC2Z5K.js} +20 -19
  179. package/dist/{tokens-FWNNDJ6R.js → tokens-4N46PWSF.js} +2 -2
  180. package/dist/{transcribe-TRPKXZ7L.js → transcribe-2DVBS7MH.js} +19 -18
  181. package/dist/{transcribe-VD2TMMC2.js → transcribe-IDC7JTM4.js} +13 -12
  182. package/dist/{updateCheck-CUPS6LU3.js → updateCheck-QRDVXU7I.js} +2 -2
  183. package/dist/{upgrade-23XO6MEX.js → upgrade-5CNE3TBH.js} +2 -2
  184. package/dist/{urlDownloader-YOAOONCK.js → urlDownloader-P2I25DFC.js} +7 -6
  185. package/dist/{validate-BWIW24G5.js → validate-CLR5PEOV.js} +25 -24
  186. package/dist/{video-XRXJS4GC.js → video-3CKZZBOB.js} +8 -7
  187. package/dist/warmCheck.js +38 -37
  188. package/package.json +1 -1
  189. package/dist/chunk-B2XLXD7V.js +0 -3897
@@ -19,7 +19,7 @@ import {
19
19
  splitElementInHtml,
20
20
  unwrapElementsFromHtml,
21
21
  wrapElementsInHtml
22
- } from "./chunk-SK7TR7BL.js";
22
+ } from "./chunk-JU4T4VAA.js";
23
23
  import {
24
24
  MEDIA_LINK_ATTR,
25
25
  relinkSplitHalves
@@ -32,7 +32,7 @@ import {
32
32
  requestedProjectPath,
33
33
  requiredFfmpeg,
34
34
  resolveLocalAudioPath
35
- } from "./chunk-FBVUAH7N.js";
35
+ } from "./chunk-2OYYNKJ4.js";
36
36
  import {
37
37
  HistoryBusyError,
38
38
  MAX_WINDOW_IDLE_MS,
@@ -46,7 +46,7 @@ import {
46
46
  resolveProjectAndSignature,
47
47
  resolveProjectSignature,
48
48
  settledFileTag
49
- } from "./chunk-4HCJOFMB.js";
49
+ } from "./chunk-OJNNKHAZ.js";
50
50
  import {
51
51
  PROXY_PARAMS_VERSION,
52
52
  PROXY_PENDING_RETRY_AFTER_SECONDS,
@@ -68,7 +68,7 @@ import {
68
68
  scanProjectMediaCodecMap,
69
69
  shouldPrewarmProxy,
70
70
  waitForProxy
71
- } from "./chunk-7RSY7SZN.js";
71
+ } from "./chunk-MCFPMUMT.js";
72
72
  import {
73
73
  STUDIO_MOTION_PATH,
74
74
  createStudioMotionRenderBodyScript,
@@ -83,7 +83,7 @@ import {
83
83
  import {
84
84
  findTimelineScript,
85
85
  parseGsapScriptAcorn
86
- } from "./chunk-E3P3LJG6.js";
86
+ } from "./chunk-FLREUEHW.js";
87
87
  import {
88
88
  atomicTempPath,
89
89
  createFileAtomically,
@@ -102,19 +102,21 @@ import {
102
102
  locateSystemFont
103
103
  } from "./chunk-7FMUTGOH.js";
104
104
  import {
105
+ GSAP_BASE_URL_META,
105
106
  PREVIEW_PROXY_BOX_PARAM,
106
107
  formatPreviewProxyBox,
107
108
  formatRenderOutputTimestamp,
108
109
  gsapCdnDist,
109
110
  motionPathPluginUrl,
111
+ normalizeGsapBaseUrl,
110
112
  parseFps,
111
113
  parsePreviewProxyBox
112
- } from "./chunk-MGBUWPXX.js";
114
+ } from "./chunk-JVTWX5G3.js";
113
115
  import {
114
116
  addScenePartsManifest,
115
117
  ensureHfIds,
116
118
  stampHfIdsInPlace
117
- } from "./chunk-AEXVVABM.js";
119
+ } from "./chunk-GAFEU6AB.js";
118
120
  import {
119
121
  AFTER_FONTS_SCRIPT_TYPE,
120
122
  RUNTIME_BOOTSTRAP_ATTR,
@@ -128,7 +130,7 @@ import {
128
130
  resolveRateSpec,
129
131
  sourceTimeAt,
130
132
  stripEmbeddedRuntimeScripts
131
- } from "./chunk-B2XLXD7V.js";
133
+ } from "./chunk-2D5WP2NI.js";
132
134
  import {
133
135
  HTML_ATTRIBUTE_ENTITIES,
134
136
  MagicString,
@@ -136,7 +138,7 @@ import {
136
138
  decodeAuthoredAttribute,
137
139
  scanHtmlOpeningTags,
138
140
  unrollComputedTimeline
139
- } from "./chunk-2MCXIY4B.js";
141
+ } from "./chunk-B7RJV74O.js";
140
142
  import {
141
143
  ProjectRootMissingError,
142
144
  folderGone,
@@ -559,6 +561,16 @@ function mergePercentageKeyframes(keyframes) {
559
561
  }
560
562
  return [...byPercentage.values()].sort((a, b) => a.percentage - b.percentage);
561
563
  }
564
+ function distributeArrayKeyframes(channels) {
565
+ return mergePercentageKeyframes(
566
+ [...channels].flatMap(
567
+ ([key, values]) => values.map((value, index) => ({
568
+ percentage: values.length > 1 ? Math.round(index / (values.length - 1) * 100) : 0,
569
+ properties: { [key]: value }
570
+ }))
571
+ )
572
+ );
573
+ }
562
574
  function buildArcPath(coords, curviness, autoRotate, isCubic) {
563
575
  const first = coords[0];
564
576
  if (coords.length < 2 || !first) return void 0;
@@ -1419,19 +1431,9 @@ function parseSimpleArrayKeyframes(node, scope) {
1419
1431
  easeEach = tryResolveStringProp(prop.value, scope) ?? easeEach;
1420
1432
  }
1421
1433
  }
1422
- const maxLen = Math.max(...[...arrayProps.values()].map((a) => a.length), 0);
1423
- const keyframes = [];
1424
- for (let i = 0; i < maxLen; i++) {
1425
- const percentage = maxLen > 1 ? Math.round(i / (maxLen - 1) * 100) : 0;
1426
- const properties = {};
1427
- for (const [key, values] of arrayProps) {
1428
- if (i < values.length) properties[key] = values[i];
1429
- }
1430
- keyframes.push({ percentage, properties });
1431
- }
1432
1434
  return {
1433
1435
  format: "simple-array",
1434
- keyframes,
1436
+ keyframes: distributeArrayKeyframes(arrayProps),
1435
1437
  ...ease ? { ease } : {},
1436
1438
  ...easeEach ? { easeEach } : {}
1437
1439
  };
@@ -3875,7 +3877,7 @@ function tagRootCompositionFile(bodyHtml, compPath) {
3875
3877
  function rootHeadContent(rootHtml) {
3876
3878
  return rootHtml.match(/<head[^>]*>([\s\S]*?)<\/head>/i)?.[1] ?? "";
3877
3879
  }
3878
- function buildSubCompositionHtml(projectDir, compPath, runtimeUrl, baseHref, rawOverride) {
3880
+ function buildSubCompositionHtml(projectDir, compPath, runtimeUrl, baseHref, rawOverride, gsapBaseUrl) {
3879
3881
  const compFile = join22(projectDir, compPath);
3880
3882
  if (!existsSync(compFile)) return null;
3881
3883
  const rawComp = rawOverride ?? readFileSync3(compFile, "utf-8");
@@ -3927,7 +3929,7 @@ ${compHeadContent}`;
3927
3929
  <script ${RUNTIME_BOOTSTRAP_ATTR}="1" src="${runtimeUrl}"></script>`;
3928
3930
  if (!headContent.includes("gsap")) {
3929
3931
  headContent += `
3930
- <script src="${gsapCdnDist()}gsap.min.js"></script>`;
3932
+ <script src="${gsapCdnDist(void 0, gsapBaseUrl).replace(/&/g, "&amp;")}gsap.min.js"></script>`;
3931
3933
  }
3932
3934
  const htmlOpen = htmlAttrs ? `<html ${htmlAttrs}>` : "<html>";
3933
3935
  const bodyOpen = bodyAttrs ? `<body ${bodyAttrs}>` : "<body>";
@@ -4641,7 +4643,7 @@ function resolveGsapWriter(env) {
4641
4643
  throw new Error(`Invalid ${GSAP_WRITER_MIGRATION.flag}=${configured}; expected recast or acorn`);
4642
4644
  }
4643
4645
  async function loadGsapParser() {
4644
- return import("./gsapParser-UP3PNPC2.js");
4646
+ return import("./gsapParser-IEUSLYDJ.js");
4645
4647
  }
4646
4648
  function isDanglingSymlinkInProject(projectDir, lexicalPath) {
4647
4649
  if (!isSafePath(projectDir, dirname3(lexicalPath))) return false;
@@ -5500,7 +5502,7 @@ async function prepareGsapMutationScript(c, res, firstMutation) {
5500
5502
  let block = extractGsapScriptBlock(html);
5501
5503
  if (!block && (firstMutation.type === "add" || firstMutation.type === "add-with-keyframes")) {
5502
5504
  const compId = html.match(/data-composition-id="([^"]+)"/)?.[1] ?? "main";
5503
- const { GSAP_CDN } = await import("./dist-5KKCRFPT.js");
5505
+ const { GSAP_CDN } = await import("./dist-2YTN2UGY.js");
5504
5506
  const bootstrap = [
5505
5507
  `<script src="${GSAP_CDN}"></script>`,
5506
5508
  "<script>",
@@ -7375,9 +7377,12 @@ function lazyPreviewImages(html) {
7375
7377
  return parts.join("");
7376
7378
  }
7377
7379
  var PROJECT_SIGNATURE_META = "hyperframes-project-signature";
7378
- var GSAP_CDN_SCRIPT = `<script src="${gsapCdnDist()}gsap.min.js"></script>`;
7379
- var GSAP_CUSTOM_EASE_CDN_SCRIPT = `<script src="${gsapCdnDist()}CustomEase.min.js"></script>`;
7380
- var GSAP_MOTION_PATH_CDN_SCRIPT = `<script src="${motionPathPluginUrl()}"></script>`;
7380
+ function escapeGsapUrl(url) {
7381
+ return url.replace(/&/g, "&amp;").replace(/"/g, "&quot;");
7382
+ }
7383
+ function gsapScriptTag(file, baseUrl) {
7384
+ return `<script src="${escapeGsapUrl(gsapCdnDist(void 0, baseUrl) + file)}"></script>`;
7385
+ }
7381
7386
  function injectProjectSignature(html, signature) {
7382
7387
  const tag = `<meta name="${PROJECT_SIGNATURE_META}" content="${signature}">`;
7383
7388
  if (html.includes(`name="${PROJECT_SIGNATURE_META}"`)) {
@@ -7433,16 +7438,16 @@ function htmlUsesMotionPath(html) {
7433
7438
  function htmlHasMotionPathPlugin(html) {
7434
7439
  return /<script\b[^>]*src=["'][^"']*MotionPathPlugin/i.test(html) || /\bwindow\.MotionPathPlugin\b/.test(html) || /\bMotionPathPlugin\s*=\s*/.test(html);
7435
7440
  }
7436
- function injectMotionPathPluginIfNeeded(html) {
7441
+ function injectMotionPathPluginIfNeeded(html, baseUrl) {
7437
7442
  if (!htmlUsesMotionPath(html) || htmlHasMotionPathPlugin(html)) return html;
7438
7443
  const gsap = findGsapCoreScript(html);
7439
7444
  if (gsap) {
7440
7445
  const version = gsap.src.match(/gsap@([\d.]+)/)?.[1];
7441
7446
  const ordering = `${gsap.type ? ` type="${gsap.type}"` : ""}${gsap.defer ? " defer" : ""}`;
7442
- const pluginTag = `<script${ordering} src="${motionPathPluginUrl(version)}"></script>`;
7447
+ const pluginTag = `<script${ordering} src="${escapeGsapUrl(motionPathPluginUrl(version, baseUrl))}"></script>`;
7443
7448
  return html.slice(0, gsap.end) + "\n" + pluginTag + html.slice(gsap.end);
7444
7449
  }
7445
- return injectScriptTagIntoHead(html, GSAP_MOTION_PATH_CDN_SCRIPT);
7450
+ return injectScriptTagIntoHead(html, gsapScriptTag("MotionPathPlugin.min.js", baseUrl));
7446
7451
  }
7447
7452
  function isGsapCoreUrl(src) {
7448
7453
  const base = "http://localhost/";
@@ -7475,30 +7480,32 @@ function scriptCloseEnd(html, start) {
7475
7480
  const closeAt = close.exec(html)?.index;
7476
7481
  return closeAt === void 0 ? 0 : html.indexOf(">", closeAt) + 1;
7477
7482
  }
7478
- function injectStudioMotionDependencies(html, manifestContent) {
7483
+ function injectStudioMotionDependencies(html, manifestContent, baseUrl) {
7479
7484
  const manifest = parseStudioMotionManifestContent(manifestContent);
7480
7485
  if (!manifest.hasMotion) return html;
7481
7486
  let next = html;
7482
- if (!htmlHasGsap(next)) next = injectScriptTagIntoHead(next, GSAP_CDN_SCRIPT);
7487
+ if (!htmlHasGsap(next))
7488
+ next = injectScriptTagIntoHead(next, gsapScriptTag("gsap.min.js", baseUrl));
7483
7489
  if (manifest.hasCustomEase && !htmlHasCustomEase(next)) {
7484
- next = injectScriptTagIntoHead(next, GSAP_CUSTOM_EASE_CDN_SCRIPT);
7490
+ next = injectScriptTagIntoHead(next, gsapScriptTag("CustomEase.min.js", baseUrl));
7485
7491
  }
7486
7492
  return next;
7487
7493
  }
7488
- function injectStudioMotionScript(html, projectDir, activeCompositionPath) {
7494
+ function injectStudioMotionScript(html, projectDir, activeCompositionPath, baseUrl) {
7489
7495
  const manifestContent = readStudioMotionManifestContent(projectDir);
7490
7496
  const script = createStudioMotionRenderBodyScript(manifestContent, {
7491
7497
  activeCompositionPath
7492
7498
  });
7493
7499
  if (!script) return html;
7494
- const withDependencies = injectStudioMotionDependencies(html, manifestContent);
7500
+ const withDependencies = injectStudioMotionDependencies(html, manifestContent, baseUrl);
7495
7501
  const tag = `<script type="${AFTER_FONTS_SCRIPT_TYPE}">${script.replace(/<\/script/gi, "<\\/script")}</script>`;
7496
7502
  return insertBeforeCloseTag(withDependencies, "body", tag) ?? `${withDependencies}${tag}`;
7497
7503
  }
7498
7504
  var GSAP_FALLBACK_ATTR = "data-hf-gsap-fallback";
7499
- var GSAP_CDN_FALLBACK_SCRIPT = `<script ${GSAP_FALLBACK_ATTR}>
7505
+ function gsapCdnFallbackScript(baseUrl) {
7506
+ return `<script ${GSAP_FALLBACK_ATTR}>
7500
7507
  (function(){
7501
- var cdnBase="${gsapCdnDist()}";
7508
+ var cdnBase=${JSON.stringify(gsapCdnDist(void 0, baseUrl)).replace(/</g, "\\u003c")};
7502
7509
  var loaded={};
7503
7510
  function loadFallback(file){
7504
7511
  if(loaded[file])return loaded[file];
@@ -7518,10 +7525,12 @@ var GSAP_CDN_FALLBACK_SCRIPT = `<script ${GSAP_FALLBACK_ATTR}>
7518
7525
  },true);
7519
7526
  })();
7520
7527
  </script>`;
7521
- function injectGsapCdnFallback(html) {
7528
+ }
7529
+ function injectGsapCdnFallback(html, baseUrl) {
7522
7530
  if (html.includes(GSAP_FALLBACK_ATTR)) return html;
7523
- if (html.includes("<head>")) return html.replace("<head>", "<head>" + GSAP_CDN_FALLBACK_SCRIPT);
7524
- return GSAP_CDN_FALLBACK_SCRIPT + html;
7531
+ if (html.includes("<head>"))
7532
+ return html.replace("<head>", "<head>" + gsapCdnFallbackScript(baseUrl));
7533
+ return gsapCdnFallbackScript(baseUrl) + html;
7525
7534
  }
7526
7535
  function parsePreviewVariablesParam(raw) {
7527
7536
  if (raw === void 0 || raw === "") return { ok: true, values: null };
@@ -7548,8 +7557,8 @@ function previewVariablesFromRequest(rawVariables) {
7548
7557
  var PREVIEW_CAPTURE_PARAM = "hf-capture";
7549
7558
  var EARLY_ERRORS_SCRIPT = `<script>(function(){var seen=window.${STUDIO_PREVIEW_ERRORS}=[];
7550
7559
  addEventListener("error",function(e){seen.push(e.message||String(e))});})();</script>`;
7551
- function injectStudioPreviewAugmentations(html, adapter, projectDir, activeCompositionPath, capture) {
7552
- const marked = capture ? injectTagsAtHeadStart(
7560
+ function injectStudioPreviewAugmentations(html, adapter, projectDir, activeCompositionPath, options) {
7561
+ const marked = options.capture ? injectTagsAtHeadStart(
7553
7562
  html,
7554
7563
  `<meta name="${STUDIO_PREVIEW_MARK_META}" content="${STUDIO_PREVIEW_CAPTURE_MODE}">`
7555
7564
  ) : injectTagsAtHeadStart(
@@ -7559,11 +7568,20 @@ function injectStudioPreviewAugmentations(html, adapter, projectDir, activeCompo
7559
7568
  return injectStudioMotionScript(
7560
7569
  injectMotionPathPluginIfNeeded(
7561
7570
  injectGsapCdnFallback(
7562
- injectProjectSignature(marked, resolveProjectSignature(adapter, projectDir))
7563
- )
7571
+ injectProjectSignature(
7572
+ injectTagsAtHeadStart(
7573
+ marked,
7574
+ `<meta name="${GSAP_BASE_URL_META}" content="${escapeGsapUrl(options.gsapBaseUrl)}">`
7575
+ ),
7576
+ resolveProjectSignature(adapter, projectDir)
7577
+ ),
7578
+ options.gsapBaseUrl
7579
+ ),
7580
+ options.gsapBaseUrl
7564
7581
  ),
7565
7582
  projectDir,
7566
- activeCompositionPath
7583
+ activeCompositionPath,
7584
+ options.gsapBaseUrl
7567
7585
  );
7568
7586
  }
7569
7587
  async function transformPreviewHtml(html, adapter, project, activeCompositionPath) {
@@ -7607,6 +7625,16 @@ var PREVIEW_BUNDLE_OPTIONS = {
7607
7625
  var previewBaseHref = (projectId) => `/api/projects/${encodeURIComponent(projectId)}/preview/`;
7608
7626
  var withPreviewBase = (html, projectId) => hasBaseElement(html) ? html : injectTagsAtHeadStart(html, `<base href="${previewBaseHref(projectId)}">`);
7609
7627
  function registerPreviewRoutes(api, adapter) {
7628
+ let gsapBaseUrl;
7629
+ try {
7630
+ gsapBaseUrl = normalizeGsapBaseUrl(process.env.HYPERFRAMES_GSAP_BASE_URL);
7631
+ } catch (cause) {
7632
+ throw new Error(
7633
+ "Invalid HYPERFRAMES_GSAP_BASE_URL: use an absolute HTTP(S) npm mirror root without credentials, query, or fragment",
7634
+ { cause }
7635
+ );
7636
+ }
7637
+ const gsapEtagSalt = `:gsap:${createHash22("sha1").update(gsapBaseUrl).digest("hex").slice(0, 12)}`;
7610
7638
  const previewCacheHeaders = (etag) => ({
7611
7639
  "Cache-Control": "private, no-cache",
7612
7640
  ETag: etag
@@ -7641,7 +7669,7 @@ function registerPreviewRoutes(api, adapter) {
7641
7669
  adapter,
7642
7670
  project.dir,
7643
7671
  mainCompositionPath,
7644
- capture
7672
+ { capture, gsapBaseUrl }
7645
7673
  );
7646
7674
  if (previewVariables) bundled = injectPreviewVariables(bundled, previewVariables);
7647
7675
  bundled = await injectMediaCodecMap(
@@ -7669,7 +7697,7 @@ function registerPreviewRoutes(api, adapter) {
7669
7697
  adapter,
7670
7698
  project.dir,
7671
7699
  fallback.compositionPath,
7672
- capture
7700
+ { capture, gsapBaseUrl }
7673
7701
  );
7674
7702
  if (previewVariables) {
7675
7703
  fallbackAugmented = injectPreviewVariables(fallbackAugmented, previewVariables);
@@ -7694,7 +7722,7 @@ function registerPreviewRoutes(api, adapter) {
7694
7722
  if (vars.error !== void 0) return c.json({ error: vars.error }, 400);
7695
7723
  const previewVariables = vars.values;
7696
7724
  const capture = c.req.query(PREVIEW_CAPTURE_PARAM) !== void 0;
7697
- const etag = `"preview:${signature}${variablesEtagSalt(vars.raw)}${capture ? ":capture" : ""}"`;
7725
+ const etag = `"preview:${signature}${gsapEtagSalt}${variablesEtagSalt(vars.raw)}${capture ? ":capture" : ""}"`;
7698
7726
  const ifNoneMatch = c.req.header("If-None-Match");
7699
7727
  if (ifNoneMatch === etag) {
7700
7728
  return new Response(null, {
@@ -7744,7 +7772,7 @@ ${etag}`;
7744
7772
  }
7745
7773
  const compPathHash = createHash22("sha1").update(compPath).digest("hex");
7746
7774
  const capture = c.req.query(PREVIEW_CAPTURE_PARAM) !== void 0;
7747
- const etag = `"comp:v2:${compPathHash}:${signature}${variablesEtagSalt(vars.raw)}${capture ? ":capture" : ""}"`;
7775
+ const etag = `"comp:v2:${compPathHash}:${signature}${gsapEtagSalt}${variablesEtagSalt(vars.raw)}${capture ? ":capture" : ""}"`;
7748
7776
  const ifNoneMatch = c.req.header("If-None-Match");
7749
7777
  if (ifNoneMatch === etag) {
7750
7778
  return new Response(null, {
@@ -7760,12 +7788,16 @@ ${etag}`;
7760
7788
  compPath,
7761
7789
  adapter.runtimeUrl,
7762
7790
  baseHref,
7763
- stamped
7791
+ stamped,
7792
+ gsapBaseUrl
7764
7793
  );
7765
7794
  if (!html) return c.text("not found", 404);
7766
7795
  recordPreviewReferences(project.dir, html);
7767
7796
  html = ensureHfIds(await transformPreviewHtml(html, adapter, project, compPath));
7768
- html = injectStudioPreviewAugmentations(html, adapter, project.dir, compPath, capture);
7797
+ html = injectStudioPreviewAugmentations(html, adapter, project.dir, compPath, {
7798
+ capture,
7799
+ gsapBaseUrl
7800
+ });
7769
7801
  if (previewVariables) html = injectPreviewVariables(html, previewVariables);
7770
7802
  html = await injectMediaCodecMap(html, adapter, project.dir, compPath, mediaCodecProbeCache);
7771
7803
  return c.html(html, 200, previewCacheHeaders(etag));
@@ -3714,7 +3714,8 @@ var require_dist = __commonJS({
3714
3714
  import { parse } from "acorn";
3715
3715
  var import_postcss_selector_parser = __toESM(require_dist(), 1);
3716
3716
  import postcss from "postcss";
3717
- import { parse as parse2 } from "acorn";
3717
+ import { parse as parse2, parseExpressionAt } from "acorn";
3718
+ import { parse as parse3 } from "acorn";
3718
3719
  import postcss2 from "postcss";
3719
3720
  import postcss3 from "postcss";
3720
3721
 
@@ -3753,7 +3754,6 @@ function trackKindOf(node) {
3753
3754
  }
3754
3755
 
3755
3756
  // ../lint/dist/index.js
3756
- import { parse as parse3, parseExpressionAt } from "acorn";
3757
3757
  import { createHash } from "crypto";
3758
3758
  import { existsSync as existsSync2, readFileSync, readdirSync } from "fs";
3759
3759
  import { dirname as dirname2, extname, join as join3, relative as relative2, resolve } from "path";
@@ -3833,7 +3833,18 @@ function parseStartExpression(raw) {
3833
3833
  offset: reference.operator === "-" ? -reference.magnitude : reference.magnitude
3834
3834
  };
3835
3835
  }
3836
- function findReferenceTargetEl(doc, refId) {
3836
+ function compositionScopeOf(el) {
3837
+ return (el.getAttribute("data-composition-id") !== null ? el.parentElement : el)?.closest?.(
3838
+ "[data-composition-id]"
3839
+ ) ?? null;
3840
+ }
3841
+ function findReferenceTargetEl(doc, refId, from) {
3842
+ const scope = compositionScopeOf(from);
3843
+ if (scope) {
3844
+ for (const candidate of scope.querySelectorAll?.(`[id="${refId}"]`) ?? []) {
3845
+ if (compositionScopeOf(candidate) === scope) return candidate;
3846
+ }
3847
+ }
3837
3848
  return doc.getElementById(refId) ?? doc.querySelector(`[data-composition-id="${refId}"]`);
3838
3849
  }
3839
3850
  function resolveReferencedStart(doc, el, startCache, visiting) {
@@ -3852,7 +3863,7 @@ function resolveReferencedStart(doc, el, startCache, visiting) {
3852
3863
  startCache.set(el, value);
3853
3864
  return value;
3854
3865
  }
3855
- const target = findReferenceTargetEl(doc, expression.refId);
3866
+ const target = findReferenceTargetEl(doc, expression.refId, el);
3856
3867
  if (!target) {
3857
3868
  startCache.set(el, 0);
3858
3869
  return 0;
@@ -4690,11 +4701,96 @@ function buildLintContext(html, options = {}) {
4690
4701
  options
4691
4702
  };
4692
4703
  }
4704
+ var GLSL_SCRIPT_TYPES = /* @__PURE__ */ new Set(["x-shader/x-fragment", "x-shader/x-vertex", "text/glsl"]);
4705
+ function withoutComments(source) {
4706
+ return source.replace(/\/\*[\s\S]*?\*\/|\/\/[^\r\n]*/g, (text) => text.replace(/[^\r\n]/g, " "));
4707
+ }
4708
+ function staticShaders(source) {
4709
+ const shaders = [];
4710
+ try {
4711
+ const ast = parse2(source, {
4712
+ ecmaVersion: "latest",
4713
+ sourceType: "module",
4714
+ allowReturnOutsideFunction: true
4715
+ });
4716
+ simple(ast, {
4717
+ Literal(node) {
4718
+ if (typeof node.value !== "string") return;
4719
+ shaders.push({
4720
+ text: node.value,
4721
+ start: node.start + 1,
4722
+ exactOffsets: source.slice(node.start + 1, node.end - 1) === node.value
4723
+ });
4724
+ },
4725
+ TemplateLiteral(node) {
4726
+ if (node.expressions.length !== 0) return;
4727
+ const value = node.quasis[0]?.value;
4728
+ if (value?.cooked == null) return;
4729
+ shaders.push({
4730
+ text: value.cooked,
4731
+ start: node.start + 1,
4732
+ exactOffsets: source.slice(node.start + 1, node.end - 1) === value.cooked
4733
+ });
4734
+ }
4735
+ });
4736
+ } catch {
4737
+ }
4738
+ return shaders.filter(({ text }) => /\bvoid\s+main\s*\(/.test(withoutComments(text)));
4739
+ }
4740
+ function isNumber(node, value) {
4741
+ return node?.type === "Literal" && node.value === value;
4742
+ }
4743
+ function isCall(node, name) {
4744
+ return node?.type === "CallExpression" && node.callee.type === "Identifier" && node.callee.name === name;
4745
+ }
4746
+ function unboundedCosine(node) {
4747
+ if (node.type !== "CallExpression") return false;
4748
+ if (isCall(node, "dot")) return node.arguments.length === 2;
4749
+ if (!isCall(node, "max") || node.arguments.length !== 2) return false;
4750
+ const a = argumentAt(node, 0);
4751
+ const b = argumentAt(node, 1);
4752
+ return zeroFlooredDot(a, b) || zeroFlooredDot(b, a);
4753
+ }
4754
+ function argumentAt(call, index) {
4755
+ const node = call.arguments[index];
4756
+ return node?.type === "SpreadElement" ? void 0 : node;
4757
+ }
4758
+ function zeroFlooredDot(a, b) {
4759
+ return isCall(a, "dot") && isNumber(b, 0);
4760
+ }
4761
+ function unsafeCosinePower(call) {
4762
+ if (call.arguments.length !== 2) return false;
4763
+ const [base2] = call.arguments;
4764
+ return base2?.type === "BinaryExpression" && base2.operator === "-" && base2.left.type !== "PrivateIdentifier" && isNumber(base2.left, 1) && unboundedCosine(base2.right);
4765
+ }
4766
+ function unsafePowOffsets(source) {
4767
+ const offsets = [];
4768
+ const masked = withoutComments(source);
4769
+ for (const match of masked.matchAll(/\bpow\s*\(/g)) {
4770
+ try {
4771
+ const expression = parseExpressionAt(masked, match.index, { ecmaVersion: "latest" });
4772
+ simple(expression, {
4773
+ CallExpression(node) {
4774
+ if (node.start === match.index && unsafeCosinePower(node)) offsets.push(node.start);
4775
+ }
4776
+ });
4777
+ } catch {
4778
+ }
4779
+ }
4780
+ return offsets;
4781
+ }
4782
+ function shaderDomainOffsets(source, glsl = false) {
4783
+ const shaders = glsl ? [{ text: source, start: 0, exactOffsets: true }] : staticShaders(source);
4784
+ return shaders.flatMap(
4785
+ ({ text, start, exactOffsets }) => unsafePowOffsets(text).map((offset) => exactOffsets ? start + offset : void 0)
4786
+ );
4787
+ }
4693
4788
  var SCRIPT_SYNTAX_EXEMPT_TYPES = /* @__PURE__ */ new Set([
4694
4789
  "application/json",
4695
4790
  "application/hyperframes-slideshow+json",
4696
4791
  "importmap",
4697
- "module"
4792
+ "module",
4793
+ ...GLSL_SCRIPT_TYPES
4698
4794
  ]);
4699
4795
  function repeatedDescendantId(selector) {
4700
4796
  let repeated = null;
@@ -5493,7 +5589,7 @@ function driftingFields(members) {
5493
5589
  return values.some((value) => Math.abs(value - first) > SYNC_TOLERANCE_S);
5494
5590
  }).map(({ field }) => field);
5495
5591
  }
5496
- function compositionScopeOf(tag, compositions) {
5592
+ function compositionScopeOf2(tag, compositions) {
5497
5593
  let scope = -1;
5498
5594
  for (const composition of compositions) {
5499
5595
  const end = composition.endIndex ?? composition.closeIndex ?? Number.POSITIVE_INFINITY;
@@ -5512,7 +5608,7 @@ function groupByLink(tags) {
5512
5608
  for (const tag of tags) {
5513
5609
  const link = readAttr(tag.raw, "data-link");
5514
5610
  if (!link) continue;
5515
- const key = `${compositionScopeOf(tag, compositions)}\0${link}`;
5611
+ const key = `${compositionScopeOf2(tag, compositions)}\0${link}`;
5516
5612
  const group = groups.get(key) ?? { link, members: [] };
5517
5613
  group.members.push(tag);
5518
5614
  groups.set(key, group);
@@ -6442,7 +6538,7 @@ function callsFor(script) {
6442
6538
  if (cached) return cached;
6443
6539
  const calls = [];
6444
6540
  try {
6445
- const ast = parse2(script.content, {
6541
+ const ast = parse3(script.content, {
6446
6542
  ecmaVersion: "latest",
6447
6543
  sourceType: "script",
6448
6544
  allowReturnOutsideFunction: true
@@ -7676,11 +7772,11 @@ function deriveDurationFromClips(tags, rootTag) {
7676
7772
  return resolveCompositionDuration({ authoredDurationSeconds: null, clipEndsSeconds: clipEnds });
7677
7773
  }
7678
7774
  async function loadParseGsapScript() {
7679
- const mod = await import("./gsapParserAcorn-OOTY2MVN.js");
7775
+ const mod = await import("./gsapParserAcorn-LZJKCFQI.js");
7680
7776
  return mod.parseGsapScriptAcorn;
7681
7777
  }
7682
7778
  async function loadGsapScriptMotionPathFirstUseIndex() {
7683
- const mod = await import("./gsapParserAcorn-OOTY2MVN.js");
7779
+ const mod = await import("./gsapParserAcorn-LZJKCFQI.js");
7684
7780
  return mod.gsapScriptMotionPathFirstUseIndex;
7685
7781
  }
7686
7782
  var SCENE_BOUNDARY_EPSILON_SECONDS = 0.05;
@@ -10311,89 +10407,6 @@ var structureRules = [
10311
10407
  return topLevelElements(root).filter((row) => !isSubCompositionHost(row)).flatMap((row) => neverVisibleNestedFindings(row, severity));
10312
10408
  }
10313
10409
  ];
10314
- function withoutComments(source) {
10315
- return source.replace(/\/\*[\s\S]*?\*\/|\/\/[^\r\n]*/g, (text) => text.replace(/[^\r\n]/g, " "));
10316
- }
10317
- function staticShaders(source) {
10318
- const shaders = [];
10319
- try {
10320
- const ast = parse3(source, {
10321
- ecmaVersion: "latest",
10322
- sourceType: "module",
10323
- allowReturnOutsideFunction: true
10324
- });
10325
- simple(ast, {
10326
- Literal(node) {
10327
- if (typeof node.value !== "string") return;
10328
- shaders.push({
10329
- text: node.value,
10330
- start: node.start + 1,
10331
- exactOffsets: source.slice(node.start + 1, node.end - 1) === node.value
10332
- });
10333
- },
10334
- TemplateLiteral(node) {
10335
- if (node.expressions.length !== 0) return;
10336
- const value = node.quasis[0]?.value;
10337
- if (value?.cooked == null) return;
10338
- shaders.push({
10339
- text: value.cooked,
10340
- start: node.start + 1,
10341
- exactOffsets: source.slice(node.start + 1, node.end - 1) === value.cooked
10342
- });
10343
- }
10344
- });
10345
- } catch {
10346
- }
10347
- return shaders.filter(({ text }) => /\bvoid\s+main\s*\(/.test(withoutComments(text)));
10348
- }
10349
- function isNumber(node, value) {
10350
- return node?.type === "Literal" && node.value === value;
10351
- }
10352
- function isCall(node, name) {
10353
- return node?.type === "CallExpression" && node.callee.type === "Identifier" && node.callee.name === name;
10354
- }
10355
- function unboundedCosine(node) {
10356
- if (node.type !== "CallExpression") return false;
10357
- if (isCall(node, "dot")) return node.arguments.length === 2;
10358
- if (!isCall(node, "max") || node.arguments.length !== 2) return false;
10359
- const a = argumentAt(node, 0);
10360
- const b = argumentAt(node, 1);
10361
- return zeroFlooredDot(a, b) || zeroFlooredDot(b, a);
10362
- }
10363
- function argumentAt(call, index) {
10364
- const node = call.arguments[index];
10365
- return node?.type === "SpreadElement" ? void 0 : node;
10366
- }
10367
- function zeroFlooredDot(a, b) {
10368
- return isCall(a, "dot") && isNumber(b, 0);
10369
- }
10370
- function unsafeCosinePower(call) {
10371
- if (call.arguments.length !== 2) return false;
10372
- const [base2] = call.arguments;
10373
- return base2?.type === "BinaryExpression" && base2.operator === "-" && base2.left.type !== "PrivateIdentifier" && isNumber(base2.left, 1) && unboundedCosine(base2.right);
10374
- }
10375
- function unsafePowOffsets(source) {
10376
- const offsets = [];
10377
- const masked = withoutComments(source);
10378
- for (const match of masked.matchAll(/\bpow\s*\(/g)) {
10379
- try {
10380
- const expression = parseExpressionAt(masked, match.index, { ecmaVersion: "latest" });
10381
- simple(expression, {
10382
- CallExpression(node) {
10383
- if (node.start === match.index && unsafeCosinePower(node)) offsets.push(node.start);
10384
- }
10385
- });
10386
- } catch {
10387
- }
10388
- }
10389
- return offsets;
10390
- }
10391
- function shaderDomainOffsets(source, glsl = false) {
10392
- const shaders = glsl ? [{ text: source, start: 0, exactOffsets: true }] : staticShaders(source);
10393
- return shaders.flatMap(
10394
- ({ text, start, exactOffsets }) => unsafePowOffsets(text).map((offset) => exactOffsets ? start + offset : void 0)
10395
- );
10396
- }
10397
10410
  function shaderDomainWarning() {
10398
10411
  return {
10399
10412
  code: "shader_unbounded_cosine_pow",
@@ -10407,7 +10420,7 @@ var shaderRules = [
10407
10420
  const tag = `<script ${script.attrs}>`;
10408
10421
  if (readAttr(tag, "src") !== null) return [];
10409
10422
  const type = readAttr(tag, "type") ?? "";
10410
- const glsl = /^(?:x-shader\/x-(?:fragment|vertex)|text\/glsl)$/i.test(type);
10423
+ const glsl = GLSL_SCRIPT_TYPES.has(type.toLowerCase());
10411
10424
  if (type && !glsl && !/^(?:module|(?:text|application)\/javascript)$/i.test(type)) return [];
10412
10425
  return shaderDomainOffsets(script.content, glsl).map((offset) => ({
10413
10426
  ...shaderDomainWarning(),
@@ -0,0 +1,17 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+
8
+ // ../core/dist/browserMarker.js
9
+ var HYPERFRAMES_BROWSER_MARKER_ARG = "--hyperframes-owned-browser";
10
+ function withHyperframesBrowserMarker(args = []) {
11
+ return args.includes(HYPERFRAMES_BROWSER_MARKER_ARG) ? [...args] : [...args, HYPERFRAMES_BROWSER_MARKER_ARG];
12
+ }
13
+
14
+ export {
15
+ HYPERFRAMES_BROWSER_MARKER_ARG,
16
+ withHyperframesBrowserMarker
17
+ };