screenwright 0.1.37 → 0.1.38

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DemoVideo.d.ts","sourceRoot":"","sources":["../../../src/composition/DemoVideo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AASjE,UAAU,KAAK;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA0OrC,CAAC"}
1
+ {"version":3,"file":"DemoVideo.d.ts","sourceRoot":"","sources":["../../../src/composition/DemoVideo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAkBjE,UAAU,KAAK;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA2KrC,CAAC"}
@@ -6,25 +6,28 @@ import { SceneSlide } from './SceneSlide.js';
6
6
  import { precomputeCursorPaths } from './cursor-path.js';
7
7
  import { findClosestFrame } from './frame-lookup.js';
8
8
  import { getTransitionStyles } from './transition-styles.js';
9
- import { resolveSlideScenes, sourceTimeMs, computeSlideSegments, remapEvents } from './time-remap.js';
9
+ import { resolveSlideScenes, resolveTransitions, sourceTimeMs, computeOutputSegments, remapEvents, } from './time-remap.js';
10
+ const IMG_STYLE = { width: '100%', height: '100%', display: 'block' };
11
+ const JITTER_MS = 50;
10
12
  export const DemoVideo = ({ timeline, branding }) => {
11
13
  const fps = 30;
12
14
  const frame = useCurrentFrame();
13
15
  const outputTimeMs = (frame / fps) * 1000;
14
16
  const scenes = timeline.events.filter((e) => e.type === 'scene');
15
- const slideScenes = resolveSlideScenes(scenes, timeline.events);
16
- const timeMs = slideScenes.length > 0
17
- ? sourceTimeMs(outputTimeMs, slideScenes)
17
+ const slideScenes = resolveSlideScenes(scenes);
18
+ const resolvedTransitions = resolveTransitions(timeline.events);
19
+ const hasInsertions = slideScenes.length > 0 || resolvedTransitions.length > 0;
20
+ const timeMs = hasInsertions
21
+ ? sourceTimeMs(outputTimeMs, slideScenes, resolvedTransitions)
18
22
  : outputTimeMs;
19
- const eventsToUse = slideScenes.length > 0
20
- ? remapEvents(timeline.events, slideScenes)
23
+ const eventsToUse = hasInsertions
24
+ ? remapEvents(timeline.events, slideScenes, resolvedTransitions)
21
25
  : timeline.events;
22
26
  const cursorEvents = precomputeCursorPaths(eventsToUse.filter((e) => e.type === 'cursor_target'));
23
- const transitionEvents = eventsToUse.filter((e) => e.type === 'transition');
24
27
  const clickEvents = eventsToUse.filter((e) => e.type === 'action' && e.action === 'click');
25
28
  const narrations = eventsToUse.filter((e) => e.type === 'narration');
26
29
  const { frameManifest, videoFile } = timeline.metadata;
27
- const slideSegments = computeSlideSegments(scenes);
30
+ const { slides: slideSegments, transitions: transitionSegments } = computeOutputSegments(scenes, resolvedTransitions);
28
31
  function resolveSlideProps(seg) {
29
32
  return {
30
33
  title: seg.sceneTitle,
@@ -37,31 +40,8 @@ export const DemoVideo = ({ timeline, branding }) => {
37
40
  }
38
41
  // Check if current time is inside a slide
39
42
  let activeSlide = slideSegments.find(s => outputTimeMs >= s.slideStartMs && outputTimeMs < s.slideEndMs);
40
- // Check if current time is inside a transition involving a slide or scenario edge
41
- let slideTransition = null;
42
- if (!activeSlide) {
43
- for (const t of transitionEvents) {
44
- if (outputTimeMs < t.timestampMs || outputTimeMs >= t.timestampMs + t.durationMs)
45
- continue;
46
- const tEnd = t.timestampMs + t.durationMs;
47
- const before = slideSegments.find(s => Math.abs(s.slideEndMs - t.timestampMs) < 50) ?? null;
48
- const after = slideSegments.find(s => Math.abs(s.slideStartMs - tEnd) < 50) ?? null;
49
- if (before || after) {
50
- slideTransition = { transition: t, before, after };
51
- break;
52
- }
53
- // Transitions at scenario edges (no content before/after) fade to/from backdrop
54
- const hasAfter = eventsToUse.some(e => e.timestampMs >= tEnd - 50 && (e.type === 'scene' || e.type === 'action'));
55
- const hasBefore = eventsToUse.some(e => e.timestampMs < t.timestampMs + 50 && (e.type === 'scene' || e.type === 'action'));
56
- if (!hasAfter || !hasBefore) {
57
- slideTransition = { transition: t, before, after };
58
- break;
59
- }
60
- }
61
- }
62
- // Fallback: if no exact match but slides exist, snap to the nearest slide.
63
- // Handles timing jitter gaps (e.g. first frame at t=0 when first slide starts at t=1).
64
- if (!activeSlide && !slideTransition && slideSegments.length > 0) {
43
+ // Fallback: snap to nearest slide within 100ms jitter
44
+ if (!activeSlide && slideSegments.length > 0) {
65
45
  let best = slideSegments[0];
66
46
  let bestDist = Infinity;
67
47
  for (const s of slideSegments) {
@@ -78,61 +58,44 @@ export const DemoVideo = ({ timeline, branding }) => {
78
58
  if (bestDist < 100)
79
59
  activeSlide = best;
80
60
  }
81
- // Find active transition for frame-based content
82
- const activeTransition = !activeSlide && !slideTransition
83
- ? transitionEvents.find(t => outputTimeMs >= t.timestampMs && outputTimeMs < t.timestampMs + t.durationMs)
61
+ // Check if current time is inside a transition segment
62
+ const activeTransition = !activeSlide
63
+ ? transitionSegments.find(t => outputTimeMs >= t.outputStartMs && outputTimeMs < t.outputEndMs)
84
64
  : null;
85
- // Detect if we're past a terminal transition (no content follows → hold backdrop)
86
- let pastTerminalTransition = false;
87
- if (!activeSlide && !slideTransition && !activeTransition && transitionEvents.length > 0) {
88
- const last = transitionEvents[transitionEvents.length - 1];
89
- const lastEnd = last.timestampMs + last.durationMs;
90
- if (outputTimeMs >= lastEnd) {
91
- pastTerminalTransition = !eventsToUse.some(e => e.timestampMs >= lastEnd - 50 && (e.type === 'scene' || e.type === 'action'));
92
- }
93
- }
94
65
  let baseLayer;
95
- if (pastTerminalTransition) {
96
- baseLayer = _jsx("div", { style: { position: 'absolute', inset: 0, backgroundColor: branding?.brandColor ?? '#000000' } });
97
- }
98
- else if (activeSlide) {
99
- // Slide IS the base layer — no frame images
66
+ if (activeSlide) {
100
67
  baseLayer = _jsx(SceneSlide, { ...resolveSlideProps(activeSlide) });
101
68
  }
102
- else if (slideTransition) {
103
- // Transition involving at least one slide (slide↔slide, frame→slide, or slide→frame)
104
- const { transition: t, before, after } = slideTransition;
105
- const progress = (outputTimeMs - t.timestampMs) / t.durationMs;
69
+ else if (activeTransition && frameManifest && frameManifest.length > 0) {
70
+ const progress = (outputTimeMs - activeTransition.outputStartMs) / activeTransition.durationMs;
106
71
  const { width: vw } = timeline.metadata.viewport;
107
- const styles = getTransitionStyles(t.transition, progress, vw);
72
+ const styles = getTransitionStyles(activeTransition.transition, progress, vw);
108
73
  const faceClip = styles.container ? {} : { overflow: 'hidden' };
109
- const imgStyle = { width: '100%', height: '100%', display: 'block' };
110
- const tEnd = t.timestampMs + t.durationMs;
111
- const hasContentAfter = eventsToUse.some(e => e.timestampMs >= tEnd - 50 && (e.type === 'scene' || e.type === 'action'));
112
- const hasContentBefore = eventsToUse.some(e => e.timestampMs < t.timestampMs + 50 && (e.type === 'scene' || e.type === 'action'));
113
- // Resolve entrance (new content arriving)
114
- // When no slide follows and no scene/action follows, leave empty so backdrop shows.
115
- let entranceContent;
116
- if (after) {
117
- entranceContent = _jsx(SceneSlide, { ...resolveSlideProps(after) });
74
+ // Resolve exit content (before the transition)
75
+ const beforeSlide = slideSegments.find(s => Math.abs(s.slideEndMs - activeTransition.outputStartMs) < JITTER_MS);
76
+ let exitContent;
77
+ if (!activeTransition.hasContentBefore && !beforeSlide) {
78
+ exitContent = undefined; // scenario start edge backdrop
118
79
  }
119
- else if (hasContentAfter && frameManifest && frameManifest.length > 0) {
120
- const afterSourceTime = slideScenes.length > 0
121
- ? sourceTimeMs(tEnd, slideScenes) : tEnd;
122
- const afterEntry = findClosestFrame(frameManifest, afterSourceTime);
123
- entranceContent = _jsx(Img, { src: staticFile(afterEntry.file), style: imgStyle });
80
+ else if (beforeSlide) {
81
+ exitContent = _jsx(SceneSlide, { ...resolveSlideProps(beforeSlide) });
124
82
  }
125
- // Resolve exit (old content departing)
126
- // When no slide precedes and no scene/action precedes, leave empty so backdrop shows.
127
- let exitContent;
128
- if (before) {
129
- exitContent = _jsx(SceneSlide, { ...resolveSlideProps(before) });
83
+ else {
84
+ const beforeEntry = findClosestFrame(frameManifest, activeTransition.beforeSourceMs);
85
+ exitContent = _jsx(Img, { src: staticFile(beforeEntry.file), style: IMG_STYLE });
86
+ }
87
+ // Resolve entrance content (after the transition)
88
+ const afterSlide = slideSegments.find(s => Math.abs(s.slideStartMs - activeTransition.outputEndMs) < JITTER_MS);
89
+ let entranceContent;
90
+ if (!activeTransition.hasContentAfter && !afterSlide) {
91
+ entranceContent = undefined; // scenario end edge — backdrop
92
+ }
93
+ else if (afterSlide) {
94
+ entranceContent = _jsx(SceneSlide, { ...resolveSlideProps(afterSlide) });
130
95
  }
131
- else if (hasContentBefore && frameManifest && frameManifest.length > 0) {
132
- const beforeSourceTime = slideScenes.length > 0
133
- ? sourceTimeMs(t.timestampMs, slideScenes) : t.timestampMs;
134
- const beforeEntry = findClosestFrame(frameManifest, beforeSourceTime);
135
- exitContent = _jsx(Img, { src: staticFile(beforeEntry.file), style: imgStyle });
96
+ else {
97
+ const afterEntry = findClosestFrame(frameManifest, activeTransition.afterSourceMs);
98
+ entranceContent = _jsx(Img, { src: staticFile(afterEntry.file), style: IMG_STYLE });
136
99
  }
137
100
  const faces = (_jsxs(_Fragment, { children: [_jsx("div", { style: { position: 'absolute', inset: 0, ...faceClip, ...styles.entrance }, children: entranceContent }), _jsx("div", { style: { position: 'absolute', inset: 0, ...faceClip, ...styles.exit }, children: exitContent }), styles.exit2 && (_jsx("div", { style: { position: 'absolute', inset: 0, ...faceClip, ...styles.exit2 }, children: exitContent }))] }));
138
101
  let wrappedFaces = faces;
@@ -142,26 +105,15 @@ export const DemoVideo = ({ timeline, branding }) => {
142
105
  if (styles.perspective) {
143
106
  wrappedFaces = _jsx("div", { style: { position: 'absolute', inset: 0, perspective: styles.perspective }, children: wrappedFaces });
144
107
  }
145
- const slideSide = after ?? before;
146
- const backdropColor = styles.backdrop
147
- ?? (slideSide ? resolveSlideProps(slideSide).brandColor : branding?.brandColor ?? '#000000');
108
+ const backdropColor = styles.backdrop ?? branding?.brandColor ?? '#000000';
148
109
  baseLayer = (_jsxs(_Fragment, { children: [_jsx("div", { style: { position: 'absolute', inset: 0, backgroundColor: backdropColor } }), wrappedFaces] }));
149
110
  }
150
- else if (activeTransition && frameManifest && frameManifest.length > 0) {
151
- const progress = (outputTimeMs - activeTransition.timestampMs) / activeTransition.durationMs;
152
- const styles = getTransitionStyles(activeTransition.transition, progress, timeline.metadata.viewport.width);
153
- const beforeSourceTime = slideScenes.length > 0
154
- ? sourceTimeMs(activeTransition.timestampMs, slideScenes)
155
- : activeTransition.timestampMs;
156
- const beforeEntry = findClosestFrame(frameManifest, beforeSourceTime);
157
- const afterEntry = findClosestFrame(frameManifest, timeMs);
158
- baseLayer = (_jsxs(_Fragment, { children: [_jsx(Img, { src: staticFile(afterEntry.file), style: { position: 'absolute', width: '100%', height: '100%', display: 'block', ...styles.entrance } }), _jsx(Img, { src: staticFile(beforeEntry.file), style: { position: 'absolute', width: '100%', height: '100%', display: 'block', ...styles.exit } }), styles.exit2 && (_jsx(Img, { src: staticFile(beforeEntry.file), style: { position: 'absolute', width: '100%', height: '100%', display: 'block', ...styles.exit2 } }))] }));
159
- }
160
111
  else if (frameManifest && frameManifest.length > 0) {
161
112
  const entry = findClosestFrame(frameManifest, timeMs);
162
- baseLayer = (_jsx(Img, { src: staticFile(entry.file), style: { width: '100%', height: '100%', display: 'block' } }));
113
+ baseLayer = (_jsx(Img, { src: staticFile(entry.file), style: IMG_STYLE }));
163
114
  }
164
115
  else if (videoFile) {
116
+ const transitionEvents = timeline.events.filter((e) => e.type === 'transition');
165
117
  if (transitionEvents.length > 0 && frame === 0) {
166
118
  console.warn('sw.transition() effects require frame-based capture (captureMode: "frame"). Transitions will be ignored with video-based capture.');
167
119
  }
@@ -175,6 +127,6 @@ export const DemoVideo = ({ timeline, branding }) => {
175
127
  width: timeline.metadata.viewport.width,
176
128
  height: timeline.metadata.viewport.height,
177
129
  overflow: 'hidden',
178
- }, children: [baseLayer, !activeSlide && !slideTransition && (_jsx(CursorOverlay, { cursorEvents: cursorEvents, clickEvents: clickEvents, fps: fps })), _jsx(NarrationTrack, { narrations: narrations, fps: fps })] }));
130
+ }, children: [baseLayer, !activeSlide && !activeTransition && (_jsx(CursorOverlay, { cursorEvents: cursorEvents, clickEvents: clickEvents, fps: fps })), _jsx(NarrationTrack, { narrations: narrations, fps: fps })] }));
179
131
  };
180
132
  //# sourceMappingURL=DemoVideo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DemoVideo.js","sourceRoot":"","sources":["../../../src/composition/DemoVideo.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DemoVideo.js","sourceRoot":"","sources":["../../../src/composition/DemoVideo.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"remotion-root.d.ts","sourceRoot":"","sources":["../../../src/composition/remotion-root.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAyChC,CAAC"}
1
+ {"version":3,"file":"remotion-root.d.ts","sourceRoot":"","sources":["../../../src/composition/remotion-root.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EA4ChC,CAAC"}
@@ -4,7 +4,7 @@ import { z } from 'zod';
4
4
  import { DemoVideo } from './DemoVideo.js';
5
5
  import { timelineSchema } from '../timeline/schema.js';
6
6
  import { brandingSchema } from '../config/config-schema.js';
7
- import { resolveSlideScenes, totalSlideDurationMs, msToFrames } from './time-remap.js';
7
+ import { resolveSlideScenes, resolveTransitions, totalSlideDurationMs, totalTransitionDurationMs, msToFrames } from './time-remap.js';
8
8
  const propsSchema = z.object({
9
9
  timeline: timelineSchema,
10
10
  branding: brandingSchema.optional(),
@@ -27,7 +27,10 @@ export const RemotionRoot = () => {
27
27
  const fps = 30;
28
28
  const scenes = props.timeline.events.filter((e) => e.type === 'scene');
29
29
  const slideScenes = resolveSlideScenes(scenes);
30
- const totalMs = props.timeline.metadata.videoDurationMs + totalSlideDurationMs(slideScenes);
30
+ const resolvedTransitions = resolveTransitions(props.timeline.events);
31
+ const totalMs = props.timeline.metadata.videoDurationMs
32
+ + totalSlideDurationMs(slideScenes)
33
+ + totalTransitionDurationMs(resolvedTransitions);
31
34
  const durationInFrames = Math.max(30, msToFrames(totalMs, fps));
32
35
  return {
33
36
  durationInFrames,
@@ -1 +1 @@
1
- {"version":3,"file":"remotion-root.js","sourceRoot":"","sources":["../../../src/composition/remotion-root.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEvF,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAa,GAAG,EAAE;IACzC,OAAO,CACL,4BACE,KAAC,WAAW,IACV,EAAE,EAAC,WAAW,EACd,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAgB,EAAE,CAAC,EACnE,MAAM,EAAE,WAAW,EACnB,gBAAgB,EAAE,GAAG,EACrB,GAAG,EAAE,EAAE,EACP,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,GAAG,EACX,YAAY,EAAE;gBACZ,QAAQ,EAAE;oBACR,OAAO,EAAE,CAAU;oBACnB,QAAQ,EAAE;wBACR,QAAQ,EAAE,EAAE;wBACZ,YAAY,EAAE,EAAE;wBAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;wBACtC,eAAe,EAAE,CAAC;wBAClB,SAAS,EAAE,kBAAkB;qBAC9B;oBACD,MAAM,EAAE,EAAE;iBACX;aACF,EACD,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC/B,MAAM,GAAG,GAAG,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBACxF,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;gBAC5F,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAChE,OAAO;oBACL,gBAAgB;oBAChB,GAAG;oBACH,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK;oBAC7C,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;iBAChD,CAAC;YACJ,CAAC,GACD,GACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,YAAY,CAAC,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"remotion-root.js","sourceRoot":"","sources":["../../../src/composition/remotion-root.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEtI,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAa,GAAG,EAAE;IACzC,OAAO,CACL,4BACE,KAAC,WAAW,IACV,EAAE,EAAC,WAAW,EACd,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAgB,EAAE,CAAC,EACnE,MAAM,EAAE,WAAW,EACnB,gBAAgB,EAAE,GAAG,EACrB,GAAG,EAAE,EAAE,EACP,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,GAAG,EACX,YAAY,EAAE;gBACZ,QAAQ,EAAE;oBACR,OAAO,EAAE,CAAU;oBACnB,QAAQ,EAAE;wBACR,QAAQ,EAAE,EAAE;wBACZ,YAAY,EAAE,EAAE;wBAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;wBACtC,eAAe,EAAE,CAAC;wBAClB,SAAS,EAAE,kBAAkB;qBAC9B;oBACD,MAAM,EAAE,EAAE;iBACX;aACF,EACD,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC/B,MAAM,GAAG,GAAG,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBACxF,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACtE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe;sBACnD,oBAAoB,CAAC,WAAW,CAAC;sBACjC,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;gBACnD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAChE,OAAO;oBACL,gBAAgB;oBAChB,GAAG;oBACH,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK;oBAC7C,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;iBAChD,CAAC;YACJ,CAAC,GACD,GACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,YAAY,CAAC,YAAY,CAAC,CAAC"}
@@ -1,11 +1,20 @@
1
- import type { SceneEvent, SceneSlideConfig, TimelineEvent } from '../timeline/types.js';
1
+ import type { SceneEvent, SceneSlideConfig, TimelineEvent, TransitionType } from '../timeline/types.js';
2
2
  export declare const DEFAULT_SLIDE_DURATION_MS = 2000;
3
3
  export declare function msToFrames(ms: number, fps: number): number;
4
4
  export interface ResolvedSlideScene {
5
5
  timestampMs: number;
6
6
  slideDurationMs: number;
7
- /** Source-time dead zone after the slide (transition wait + optional navigate load). */
8
- deadAfterMs: number;
7
+ }
8
+ export interface ResolvedTransition {
9
+ timestampMs: number;
10
+ transitionDurationMs: number;
11
+ transition: TransitionType;
12
+ beforeSourceMs: number;
13
+ afterSourceMs: number;
14
+ /** True when a visual action exists before this transition. */
15
+ hasContentBefore: boolean;
16
+ /** True when a visual action exists after this transition. */
17
+ hasContentAfter: boolean;
9
18
  }
10
19
  export interface SlideSegment {
11
20
  slideStartMs: number;
@@ -15,28 +24,46 @@ export interface SlideSegment {
15
24
  sceneDescription?: string;
16
25
  slideConfig: SceneSlideConfig;
17
26
  }
27
+ export interface TransitionSegment {
28
+ outputStartMs: number;
29
+ outputEndMs: number;
30
+ durationMs: number;
31
+ transition: TransitionType;
32
+ beforeSourceMs: number;
33
+ afterSourceMs: number;
34
+ hasContentBefore: boolean;
35
+ hasContentAfter: boolean;
36
+ }
18
37
  /**
19
38
  * Filter scenes that have a `slide` field and resolve their duration.
20
- * When allEvents is provided, also computes the dead zone after each slide
21
- * (stale source time from transition waits + navigate page loads).
22
39
  */
23
- export declare function resolveSlideScenes(scenes: SceneEvent[], allEvents?: TimelineEvent[]): ResolvedSlideScene[];
40
+ export declare function resolveSlideScenes(scenes: SceneEvent[]): ResolvedSlideScene[];
24
41
  /**
25
- * Compute the output-time intervals where each scene slide is shown.
26
- * Each slide is inserted *before* the scene's recorded content.
42
+ * Walk timeline events and resolve each transition's frame references.
43
+ * beforeSourceMs = settledAtMs (or timestampMs) of the last visual action before it.
44
+ * afterSourceMs = settledAtMs (or timestampMs) of the first visual action after it.
27
45
  */
28
- export declare function computeSlideSegments(scenes: SceneEvent[]): SlideSegment[];
46
+ export declare function resolveTransitions(events: TimelineEvent[]): ResolvedTransition[];
29
47
  /**
30
48
  * Map an output-time position back to its source-time position.
31
- * During a slide, returns the scene's timestamp (freeze-frame).
32
- * During video segments, subtracts accumulated slide durations.
33
- * Source times that fall in a dead zone are clamped to its end.
49
+ * During an insertion (slide or transition), returns the insertion's
50
+ * source timestamp (freeze-frame). Otherwise subtracts accumulated offsets.
34
51
  */
35
- export declare function sourceTimeMs(outputTimeMs: number, slideScenes: ResolvedSlideScene[]): number;
52
+ export declare function sourceTimeMs(outputTimeMs: number, slideScenes: ResolvedSlideScene[], transitions?: ResolvedTransition[]): number;
36
53
  export declare function totalSlideDurationMs(slideScenes: ResolvedSlideScene[]): number;
54
+ export declare function totalTransitionDurationMs(transitions: ResolvedTransition[]): number;
55
+ /**
56
+ * Compute output-time intervals for both slides and transitions,
57
+ * accounting for all preceding insertions.
58
+ */
59
+ export declare function computeOutputSegments(scenes: SceneEvent[], transitions: ResolvedTransition[]): {
60
+ slides: SlideSegment[];
61
+ transitions: TransitionSegment[];
62
+ };
37
63
  /**
38
- * Shift every event's timestampMs forward by the accumulated slide
39
- * durations that precede it. Returns a new array (no mutation).
64
+ * Shift every event's timestampMs forward by accumulated insertion
65
+ * durations (slides + transitions) that precede it.
66
+ * Returns a new array (no mutation).
40
67
  */
41
- export declare function remapEvents<T extends TimelineEvent>(events: T[], slideScenes: ResolvedSlideScene[]): T[];
68
+ export declare function remapEvents<T extends TimelineEvent>(events: T[], slideScenes: ResolvedSlideScene[], transitions?: ResolvedTransition[]): T[];
42
69
  //# sourceMappingURL=time-remap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time-remap.d.ts","sourceRoot":"","sources":["../../../src/composition/time-remap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAmB,MAAM,sBAAsB,CAAC;AAEtH,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,CAAC,EAAE,aAAa,EAAE,GAC1B,kBAAkB,EAAE,CAkCtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAqBzE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,kBAAkB,EAAE,GAChC,MAAM,CAgBR;AAWD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,kBAAkB,EAAE,GAChC,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,aAAa,EACjD,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,kBAAkB,EAAE,GAChC,CAAC,EAAE,CAaL"}
1
+ {"version":3,"file":"time-remap.d.ts","sourceRoot":"","sources":["../../../src/composition/time-remap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAErH,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,cAAc,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,cAAc,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,CAO7E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,kBAAkB,EAAE,CA0BhF;AAqCD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,kBAAkB,EAAE,EACjC,WAAW,GAAE,kBAAkB,EAAO,GACrC,MAAM,CAWR;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAI9E;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAInF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAAE,EACpB,WAAW,EAAE,kBAAkB,EAAE,GAChC;IAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,WAAW,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAmD9D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,aAAa,EACjD,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,kBAAkB,EAAE,EACjC,WAAW,GAAE,kBAAkB,EAAO,GACrC,CAAC,EAAE,CAaL"}
@@ -4,109 +4,160 @@ export function msToFrames(ms, fps) {
4
4
  }
5
5
  /**
6
6
  * Filter scenes that have a `slide` field and resolve their duration.
7
- * When allEvents is provided, also computes the dead zone after each slide
8
- * (stale source time from transition waits + navigate page loads).
9
7
  */
10
- export function resolveSlideScenes(scenes, allEvents) {
8
+ export function resolveSlideScenes(scenes) {
11
9
  return scenes
12
10
  .filter(s => s.slide !== undefined)
13
- .map(s => {
14
- let deadAfterMs = 0;
15
- if (allEvents) {
16
- const afterTrans = allEvents.find((e) => e.type === 'transition' && Math.abs(e.timestampMs - s.timestampMs) < 50);
17
- if (afterTrans) {
18
- const transEnd = s.timestampMs + afterTrans.durationMs;
19
- const firstAction = allEvents.find((e) => e.type === 'action' && e.timestampMs >= transEnd - 50);
20
- if (firstAction?.action === 'navigate') {
21
- const settled = allEvents.find(e => e.timestampMs > firstAction.timestampMs + 50);
22
- deadAfterMs = settled
23
- ? settled.timestampMs - s.timestampMs
24
- : afterTrans.durationMs;
25
- }
26
- else {
27
- deadAfterMs = afterTrans.durationMs;
28
- }
29
- }
30
- }
31
- return {
32
- timestampMs: s.timestampMs,
33
- slideDurationMs: s.slide.duration ?? DEFAULT_SLIDE_DURATION_MS,
34
- deadAfterMs,
35
- };
36
- });
11
+ .map(s => ({
12
+ timestampMs: s.timestampMs,
13
+ slideDurationMs: s.slide.duration ?? DEFAULT_SLIDE_DURATION_MS,
14
+ }));
37
15
  }
38
16
  /**
39
- * Compute the output-time intervals where each scene slide is shown.
40
- * Each slide is inserted *before* the scene's recorded content.
17
+ * Walk timeline events and resolve each transition's frame references.
18
+ * beforeSourceMs = settledAtMs (or timestampMs) of the last visual action before it.
19
+ * afterSourceMs = settledAtMs (or timestampMs) of the first visual action after it.
41
20
  */
42
- export function computeSlideSegments(scenes) {
43
- const segments = [];
44
- let accumulated = 0;
45
- for (const scene of scenes) {
46
- if (!scene.slide)
21
+ export function resolveTransitions(events) {
22
+ const result = [];
23
+ const actions = events.filter((e) => e.type === 'action');
24
+ for (const event of events) {
25
+ if (event.type !== 'transition')
47
26
  continue;
48
- const slideDurationMs = scene.slide.duration ?? DEFAULT_SLIDE_DURATION_MS;
49
- const slideStartMs = scene.timestampMs + accumulated;
50
- segments.push({
51
- slideStartMs,
52
- slideEndMs: slideStartMs + slideDurationMs,
53
- slideDurationMs,
54
- sceneTitle: scene.title,
55
- sceneDescription: scene.description,
56
- slideConfig: scene.slide,
27
+ const lastBefore = findLastAction(actions, event.timestampMs);
28
+ const firstAfter = actions.find(a => a.timestampMs > event.timestampMs) ?? null;
29
+ result.push({
30
+ timestampMs: event.timestampMs,
31
+ transitionDurationMs: event.durationMs,
32
+ transition: event.transition,
33
+ beforeSourceMs: lastBefore
34
+ ? (lastBefore.settledAtMs ?? lastBefore.timestampMs)
35
+ : event.timestampMs,
36
+ afterSourceMs: firstAfter
37
+ ? (firstAfter.settledAtMs ?? firstAfter.timestampMs)
38
+ : event.timestampMs,
39
+ hasContentBefore: lastBefore !== null,
40
+ hasContentAfter: firstAfter !== null,
57
41
  });
58
- accumulated += slideDurationMs;
59
42
  }
60
- return segments;
43
+ return result;
44
+ }
45
+ function findLastAction(actions, beforeOrAt) {
46
+ let last = null;
47
+ for (const a of actions) {
48
+ if (a.timestampMs <= beforeOrAt)
49
+ last = a;
50
+ else
51
+ break;
52
+ }
53
+ return last;
54
+ }
55
+ function buildSortedInsertions(slideScenes, transitions) {
56
+ const ins = [];
57
+ for (const ss of slideScenes) {
58
+ ins.push({ sourceTimeMs: ss.timestampMs, durationMs: ss.slideDurationMs, kind: 'slide' });
59
+ }
60
+ for (const t of transitions) {
61
+ ins.push({ sourceTimeMs: t.timestampMs, durationMs: t.transitionDurationMs, kind: 'transition' });
62
+ }
63
+ // Slides sort before transitions at the same source time; stable for same-kind ties.
64
+ ins.sort((a, b) => a.sourceTimeMs - b.sourceTimeMs || (a.kind === b.kind ? 0 : a.kind === 'slide' ? -1 : 1));
65
+ return ins;
61
66
  }
62
67
  /**
63
68
  * Map an output-time position back to its source-time position.
64
- * During a slide, returns the scene's timestamp (freeze-frame).
65
- * During video segments, subtracts accumulated slide durations.
66
- * Source times that fall in a dead zone are clamped to its end.
69
+ * During an insertion (slide or transition), returns the insertion's
70
+ * source timestamp (freeze-frame). Otherwise subtracts accumulated offsets.
67
71
  */
68
- export function sourceTimeMs(outputTimeMs, slideScenes) {
69
- const sorted = [...slideScenes].sort((a, b) => a.timestampMs - b.timestampMs);
72
+ export function sourceTimeMs(outputTimeMs, slideScenes, transitions = []) {
73
+ const insertions = buildSortedInsertions(slideScenes, transitions);
70
74
  let accumulated = 0;
71
- for (const ss of sorted) {
72
- const slideStart = ss.timestampMs + accumulated;
73
- const slideEnd = slideStart + ss.slideDurationMs;
74
- if (outputTimeMs < slideStart) {
75
- return clampDeadZones(outputTimeMs - accumulated, sorted);
76
- }
77
- if (outputTimeMs < slideEnd) {
78
- return ss.timestampMs;
79
- }
80
- accumulated += ss.slideDurationMs;
81
- }
82
- return clampDeadZones(outputTimeMs - accumulated, sorted);
83
- }
84
- function clampDeadZones(sourceTime, slides) {
85
- for (const ss of slides) {
86
- if (ss.deadAfterMs > 0 && sourceTime >= ss.timestampMs && sourceTime < ss.timestampMs + ss.deadAfterMs) {
87
- return ss.timestampMs + ss.deadAfterMs;
88
- }
75
+ for (const ins of insertions) {
76
+ const start = ins.sourceTimeMs + accumulated;
77
+ const end = start + ins.durationMs;
78
+ if (outputTimeMs < start)
79
+ return outputTimeMs - accumulated;
80
+ if (outputTimeMs < end)
81
+ return ins.sourceTimeMs;
82
+ accumulated += ins.durationMs;
89
83
  }
90
- return sourceTime;
84
+ return outputTimeMs - accumulated;
91
85
  }
92
86
  export function totalSlideDurationMs(slideScenes) {
93
87
  let total = 0;
94
- for (const ss of slideScenes) {
88
+ for (const ss of slideScenes)
95
89
  total += ss.slideDurationMs;
96
- }
97
90
  return total;
98
91
  }
92
+ export function totalTransitionDurationMs(transitions) {
93
+ let total = 0;
94
+ for (const t of transitions)
95
+ total += t.transitionDurationMs;
96
+ return total;
97
+ }
98
+ /**
99
+ * Compute output-time intervals for both slides and transitions,
100
+ * accounting for all preceding insertions.
101
+ */
102
+ export function computeOutputSegments(scenes, transitions) {
103
+ const slideScenes = resolveSlideScenes(scenes);
104
+ const insertions = buildSortedInsertions(slideScenes, transitions);
105
+ // Build queues (same order as sorted insertions) so we pop metadata
106
+ // in order even when multiple insertions share the same timestamp.
107
+ const slideQueue = scenes.filter(s => s.slide).sort((a, b) => a.timestampMs - b.timestampMs);
108
+ const transQueue = [...transitions].sort((a, b) => a.timestampMs - b.timestampMs);
109
+ let si = 0;
110
+ let ti = 0;
111
+ const slides = [];
112
+ const transSegs = [];
113
+ let accumulated = 0;
114
+ for (const ins of insertions) {
115
+ const outputStart = ins.sourceTimeMs + accumulated;
116
+ const outputEnd = outputStart + ins.durationMs;
117
+ if (ins.kind === 'slide') {
118
+ const sc = slideQueue[si++];
119
+ if (sc) {
120
+ slides.push({
121
+ slideStartMs: outputStart,
122
+ slideEndMs: outputEnd,
123
+ slideDurationMs: ins.durationMs,
124
+ sceneTitle: sc.title,
125
+ sceneDescription: sc.description,
126
+ slideConfig: sc.slide,
127
+ });
128
+ }
129
+ }
130
+ else {
131
+ const rt = transQueue[ti++];
132
+ if (rt) {
133
+ transSegs.push({
134
+ outputStartMs: outputStart,
135
+ outputEndMs: outputEnd,
136
+ durationMs: ins.durationMs,
137
+ transition: rt.transition,
138
+ beforeSourceMs: rt.beforeSourceMs,
139
+ afterSourceMs: rt.afterSourceMs,
140
+ hasContentBefore: rt.hasContentBefore,
141
+ hasContentAfter: rt.hasContentAfter,
142
+ });
143
+ }
144
+ }
145
+ accumulated += ins.durationMs;
146
+ }
147
+ return { slides, transitions: transSegs };
148
+ }
99
149
  /**
100
- * Shift every event's timestampMs forward by the accumulated slide
101
- * durations that precede it. Returns a new array (no mutation).
150
+ * Shift every event's timestampMs forward by accumulated insertion
151
+ * durations (slides + transitions) that precede it.
152
+ * Returns a new array (no mutation).
102
153
  */
103
- export function remapEvents(events, slideScenes) {
104
- const sorted = [...slideScenes].sort((a, b) => a.timestampMs - b.timestampMs);
154
+ export function remapEvents(events, slideScenes, transitions = []) {
155
+ const insertions = buildSortedInsertions(slideScenes, transitions);
105
156
  return events.map(event => {
106
157
  let offset = 0;
107
- for (const ss of sorted) {
108
- if (event.timestampMs >= ss.timestampMs) {
109
- offset += ss.slideDurationMs;
158
+ for (const ins of insertions) {
159
+ if (event.timestampMs >= ins.sourceTimeMs) {
160
+ offset += ins.durationMs;
110
161
  }
111
162
  else {
112
163
  break;