hyperframes 0.8.143 → 0.8.145

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 (202) hide show
  1. package/README.md +3 -2
  2. package/dist/{add-Q5EYDUAY.js → add-B6OUH46W.js} +12 -12
  3. package/dist/{animatedGifPrep-H2DUQEZ3.js → animatedGifPrep-MIWRDJIO.js} +7 -7
  4. package/dist/{asset-C7JBYYX4.js → asset-XJ2B2PU3.js} +2 -2
  5. package/dist/{assetCataloger-FRO4G6OU.js → assetCataloger-A5ZLSCMZ.js} +3 -3
  6. package/dist/{auth-FRWLCO36.js → auth-5HOVCZMV.js} +1 -1
  7. package/dist/{autoUpdate-E4OZXQK6.js → autoUpdate-WVNL5K3D.js} +2 -2
  8. package/dist/{backgroundChecks-FSUVHN5L.js → backgroundChecks-IGF54SFH.js} +3 -3
  9. package/dist/backgroundChecksWorker.js +3 -3
  10. package/dist/{batchRender-4U73BYTU.js → batchRender-T6JEGCQV.js} +4 -4
  11. package/dist/{beats-U6KJWF35.js → beats-37T6Y6QP.js} +13 -13
  12. package/dist/{benchmark-5ONT7V7B.js → benchmark-ZVVLOWPP.js} +9 -9
  13. package/dist/{browser-R4DU46IE.js → browser-4SSJOLH4.js} +39 -55
  14. package/dist/{bundleWithLocalizedFonts-VH55VOAL.js → bundleWithLocalizedFonts-XWK423QP.js} +2 -2
  15. package/dist/{capture-OGQAEYKO.js → capture-2SF7YP57.js} +2 -2
  16. package/dist/{capture-26G2DPSI.js → capture-KZXOPBMO.js} +18 -18
  17. package/dist/{catalog-RKORTIUE.js → catalog-NLD4A2C6.js} +12 -12
  18. package/dist/{catch-up-4OBERRQO.js → catch-up-4BSRN6IR.js} +4 -4
  19. package/dist/{check-P2XDN57S.js → check-IA44QQWM.js} +66 -55
  20. package/dist/{checkBrowser-NTGJGAEA.js → checkBrowser-VM35KZMW.js} +81 -30
  21. package/dist/{chunk-LVX6NK36.js → chunk-3IBMBNYY.js} +1 -1
  22. package/dist/{chunk-6XMFEICO.js → chunk-3KU3PFDW.js} +77 -92
  23. package/dist/{chunk-PJU63L6W.js → chunk-4ORLNTET.js} +1 -1
  24. package/dist/{chunk-DF2BHILQ.js → chunk-4QWD6JYN.js} +3 -3
  25. package/dist/{chunk-BT27OYYX.js → chunk-5NRXZGKK.js} +18 -12
  26. package/dist/{chunk-UM2GRYM3.js → chunk-5WVW7P23.js} +3 -3
  27. package/dist/{chunk-I7QGQAZM.js → chunk-6LGNTUZN.js} +7 -7
  28. package/dist/{chunk-LAOCA3MQ.js → chunk-A4Q7W4LV.js} +13 -8
  29. package/dist/{chunk-4PFZPP2N.js → chunk-A6S35NYA.js} +54 -16
  30. package/dist/{chunk-QRKLPWEX.js → chunk-ADF3X6GM.js} +11 -2
  31. package/dist/chunk-AUWHD7RA.js +3753 -0
  32. package/dist/{chunk-W35EKBS6.js → chunk-BFACGEII.js} +2 -2
  33. package/dist/{chunk-HW4AKJ5F.js → chunk-BIAC7IJT.js} +1 -1
  34. package/dist/{chunk-ZLW2V65P.js → chunk-BSQ7XANM.js} +3 -2
  35. package/dist/{chunk-LCSMOLGX.js → chunk-BYSBRF24.js} +69 -8
  36. package/dist/{chunk-2LBBHMKT.js → chunk-CFUXNBWH.js} +1 -1
  37. package/dist/{chunk-BFDJ63J5.js → chunk-DDIVWXN7.js} +1 -1
  38. package/dist/{chunk-KOEWEFHK.js → chunk-DIRJ322I.js} +10 -5
  39. package/dist/{chunk-FVYXDXEV.js → chunk-DWUKJQTO.js} +2 -2
  40. package/dist/{chunk-POLR33RB.js → chunk-EPE2HRJK.js} +15 -17
  41. package/dist/{chunk-UICWP23D.js → chunk-FBCULCAL.js} +3 -3
  42. package/dist/{chunk-F26LCYRY.js → chunk-FDT6KQV4.js} +142 -81
  43. package/dist/{chunk-P7THMINS.js → chunk-FXJJCPPB.js} +1 -1
  44. package/dist/{chunk-BYK73CR7.js → chunk-GBGJ7A3D.js} +5 -5
  45. package/dist/{sherpa-LVIUEAGF.js → chunk-GEMJYBRU.js} +11 -45
  46. package/dist/{chunk-KO5QBV73.js → chunk-GMAJB2P6.js} +1 -1
  47. package/dist/{chunk-KQLGTGE5.js → chunk-GRY3PN3K.js} +2 -2
  48. package/dist/{chunk-7UYBQ6NF.js → chunk-GXJEGZL2.js} +30 -20
  49. package/dist/{chunk-KJJLA674.js → chunk-GZVP4TWN.js} +1 -46
  50. package/dist/{chunk-QVYVUCWD.js → chunk-HB7FJOY4.js} +1 -1
  51. package/dist/{chunk-QFN7NVWM.js → chunk-ICKDMTLA.js} +1 -1
  52. package/dist/{chunk-XONFUK3M.js → chunk-IEIJRMLZ.js} +47 -35
  53. package/dist/{chunk-PAGIICKN.js → chunk-IHTRYDFN.js} +1 -1
  54. package/dist/chunk-IR35BCLK.js +13 -0
  55. package/dist/{chunk-KDPYVTEU.js → chunk-KBB4RG6F.js} +6 -1
  56. package/dist/{chunk-ZQQ3SEIE.js → chunk-KIFHYXPB.js} +99 -31
  57. package/dist/{chunk-TAMQYQGJ.js → chunk-LAFJSYDL.js} +1 -1
  58. package/dist/{chunk-U3X3TPBW.js → chunk-MAYCCGMQ.js} +11 -2
  59. package/dist/{chunk-HC7EVDEL.js → chunk-OB5MJR4W.js} +1 -1
  60. package/dist/{chunk-N3DQEVSI.js → chunk-OTHDVXOJ.js} +8 -5
  61. package/dist/{chunk-Y6QL2LGO.js → chunk-PLR7Z6TC.js} +1 -1
  62. package/dist/{chunk-OBXQRJWQ.js → chunk-QATWIE4K.js} +1 -1
  63. package/dist/{chunk-HLYOEIWM.js → chunk-QLSM7K5S.js} +2 -2
  64. package/dist/{chunk-LW6HO6U3.js → chunk-R42WWQVB.js} +1 -1
  65. package/dist/{chunk-HMT2RPZU.js → chunk-U5QY7KTN.js} +13 -9
  66. package/dist/chunk-UPFUC4DB.js +136 -0
  67. package/dist/{chunk-33RZPZ4K.js → chunk-UXO2L7HJ.js} +366 -156
  68. package/dist/{chunk-GNBGPUJ7.js → chunk-VHFEMFYL.js} +3 -3
  69. package/dist/{chunk-4M4EC7JX.js → chunk-VRW6EBHV.js} +12 -1
  70. package/dist/{chunk-VIVBA6E6.js → chunk-XBX4QJP7.js} +1 -1
  71. package/dist/{chunk-CLOH4LIB.js → chunk-XIHCMVMG.js} +2 -2
  72. package/dist/{chunk-TVCRUG2S.js → chunk-ZEUONDQG.js} +1 -1
  73. package/dist/{chunk-OSSHSIMD.js → chunk-ZF7SXQJ7.js} +1 -1
  74. package/dist/{chunk-5FISWJ37.js → chunk-ZIYZ77MR.js} +4 -4
  75. package/dist/{chunk-3NE7ZYU2.js → chunk-ZSVUAVMT.js} +3 -3
  76. package/dist/{clean-YHGPY33K.js → clean-RDKJB5FK.js} +18 -18
  77. package/dist/cli.js +68 -56
  78. package/dist/{cloud-DOFI5ISR.js → cloud-QVPVVNCW.js} +4 -4
  79. package/dist/{cloudrun-KTZ4XDHL.js → cloudrun-3RE2UCQG.js} +4 -4
  80. package/dist/{compare-SMMIZN2C.js → compare-LEDOY7MO.js} +25 -25
  81. package/dist/{compiler-TEXQWW6N.js → compiler-F54OZZPM.js} +10 -4
  82. package/dist/{component-B3GCNGSS.js → component-N42M67WY.js} +3 -3
  83. package/dist/{compositions-OQNZZTKF.js → compositions-VB2J2LZI.js} +11 -11
  84. package/dist/{delete-EL5LVSEP.js → delete-Q6RWMJ4Z.js} +2 -2
  85. package/dist/{dist-5UVIRMSM.js → dist-KDJTFJHA.js} +2 -2
  86. package/dist/{dist-XN234YFQ.js → dist-Q4BI5A73.js} +4 -4
  87. package/dist/{doctor-UOL3OI2A.js → doctor-JMMUHDRV.js} +13 -13
  88. package/dist/{events-K2DB2PBC.js → events-6ZBSIBE5.js} +2 -2
  89. package/dist/{events-NIZBS6S7.js → events-RGUAHIBW.js} +3 -3
  90. package/dist/{feedback-QMP4E6L7.js → feedback-FIID6MZW.js} +9 -9
  91. package/dist/{ffmpeg-QIUFEFTY.js → ffmpeg-T5SH2EFJ.js} +3 -2
  92. package/dist/{figma-2AUJRNVC.js → figma-BL3JJC36.js} +3 -3
  93. package/dist/fontLocalizeCli.js +9 -9
  94. package/dist/{get-P5NC7SRM.js → get-P46GS7S6.js} +2 -2
  95. package/dist/{gpuPolicy-7N5MCE2G.js → gpuPolicy-AQ2BPLBK.js} +11 -9
  96. package/dist/{grade-compare-HV5AFZ6P.js → grade-compare-GDCWU7ZZ.js} +27 -27
  97. package/dist/{help-3TSTXBLN.js → help-HJR3RWFG.js} +2 -2
  98. package/dist/{history-D65XFJ6D.js → history-GGO5AWJB.js} +5 -5
  99. package/dist/hyperframe-runtime.js +59 -59
  100. package/dist/hyperframe.manifest.json +1 -1
  101. package/dist/hyperframe.runtime.iife.js +59 -59
  102. package/dist/hyperframes-player.global.js +3 -3
  103. package/dist/{info-TXV7MLFO.js → info-3GFWUBJC.js} +8 -8
  104. package/dist/{init-OSDMJZJV.js → init-36OPU2ZG.js} +35 -36
  105. package/dist/{inspect-RQQSAYIJ.js → inspect-F2HEL5ON.js} +26 -26
  106. package/dist/{installer-CDOB32HE.js → installer-NI6P6GC4.js} +5 -5
  107. package/dist/{keyframes-V75Q6GRM.js → keyframes-7OY3LMAZ.js} +6 -6
  108. package/dist/{lambda-RODV4RCX.js → lambda-6GJIWNJ3.js} +5 -5
  109. package/dist/{layout-IZAI5SFC.js → layout-FTMLNL5A.js} +26 -26
  110. package/dist/{lint-PLXOXY5R.js → lint-U6POHUON.js} +8 -8
  111. package/dist/{lintProject-OQ6H6XBR.js → lintProject-UBZ3TDHU.js} +2 -2
  112. package/dist/{list-BQBPNKDZ.js → list-IP5KI5Q2.js} +2 -2
  113. package/dist/{login-NP6F4FHC.js → login-4VWTVPHG.js} +4 -4
  114. package/dist/{manager-CT3D67CG.js → manager-BPSR6D3V.js} +2 -2
  115. package/dist/{manager-GXYF4AVO.js → manager-YKMHR6LN.js} +8 -5
  116. package/dist/{media-treatment-PXGMZ4A4.js → media-treatment-XGV44AGV.js} +16 -13
  117. package/dist/{models-CEZM6XZ7.js → models-UCXB6UR5.js} +59 -19
  118. package/dist/{motionShot-R4GHYWYM.js → motionShot-WPVNBXKA.js} +21 -22
  119. package/dist/{normalize-H6KUHHEI.js → normalize-U3SL5VG3.js} +2 -2
  120. package/dist/{normalize-audio-MQ7NFCOV.js → normalize-audio-TYJ3UEHO.js} +6 -6
  121. package/dist/{open-AKQTGNXF.js → open-HENOLVB2.js} +4 -4
  122. package/dist/parakeetRunner-VFQ6WFTD.js +67 -0
  123. package/dist/{pipeline-SYJYP2RM.js → pipeline-6WPSC3H4.js} +10 -9
  124. package/dist/{play-NBH4B7PL.js → play-OI53WNUM.js} +19 -19
  125. package/dist/{preflight-Y5DN5D37.js → preflight-B4AFK3RG.js} +4 -4
  126. package/dist/{present-XAX55CFS.js → present-NGMEQ4NO.js} +15 -15
  127. package/dist/{preview-OLANKNFA.js → preview-VT2HWRWZ.js} +19 -19
  128. package/dist/{producer-Q6YNZZUJ.js → producer-7TYEAUF7.js} +1 -1
  129. package/dist/{projectConfig-EM26P45P.js → projectConfig-B2AF5DXY.js} +7 -7
  130. package/dist/{publication-OXWJZKSX.js → publication-2PANQVC6.js} +3 -3
  131. package/dist/{publish-4VBWP2UB.js → publish-O5OL42BG.js} +11 -11
  132. package/dist/{remove-background-REB7427G.js → remove-background-T2JM6UVP.js} +11 -10
  133. package/dist/{render-K25YOG3M.js → render-OLPKOJRU.js} +11 -11
  134. package/dist/{render-3CVZ2SZG.js → render-W7OFXDOJ.js} +4 -4
  135. package/dist/{render-TSE75QUL.js → render-Z253WHBK.js} +26 -26
  136. package/dist/{render-batch-GGUOK3DS.js → render-batch-46IIBFKL.js} +4 -4
  137. package/dist/{renderCancellation-PZRWB53I.js → renderCancellation-QTZOCDJ2.js} +10 -9
  138. package/dist/renderSetupWorker.js +32 -44
  139. package/dist/{resolver-S5VK6UCB.js → resolver-J2PL5FVJ.js} +5 -5
  140. package/dist/sherpa-ZF42V3RN.js +75 -0
  141. package/dist/sherpaWorker.js +2 -1
  142. package/dist/skills/hyperframes/scripts/lib/frame-packets-core.mjs +2 -20
  143. package/dist/skills/hyperframes/scripts/lib/main-module.mjs +13 -0
  144. package/dist/skills/hyperframes/scripts/lib/main-module.test.mjs +51 -0
  145. package/dist/skills/hyperframes/scripts/plugin-cli.mjs +4 -3
  146. package/dist/skills/hyperframes/scripts/plugin-cli.test.mjs +5 -1
  147. package/dist/skills/hyperframes-cli/SKILL.md +2 -0
  148. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +1 -1
  149. package/dist/skills/media-use/audio/scripts/heygen-voice.mjs +2 -2
  150. package/dist/skills/media-use/audio/scripts/lib/main-module.mjs +13 -0
  151. package/dist/skills/media-use/scripts/lib/cube-validate.mjs +2 -3
  152. package/dist/skills/media-use/scripts/lib/main-module.mjs +13 -0
  153. package/dist/{skills-I65FU5HD.js → skills-ACDOO3PX.js} +7 -7
  154. package/dist/{skillsUpdateCheck-J57RNNIV.js → skillsUpdateCheck-L5OXVVPU.js} +3 -3
  155. package/dist/{snapshot-YROOGY22.js → snapshot-UUVNZOW5.js} +28 -28
  156. package/dist/{src-JO5JOV7Y.js → src-BSLKXEGX.js} +10 -6
  157. package/dist/{src-X426BZAG.js → src-KS3AWFGT.js} +8 -8
  158. package/dist/{staticProjectServer-5VMBS262.js → staticProjectServer-2TTVGPQH.js} +15 -15
  159. package/dist/studio/assets/{hyperframes-player-BXSuksFh.js → hyperframes-player-DZ5JrMDg.js} +3 -3
  160. package/dist/studio/assets/{index-FgyO_5Kv.js → index-BOs6C0aZ.js} +1 -1
  161. package/dist/studio/assets/{index-BgOVCqjo.js → index-BqFRhNZa.js} +1 -1
  162. package/dist/studio/assets/{index-J7jpL4pj.js → index-D8W0a0Z9.js} +149 -149
  163. package/dist/studio/{chunk-TFLU2MGI.js → chunk-6JY3MTIX.js} +108 -2
  164. package/dist/studio/{chunk-H2DUOXTF.js → chunk-NZPJUZKT.js} +100 -4
  165. package/dist/studio/{chunk-UYWON5AX.js → chunk-TP6D3U37.js} +7 -100
  166. package/dist/studio/{chunk-LOVBLSMR.js → chunk-Y2OHHNM2.js} +35 -19
  167. package/dist/studio/{domEditingLayers-KBTPQKGA.js → domEditingLayers-PTP2ICGM.js} +3 -3
  168. package/dist/studio/index.d.ts +8 -5
  169. package/dist/studio/index.html +1 -1
  170. package/dist/studio/index.js +545 -495
  171. package/dist/studio/player.js +3 -3
  172. package/dist/studio/ui.d.ts +4 -5
  173. package/dist/studio/ui.js +1 -1
  174. package/dist/{studio-api-VRBZUGAE.js → studio-api-WYWF7XRC.js} +9 -9
  175. package/dist/{studioServer-DBNKZ6I6.js → studioServer-3FG4YTP7.js} +72 -54
  176. package/dist/{telemetry-CXAX3TO3.js → telemetry-PAOOB4T4.js} +3 -3
  177. package/dist/{timeline-VQ34WH7J.js → timeline-JIIJKKPC.js} +69 -47
  178. package/dist/{tokens-62R7VFAZ.js → tokens-3QRAM75Z.js} +2 -2
  179. package/dist/{transcribe-XOHPPL2O.js → transcribe-QSBP5MUG.js} +115 -51
  180. package/dist/{transcribe-7KR7IPJA.js → transcribe-SZB6UMXE.js} +14 -12
  181. package/dist/{tts-MUV42JXT.js → tts-B6AHFQEO.js} +1 -1
  182. package/dist/{updateCheck-POYNH3B5.js → updateCheck-V3DSB26K.js} +2 -2
  183. package/dist/{upgrade-NBNOT7J2.js → upgrade-L5GISOEV.js} +2 -2
  184. package/dist/{urlDownloader-3NS63A7B.js → urlDownloader-52FERT4X.js} +6 -6
  185. package/dist/{validate-Y2QDHAEP.js → validate-HVVLX7KO.js} +20 -20
  186. package/dist/{video-SJDMTSTL.js → video-MEOWRMFG.js} +7 -7
  187. package/package.json +1 -1
  188. package/dist/chunk-6TPZSTCL.js +0 -3681
  189. package/dist/studio/chunk-EEXSYY5F.js.map +0 -1
  190. package/dist/studio/chunk-H2DUOXTF.js.map +0 -1
  191. package/dist/studio/chunk-LOVBLSMR.js.map +0 -1
  192. package/dist/studio/chunk-PZ5AY32C.js.map +0 -1
  193. package/dist/studio/chunk-TFLU2MGI.js.map +0 -1
  194. package/dist/studio/chunk-UYWON5AX.js.map +0 -1
  195. package/dist/studio/domEditingLayers-KBTPQKGA.js.map +0 -1
  196. package/dist/studio/index.css.map +0 -1
  197. package/dist/studio/index.js.map +0 -1
  198. package/dist/studio/player.js.map +0 -1
  199. package/dist/studio/styles/tailwind-preset.js.map +0 -1
  200. package/dist/studio/ui.js.map +0 -1
  201. package/dist/{screenshotCapture-TEUIWXWN.js → screenshotCapture-3JXXUZND.js} +3 -3
  202. package/dist/{synthesize-C3IWDAXF.js → synthesize-UCI4X5O7.js} +4 -4
