remotion 4.0.534 → 4.0.536
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.
- package/README.md +1 -1
- package/dist/cjs/AbsoluteFill.d.ts +2 -7
- package/dist/cjs/AbsoluteFill.js +1 -1
- package/dist/cjs/Composition.js +15 -20
- package/dist/cjs/CompositionManager.d.ts +0 -4
- package/dist/cjs/CompositionManagerContext.d.ts +1 -6
- package/dist/cjs/CompositionManagerContext.js +0 -4
- package/dist/cjs/CompositionManagerProvider.js +77 -169
- package/dist/cjs/CompositionRegistryProvider.d.ts +5 -0
- package/dist/cjs/CompositionRegistryProvider.js +142 -0
- package/dist/cjs/DefaultPremountContext.d.ts +1 -0
- package/dist/cjs/DefaultPremountContext.js +6 -0
- package/dist/cjs/Folder.js +11 -20
- package/dist/cjs/HtmlInCanvas.d.ts +6 -4
- package/dist/cjs/HtmlInCanvas.js +179 -32
- package/dist/cjs/IFrame.js +40 -8
- package/dist/cjs/Img.d.ts +4 -2
- package/dist/cjs/Img.js +4 -3
- package/dist/cjs/Interactive.d.ts +31 -5
- package/dist/cjs/Interactive.js +40 -8
- package/dist/cjs/RemotionRoot.js +2 -1
- package/dist/cjs/Sequence.d.ts +2 -3
- package/dist/cjs/Sequence.js +117 -39
- package/dist/cjs/SequenceActivityBoundary.d.ts +10 -0
- package/dist/cjs/SequenceActivityBoundary.js +101 -0
- package/dist/cjs/SequenceActivityBudget.d.ts +13 -0
- package/dist/cjs/SequenceActivityBudget.js +196 -0
- package/dist/cjs/SequenceActivitySuspensionProvider.d.ts +4 -0
- package/dist/cjs/SequenceActivitySuspensionProvider.js +45 -0
- package/dist/cjs/SequenceManager.d.ts +9 -22
- package/dist/cjs/SequenceManager.js +54 -196
- package/dist/cjs/SequenceRegistryProvider.d.ts +4 -0
- package/dist/cjs/SequenceRegistryProvider.js +292 -0
- package/dist/cjs/Track.d.ts +10 -3
- package/dist/cjs/Track.js +8 -8
- package/dist/cjs/animated-image/AnimatedImage.d.ts +3 -2
- package/dist/cjs/animated-image/AnimatedImage.js +47 -34
- package/dist/cjs/animated-image/canvas.d.ts +2 -1
- package/dist/cjs/animated-image/canvas.js +2 -2
- package/dist/cjs/animated-image/props.d.ts +2 -1
- package/dist/cjs/asset-types.d.ts +4 -0
- package/dist/cjs/audio/AudioForPreview.js +54 -41
- package/dist/cjs/audio/get-audio-sync-anchor-tolerance.d.ts +1 -0
- package/dist/cjs/audio/get-audio-sync-anchor-tolerance.js +11 -0
- package/dist/cjs/audio/shared-audio-tags.d.ts +1 -1
- package/dist/cjs/audio/shared-audio-tags.js +1 -1
- package/dist/cjs/audio/use-audio-context.js +26 -7
- package/dist/cjs/canvas-image/CanvasImage.d.ts +3 -2
- package/dist/cjs/canvas-image/CanvasImage.js +5 -4
- package/dist/cjs/canvas-image/props.d.ts +2 -1
- package/dist/cjs/committed-metadata.d.ts +68 -0
- package/dist/cjs/committed-metadata.js +39 -0
- package/dist/cjs/component-identity.d.ts +6 -0
- package/dist/cjs/component-identity.js +39 -0
- package/dist/cjs/composition-registry-fallback.d.ts +14 -0
- package/dist/cjs/composition-registry-fallback.js +35 -0
- package/dist/cjs/create-element-source-proxy.d.ts +4 -0
- package/dist/cjs/create-element-source-proxy.js +46 -0
- package/dist/cjs/default-premount-in-seconds.d.ts +3 -0
- package/dist/cjs/default-premount-in-seconds.js +12 -0
- package/dist/cjs/effects/Solid.d.ts +3 -2
- package/dist/cjs/effects/Solid.js +5 -4
- package/dist/cjs/effects/canvas-pool.d.ts +1 -0
- package/dist/cjs/effects/canvas-pool.js +15 -10
- package/dist/cjs/effects/effect-types.d.ts +4 -0
- package/dist/cjs/effects/index.d.ts +1 -1
- package/dist/cjs/effects/run-effect-chain.d.ts +3 -1
- package/dist/cjs/effects/run-effect-chain.js +94 -56
- package/dist/cjs/effects/use-effect-chain-state.d.ts +2 -1
- package/dist/cjs/effects/use-effect-chain-state.js +11 -2
- package/dist/cjs/effects/use-memoized-effects.js +96 -17
- package/dist/cjs/enable-sequence-stack-traces.d.ts +2 -8
- package/dist/cjs/enable-sequence-stack-traces.js +7 -38
- package/dist/cjs/freeze.js +4 -1
- package/dist/cjs/index.d.ts +1 -3
- package/dist/cjs/index.js +0 -2
- package/dist/cjs/interactivity-schema.d.ts +50 -14
- package/dist/cjs/interactivity-schema.js +32 -4
- package/dist/cjs/internals.d.ts +110 -33
- package/dist/cjs/internals.js +29 -8
- package/dist/cjs/interpolate-keyframed-status.d.ts +4 -0
- package/dist/cjs/interpolate-keyframed-status.js +38 -1
- package/dist/cjs/interpolate.d.ts +12 -0
- package/dist/cjs/interpolate.js +15 -1
- package/dist/cjs/no-react.d.ts +5 -1
- package/dist/cjs/no-react.js +6 -0
- package/dist/cjs/optimistic-sequence-deletion.d.ts +17 -0
- package/dist/cjs/optimistic-sequence-deletion.js +114 -0
- package/dist/cjs/registry-store.d.ts +17 -0
- package/dist/cjs/registry-store.js +68 -0
- package/dist/cjs/sequence-activity-context.d.ts +13 -0
- package/dist/cjs/sequence-activity-context.js +21 -0
- package/dist/cjs/sequence-activity-defaults.d.ts +1 -0
- package/dist/cjs/sequence-activity-defaults.js +4 -0
- package/dist/cjs/sequence-outline.js +1 -2
- package/dist/cjs/sequence-registry-context.d.ts +26 -0
- package/dist/cjs/sequence-registry-context.js +71 -0
- package/dist/cjs/series/index.d.ts +2 -1
- package/dist/cjs/series/index.js +12 -4
- package/dist/cjs/timeline-position-state.js +11 -3
- package/dist/cjs/timeline-track-context.d.ts +1 -1
- package/dist/cjs/timeline-track-context.js +1 -2
- package/dist/cjs/use-lazy-component.js +29 -15
- package/dist/cjs/use-media-in-timeline.d.ts +7 -14
- package/dist/cjs/use-media-in-timeline.js +15 -117
- package/dist/cjs/use-premounting.js +3 -4
- package/dist/cjs/use-schema.js +3 -1
- package/dist/cjs/use-sequence-registration.d.ts +1 -1
- package/dist/cjs/use-sequence-registration.js +22 -6
- package/dist/cjs/use-timeline-seek.d.ts +1 -0
- package/dist/cjs/use-timeline-seek.js +10 -0
- package/dist/cjs/use-video.d.ts +7 -2
- package/dist/cjs/use-video.js +11 -3
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/video/VideoForPreview.js +55 -42
- package/dist/cjs/video/seek-until-right.js +11 -7
- package/dist/cjs/with-interactivity-schema.js +40 -14
- package/dist/cjs/wrap-remotion-context.d.ts +15 -3
- package/dist/cjs/wrap-remotion-context.js +101 -7
- package/dist/esm/index.mjs +3562 -2347
- package/dist/esm/no-react.mjs +74 -37
- package/dist/esm/version.mjs +1 -1
- package/package.json +2 -2
- package/dist/cjs/nonce.d.ts +0 -11
- package/dist/cjs/nonce.js +0 -42
- package/dist/cjs/sequence-order-marker.d.ts +0 -58
- package/dist/cjs/sequence-order-marker.js +0 -44
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SequenceActivityBoundary = exports.SequenceActivityContent = void 0;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
const sequence_activity_context_js_1 = require("./sequence-activity-context.js");
|
|
40
|
+
const TimelineContext_js_1 = require("./TimelineContext.js");
|
|
41
|
+
const use_video_config_js_1 = require("./use-video-config.js");
|
|
42
|
+
// Resume through the context update, never through a wakeable callback. React
|
|
43
|
+
// 19.2 can retry an already unmounted Activity with a null Offscreen stateNode.
|
|
44
|
+
// Do not retain retry callbacks either: this token is shared by all activities.
|
|
45
|
+
const suspendedActivity = { then: () => undefined };
|
|
46
|
+
const SuspendSequenceActivity = ({ children, dormant }) => {
|
|
47
|
+
const suspended = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivitySuspensionContext);
|
|
48
|
+
if (dormant && suspended) {
|
|
49
|
+
// The hidden Activity retains its last committed children when suspended,
|
|
50
|
+
// including the metadata used by Studio's timeline registry.
|
|
51
|
+
throw suspendedActivity;
|
|
52
|
+
}
|
|
53
|
+
return children;
|
|
54
|
+
};
|
|
55
|
+
const areActivityChildrenEqual = (previous, next) => {
|
|
56
|
+
if (Object.is(previous, next)) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (Array.isArray(previous) && Array.isArray(next)) {
|
|
60
|
+
return (previous.length === next.length &&
|
|
61
|
+
previous.every((child, index) => areActivityChildrenEqual(child, next[index])));
|
|
62
|
+
}
|
|
63
|
+
if (!react_1.default.isValidElement(previous) ||
|
|
64
|
+
!react_1.default.isValidElement(next) ||
|
|
65
|
+
previous.type !== next.type ||
|
|
66
|
+
previous.key !== next.key) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const keys = Object.keys(previous.props);
|
|
70
|
+
return (keys.length === Object.keys(next.props).length &&
|
|
71
|
+
keys.every((key) => Object.prototype.hasOwnProperty.call(next.props, key) &&
|
|
72
|
+
(key === 'children'
|
|
73
|
+
? areActivityChildrenEqual(previous.props.children, next.props.children)
|
|
74
|
+
: Object.is(previous.props[key], next.props[key]))));
|
|
75
|
+
};
|
|
76
|
+
// Parent frame subscriptions often recreate unchanged JSX. Compare element
|
|
77
|
+
// structure and all props instead of ignoring changes to dormant scene props.
|
|
78
|
+
exports.SequenceActivityContent = react_1.default.memo(({ children }) => children, (previous, next) => previous.dormant &&
|
|
79
|
+
next.dormant &&
|
|
80
|
+
areActivityChildrenEqual(previous.children, next.children));
|
|
81
|
+
const SequenceActivityBoundary = ({ children, dormant, frame }) => {
|
|
82
|
+
const parentDormant = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivityDormantContext);
|
|
83
|
+
const timeline = (0, react_1.useContext)(parentDormant ? sequence_activity_context_js_1.SequenceActivityTimelineContext : TimelineContext_js_1.TimelineContext);
|
|
84
|
+
const absoluteTime = (0, react_1.useContext)(parentDormant ? sequence_activity_context_js_1.SequenceActivityAbsoluteTimeContext : TimelineContext_js_1.AbsoluteTimeContext);
|
|
85
|
+
const { id } = (0, use_video_config_js_1.useVideoConfig)();
|
|
86
|
+
if (timeline === null) {
|
|
87
|
+
throw new Error('TimelineContext is missing');
|
|
88
|
+
}
|
|
89
|
+
const { audioAndVideoTags } = timeline;
|
|
90
|
+
const dormantTimeline = (0, react_1.useMemo)(() => ({
|
|
91
|
+
frame: { [id]: frame },
|
|
92
|
+
isPlaying: () => false,
|
|
93
|
+
isInsideFreeze: true,
|
|
94
|
+
audioAndVideoTags,
|
|
95
|
+
}), [audioAndVideoTags, frame, id]);
|
|
96
|
+
// Keep the providers and Activity at the same position when activating a
|
|
97
|
+
// scene. Unlike Freeze, discovery does not reset SequenceContext origins or
|
|
98
|
+
// disable Series duration inference.
|
|
99
|
+
return (jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivityDormantContext.Provider, { value: dormant, children: jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivityTimelineContext.Provider, { value: dormant ? dormantTimeline : null, children: jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivityAbsoluteTimeContext.Provider, { value: dormant ? dormantTimeline : null, children: jsx_runtime_1.jsx(TimelineContext_js_1.TimelineContext.Provider, { value: dormant ? dormantTimeline : timeline, children: jsx_runtime_1.jsx(TimelineContext_js_1.AbsoluteTimeContext.Provider, { value: dormant ? dormantTimeline : absoluteTime, children: jsx_runtime_1.jsx(react_1.default.Activity, { mode: dormant && !parentDormant ? 'hidden' : 'visible', children: jsx_runtime_1.jsx(SuspendSequenceActivity, { dormant: dormant, children: children }) }) }) }) }) }) }));
|
|
100
|
+
};
|
|
101
|
+
exports.SequenceActivityBoundary = SequenceActivityBoundary;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type ActivityCandidate = {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly parent: string | null;
|
|
5
|
+
readonly compositionId: string;
|
|
6
|
+
readonly from: number;
|
|
7
|
+
readonly end: number;
|
|
8
|
+
};
|
|
9
|
+
export declare const SequenceActivityBudgetProvider: React.FC<{
|
|
10
|
+
readonly children: React.ReactNode;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const useSequenceActivityAdmission: (candidate: ActivityCandidate | null) => boolean;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var _a;
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.useSequenceActivityAdmission = exports.SequenceActivityBudgetProvider = void 0;
|
|
38
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
39
|
+
const react_1 = __importStar(require("react"));
|
|
40
|
+
const registry_store_js_1 = require("./registry-store.js");
|
|
41
|
+
const sequence_activity_context_js_1 = require("./sequence-activity-context.js");
|
|
42
|
+
const TimelineContext_js_1 = require("./TimelineContext.js");
|
|
43
|
+
const use_sync_external_store_js_1 = require("./use-sync-external-store.js");
|
|
44
|
+
// Count nested dormant content too: one admitted scene must not be able to
|
|
45
|
+
// recursively mount another thousand expensive scenes behind its Activity.
|
|
46
|
+
const useCommitEffect = (_a = react_1.default.useInsertionEffect) !== null && _a !== void 0 ? _a : react_1.default.useLayoutEffect;
|
|
47
|
+
const createActivityBudget = () => {
|
|
48
|
+
const registry = (0, registry_store_js_1.createRegistryStore)(new Set());
|
|
49
|
+
const candidates = new Map();
|
|
50
|
+
let frame = {};
|
|
51
|
+
let limit = sequence_activity_context_js_1.DEFAULT_SEQUENCE_ACTIVITY_LIMIT;
|
|
52
|
+
let scheduled = false;
|
|
53
|
+
let suspended = false;
|
|
54
|
+
const schedule = () => {
|
|
55
|
+
if (scheduled || suspended) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
scheduled = true;
|
|
59
|
+
// Insertion effects run in hidden Activities too. Publish only after the
|
|
60
|
+
// whole commit, once all candidates and the root playhead are current.
|
|
61
|
+
queueMicrotask(() => {
|
|
62
|
+
scheduled = false;
|
|
63
|
+
if (suspended) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const ranked = [...candidates.values()]
|
|
67
|
+
.filter((candidate) => candidate.end > candidate.from)
|
|
68
|
+
.map((candidate) => {
|
|
69
|
+
var _a;
|
|
70
|
+
const currentFrame = (_a = frame[candidate.compositionId]) !== null && _a !== void 0 ? _a : 0;
|
|
71
|
+
return {
|
|
72
|
+
candidate,
|
|
73
|
+
distance: Math.max(0, candidate.from - currentFrame, currentFrame - candidate.end),
|
|
74
|
+
};
|
|
75
|
+
})
|
|
76
|
+
.sort((a, b) => a.distance - b.distance);
|
|
77
|
+
const selected = new Set();
|
|
78
|
+
for (const { candidate } of ranked) {
|
|
79
|
+
const ancestors = [];
|
|
80
|
+
let ancestor = candidate;
|
|
81
|
+
while (ancestor && !selected.has(ancestor.id)) {
|
|
82
|
+
ancestors.push(ancestor.id);
|
|
83
|
+
if (selected.size + ancestors.length > limit) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
ancestor =
|
|
87
|
+
ancestor.parent === null
|
|
88
|
+
? undefined
|
|
89
|
+
: candidates.get(ancestor.parent);
|
|
90
|
+
}
|
|
91
|
+
if (selected.size + ancestors.length > limit) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
for (const id of ancestors) {
|
|
95
|
+
selected.add(id);
|
|
96
|
+
}
|
|
97
|
+
if (selected.size === limit) {
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Reserve nearby visible trees too, so becoming dormant retains their
|
|
102
|
+
// state immediately. All other visible trees bypass admission. Reserved
|
|
103
|
+
// IDs bound dormant content, including during a large seek.
|
|
104
|
+
registry.setSnapshot((previous) => previous.size === selected.size &&
|
|
105
|
+
[...previous].every((id) => selected.has(id))
|
|
106
|
+
? previous
|
|
107
|
+
: selected);
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
...registry,
|
|
112
|
+
setSuspended: (next) => {
|
|
113
|
+
if (suspended !== next) {
|
|
114
|
+
suspended = next;
|
|
115
|
+
schedule();
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
setLimit: (next) => {
|
|
119
|
+
if (limit !== next) {
|
|
120
|
+
limit = next;
|
|
121
|
+
schedule();
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
setFrame: (next) => {
|
|
125
|
+
frame = next;
|
|
126
|
+
schedule();
|
|
127
|
+
},
|
|
128
|
+
register: (candidate) => {
|
|
129
|
+
candidates.set(candidate.id, candidate);
|
|
130
|
+
schedule();
|
|
131
|
+
return () => {
|
|
132
|
+
candidates.delete(candidate.id);
|
|
133
|
+
schedule();
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
const ActivityBudgetContext = (0, react_1.createContext)(null);
|
|
139
|
+
const InactiveTimelineContext = (0, react_1.createContext)(null);
|
|
140
|
+
const emptySelection = new Set();
|
|
141
|
+
const ActivitySelectionContext = (0, react_1.createContext)(emptySelection);
|
|
142
|
+
const SequenceActivityBudgetProvider = ({ children }) => {
|
|
143
|
+
var _a;
|
|
144
|
+
const enabled = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivityContext);
|
|
145
|
+
const settings = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivitySettingsContext);
|
|
146
|
+
const suspended = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivitySuspensionContext);
|
|
147
|
+
const limit = (_a = settings === null || settings === void 0 ? void 0 : settings.limit) !== null && _a !== void 0 ? _a : sequence_activity_context_js_1.DEFAULT_SEQUENCE_ACTIVITY_LIMIT;
|
|
148
|
+
const admitting = enabled && limit > 0 && limit !== Infinity;
|
|
149
|
+
const [budget] = (0, react_1.useState)(createActivityBudget);
|
|
150
|
+
const timeline = (0, react_1.useContext)(admitting && !suspended ? TimelineContext_js_1.TimelineContext : InactiveTimelineContext);
|
|
151
|
+
const selected = (0, use_sync_external_store_js_1.useSyncExternalStore)(budget.subscribe, budget.getSnapshot, budget.getSnapshot);
|
|
152
|
+
// Shrinking the setting must not keep the old, larger selection for a commit
|
|
153
|
+
// while the budget schedules its new snapshot.
|
|
154
|
+
const admitted = (0, react_1.useMemo)(() => !admitting
|
|
155
|
+
? emptySelection
|
|
156
|
+
: selected.size > limit
|
|
157
|
+
? new Set([...selected].slice(0, limit))
|
|
158
|
+
: selected, [admitting, limit, selected]);
|
|
159
|
+
useCommitEffect(() => {
|
|
160
|
+
// Retain the admitted trees while moving the playhead. Re-ranking would
|
|
161
|
+
// unmount their suspended content and remove its timeline registrations.
|
|
162
|
+
budget.setSuspended(suspended);
|
|
163
|
+
budget.setLimit(admitting ? limit : 0);
|
|
164
|
+
if (admitting && timeline !== null) {
|
|
165
|
+
budget.setFrame(timeline.frame);
|
|
166
|
+
}
|
|
167
|
+
}, [admitting, budget, limit, suspended, timeline]);
|
|
168
|
+
return (jsx_runtime_1.jsx(ActivityBudgetContext.Provider, { value: admitting ? budget : null, children: jsx_runtime_1.jsx(ActivitySelectionContext.Provider, { value: admitted, children: children }) }));
|
|
169
|
+
};
|
|
170
|
+
exports.SequenceActivityBudgetProvider = SequenceActivityBudgetProvider;
|
|
171
|
+
const useSequenceActivityAdmission = (candidate) => {
|
|
172
|
+
var _a, _b, _c, _d, _e, _f;
|
|
173
|
+
const budget = (0, react_1.useContext)(ActivityBudgetContext);
|
|
174
|
+
const enabled = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivityContext);
|
|
175
|
+
const settings = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivitySettingsContext);
|
|
176
|
+
const unlimited = enabled &&
|
|
177
|
+
((_a = settings === null || settings === void 0 ? void 0 : settings.limit) !== null && _a !== void 0 ? _a : sequence_activity_context_js_1.DEFAULT_SEQUENCE_ACTIVITY_LIMIT) === Infinity;
|
|
178
|
+
const selected = (0, react_1.useContext)(ActivitySelectionContext);
|
|
179
|
+
const id = (_b = candidate === null || candidate === void 0 ? void 0 : candidate.id) !== null && _b !== void 0 ? _b : null;
|
|
180
|
+
const parent = (_c = candidate === null || candidate === void 0 ? void 0 : candidate.parent) !== null && _c !== void 0 ? _c : null;
|
|
181
|
+
const compositionId = (_d = candidate === null || candidate === void 0 ? void 0 : candidate.compositionId) !== null && _d !== void 0 ? _d : null;
|
|
182
|
+
const from = (_e = candidate === null || candidate === void 0 ? void 0 : candidate.from) !== null && _e !== void 0 ? _e : null;
|
|
183
|
+
const end = (_f = candidate === null || candidate === void 0 ? void 0 : candidate.end) !== null && _f !== void 0 ? _f : null;
|
|
184
|
+
const committedCandidate = (0, react_1.useMemo)(() => id !== null && compositionId !== null && from !== null && end !== null
|
|
185
|
+
? { id, parent, compositionId, from, end }
|
|
186
|
+
: null, [id, parent, compositionId, from, end]);
|
|
187
|
+
useCommitEffect(() => {
|
|
188
|
+
if (budget !== null && committedCandidate !== null) {
|
|
189
|
+
return budget.register(committedCandidate);
|
|
190
|
+
}
|
|
191
|
+
}, [budget, committedCandidate]);
|
|
192
|
+
// Unlimited discovery admits children on their first render, without waiting
|
|
193
|
+
// for their registration and a subsequent budget publication.
|
|
194
|
+
return id !== null && (unlimited || selected.has(id));
|
|
195
|
+
};
|
|
196
|
+
exports.useSequenceActivityAdmission = useSequenceActivityAdmission;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SequenceActivitySuspensionProvider = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const sequence_activity_context_js_1 = require("./sequence-activity-context.js");
|
|
7
|
+
const TimelineContext_js_1 = require("./TimelineContext.js");
|
|
8
|
+
const SequenceActivitySuspensionProvider = ({ children }) => {
|
|
9
|
+
const enabled = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivityContext);
|
|
10
|
+
const { isPlaying, subscribePlaying, seek } = (0, react_1.useContext)(TimelineContext_js_1.SetTimelineContext);
|
|
11
|
+
const [suspended, setSuspended] = (0, react_1.useState)(false);
|
|
12
|
+
(0, react_1.useEffect)(() => {
|
|
13
|
+
if (!enabled) {
|
|
14
|
+
setSuspended(false);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let timeout = null;
|
|
18
|
+
const update = () => {
|
|
19
|
+
setSuspended(isPlaying() || timeout !== null);
|
|
20
|
+
};
|
|
21
|
+
const unsubscribePlaying = subscribePlaying(update);
|
|
22
|
+
const unsubscribeSeek = seek === null || seek === void 0 ? void 0 : seek.subscribe(() => {
|
|
23
|
+
setSuspended(true);
|
|
24
|
+
if (timeout !== null) {
|
|
25
|
+
clearTimeout(timeout);
|
|
26
|
+
}
|
|
27
|
+
// Repeated pointer, keyboard, and API seeks keep discovery suspended.
|
|
28
|
+
// Resume only once navigation settles, using the latest scene props.
|
|
29
|
+
timeout = setTimeout(() => {
|
|
30
|
+
timeout = null;
|
|
31
|
+
update();
|
|
32
|
+
}, 150);
|
|
33
|
+
});
|
|
34
|
+
update();
|
|
35
|
+
return () => {
|
|
36
|
+
unsubscribePlaying();
|
|
37
|
+
unsubscribeSeek === null || unsubscribeSeek === void 0 ? void 0 : unsubscribeSeek();
|
|
38
|
+
if (timeout !== null) {
|
|
39
|
+
clearTimeout(timeout);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}, [enabled, isPlaying, seek, subscribePlaying]);
|
|
43
|
+
return (jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivitySuspensionContext.Provider, { value: suspended, children: children }));
|
|
44
|
+
};
|
|
45
|
+
exports.SequenceActivitySuspensionProvider = SequenceActivitySuspensionProvider;
|
|
@@ -1,28 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
2
|
+
export * from './sequence-registry-context.js';
|
|
3
|
+
import { type SequenceManagerActions, type SequenceNodePath } from './sequence-registry-context.js';
|
|
3
4
|
import type { CanUpdateSequencePropStatus, DragOverrideValue, GetDragOverrides, GetEffectDragOverrides, PropStatuses } from './use-schema.js';
|
|
4
5
|
import type { SourceNumericValue } from './use-schema.js';
|
|
5
6
|
import type { VideoConfigValues } from './video-config.js';
|
|
6
|
-
export type SequenceManagerContext = {
|
|
7
|
-
registerSequence: (seq: TSequence) => void;
|
|
8
|
-
updateSequence: ((seq: TSequence) => void) | null;
|
|
9
|
-
unregisterSequence: (id: string) => void;
|
|
10
|
-
sequences: TSequence[];
|
|
11
|
-
};
|
|
12
|
-
export type SequenceManagerRef = {
|
|
13
|
-
current: TSequence[];
|
|
14
|
-
};
|
|
15
|
-
export type SequenceNodePath = Array<string | number>;
|
|
16
|
-
type SequenceManagerActions = Pick<SequenceManagerContext, 'registerSequence' | 'updateSequence' | 'unregisterSequence'>;
|
|
17
|
-
export declare const SequenceManagerActionsContext: React.Context<SequenceManagerActions>;
|
|
18
|
-
export declare const SequenceManager: React.Context<SequenceManagerContext>;
|
|
19
|
-
export declare const useSequenceManagerSequences: () => TSequence[];
|
|
20
|
-
export declare const SequenceManagerRefContext: React.Context<SequenceManagerRef>;
|
|
21
|
-
export declare const SequenceRegistrationContext: React.Context<boolean>;
|
|
22
|
-
export declare const DisableSequenceRegistrationContext: React.Context<boolean>;
|
|
23
|
-
export declare const DisableSequenceRegistrationProvider: React.FC<{
|
|
24
|
-
readonly children: React.ReactNode;
|
|
25
|
-
}>;
|
|
26
7
|
export type VisualModePropStatuses = {
|
|
27
8
|
propStatuses: PropStatuses;
|
|
28
9
|
};
|
|
@@ -86,6 +67,11 @@ export type CanUpdateSequencePropsResponseTrue<Numeric = SourceNumericValue> = {
|
|
|
86
67
|
canUpdate: true;
|
|
87
68
|
props: Record<string, CanUpdateSequencePropStatus<Numeric>>;
|
|
88
69
|
effects: CanUpdateEffectPropsResponse<Numeric>[];
|
|
70
|
+
/** Source ranges also include interpolations outside the editable schema. */
|
|
71
|
+
durationDependentKeyframes: {
|
|
72
|
+
readonly scope: SequenceNodePath;
|
|
73
|
+
readonly inputRanges: readonly (readonly SourceNumericValue[] | null)[];
|
|
74
|
+
} | null;
|
|
89
75
|
};
|
|
90
76
|
export type CanUpdateSequencePropsResponseFalse = {
|
|
91
77
|
canUpdate: false;
|
|
@@ -96,9 +82,10 @@ export declare const makeSequencePropsSubscriptionKey: (key: SequencePropsSubscr
|
|
|
96
82
|
export declare const VisualModePropStatusesContext: React.Context<VisualModePropStatuses>;
|
|
97
83
|
export declare const VisualModePropStatusesRefContext: React.Context<VisualModePropStatusesRef>;
|
|
98
84
|
export declare const VisualModeDragOverridesContext: React.Context<VisualModeDragOverrides>;
|
|
85
|
+
export declare const VisualModeDragOverridesRefContext: React.Context<React.RefObject<VisualModeDragOverrides>>;
|
|
99
86
|
export declare const useDragOverridesForNodePath: (nodePath: SequencePropsSubscriptionKey | null) => Record<string, DragOverrideValue>;
|
|
100
87
|
export declare const useActiveFromDragOverrideKeys: () => ReadonlySet<string>;
|
|
101
|
-
export declare const useEffectDragOverridesForNodePath: (nodePath: SequencePropsSubscriptionKey | null
|
|
88
|
+
export declare const useEffectDragOverridesForNodePath: (nodePath: SequencePropsSubscriptionKey | null) => Record<string, Record<string, DragOverrideValue>>;
|
|
102
89
|
export declare const VisualModeSettersContext: React.Context<VisualModeSetters>;
|
|
103
90
|
export declare const VisualModeBatchSettersContext: React.Context<VisualModeBatchSetters | null>;
|
|
104
91
|
export type SequencePropsSubscriptionKey = {
|