@hyperframes/studio 0.8.144 → 0.8.146

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/assets/{hyperframes-player-Bw_jIaSX.js → hyperframes-player-tkxyWf5H.js} +3 -3
  2. package/dist/assets/{index-Cj7W_c7p.js → index-BrdqOkqP.js} +1 -1
  3. package/dist/assets/{index-BVM9NuWl.js → index-Cg48BxAo.js} +145 -145
  4. package/dist/assets/{index-DyH9dT7b.js → index-Dllxg4aU.js} +1 -1
  5. package/dist/{chunk-EEXSYY5F.js → chunk-C5BDT7NG.js} +0 -1
  6. package/dist/{chunk-PEAKCOUW.js → chunk-HZDCMUG4.js} +2 -100
  7. package/dist/{chunk-PZ5AY32C.js → chunk-MLKGABMK.js} +0 -1
  8. package/dist/{chunk-G3EDKRZH.js → chunk-PHGBG7OG.js} +100 -5
  9. package/dist/{chunk-Y2OHHNM2.js → chunk-PVFBY7KR.js} +0 -1
  10. package/dist/{chunk-3GHTHPZD.js → chunk-T43DM7Q6.js} +101 -3
  11. package/dist/{domEditingLayers-PYST4G45.js → domEditingLayers-SMVA3FEW.js} +3 -4
  12. package/dist/index.css +0 -1
  13. package/dist/index.d.ts +8 -5
  14. package/dist/index.html +1 -1
  15. package/dist/index.js +509 -529
  16. package/dist/player.js +4 -5
  17. package/dist/styles/tailwind-preset.js +1 -2
  18. package/dist/ui.js +3 -4
  19. package/package.json +8 -8
  20. package/src/captions/components/CaptionOverlay.tsx +1 -1
  21. package/src/captions/hooks/useCaptionSync.ts +1 -1
  22. package/src/components/LinkedSelectionToggle.tsx +2 -2
  23. package/src/components/LintModal.tsx +1 -5
  24. package/src/components/MediaPreview.tsx +2 -2
  25. package/src/components/ProjectUnreachableBanner.tsx +1 -1
  26. package/src/components/StudioLeftPanels.tsx +2 -2
  27. package/src/components/StudioRightPanels.tsx +1 -1
  28. package/src/components/TimelineToolbar.test.tsx +2 -2
  29. package/src/components/TimelineToolbar.tsx +6 -6
  30. package/src/components/editor/AnimationCard.tsx +3 -3
  31. package/src/components/editor/AnimationCardParts.tsx +1 -1
  32. package/src/components/editor/BlockParamsPanel.tsx +3 -3
  33. package/src/components/editor/ComputedTweenNotice.tsx +2 -2
  34. package/src/components/editor/FileTree.tsx +1 -1
  35. package/src/components/editor/GsapAnimationList.tsx +1 -1
  36. package/src/components/editor/GsapAnimationSection.tsx +2 -2
  37. package/src/components/editor/LayersPanel.test.ts +4 -4
  38. package/src/components/editor/LayersPanel.tsx +2 -2
  39. package/src/components/editor/OffCanvasIndicators.tsx +1 -1
  40. package/src/components/editor/PromotableControl.tsx +1 -1
  41. package/src/components/editor/PropertyPanel.tsx +2 -2
  42. package/src/components/editor/SnapToolbar.tsx +2 -2
  43. package/src/components/editor/TopologyLens.test.tsx +5 -4
  44. package/src/components/editor/Transform3DCube.tsx +1 -1
  45. package/src/components/editor/gsapAnimationConstants.ts +2 -2
  46. package/src/components/editor/gsapAnimationHelpers.test.ts +1 -1
  47. package/src/components/editor/gsapAnimationHelpers.ts +1 -1
  48. package/src/components/editor/propertyPanelColorGradingControls.tsx +1 -1
  49. package/src/components/editor/propertyPanelFill.tsx +1 -1
  50. package/src/components/editor/propertyPanelFlatMotionSection.tsx +3 -3
  51. package/src/components/editor/propertyPanelFlatPrimitives.tsx +2 -2
  52. package/src/components/editor/propertyPanelFlatSelectRow.tsx +1 -1
  53. package/src/components/editor/propertyPanelFlatTextSection.tsx +1 -1
  54. package/src/components/editor/propertyPanelFont.tsx +3 -3
  55. package/src/components/editor/propertyPanelFxBandRuler.tsx +2 -2
  56. package/src/components/editor/propertyPanelFxNodeOpenBody.tsx +2 -2
  57. package/src/components/editor/propertyPanelTimingSection.tsx +1 -1
  58. package/src/components/editor/propertyPanelTransformCommit.ts +3 -3
  59. package/src/components/editor/useColorGradingController.ts +1 -1
  60. package/src/components/panels/SlideshowSubPanels.tsx +2 -2
  61. package/src/components/panels/VariablesBindElement.tsx +1 -1
  62. package/src/components/panels/VariablesPanel.tsx +3 -3
  63. package/src/components/renders/GpuEncodingToggle.tsx +28 -0
  64. package/src/components/renders/RenderQueue.test.tsx +20 -2
  65. package/src/components/renders/RenderQueue.tsx +15 -3
  66. package/src/components/renders/RenderQueuePanel.tsx +2 -1
  67. package/src/components/renders/renderSettings.ts +5 -2
  68. package/src/components/renders/useRenderQueue.ts +6 -3
  69. package/src/components/renders/useRenderQueueComposition.test.tsx +12 -0
  70. package/src/components/sidebar/AssetCard.tsx +2 -2
  71. package/src/components/sidebar/AudioRow.tsx +1 -1
  72. package/src/components/sidebar/BlocksTab.tsx +2 -2
  73. package/src/components/sidebar/CompositionsTab.tsx +2 -2
  74. package/src/components/sidebar/PromptPreviewModal.tsx +1 -1
  75. package/src/hooks/timelineAudioGroupCreate.ts +1 -1
  76. package/src/hooks/timelineEditingHelpers.ts +1 -1
  77. package/src/hooks/useBlockHandlers.ts +1 -1
  78. package/src/hooks/useConsoleErrorCapture.test.tsx +21 -2
  79. package/src/hooks/useConsoleErrorCapture.ts +3 -2
  80. package/src/hooks/useDomEditSession.ts +1 -1
  81. package/src/hooks/useEditorSave.ts +1 -1
  82. package/src/hooks/useFrameCapture.ts +1 -1
  83. package/src/hooks/useGestureCommit.ts +4 -4
  84. package/src/hooks/useGsapScriptCommits.ts +1 -1
  85. package/src/index.ts +1 -0
  86. package/src/player/components/AudioGainDialog.test.tsx +1 -1
  87. package/src/player/components/AudioGainDialog.tsx +2 -1
  88. package/src/player/components/EditModal.tsx +2 -2
  89. package/src/player/components/KeyframeDiamondContextMenu.tsx +1 -1
  90. package/src/player/components/OutOfSyncBadge.tsx +1 -1
  91. package/src/player/components/Player.test.ts +44 -0
  92. package/src/player/components/Player.tsx +12 -1
  93. package/src/player/components/ShortcutsPanel.tsx +2 -2
  94. package/src/player/components/Timeline.virtualization.test.tsx +1 -1
  95. package/src/player/components/TimelineAutomationLaneSlot.tsx +1 -1
  96. package/src/player/components/TimelineClip.tsx +1 -1
  97. package/src/player/components/TimelineFxButton.tsx +2 -2
  98. package/src/player/components/TimelineTrackHeader.test.tsx +3 -3
  99. package/src/player/components/timelineClipDragCommit.ts +2 -2
  100. package/src/player/components/trackHeaderLabelRows.tsx +1 -1
  101. package/src/player/lib/playbackAdapter.ts +1 -1
  102. package/src/player/lib/playbackTypes.ts +1 -0
  103. package/src/player/sceneSwap.test.ts +27 -1
  104. package/src/player/sceneSwap.ts +16 -2
  105. package/src/utils/hmrStableContext.ts +1 -1
  106. package/src/utils/razorSplitTransaction.ts +0 -2
  107. package/src/utils/sdkCutover.linkedTiming.test.ts +1 -1
  108. package/dist/chunk-3GHTHPZD.js.map +0 -1
  109. package/dist/chunk-EEXSYY5F.js.map +0 -1
  110. package/dist/chunk-G3EDKRZH.js.map +0 -1
  111. package/dist/chunk-PEAKCOUW.js.map +0 -1
  112. package/dist/chunk-PZ5AY32C.js.map +0 -1
  113. package/dist/chunk-Y2OHHNM2.js.map +0 -1
  114. package/dist/domEditingLayers-PYST4G45.js.map +0 -1
  115. package/dist/index.css.map +0 -1
  116. package/dist/index.js.map +0 -1
  117. package/dist/player.js.map +0 -1
  118. package/dist/styles/tailwind-preset.js.map +0 -1
  119. package/dist/ui.js.map +0 -1