@@ -1,3 +1,7 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-PZ5AY32C.js";
4
+
1
5
  // src/utils/sourceScopedSelectorIndex.ts
2
6
  var activePass = null;
3
7
  function withSelectorIndexPass(doc, run) {
@@ -303,6 +307,12 @@ function roundTo3(val) {
303
307
  function roundToLayoutPx(val) {
304
308
  return Math.round(val);
305
309
  }
310
+ function roundToLayoutSize(size) {
311
+ return {
312
+ width: roundToLayoutPx(Math.max(1, size.width)),
313
+ height: roundToLayoutPx(Math.max(1, size.height))
314
+ };
315
+ }
306
316
  function roundToCenti(val) {
307
317
  return Math.round(val * 100) / 100;
308
318
  }
@@ -1026,6 +1036,94 @@ function buildProjectApiPath(projectId, suffix = "") {
1026
1036
  return `/api/projects/${encodeProjectId(projectId)}${normalizedSuffix}`;
1027
1037
  }
1028
1038
 
1039
+ // src/components/editor/manualEditingAvailability.ts
1040
+ var manualEditingAvailability_exports = {};
1041
+ __export(manualEditingAvailability_exports, {
1042
+ STUDIO_API_SAME_ORIGIN_CREDENTIALS: () => STUDIO_API_SAME_ORIGIN_CREDENTIALS,
1043
+ STUDIO_FLAT_INSPECTOR_ENABLED: () => STUDIO_FLAT_INSPECTOR_ENABLED,
1044
+ STUDIO_SDK_CUTOVER_ENABLED: () => STUDIO_SDK_CUTOVER_ENABLED,
1045
+ STUDIO_SDK_CUTOVER_FAMILIES: () => STUDIO_SDK_CUTOVER_FAMILIES,
1046
+ STUDIO_SDK_RESOLVER_SHADOW_ENABLED: () => STUDIO_SDK_RESOLVER_SHADOW_ENABLED,
1047
+ resolveStudioBooleanEnvFlag: () => resolveStudioBooleanEnvFlag
1048
+ });
1049
+
1050
+ // src/utils/sdkCutoverPolicy.ts
1051
+ var STUDIO_SDK_OPERATION_FAMILIES = [
1052
+ "dom",
1053
+ "timing",
1054
+ "gsap-animation",
1055
+ "gsap-keyframe",
1056
+ "lifecycle"
1057
+ ];
1058
+ function resolveEnabledSdkFamilies(env2, masterEnabled) {
1059
+ if (!masterEnabled) return /* @__PURE__ */ new Set();
1060
+ const raw = env2["VITE_STUDIO_SDK_CUTOVER_FAMILIES"];
1061
+ if (typeof raw !== "string" || raw.trim() === "") return new Set(STUDIO_SDK_OPERATION_FAMILIES);
1062
+ const requested = raw.split(",").map((family) => family.trim()).filter(Boolean);
1063
+ const known = new Set(STUDIO_SDK_OPERATION_FAMILIES);
1064
+ const unknown = requested.filter((family) => !known.has(family));
1065
+ if (unknown.length > 0) {
1066
+ throw new Error(`Unknown Studio SDK cutover families: ${unknown.join(", ")}`);
1067
+ }
1068
+ return new Set(requested);
1069
+ }
1070
+ function isSdkFamilyEnabled(masterEnabled, configured, family) {
1071
+ return masterEnabled && (configured?.has(family) ?? true);
1072
+ }
1073
+
1074
+ // src/components/editor/manualEditingAvailability.ts
1075
+ var TRUTHY_ENV_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on", "enabled"]);
1076
+ var FALSY_ENV_VALUES = /* @__PURE__ */ new Set(["0", "false", "no", "off", "disabled"]);
1077
+ function resolveStudioBooleanEnvFlag(env2, names, fallback) {
1078
+ for (const name of names) {
1079
+ const value = env2[name];
1080
+ if (typeof value === "boolean") return value;
1081
+ if (typeof value !== "string") continue;
1082
+ const normalized = value.trim().toLowerCase();
1083
+ if (!normalized) continue;
1084
+ if (TRUTHY_ENV_VALUES.has(normalized)) return true;
1085
+ if (FALSY_ENV_VALUES.has(normalized)) return false;
1086
+ }
1087
+ return fallback;
1088
+ }
1089
+ var runtimeEnv = typeof window !== "undefined" ? window.__HF_STUDIO_ENV__ ?? {} : {};
1090
+ var env = { ...import.meta.env ?? {}, ...runtimeEnv };
1091
+ var STUDIO_SDK_CUTOVER_ENABLED = resolveStudioBooleanEnvFlag(
1092
+ env,
1093
+ ["VITE_STUDIO_SDK_CUTOVER_ENABLED"],
1094
+ true
1095
+ );
1096
+ var STUDIO_SDK_CUTOVER_FAMILIES = resolveEnabledSdkFamilies(
1097
+ env,
1098
+ STUDIO_SDK_CUTOVER_ENABLED
1099
+ );
1100
+ var STUDIO_SDK_RESOLVER_SHADOW_ENABLED = resolveStudioBooleanEnvFlag(
1101
+ env,
1102
+ ["VITE_STUDIO_SDK_RESOLVER_SHADOW_ENABLED"],
1103
+ true
1104
+ );
1105
+ var STUDIO_FLAT_INSPECTOR_ENABLED = resolveStudioBooleanEnvFlag(
1106
+ env,
1107
+ ["VITE_STUDIO_ENABLE_FLAT_INSPECTOR", "VITE_STUDIO_FLAT_INSPECTOR_ENABLED"],
1108
+ true
1109
+ );
1110
+ var STUDIO_API_SAME_ORIGIN_CREDENTIALS = resolveStudioBooleanEnvFlag(
1111
+ env,
1112
+ ["VITE_STUDIO_API_SAME_ORIGIN_CREDENTIALS"],
1113
+ false
1114
+ );
1115
+
1116
+ // src/utils/studioApiFetch.ts
1117
+ var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "[::1]"]);
1118
+ function studioApiCredentials() {
1119
+ if (STUDIO_API_SAME_ORIGIN_CREDENTIALS) return "same-origin";
1120
+ const host = globalThis.location?.hostname;
1121
+ return !host || LOOPBACK_HOSTS.has(host) ? "omit" : "same-origin";
1122
+ }
1123
+ function studioApiFetch(input, init) {
1124
+ return globalThis.fetch(input, { ...init, credentials: studioApiCredentials() });
1125
+ }
1126
+
1029
1127
  export {
1030
1128
  buildProjectHash,
1031
1129
  parseProjectHashRoute,
@@ -1033,6 +1131,7 @@ export {
1033
1131
  buildProjectApiPath,
1034
1132
  roundTo3,
1035
1133
  roundToLayoutPx,
1134
+ roundToLayoutSize,
1036
1135
  roundToCenti,
1037
1136
  parseCssColor,
1038
1137
  resolvePickerColor,
@@ -1093,6 +1192,13 @@ export {
1093
1192
  deriveTimelineStoreKeyForDomId,
1094
1193
  previewElementFinder,
1095
1194
  findClipElementById,
1096
- createTimelineDomNodeResolver
1195
+ createTimelineDomNodeResolver,
1196
+ isSdkFamilyEnabled,
1197
+ STUDIO_SDK_CUTOVER_ENABLED,
1198
+ STUDIO_SDK_CUTOVER_FAMILIES,
1199
+ STUDIO_SDK_RESOLVER_SHADOW_ENABLED,
1200
+ STUDIO_FLAT_INSPECTOR_ENABLED,
1201
+ manualEditingAvailability_exports,
1202
+ studioApiFetch
1097
1203
  };
1098
- //# sourceMappingURL=chunk-TFLU2MGI.js.map
1204
+ //# sourceMappingURL=chunk-6JY3MTIX.js.map
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  HyperframesLoader
3
- } from "./chunk-LOVBLSMR.js";
3
+ } from "./chunk-Y2OHHNM2.js";
4
4
  import {
5
5
  buildProjectApiPath,
6
- splitTimelineElementKey
7
- } from "./chunk-TFLU2MGI.js";
6
+ splitTimelineElementKey,
7
+ studioApiFetch
8
+ } from "./chunk-6JY3MTIX.js";
8
9
 