@@ -1 +1 @@
1
- import{h as P}from"./index-BVM9NuWl.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var h=e[o+x]-t,_=r.some(function(g){if(g.interval===h)return g.count+=1});_||r.push({interval:h,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
1
+ import{h as P}from"./index-Cg48BxAo.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var h=e[o+x]-t,_=r.some(function(g){if(g.interval===h)return g.count+=1});_||r.push({interval:h,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
@@ -187,4 +187,3 @@ function HyperframesLogo() {
187
187
  export {
188
188
  HyperframesLogo
189
189
  };
190
- //# sourceMappingURL=chunk-EEXSYY5F.js.map
@@ -17,103 +17,13 @@ import {
17
17
  normalizeTimelineCompositionSource,
18
18
  parsePx,
19
19
  querySelectorAllSafely,
20
+ studioApiFetch,
20
21
  withSelectorIndexPass
21
- } from "./chunk-3GHTHPZD.js";
22
- import {
23
- __export
24
- } from "./chunk-PZ5AY32C.js";
22
+ } from "./chunk-T43DM7Q6.js";
25
23
 
26
24
  // src/components/editor/domEditingLayers.ts
27
25
  import { PREVIEW_ONLY_ATTRS } from "@hyperframes/core/studio-preview-mark";
28
26
 
29
- // src/components/editor/manualEditingAvailability.ts
30
- var manualEditingAvailability_exports = {};
31
- __export(manualEditingAvailability_exports, {
32
- STUDIO_API_SAME_ORIGIN_CREDENTIALS: () => STUDIO_API_SAME_ORIGIN_CREDENTIALS,
33
- STUDIO_FLAT_INSPECTOR_ENABLED: () => STUDIO_FLAT_INSPECTOR_ENABLED,
34
- STUDIO_SDK_CUTOVER_ENABLED: () => STUDIO_SDK_CUTOVER_ENABLED,
35
- STUDIO_SDK_CUTOVER_FAMILIES: () => STUDIO_SDK_CUTOVER_FAMILIES,
36
- STUDIO_SDK_RESOLVER_SHADOW_ENABLED: () => STUDIO_SDK_RESOLVER_SHADOW_ENABLED,
37
- resolveStudioBooleanEnvFlag: () => resolveStudioBooleanEnvFlag
38
- });
39
-
40
- // src/utils/sdkCutoverPolicy.ts
41
- var STUDIO_SDK_OPERATION_FAMILIES = [
42
- "dom",
43
- "timing",
44
- "gsap-animation",
45
- "gsap-keyframe",
46
- "lifecycle"
47
- ];
48
- function resolveEnabledSdkFamilies(env2, masterEnabled) {
49
- if (!masterEnabled) return /* @__PURE__ */ new Set();
50
- const raw = env2["VITE_STUDIO_SDK_CUTOVER_FAMILIES"];
51
- if (typeof raw !== "string" || raw.trim() === "") return new Set(STUDIO_SDK_OPERATION_FAMILIES);
52
- const requested = raw.split(",").map((family) => family.trim()).filter(Boolean);
53
- const known = new Set(STUDIO_SDK_OPERATION_FAMILIES);
54
- const unknown = requested.filter((family) => !known.has(family));
55
- if (unknown.length > 0) {
56
- throw new Error(`Unknown Studio SDK cutover families: ${unknown.join(", ")}`);
57
- }
58
- return new Set(requested);
59
- }
60
- function isSdkFamilyEnabled(masterEnabled, configured, family) {
61
- return masterEnabled && (configured?.has(family) ?? true);
62
- }
63
-
64
- // src/components/editor/manualEditingAvailability.ts
65
- var TRUTHY_ENV_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on", "enabled"]);
66
- var FALSY_ENV_VALUES = /* @__PURE__ */ new Set(["0", "false", "no", "off", "disabled"]);
67
- function resolveStudioBooleanEnvFlag(env2, names, fallback) {
68
- for (const name of names) {
69
- const value = env2[name];
70
- if (typeof value === "boolean") return value;
71
- if (typeof value !== "string") continue;
72
- const normalized = value.trim().toLowerCase();
73
- if (!normalized) continue;
74
- if (TRUTHY_ENV_VALUES.has(normalized)) return true;
75
- if (FALSY_ENV_VALUES.has(normalized)) return false;
76
- }
77
- return fallback;
78
- }
79
- var runtimeEnv = typeof window !== "undefined" ? window.__HF_STUDIO_ENV__ ?? {} : {};
80
- var env = { ...import.meta.env ?? {}, ...runtimeEnv };
81
- var STUDIO_SDK_CUTOVER_ENABLED = resolveStudioBooleanEnvFlag(
82
- env,
83
- ["VITE_STUDIO_SDK_CUTOVER_ENABLED"],
84
- true
85
- );
86
- var STUDIO_SDK_CUTOVER_FAMILIES = resolveEnabledSdkFamilies(
87
- env,
88
- STUDIO_SDK_CUTOVER_ENABLED
89
- );
90
- var STUDIO_SDK_RESOLVER_SHADOW_ENABLED = resolveStudioBooleanEnvFlag(
91
- env,
92
- ["VITE_STUDIO_SDK_RESOLVER_SHADOW_ENABLED"],
93
- true
94
- );
95
- var STUDIO_FLAT_INSPECTOR_ENABLED = resolveStudioBooleanEnvFlag(
96
- env,
97
- ["VITE_STUDIO_ENABLE_FLAT_INSPECTOR", "VITE_STUDIO_FLAT_INSPECTOR_ENABLED"],
98
- true
99
- );
100
- var STUDIO_API_SAME_ORIGIN_CREDENTIALS = resolveStudioBooleanEnvFlag(
101
- env,
102
- ["VITE_STUDIO_API_SAME_ORIGIN_CREDENTIALS"],
103
- false
104
- );
105
-
106
- // src/utils/studioApiFetch.ts
107
- var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "[::1]"]);
108
- function studioApiCredentials() {
109
- if (STUDIO_API_SAME_ORIGIN_CREDENTIALS) return "same-origin";
110
- const host = globalThis.location?.hostname;
111
- return !host || LOOPBACK_HOSTS.has(host) ? "omit" : "same-origin";
112
- }
113
- function studioApiFetch(input, init) {
114
- return globalThis.fetch(input, { ...init, credentials: studioApiCredentials() });
115
- }
116
-
117
27
  // src/components/editor/probeSourceElement.ts