9
10
  // src/player/lib/time.ts
10
11
  var STUDIO_PREVIEW_FPS = 30;
@@ -959,6 +960,87 @@ function whenPreviewBooted(projectId) {
959
960
  });
960
961
  }
961
962
 
963
+ // src/player/sceneSwap.ts
964
+ var SCENES_SWAPPED = "hf-scenes-swapped";
965
+ var SCENE_SWAP_MS = 5e3;
966
+ var PREVIEW_DOCUMENT_LOADED = "hf-preview-document-loaded";
967
+ function announcePreviewDocumentLoaded(iframe) {
968
+ iframe.dispatchEvent(new Event(PREVIEW_DOCUMENT_LOADED));
969
+ }
970
+ function onPreviewDocumentLoaded(iframe, onLoaded) {
971
+ iframe.addEventListener(PREVIEW_DOCUMENT_LOADED, onLoaded);
972
+ return () => iframe.removeEventListener(PREVIEW_DOCUMENT_LOADED, onLoaded);
973
+ }
974
+ function onPreviewContentReplaced(iframe, onReplaced) {
975
+ const stopLoaded = onPreviewDocumentLoaded(iframe, onReplaced);
976
+ iframe.addEventListener(SCENES_SWAPPED, onReplaced);
977
+ return () => {
978
+ stopLoaded();
979
+ iframe.removeEventListener(SCENES_SWAPPED, onReplaced);
980
+ };
981
+ }
982
+ var PREVIEW_PROMOTED = "hf-preview-promoted";
983
+ function announcePreviewPromoted(promotion) {
984
+ promotion.live.ownerDocument.dispatchEvent(
985
+ new CustomEvent(PREVIEW_PROMOTED, { detail: promotion })
986
+ );
987
+ }
988
+ function onPreviewPromoted(doc, listener) {
989
+ const handle = (event) => listener(event.detail);
990
+ doc.addEventListener(PREVIEW_PROMOTED, handle);
991
+ return () => doc.removeEventListener(PREVIEW_PROMOTED, handle);
992
+ }
993
+ function markScenesStale(iframe, files) {
994
+ const doc = iframe?.contentDocument;
995
+ const meta = doc?.querySelector('meta[name="hf-scene-parts"]');
996
+ if (!doc || !meta) return;
997
+ let parts;
998
+ try {
999
+ parts = JSON.parse(meta.content);
1000
+ } catch {
1001
+ return;
1002
+ }
1003
+ for (const file of files) {
1004
+ const hosts = doc.querySelectorAll(`[data-composition-file="${CSS.escape(file)}"]`);
1005
+ if (hosts.length === 0 && file.endsWith(".html")) parts.shared = "";
1006
+ for (const host of hosts) {
1007
+ const scene = host.closest("[data-hf-scene]")?.getAttribute("data-hf-scene");
1008
+ if (scene && scene in parts.scenes) parts.scenes[scene] = "";
1009
+ }
1010
+ }
1011
+ meta.content = JSON.stringify(parts);
1012
+ }
1013
+ function sceneSwapFor(iframe) {
1014
+ const win = iframe.contentWindow;
1015
+ const swap = win?.__hfSwapScenes;
1016
+ if (typeof swap !== "function") return null;
1017
+ return async (url, isCurrent, cancel) => {
1018
+ if (cancel?.aborted) throw cancel.reason;
1019
+ const deadline = new AbortController();
1020
+ const timer = setTimeout(
1021
+ () => deadline.abort(new Error("the preview took too long to swap")),
1022
+ SCENE_SWAP_MS
1023
+ );
1024
+ cancel?.addEventListener("abort", () => deadline.abort(cancel.reason), { once: true });
1025
+ const swapping = (async () => {
1026
+ const response = await studioApiFetch(url, { signal: deadline.signal });
1027
+ if (!response.ok) throw new Error(`preview request failed with ${response.status}`);
1028
+ const html = await response.text();
1029
+ if (!isCurrent()) throw new Error("superseded by a newer reload");
1030
+ await swap.call(win, html, deadline.signal);
1031
+ })();
1032
+ const expired = new Promise(
1033
+ (_resolve, reject) => deadline.signal.addEventListener("abort", () => reject(deadline.signal.reason))
1034
+ );
1035
+ try {
1036
+ await Promise.race([swapping, expired]);
1037
+ } finally {
1038
+ clearTimeout(timer);
1039
+ }
1040
+ iframe.dispatchEvent(new Event(SCENES_SWAPPED));
1041
+ };
1042
+ }
1043
+
962
1044
  // src/player/components/Player.tsx
963
1045
  import { forwardRef, useEffect as useEffect2, useRef, useState } from "react";
964
1046
  import { isLottieAnimationLoaded } from "@hyperframes/core/runtime/lottie-readiness";
@@ -1052,6 +1134,7 @@ function hasUnloadedAssets(iframe, lastResult) {
1052
1134
  return lastResult;
1053
1135
  }
1054
1136
  }
1137
+ var runtimeBootedIn = (iframe) => iframe.contentWindow?.__playerReady === true;
1055
1138
  var Player = forwardRef(
1056
1139
  ({
1057
1140
  projectId,
@@ -1130,9 +1213,11 @@ var Player = forwardRef(
1130
1213
  const loading = getShaderTransitionLoading(event);
1131
1214
  if (loading !== null) setShaderTransitionLoading(loading);
1132
1215
  };
1216
+ let loadedDocument = null;
1133
1217
  const handleReady = () => {
1134
1218
  setPreviewError(null);
1135
1219
  setCompositionLoading(false);
1220
+ if (iframe.contentDocument && runtimeBootedIn(iframe)) handleLoad();
1136
1221
  };
1137
1222
  const handlePainted = () => {
1138
1223
  setPainted(true);
@@ -1145,6 +1230,9 @@ var Player = forwardRef(
1145
1230
  setCompositionLoading(false);
1146
1231
  };
1147
1232
  const handleLoad = () => {
1233
+ const doc = iframe.contentDocument;
1234
+ if (doc && doc === loadedDocument) return;
1235
+ loadedDocument = doc;
1148
1236
  loadCountRef.current++;
1149
1237
  setLoaded(true);
1150
1238
  setPreviewError(null);
@@ -1159,6 +1247,7 @@ var Player = forwardRef(
1159
1247
  container.addEventListener("animationend", onEnd, { once: true });
1160
1248
  }
1161
1249
  onLoadRef.current();
1250
+ announcePreviewDocumentLoaded(iframe);
1162
1251
  if (assetPollRef.current) clearInterval(assetPollRef.current);
1163
1252
  const isContentRefresh = loadCountRef.current > 1;
1164
1253
  let lastUnloaded = isContentRefresh ? false : hasUnloadedAssets(iframe, false);
@@ -1437,6 +1526,13 @@ export {
1437
1526
  usePlayerStore,
1438
1527
  isPreviewBooted,
1439
1528
  whenPreviewBooted,
1529
+ announcePreviewDocumentLoaded,
1530
+ onPreviewDocumentLoaded,
1531
+ onPreviewContentReplaced,
1532
+ announcePreviewPromoted,
1533
+ onPreviewPromoted,
1534
+ markScenesStale,
1535
+ sceneSwapFor,
1440
1536
  Player
1441
1537
  };
1442
- //# sourceMappingURL=chunk-H2DUOXTF.js.map
1538
+ //# sourceMappingURL=chunk-NZPJUZKT.js.map
@@ -17,99 +17,12 @@ import {
17
17
  normalizeTimelineCompositionSource,
18
18
  parsePx,
19
19
  querySelectorAllSafely,
20
+ studioApiFetch,
20
21
  withSelectorIndexPass
21
- } from "./chunk-TFLU2MGI.js";
22
- import {
23
- __export
24
- } from "./chunk-PZ5AY32C.js";
25
-
26
- // src/components/editor/manualEditingAvailability.ts
27
- var manualEditingAvailability_exports = {};
28
- __export(manualEditingAvailability_exports, {
29
- STUDIO_API_SAME_ORIGIN_CREDENTIALS: () => STUDIO_API_SAME_ORIGIN_CREDENTIALS,
30
- STUDIO_FLAT_INSPECTOR_ENABLED: () => STUDIO_FLAT_INSPECTOR_ENABLED,
31
- STUDIO_SDK_CUTOVER_ENABLED: () => STUDIO_SDK_CUTOVER_ENABLED,
32
- STUDIO_SDK_CUTOVER_FAMILIES: () => STUDIO_SDK_CUTOVER_FAMILIES,
33
- STUDIO_SDK_RESOLVER_SHADOW_ENABLED: () => STUDIO_SDK_RESOLVER_SHADOW_ENABLED,
34
- resolveStudioBooleanEnvFlag: () => resolveStudioBooleanEnvFlag
35
- });
36
-
37
- // src/utils/sdkCutoverPolicy.ts
38
- var STUDIO_SDK_OPERATION_FAMILIES = [
39
- "dom",
40
- "timing",
41
- "gsap-animation",
42
- "gsap-keyframe",
43
- "lifecycle"
44
- ];
45
- function resolveEnabledSdkFamilies(env2, masterEnabled) {
46
- if (!masterEnabled) return /* @__PURE__ */ new Set();
47
- const raw = env2["VITE_STUDIO_SDK_CUTOVER_FAMILIES"];
48
- if (typeof raw !== "string" || raw.trim() === "") return new Set(STUDIO_SDK_OPERATION_FAMILIES);
49
- const requested = raw.split(",").map((family) => family.trim()).filter(Boolean);
50
- const known = new Set(STUDIO_SDK_OPERATION_FAMILIES);
51
- const unknown = requested.filter((family) => !known.has(family));
52
- if (unknown.length > 0) {
53
- throw new Error(`Unknown Studio SDK cutover families: ${unknown.join(", ")}`);
54
- }
55
- return new Set(requested);
56
- }
57
- function isSdkFamilyEnabled(masterEnabled, configured, family) {
58
- return masterEnabled && (configured?.has(family) ?? true);
59
- }
22
+ } from "./chunk-6JY3MTIX.js";
60
23
 
61
- // src/components/editor/manualEditingAvailability.ts
62
- var TRUTHY_ENV_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on", "enabled"]);
63
- var FALSY_ENV_VALUES = /* @__PURE__ */ new Set(["0", "false", "no", "off", "disabled"]);
64
- function resolveStudioBooleanEnvFlag(env2, names, fallback) {
65
- for (const name of names) {
66
- const value = env2[name];
67
- if (typeof value === "boolean") return value;
68
- if (typeof value !== "string") continue;
69
- const normalized = value.trim().toLowerCase();
70
- if (!normalized) continue;
71
- if (TRUTHY_ENV_VALUES.has(normalized)) return true;
72
- if (FALSY_ENV_VALUES.has(normalized)) return false;
73
- }
74
- return fallback;
75
- }
76
- var runtimeEnv = typeof window !== "undefined" ? window.__HF_STUDIO_ENV__ ?? {} : {};
77
- var env = { ...import.meta.env ?? {}, ...runtimeEnv };
78
- var STUDIO_SDK_CUTOVER_ENABLED = resolveStudioBooleanEnvFlag(
79
- env,
80
- ["VITE_STUDIO_SDK_CUTOVER_ENABLED"],
81
- true
82
- );
83
- var STUDIO_SDK_CUTOVER_FAMILIES = resolveEnabledSdkFamilies(
84
- env,
85
- STUDIO_SDK_CUTOVER_ENABLED
86
- );
87
- var STUDIO_SDK_RESOLVER_SHADOW_ENABLED = resolveStudioBooleanEnvFlag(
88
- env,
89
- ["VITE_STUDIO_SDK_RESOLVER_SHADOW_ENABLED"],
90
- true
91
- );
92
- var STUDIO_FLAT_INSPECTOR_ENABLED = resolveStudioBooleanEnvFlag(
93
- env,
94
- ["VITE_STUDIO_ENABLE_FLAT_INSPECTOR", "VITE_STUDIO_FLAT_INSPECTOR_ENABLED"],
95
- true
96
- );
97
- var STUDIO_API_SAME_ORIGIN_CREDENTIALS = resolveStudioBooleanEnvFlag(
98
- env,
99
- ["VITE_STUDIO_API_SAME_ORIGIN_CREDENTIALS"],
100
- false
101
- );
102
-
103
- // src/utils/studioApiFetch.ts
104
- var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "[::1]"]);
105
- function studioApiCredentials() {
106
- if (STUDIO_API_SAME_ORIGIN_CREDENTIALS) return "same-origin";
107
- const host = globalThis.location?.hostname;
108
- return !host || LOOPBACK_HOSTS.has(host) ? "omit" : "same-origin";
109
- }
110
- function studioApiFetch(input, init) {
111
- return globalThis.fetch(input, { ...init, credentials: studioApiCredentials() });
112
- }
24
+ // src/components/editor/domEditingLayers.ts
25
+ import { PREVIEW_ONLY_ATTRS } from "@hyperframes/core/studio-preview-mark";
113
26
 
114
27
  // src/components/editor/probeSourceElement.ts
115
28
  function knownSourceAnswer(previous, element, sourceFile, target) {
@@ -548,6 +461,7 @@ function getTextFieldLabel(_tagName, index, total, source) {
548
461
  if (source === "self" || total === 1) return "Content";
549
462
  return `Text ${index + 1}`;
550
463
  }
464
+ var NOT_COPIED_ATTRS = /* @__PURE__ */ new Set(["style", ...PREVIEW_ONLY_ATTRS]);
551
465
  function buildTextField(el, index, total, source, sourceChildIndex) {
552
466
  const tagName = el.tagName.toLowerCase();
553
467
  const key = el.getAttribute("data-hf-text-key") ?? `${source}:${index}:${tagName}`;
@@ -556,7 +470,7 @@ function buildTextField(el, index, total, source, sourceChildIndex) {
556
470
  label: getTextFieldLabel(tagName, index, total, source),
557
471
  value: el.textContent ?? "",
558
472
  tagName,
559
- attributes: Array.from(el.attributes).filter((attribute) => attribute.name !== "style").map((attribute) => ({
473
+ attributes: Array.from(el.attributes).filter((attribute) => !NOT_COPIED_ATTRS.has(attribute.name)).map((attribute) => ({
560
474
  name: attribute.name,
561
475
  value: attribute.value
562
476
  })),
@@ -898,13 +812,6 @@ function buildDomEditPatchTarget(selection) {
898
812
  }
899
813
 
900
814
  export {
901
- isSdkFamilyEnabled,
902
- STUDIO_SDK_CUTOVER_ENABLED,
903
- STUDIO_SDK_CUTOVER_FAMILIES,
904
- STUDIO_SDK_RESOLVER_SHADOW_ENABLED,
905
- STUDIO_FLAT_INSPECTOR_ENABLED,
906
- manualEditingAvailability_exports,
907
- studioApiFetch,
908
815
  isElementComputedVisible,
909
816
  getDomLayerPatchTarget,
910
817
  resolveAllVisualDomEditTargets,
@@ -935,4 +842,4 @@ export {
935
842
  readHfId,
936
843
  buildDomEditPatchTarget
937
844
  };
938
- //# sourceMappingURL=chunk-UYWON5AX.js.map
845
+ //# sourceMappingURL=chunk-TP6D3U37.js.map
@@ -271,7 +271,17 @@ function HyperframesLoader({
271
271
  // src/components/ui/Menu.tsx
272
272
  import { ContextMenu as BaseContextMenu } from "@base-ui/react/context-menu";
273
273
  import { Menu as BaseMenu } from "@base-ui/react/menu";
274
+ import { useRef } from "react";
274
275
  import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
276
+ var CONTENTS = { display: "contents" };
277
+ function useInlinePortal(container) {
278
+ const host = useRef(null);
279
+ if (container !== null) return { host: null, portal: { container } };
280
+ return {
281
+ host: /* @__PURE__ */ jsx6("span", { ref: host, style: CONTENTS }),
282
+ portal: { container: host, style: CONTENTS }
283
+ };
284
+ }
275
285
  var SIDE_OFFSET = 6;
276
286
  var VIEWPORT_MARGIN = 8;
277
287
  function floatingMotion(openDuration) {
@@ -315,9 +325,11 @@ function Menu({
315
325
  "data-preview-state": previewState,
316
326
  ...root
317
327
  }) {
328
+ const inline = useInlinePortal(container);
318
329
  return /* @__PURE__ */ jsxs4(BaseMenu.Root, { ...root, children: [
319
330
  /* @__PURE__ */ jsx6(BaseMenu.Trigger, { render: trigger }),
320
- /* @__PURE__ */ jsx6(BaseMenu.Portal, { container, children: /* @__PURE__ */ jsx6(
331
+ inline.host,
332
+ /* @__PURE__ */ jsx6(BaseMenu.Portal, { ...inline.portal, children: /* @__PURE__ */ jsx6(
321
333
  BaseMenu.Positioner,
322
334
  {
323
335
  side,
@@ -347,9 +359,11 @@ function ContextMenu({
347
359
  "data-preview-state": previewState,
348
360
  ...root
349
361
  }) {
362
+ const inline = useInlinePortal(container);
350
363
  return /* @__PURE__ */ jsxs4(BaseContextMenu.Root, { ...root, children: [
351
364
  /* @__PURE__ */ jsx6(BaseContextMenu.Trigger, { render: trigger }),
352
- /* @__PURE__ */ jsx6(BaseContextMenu.Portal, { container, children: /* @__PURE__ */ jsx6(BaseContextMenu.Positioner, { collisionPadding: VIEWPORT_MARGIN, className: POPUP_LAYER, children: /* @__PURE__ */ jsx6(
365
+ inline.host,
366
+ /* @__PURE__ */ jsx6(BaseContextMenu.Portal, { ...inline.portal, children: /* @__PURE__ */ jsx6(BaseContextMenu.Positioner, { collisionPadding: VIEWPORT_MARGIN, className: POPUP_LAYER, children: /* @__PURE__ */ jsx6(
353
367
  BaseContextMenu.Popup,
354
368
  {
355
369
  "aria-label": ariaLabel,
@@ -401,7 +415,7 @@ function MenuSeparator({ className, ...props }) {
401
415
 
402
416
  // src/components/ui/Tooltip.tsx
403
417
  import { Tooltip as BaseTooltip } from "@base-ui/react/tooltip";
404
- import { cloneElement, useId as useId2, useRef, useState } from "react";
418
+ import { cloneElement, useId as useId2, useRef as useRef2, useState } from "react";
405
419
  import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
406
420
  var SIDE_OFFSET2 = 6;
407
421
  var VIEWPORT_MARGIN2 = 8;
@@ -413,7 +427,7 @@ function Tooltip({
413
427
  disabled = false
414
428
  }) {
415
429
  const [open, setOpen] = useState(false);
416
- const boxRef = useRef(null);
430
+ const boxRef = useRef2(null);
417
431
  const tooltipId = useId2();
418
432
  return /* @__PURE__ */ jsxs5(BaseTooltip.Root, { open, onOpenChange: setOpen, disabled, children: [
419
433
  /* @__PURE__ */ jsx7(BaseTooltip.Trigger, { delay, render: /* @__PURE__ */ jsx7("span", { ref: boxRef, className: "contents" }), children: cloneElement(children, {
@@ -470,9 +484,11 @@ function Popover({
470
484
  "data-preview-state": previewState,
471
485
  ...root
472
486
  }) {
487
+ const inline = useInlinePortal(container);
473
488
  return /* @__PURE__ */ jsxs6(BasePopover.Root, { ...root, children: [
474
489
  /* @__PURE__ */ jsx8(BasePopover.Trigger, { render: trigger }),
475
- /* @__PURE__ */ jsx8(BasePopover.Portal, { container, children: /* @__PURE__ */ jsx8(
490
+ inline.host,
491
+ /* @__PURE__ */ jsx8(BasePopover.Portal, { ...inline.portal, children: /* @__PURE__ */ jsx8(
476
492
  BasePopover.Positioner,
477
493
  {
478
494
  side,
@@ -501,7 +517,7 @@ function Popover({
501
517
 
502
518
  // src/components/ui/Input.tsx
503
519
  import { Input as BaseInput } from "@base-ui/react/input";
504
- import { useEffect, useRef as useRef2, useState as useState2 } from "react";
520
+ import { useEffect, useRef as useRef3, useState as useState2 } from "react";
505
521
  import { jsx as jsx9 } from "react/jsx-runtime";
506
522
  var fieldBase = cn(
507
523
  "flex min-w-0 items-center gap-1.5 h-ctl px-2 rounded-md",
@@ -532,9 +548,9 @@ function Input({
532
548
  ...props
533
549
  }) {
534
550
  const [draft, setDraft] = useState2(value);
535
- const valueRef = useRef2(value);
551
+ const valueRef = useRef3(value);
536
552
  valueRef.current = value;
537
- const dirtyRef = useRef2(false);
553
+ const dirtyRef = useRef3(false);
538
554
  useEffect(() => {
539
555
  if (!dirtyRef.current) setDraft(value);
540
556
  }, [value]);
@@ -585,7 +601,7 @@ function Input({
585
601
 
586
602
  // src/components/ui/NumberField.tsx
587
603
  import { NumberField as BaseNumberField } from "@base-ui/react/number-field";
588
- import { useEffect as useEffect2, useRef as useRef3, useState as useState3 } from "react";
604
+ import { useEffect as useEffect2, useRef as useRef4, useState as useState3 } from "react";
589
605
  import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
590
606
  function NumberField({
591
607
  label,
@@ -602,9 +618,9 @@ function NumberField({
602
618
  }) {
603
619
  const [draft, setDraft] = useState3(value);
604
620
  const [invalid, setInvalid] = useState3(false);
605
- const inputRef = useRef3(null);
606
- const committedRef = useRef3(value);
607
- const valueRef = useRef3(value);
621
+ const inputRef = useRef4(null);
622
+ const committedRef = useRef4(value);
623
+ const valueRef = useRef4(value);
608
624
  valueRef.current = value;
609
625
  useEffect2(() => {
610
626
  committedRef.current = value;
@@ -756,7 +772,7 @@ function Select({
756
772
 
757
773
  // src/components/ui/Slider.tsx
758
774
  import { Slider as BaseSlider } from "@base-ui/react/slider";
759
- import { useEffect as useEffect3, useRef as useRef4, useState as useState4 } from "react";
775
+ import { useEffect as useEffect3, useRef as useRef5, useState as useState4 } from "react";
760
776
  import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
761
777
  var first = (next) => Array.isArray(next) ? next[0] : next;
762
778
  function Slider({
@@ -773,11 +789,11 @@ function Slider({
773
789
  "data-preview-state": previewState
774
790
  }) {
775
791
  const [draft, setDraft] = useState4(value);
776
- const draggingRef = useRef4(false);
777
- const abortedRef = useRef4(false);
778
- const dragStartRef = useRef4(value);
779
- const committedRef = useRef4(value);
780
- const valueRef = useRef4(value);
792
+ const draggingRef = useRef5(false);
793
+ const abortedRef = useRef5(false);
794
+ const dragStartRef = useRef5(value);
795
+ const committedRef = useRef5(value);
796
+ const valueRef = useRef5(value);
781
797
  valueRef.current = value;
782
798
  useEffect3(() => {
783
799
  if (draggingRef.current) return;
@@ -951,4 +967,4 @@ export {
951
967
  Slider,
952
968
  Toggle
953
969
  };
954
- //# sourceMappingURL=chunk-LOVBLSMR.js.map
970
+ //# sourceMappingURL=chunk-Y2OHHNM2.js.map
@@ -19,8 +19,8 @@ import {
19
19
  resolveDomEditCapabilities,
20
20
  resolveDomEditSelection,
21
21
  serializeDomEditTextFields
22
- } from "./chunk-UYWON5AX.js";
23
- import "./chunk-TFLU2MGI.js";
22
+ } from "./chunk-TP6D3U37.js";
23
+ import "./chunk-6JY3MTIX.js";
24
24
  import "./chunk-PZ5AY32C.js";
25
25
  export {
26
26
  buildDefaultDomEditTextField,
@@ -44,4 +44,4 @@ export {
44
44
  resolveDomEditSelection,
45
45
  serializeDomEditTextFields
46
46
  };
47
- //# sourceMappingURL=domEditingLayers-KBTPQKGA.js.map
47
+ //# sourceMappingURL=domEditingLayers-PTP2ICGM.js.map
@@ -2692,6 +2692,7 @@ interface StartRenderOptions {
2692
2692
  format?: "mp4" | "webm" | "mov";
2693
2693
  /** `"auto"` (default) renders at the composition's authored dimensions. */
2694
2694
  resolution?: ResolutionPreset | "auto";
2695
+ gpu?: boolean;
2695
2696
  /**
2696
2697
  * Render a specific composition file. Omit it to render the composition the
2697
2698
  * user currently has open — only the sidebar's per-composition Render button
@@ -2728,7 +2729,7 @@ interface CompositionDimensions {
2728
2729
  width: number;
2729
2730
  height: number;
2730
2731
  }
2731
- type StartRenderHandler = (format: "mp4" | "webm" | "mov", quality: "draft" | "standard" | "high", resolution: ResolutionPreset | "auto", fps: 24 | 30 | 60) => void | Promise<void>;
2732
+ type StartRenderHandler = (format: "mp4" | "webm" | "mov", quality: "draft" | "standard" | "high", resolution: ResolutionPreset | "auto", fps: 24 | 30 | 60, gpu?: boolean) => void | Promise<void>;
2732
2733
  interface RenderQueueProps {
2733
2734
  jobs: RenderJob[];
2734
2735
  projectId: string;
@@ -2764,9 +2765,10 @@ interface PersistedRenderSettings {
2764
2765
  format: "mp4" | "webm" | "mov";
2765
2766
  quality: "draft" | "standard" | "high";
2766
2767
  fps: 24 | 30 | 60;
2768
+ gpu: boolean;
2767
2769
  }
2768
2770
  declare function getPersistedRenderSettings(): PersistedRenderSettings;
2769
- declare function persistRenderSettings(format: PersistedRenderSettings["format"], quality: PersistedRenderSettings["quality"], fps: PersistedRenderSettings["fps"]): void;
2771
+ declare function persistRenderSettings(format: PersistedRenderSettings["format"], quality: PersistedRenderSettings["quality"], fps: PersistedRenderSettings["fps"], gpu?: boolean): void;
2770
2772
 
2771
2773
  interface PickedElement {
2772
2774
  id: string | null;
@@ -3590,6 +3592,7 @@ declare function useDomEditSession({ projectId, activeCompPath, compIdToSrc, cap
3590
3592
  /** The one source for which preview is on screen: the host's iframe, then each reload promoted in its place. */
3591
3593
  declare function useLivePreviewIframe(host: HTMLIFrameElement | null): HTMLIFrameElement | null;
3592
3594
 
3595
+ declare function announcePreviewDocumentLoaded(iframe: HTMLIFrameElement): void;
3593
3596
  type PreviewPromotion = {
3594
3597
  retired: HTMLIFrameElement | null;
3595
3598
  live: HTMLIFrameElement;
@@ -3842,8 +3845,8 @@ interface StudioPlaybackValue {
3842
3845
  refreshPreviewDocumentVersion: () => void;
3843
3846
  }
3844
3847
 
3845
- /** Studio state the panel reads; passed by hosts outside Studio's providers. Keep previewIframeRef stable,
3846
- * and bump refreshKey when the preview document is rebuilt without an iframe load. */
3848
+ /** Studio state the panel reads; passed by hosts outside Studio's providers. Keep previewIframeRef stable;
3849
+ * a host with its own player calls announcePreviewDocumentLoaded on each new page, or bumps refreshKey. */
3847
3850
  type LayersPanelHost = Pick<StudioShellValue, "previewIframeRef" | "activeCompPath" | "showToast"> & Pick<StudioPlaybackValue, "timelineElements" | "isPlaying"> & Partial<Pick<StudioPlaybackValue, "refreshKey" | "compositionLoading">>;
3848
3851
  declare const LayersPanel: react.NamedExoticComponent<{
3849
3852
  host?: LayersPanelHost;
@@ -4312,4 +4315,4 @@ declare function buildStudioTools(depsRef: {
4312
4315
  readonly current: StudioAgentToolsDeps;
4313
4316
  }): ModelContextTool[];
4314
4317
 
4315
- export { type AgentModalAnchorPoint, type AgentPromptElementInfo, AskAgentModal, type AskAgentModalProps, AudioMeterStrip, type AudioMeterStripProps, AudioWaveform, type AudioWaveformProps, type BlockedTimelineEditIntent, type CanEditTimelineElement, ColorField, CompositionBreadcrumb, type CompositionDimensions, type CompositionLevel, CompositionThumbnail, ConnectedDomEditOverlay, type ConnectedDomEditOverlayProps, DEFAULT_SHORTCUT_SECTIONS, Dock, type DockController, type DomEditCapabilities, type DomEditCommitDeclineReason, type DomEditCommitOutcome, type DomEditGroupPathOffsetCommit, DomEditOverlay, type DomEditOverlayProps, DomEditProvider, type DomEditSelection, type DomEditZOrder, type DomGeometryCommits, type EditHistoryHandle, EditorShell, type EditorShellProps, type ExternalFileChangeBlockedState, type ExternalFileChangeCoordinatorHandle, ExternalFileConflictBanner, type FadeEdge, type FadeHandleBox, type FadeHandleClipBox, type FfmpegStatus, FileTree, GradientField, GridOverlay, ImageThumbnail, type ImageThumbnailProps, LayersPanel, type LayersPanelHost, type LinkShortcutCallbacks, type MarqueeGestures, type MarqueeGesturesDeps, MarqueeOverlay, type MarqueeOverlayProps, type Rect$1 as MarqueeRect, type ModelContextTool, NLEPreview, type PanelId, type PatchOperation, type PersistedRenderSettings, type PickedElement, PlayerControls, type PlayerHandle, type PlayerHandleElement, type PlayerHandleListener, type PlayerHandleTimeListener, type DomEditCompositionRect as PreviewCompositionRect, PreviewGuides, PreviewOverlayProvider, type PreviewOverlayProviderProps, type PreviewPromotion, PreviewReadOnlyProvider, type PreviewSnapPreferences, PropertyPanel, type RenderJob, RenderQueue, type RenderQueueProps, type ResolutionPreset, SNAP_THRESHOLD_PX, type ShortcutHint, type ShortcutSection, ShortcutsButton, type ShortcutsButtonProps, type SnapContext, type SnapEdge, type SnapGuide, SnapGuideOverlay, type SnapGuideOverlayProps, type SnapGuidesState, type Rect as SnapRect, type SnapResult, type SnapTarget, SnapToolbar, SourceEditor, type SpacingGuide, type StartRenderOptions, type StudioAgentToolsDeps, StudioApp, StudioFileConflictError, type StudioLookSnapshot, type StudioPendingEditsDrainResult, TRACK_H, type ThumbnailPriority, type ThumbnailStill, Timeline, TimelineClipMenu, type TimelineClipMenuItem, type TimelineClipRenderContext, type TimelineEditCallbacks, type TimelineEditOutcome, type TimelineEditPermission, TimelineEditPopover, TimelineEditProvider, type TimelineElement, TimelineEmptyStatePart, TimelineFrame, TimelineGapMenu, TimelineHistoryButtons, type TimelineHistoryButtonsProps, TimelineKeyframeMenu, TimelineLanes, TimelineOverlays, TimelinePane, type TimelinePaneProps, TimelinePlayhead, TimelineProvider, TimelineRazorGuide, TimelineRuler, TimelineShortcutHint, type TimelineTheme, type TimelineTimeRange$1 as TimelineTimeRange, TimelineToolbar, type TimelineToolbarProps, type TimelineTrackPadding, type TimelineZIndexReorderCommit, type ToolResult, type UseClipboardOptions, type UseDomEditSessionParams, type UseDomGeometryCommitOptions, type UseDomStyleCommitOptions, type UseEditHistoryActionsOptions, type UsePersistentEditHistoryOptions, type UsePreviewPersistenceParams, type UseProjectFileWriterOptions, type UseRenderClipContentOptions, type UseThumbnailStillOptions, type UseTimelineEditingOptions, VideoThumbnail, type ZOrderAction, applyPatch, buildCompositionSnapTarget, buildGridSnapEdges, buildPickerAgentContextPreview, buildPickerAgentPrompt, buildStudioTools, cancelNewestStudioWaitingPress, collectSnapContext, collectStudioLookScene, currentTimelineRange, dispatchLinkShortcut, displayTrackOrder, extractSnapTargets, fadeHandleBoxes, findElementBlock, flushStudioPendingEdits, formatTime, getPersistedRenderSettings, liveTime, mergeStyleIntoTag, openAudioGainDialog, parseStyleString, persistRenderSettings, resolveDomEditSelection, resolveEquidistanceGuides, resolveGuideLineRect, resolveIframe, resolveSnapAdjustment, resolveSourceFile, revertNewestStudioPendingEdit, snapEngagedForTravel, useAudioGainDialogStore, useAudioMetersVisible, useClipboard, useCompositionStack, useDockLayoutStore, useDomEditSelectionContext, useDomEditSession, useDomEditZOrder, useDomGeometryCommit, useDomStyleCommit, useEditHistoryActions, useElementPicker, useLivePreviewIframe, useMarqueeGestures, usePersistentEditHistory, usePlayerHandle, usePlayerStore, usePreviewCompositionRect, usePreviewGuidesStore, usePreviewIframeStore, usePreviewOverlayContext, usePreviewPersistence, useProjectFileWriter, useRenderClipContent, useRenderQueue, useThumbnailStill, useTimelineContext, useTimelineEditing, useTimelinePlayer, zoomTimelineToRange };
4318
+ export { type AgentModalAnchorPoint, type AgentPromptElementInfo, AskAgentModal, type AskAgentModalProps, AudioMeterStrip, type AudioMeterStripProps, AudioWaveform, type AudioWaveformProps, type BlockedTimelineEditIntent, type CanEditTimelineElement, ColorField, CompositionBreadcrumb, type CompositionDimensions, type CompositionLevel, CompositionThumbnail, ConnectedDomEditOverlay, type ConnectedDomEditOverlayProps, DEFAULT_SHORTCUT_SECTIONS, Dock, type DockController, type DomEditCapabilities, type DomEditCommitDeclineReason, type DomEditCommitOutcome, type DomEditGroupPathOffsetCommit, DomEditOverlay, type DomEditOverlayProps, DomEditProvider, type DomEditSelection, type DomEditZOrder, type DomGeometryCommits, type EditHistoryHandle, EditorShell, type EditorShellProps, type ExternalFileChangeBlockedState, type ExternalFileChangeCoordinatorHandle, ExternalFileConflictBanner, type FadeEdge, type FadeHandleBox, type FadeHandleClipBox, type FfmpegStatus, FileTree, GradientField, GridOverlay, ImageThumbnail, type ImageThumbnailProps, LayersPanel, type LayersPanelHost, type LinkShortcutCallbacks, type MarqueeGestures, type MarqueeGesturesDeps, MarqueeOverlay, type MarqueeOverlayProps, type Rect$1 as MarqueeRect, type ModelContextTool, NLEPreview, type PanelId, type PatchOperation, type PersistedRenderSettings, type PickedElement, PlayerControls, type PlayerHandle, type PlayerHandleElement, type PlayerHandleListener, type PlayerHandleTimeListener, type DomEditCompositionRect as PreviewCompositionRect, PreviewGuides, PreviewOverlayProvider, type PreviewOverlayProviderProps, type PreviewPromotion, PreviewReadOnlyProvider, type PreviewSnapPreferences, PropertyPanel, type RenderJob, RenderQueue, type RenderQueueProps, type ResolutionPreset, SNAP_THRESHOLD_PX, type ShortcutHint, type ShortcutSection, ShortcutsButton, type ShortcutsButtonProps, type SnapContext, type SnapEdge, type SnapGuide, SnapGuideOverlay, type SnapGuideOverlayProps, type SnapGuidesState, type Rect as SnapRect, type SnapResult, type SnapTarget, SnapToolbar, SourceEditor, type SpacingGuide, type StartRenderOptions, type StudioAgentToolsDeps, StudioApp, StudioFileConflictError, type StudioLookSnapshot, type StudioPendingEditsDrainResult, TRACK_H, type ThumbnailPriority, type ThumbnailStill, Timeline, TimelineClipMenu, type TimelineClipMenuItem, type TimelineClipRenderContext, type TimelineEditCallbacks, type TimelineEditOutcome, type TimelineEditPermission, TimelineEditPopover, TimelineEditProvider, type TimelineElement, TimelineEmptyStatePart, TimelineFrame, TimelineGapMenu, TimelineHistoryButtons, type TimelineHistoryButtonsProps, TimelineKeyframeMenu, TimelineLanes, TimelineOverlays, TimelinePane, type TimelinePaneProps, TimelinePlayhead, TimelineProvider, TimelineRazorGuide, TimelineRuler, TimelineShortcutHint, type TimelineTheme, type TimelineTimeRange$1 as TimelineTimeRange, TimelineToolbar, type TimelineToolbarProps, type TimelineTrackPadding, type TimelineZIndexReorderCommit, type ToolResult, type UseClipboardOptions, type UseDomEditSessionParams, type UseDomGeometryCommitOptions, type UseDomStyleCommitOptions, type UseEditHistoryActionsOptions, type UsePersistentEditHistoryOptions, type UsePreviewPersistenceParams, type UseProjectFileWriterOptions, type UseRenderClipContentOptions, type UseThumbnailStillOptions, type UseTimelineEditingOptions, VideoThumbnail, type ZOrderAction, announcePreviewDocumentLoaded, applyPatch, buildCompositionSnapTarget, buildGridSnapEdges, buildPickerAgentContextPreview, buildPickerAgentPrompt, buildStudioTools, cancelNewestStudioWaitingPress, collectSnapContext, collectStudioLookScene, currentTimelineRange, dispatchLinkShortcut, displayTrackOrder, extractSnapTargets, fadeHandleBoxes, findElementBlock, flushStudioPendingEdits, formatTime, getPersistedRenderSettings, liveTime, mergeStyleIntoTag, openAudioGainDialog, parseStyleString, persistRenderSettings, resolveDomEditSelection, resolveEquidistanceGuides, resolveGuideLineRect, resolveIframe, resolveSnapAdjustment, resolveSourceFile, revertNewestStudioPendingEdit, snapEngagedForTravel, useAudioGainDialogStore, useAudioMetersVisible, useClipboard, useCompositionStack, useDockLayoutStore, useDomEditSelectionContext, useDomEditSession, useDomEditZOrder, useDomGeometryCommit, useDomStyleCommit, useEditHistoryActions, useElementPicker, useLivePreviewIframe, useMarqueeGestures, usePersistentEditHistory, usePlayerHandle, usePlayerStore, usePreviewCompositionRect, usePreviewGuidesStore, usePreviewIframeStore, usePreviewOverlayContext, usePreviewPersistence, useProjectFileWriter, useRenderClipContent, useRenderQueue, useThumbnailStill, useTimelineContext, useTimelineEditing, useTimelinePlayer, zoomTimelineToRange };
@@ -14,7 +14,7 @@
14
14
  document.documentElement.dataset.theme = "paper";
15
15
  }
16
16
  </script>
17
- <script type="module" crossorigin src="/assets/index-J7jpL4pj.js"></script>
17
+ <script type="module" crossorigin src="/assets/index-D8W0a0Z9.js"></script>
18
18
  <link rel="stylesheet" crossorigin href="/assets/index-CVd4O6eH.css">
19
19
  </head>
20
20
  <body>