118
28
  function knownSourceAnswer(previous, element, sourceFile, target) {
119
29
  if (!previous || previous.element !== element || previous.sourceFile !== sourceFile) return;
@@ -902,13 +812,6 @@ function buildDomEditPatchTarget(selection) {
902
812
  }
903
813
 
904
814
  export {
905
- isSdkFamilyEnabled,
906
- STUDIO_SDK_CUTOVER_ENABLED,
907
- STUDIO_SDK_CUTOVER_FAMILIES,
908
- STUDIO_SDK_RESOLVER_SHADOW_ENABLED,
909
- STUDIO_FLAT_INSPECTOR_ENABLED,
910
- manualEditingAvailability_exports,
911
- studioApiFetch,
912
815
  isElementComputedVisible,
913
816
  getDomLayerPatchTarget,
914
817
  resolveAllVisualDomEditTargets,
@@ -939,4 +842,3 @@ export {
939
842
  readHfId,
940
843
  buildDomEditPatchTarget
941
844
  };
942
- //# sourceMappingURL=chunk-PEAKCOUW.js.map
@@ -7,4 +7,3 @@ var __export = (target, all) => {
7
7
  export {
8
8
  __export
9
9
  };
10
- //# sourceMappingURL=chunk-PZ5AY32C.js.map
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  HyperframesLoader
3
- } from "./chunk-Y2OHHNM2.js";
3
+ } from "./chunk-PVFBY7KR.js";
4
4
  import {
5
5
  buildProjectApiPath,
6
- splitTimelineElementKey
7
- } from "./chunk-3GHTHPZD.js";
6
+ splitTimelineElementKey,
7
+ studioApiFetch
8
+ } from "./chunk-T43DM7Q6.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);
@@ -1171,7 +1260,7 @@ var Player = forwardRef(
1171
1260
  if (!lastUnloaded || attempts > 100) {
1172
1261
  if (lastUnloaded && attempts > 100) {
1173
1262
  console.debug(
1174
- "[studio] asset readiness poll hit the 10s cap \u2014 continuing with unloaded assets"
1263
+ "[studio] asset readiness poll hit the 10s cap, continuing with unloaded assets"
1175
1264
  );
1176
1265
  }
1177
1266
  if (assetPollRef.current) clearInterval(assetPollRef.current);
@@ -1437,6 +1526,12 @@ 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-G3EDKRZH.js.map
@@ -967,4 +967,3 @@ export {
967
967
  Slider,
968
968
  Toggle
969
969
  };
970
- //# sourceMappingURL=chunk-Y2OHHNM2.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-MLKGABMK.js";
4
+
1
5
  // src/utils/sourceScopedSelectorIndex.ts
2
6
  var activePass = null;
3
7
  function withSelectorIndexPass(doc, run) {
@@ -615,7 +619,7 @@ function resolveStaticSeekFallback(opts) {
615
619
  if (!warned.current) {
616
620
  warned.current = true;
617
621
  console.warn(
618
- `[useTimelinePlayer] Selected adapter duration (${getAdapterDuration(bestAdapter)}s) does not cover the document duration (${docDuration}s); falling back to seek-driven playback, which never starts media elements or WebAudio. Audio will not play in preview \u2014 extend the GSAP timeline to cover the declared data-duration.`
622
+ `[useTimelinePlayer] Selected adapter duration (${getAdapterDuration(bestAdapter)}s) does not cover the document duration (${docDuration}s); falling back to seek-driven playback, which never starts media elements or WebAudio. Audio will not play in preview. Extend the GSAP timeline to cover the declared data-duration.`
619
623
  );
620
624
  }
621
625
  const adapter = createStaticSeekPlaybackAdapter(
@@ -1032,6 +1036,94 @@ function buildProjectApiPath(projectId, suffix = "") {
1032
1036
  return `/api/projects/${encodeProjectId(projectId)}${normalizedSuffix}`;
1033
1037
  }
1034
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
+
1035
1127
  export {
1036
1128
  buildProjectHash,
1037
1129
  parseProjectHashRoute,
@@ -1100,6 +1192,12 @@ export {
1100
1192
  deriveTimelineStoreKeyForDomId,
1101
1193
  previewElementFinder,
1102
1194
  findClipElementById,
1103
- 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
1104
1203
  };
1105
- //# sourceMappingURL=chunk-3GHTHPZD.js.map
@@ -19,9 +19,9 @@ import {
19
19
  resolveDomEditCapabilities,
20
20
  resolveDomEditSelection,
21
21
  serializeDomEditTextFields
22
- } from "./chunk-PEAKCOUW.js";
23
- import "./chunk-3GHTHPZD.js";
24
- import "./chunk-PZ5AY32C.js";
22
+ } from "./chunk-HZDCMUG4.js";
23
+ import "./chunk-T43DM7Q6.js";
24
+ import "./chunk-MLKGABMK.js";
25
25
  export {
26
26
  buildDefaultDomEditTextField,
27
27
  buildDomEditPatchTarget,
@@ -44,4 +44,3 @@ export {
44
44
  resolveDomEditSelection,
45
45
  serializeDomEditTextFields
46
46
  };
47
- //# sourceMappingURL=domEditingLayers-PYST4G45.js.map
package/dist/index.css CHANGED
@@ -162,4 +162,3 @@
162
162
  animation: none;
163
163
  }
164
164
  }
165
- /*# sourceMappingURL=index.css.map */
package/dist/index.d.ts CHANGED
@@ -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 };
package/dist/index.html CHANGED
@@ -14,7 +14,7 @@
14
14
  document.documentElement.dataset.theme = "paper";
15
15
  }
16
16
  </script>
17
- <script type="module" crossorigin src="/assets/index-BVM9NuWl.js"></script>
17
+ <script type="module" crossorigin src="/assets/index-Cg48BxAo.js"></script>
18
18
  <link rel="stylesheet" crossorigin href="/assets/index-CVd4O6eH.css">
19
19
  </head>
20
20
  <body>