screenwright 0.1.27 → 0.1.29
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/dist/src/composition/DemoVideo.d.ts.map +1 -1
- package/dist/src/composition/DemoVideo.js +14 -11
- package/dist/src/composition/DemoVideo.js.map +1 -1
- package/dist/src/composition/SceneSlide.d.ts +1 -0
- package/dist/src/composition/SceneSlide.d.ts.map +1 -1
- package/dist/src/composition/SceneSlide.js +8 -3
- package/dist/src/composition/SceneSlide.js.map +1 -1
- package/dist/src/composition/remotion-root.d.ts.map +1 -1
- package/dist/src/composition/remotion-root.js +5 -5
- package/dist/src/composition/remotion-root.js.map +1 -1
- package/dist/src/composition/time-remap.d.ts +17 -6
- package/dist/src/composition/time-remap.d.ts.map +1 -1
- package/dist/src/composition/time-remap.js +40 -16
- package/dist/src/composition/time-remap.js.map +1 -1
- package/dist/src/config/config-schema.js +1 -1
- package/dist/src/config/config-schema.js.map +1 -1
- package/dist/src/generator/prompts.d.ts +1 -1
- package/dist/src/generator/prompts.d.ts.map +1 -1
- package/dist/src/generator/prompts.js +9 -7
- package/dist/src/generator/prompts.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/runtime/action-helpers.d.ts +6 -1
- package/dist/src/runtime/action-helpers.d.ts.map +1 -1
- package/dist/src/runtime/action-helpers.js +8 -2
- package/dist/src/runtime/action-helpers.js.map +1 -1
- package/dist/src/runtime/instrumented-page.d.ts.map +1 -1
- package/dist/src/runtime/instrumented-page.js +29 -14
- package/dist/src/runtime/instrumented-page.js.map +1 -1
- package/dist/src/timeline/schema.d.ts +47 -0
- package/dist/src/timeline/schema.d.ts.map +1 -1
- package/dist/src/timeline/schema.js +8 -0
- package/dist/src/timeline/schema.js.map +1 -1
- package/dist/src/timeline/types.d.ts +8 -0
- package/dist/src/timeline/types.d.ts.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +9 -7
|
@@ -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;AAQjE,UAAU,KAAK;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;
|
|
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;AAQjE,UAAU,KAAK;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAuFrC,CAAC"}
|
|
@@ -5,21 +5,18 @@ import { NarrationTrack } from './NarrationTrack.js';
|
|
|
5
5
|
import { SceneSlide } from './SceneSlide.js';
|
|
6
6
|
import { precomputeCursorPaths } from './cursor-path.js';
|
|
7
7
|
import { findClosestFrame } from './frame-lookup.js';
|
|
8
|
-
import {
|
|
9
|
-
function msToFrames(ms, fps) {
|
|
10
|
-
return Math.round((ms / 1000) * fps);
|
|
11
|
-
}
|
|
8
|
+
import { resolveSlideScenes, sourceTimeMs, computeSlideSegments, remapEvents, msToFrames } from './time-remap.js';
|
|
12
9
|
export const DemoVideo = ({ timeline, branding }) => {
|
|
13
10
|
const fps = 30;
|
|
14
11
|
const frame = useCurrentFrame();
|
|
15
12
|
const outputTimeMs = (frame / fps) * 1000;
|
|
16
13
|
const scenes = timeline.events.filter((e) => e.type === 'scene');
|
|
17
|
-
const
|
|
18
|
-
const timeMs =
|
|
19
|
-
? sourceTimeMs(outputTimeMs,
|
|
14
|
+
const slideScenes = resolveSlideScenes(scenes);
|
|
15
|
+
const timeMs = slideScenes.length > 0
|
|
16
|
+
? sourceTimeMs(outputTimeMs, slideScenes)
|
|
20
17
|
: outputTimeMs;
|
|
21
|
-
const eventsToUse =
|
|
22
|
-
? remapEvents(timeline.events,
|
|
18
|
+
const eventsToUse = slideScenes.length > 0
|
|
19
|
+
? remapEvents(timeline.events, slideScenes)
|
|
23
20
|
: timeline.events;
|
|
24
21
|
const cursorEvents = precomputeCursorPaths(eventsToUse.filter((e) => e.type === 'cursor_target'));
|
|
25
22
|
const clickEvents = eventsToUse.filter((e) => e.type === 'action' && e.action === 'click');
|
|
@@ -36,12 +33,18 @@ export const DemoVideo = ({ timeline, branding }) => {
|
|
|
36
33
|
else {
|
|
37
34
|
throw new Error('Timeline must have either frameManifest or videoFile');
|
|
38
35
|
}
|
|
39
|
-
const slideSegments =
|
|
36
|
+
const slideSegments = computeSlideSegments(scenes);
|
|
40
37
|
return (_jsxs("div", { style: {
|
|
41
38
|
position: 'relative',
|
|
42
39
|
width: timeline.metadata.viewport.width,
|
|
43
40
|
height: timeline.metadata.viewport.height,
|
|
44
41
|
overflow: 'hidden',
|
|
45
|
-
}, children: [baseLayer, _jsx(CursorOverlay, { cursorEvents: cursorEvents, clickEvents: clickEvents, fps: fps }), _jsx(NarrationTrack, { narrations: narrations, fps: fps }),
|
|
42
|
+
}, children: [baseLayer, _jsx(CursorOverlay, { cursorEvents: cursorEvents, clickEvents: clickEvents, fps: fps }), _jsx(NarrationTrack, { narrations: narrations, fps: fps }), slideSegments.map(seg => {
|
|
43
|
+
const brandColor = seg.slideConfig.brandColor ?? branding?.brandColor ?? '#000000';
|
|
44
|
+
const textColor = seg.slideConfig.textColor ?? branding?.textColor ?? '#FFFFFF';
|
|
45
|
+
const fontFamily = seg.slideConfig.fontFamily ?? branding?.fontFamily;
|
|
46
|
+
const titleFontSize = seg.slideConfig.titleFontSize;
|
|
47
|
+
return (_jsx(Sequence, { from: msToFrames(seg.slideStartMs, fps), durationInFrames: msToFrames(seg.slideDurationMs, fps), children: _jsx(SceneSlide, { title: seg.sceneTitle, description: seg.sceneDescription, brandColor: brandColor, textColor: textColor, fontFamily: fontFamily, titleFontSize: titleFontSize, durationInFrames: msToFrames(seg.slideDurationMs, fps), fps: fps }) }, `slide-${seg.slideStartMs}`));
|
|
48
|
+
})] }));
|
|
46
49
|
};
|
|
47
50
|
//# sourceMappingURL=DemoVideo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DemoVideo.js","sourceRoot":"","sources":["../../../src/composition/DemoVideo.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAItF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"DemoVideo.js","sourceRoot":"","sources":["../../../src/composition/DemoVideo.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAItF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOlH,MAAM,CAAC,MAAM,SAAS,GAAoB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;IACnE,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;IAE1C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAClF,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QACnC,CAAC,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC;QACzC,CAAC,CAAC,YAAY,CAAC;IAEjB,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QACxC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;QAC3C,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IAEpB,MAAM,YAAY,GAAG,qBAAqB,CACxC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAA0B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAC9E,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CACpC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CACrE,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CACnC,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CACnD,CAAC;IAEF,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAEvD,IAAI,SAA0B,CAAC;IAC/B,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACtD,SAAS,GAAG,CACV,KAAC,GAAG,IACF,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAC3B,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAC1D,CACH,CAAC;IACJ,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,SAAS,GAAG,KAAC,cAAc,IAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,GAAI,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEnD,OAAO,CACL,eACE,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK;YACvC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;YACzC,QAAQ,EAAE,QAAQ;SACnB,aAEA,SAAS,EACV,KAAC,aAAa,IAAC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAI,EACjF,KAAC,cAAc,IAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,GAAI,EAEnD,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACvB,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,UAAU,IAAI,QAAQ,EAAE,UAAU,IAAI,SAAS,CAAC;gBACnF,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS,IAAI,SAAS,CAAC;gBAChF,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,UAAU,IAAI,QAAQ,EAAE,UAAU,CAAC;gBACtE,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC;gBAEpD,OAAO,CACL,KAAC,QAAQ,IAEP,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,EACvC,gBAAgB,EAAE,UAAU,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,YAEtD,KAAC,UAAU,IACT,KAAK,EAAE,GAAG,CAAC,UAAU,EACrB,WAAW,EAAE,GAAG,CAAC,gBAAgB,EACjC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,UAAU,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,EACtD,GAAG,EAAE,GAAG,GACR,IAbG,SAAS,GAAG,CAAC,YAAY,EAAE,CAcvB,CACZ,CAAC;YACJ,CAAC,CAAC,IACE,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneSlide.d.ts","sourceRoot":"","sources":["../../../src/composition/SceneSlide.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAiBnD,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACb;AAMD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"SceneSlide.d.ts","sourceRoot":"","sources":["../../../src/composition/SceneSlide.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAiBnD,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACb;AAMD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA6ItC,CAAC"}
|
|
@@ -4,12 +4,17 @@ import { delayRender, continueRender, useCurrentFrame, interpolate, spring } fro
|
|
|
4
4
|
const SYSTEM_FONTS = 'system-ui, -apple-system, sans-serif';
|
|
5
5
|
const FONT_TIMEOUT_MS = 5000;
|
|
6
6
|
const ANIM_FRAMES = 12;
|
|
7
|
-
export const SceneSlide = ({ title, description, brandColor, textColor, fontFamily, durationInFrames, fps, }) => {
|
|
7
|
+
export const SceneSlide = ({ title, description, brandColor, textColor, fontFamily, titleFontSize = 64, durationInFrames, fps, }) => {
|
|
8
8
|
const frame = useCurrentFrame();
|
|
9
9
|
const [handle] = useState(() => fontFamily ? delayRender('Loading font') : null);
|
|
10
10
|
useEffect(() => {
|
|
11
11
|
if (!fontFamily || !handle)
|
|
12
12
|
return;
|
|
13
|
+
// Skip network fetch if font is already available (system font or previously loaded)
|
|
14
|
+
if (document.fonts.check(`16px "${fontFamily}"`)) {
|
|
15
|
+
continueRender(handle);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
13
18
|
const encoded = encodeURIComponent(fontFamily);
|
|
14
19
|
const link = document.createElement('link');
|
|
15
20
|
link.rel = 'stylesheet';
|
|
@@ -74,7 +79,7 @@ export const SceneSlide = ({ title, description, brandColor, textColor, fontFami
|
|
|
74
79
|
padding: '0 10%',
|
|
75
80
|
}, children: [_jsx("h1", { style: {
|
|
76
81
|
color: textColor,
|
|
77
|
-
fontSize:
|
|
82
|
+
fontSize: titleFontSize,
|
|
78
83
|
fontWeight: 700,
|
|
79
84
|
margin: 0,
|
|
80
85
|
lineHeight: 1.2,
|
|
@@ -87,7 +92,7 @@ export const SceneSlide = ({ title, description, brandColor, textColor, fontFami
|
|
|
87
92
|
borderRadius: 2,
|
|
88
93
|
} }), _jsx("p", { style: {
|
|
89
94
|
color: textColor,
|
|
90
|
-
fontSize:
|
|
95
|
+
fontSize: Math.round(titleFontSize * 0.44),
|
|
91
96
|
fontWeight: 400,
|
|
92
97
|
margin: 0,
|
|
93
98
|
opacity: 0.85,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneSlide.js","sourceRoot":"","sources":["../../../src/composition/SceneSlide.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"SceneSlide.js","sourceRoot":"","sources":["../../../src/composition/SceneSlide.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;
|
|
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"}
|
|
@@ -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 {
|
|
7
|
+
import { resolveSlideScenes, totalSlideDurationMs, msToFrames } from './time-remap.js';
|
|
8
8
|
const propsSchema = z.object({
|
|
9
9
|
timeline: timelineSchema,
|
|
10
10
|
branding: brandingSchema.optional(),
|
|
@@ -25,10 +25,10 @@ export const RemotionRoot = () => {
|
|
|
25
25
|
},
|
|
26
26
|
}, calculateMetadata: ({ props }) => {
|
|
27
27
|
const fps = 30;
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
const totalMs = props.timeline.metadata.videoDurationMs +
|
|
31
|
-
const durationInFrames = Math.max(30,
|
|
28
|
+
const scenes = props.timeline.events.filter((e) => e.type === 'scene');
|
|
29
|
+
const slideScenes = resolveSlideScenes(scenes);
|
|
30
|
+
const totalMs = props.timeline.metadata.videoDurationMs + totalSlideDurationMs(slideScenes);
|
|
31
|
+
const durationInFrames = Math.max(30, msToFrames(totalMs, fps));
|
|
32
32
|
return {
|
|
33
33
|
durationInFrames,
|
|
34
34
|
fps,
|
|
@@ -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;
|
|
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,26 +1,37 @@
|
|
|
1
|
-
import type { SceneEvent, TimelineEvent } from '../timeline/types.js';
|
|
2
|
-
export declare const
|
|
1
|
+
import type { SceneEvent, SceneSlideConfig, TimelineEvent } from '../timeline/types.js';
|
|
2
|
+
export declare const DEFAULT_SLIDE_DURATION_MS = 2000;
|
|
3
|
+
export declare function msToFrames(ms: number, fps: number): number;
|
|
4
|
+
export interface ResolvedSlideScene {
|
|
5
|
+
timestampMs: number;
|
|
6
|
+
slideDurationMs: number;
|
|
7
|
+
}
|
|
3
8
|
export interface SlideSegment {
|
|
4
9
|
slideStartMs: number;
|
|
5
10
|
slideEndMs: number;
|
|
11
|
+
slideDurationMs: number;
|
|
6
12
|
sceneTitle: string;
|
|
7
13
|
sceneDescription?: string;
|
|
14
|
+
slideConfig: SceneSlideConfig;
|
|
8
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Filter scenes that have a `slide` field and resolve their duration.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveSlideScenes(scenes: SceneEvent[]): ResolvedSlideScene[];
|
|
9
20
|
/**
|
|
10
21
|
* Compute the output-time intervals where each scene slide is shown.
|
|
11
22
|
* Each slide is inserted *before* the scene's recorded content.
|
|
12
23
|
*/
|
|
13
|
-
export declare function computeSlideSegments(scenes: SceneEvent[]
|
|
24
|
+
export declare function computeSlideSegments(scenes: SceneEvent[]): SlideSegment[];
|
|
14
25
|
/**
|
|
15
26
|
* Map an output-time position back to its source-time position.
|
|
16
27
|
* During a slide, returns the scene's timestamp (freeze-frame).
|
|
17
28
|
* During video segments, subtracts accumulated slide durations.
|
|
18
29
|
*/
|
|
19
|
-
export declare function sourceTimeMs(outputTimeMs: number,
|
|
20
|
-
export declare function totalSlideDurationMs(
|
|
30
|
+
export declare function sourceTimeMs(outputTimeMs: number, slideScenes: ResolvedSlideScene[]): number;
|
|
31
|
+
export declare function totalSlideDurationMs(slideScenes: ResolvedSlideScene[]): number;
|
|
21
32
|
/**
|
|
22
33
|
* Shift every event's timestampMs forward by the accumulated slide
|
|
23
34
|
* durations that precede it. Returns a new array (no mutation).
|
|
24
35
|
*/
|
|
25
|
-
export declare function remapEvents<T extends TimelineEvent>(events: T[],
|
|
36
|
+
export declare function remapEvents<T extends TimelineEvent>(events: T[], slideScenes: ResolvedSlideScene[]): T[];
|
|
26
37
|
//# 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,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
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,MAAM,sBAAsB,CAAC;AAExF,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,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;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,CAO7E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAqBzE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,kBAAkB,EAAE,GAChC,MAAM,CAgBR;AAED,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,19 +1,37 @@
|
|
|
1
|
-
export const
|
|
1
|
+
export const DEFAULT_SLIDE_DURATION_MS = 2000;
|
|
2
|
+
export function msToFrames(ms, fps) {
|
|
3
|
+
return Math.round((ms / 1000) * fps);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Filter scenes that have a `slide` field and resolve their duration.
|
|
7
|
+
*/
|
|
8
|
+
export function resolveSlideScenes(scenes) {
|
|
9
|
+
return scenes
|
|
10
|
+
.filter(s => s.slide !== undefined)
|
|
11
|
+
.map(s => ({
|
|
12
|
+
timestampMs: s.timestampMs,
|
|
13
|
+
slideDurationMs: s.slide.duration ?? DEFAULT_SLIDE_DURATION_MS,
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
2
16
|
/**
|
|
3
17
|
* Compute the output-time intervals where each scene slide is shown.
|
|
4
18
|
* Each slide is inserted *before* the scene's recorded content.
|
|
5
19
|
*/
|
|
6
|
-
export function computeSlideSegments(scenes
|
|
20
|
+
export function computeSlideSegments(scenes) {
|
|
7
21
|
const segments = [];
|
|
8
22
|
let accumulated = 0;
|
|
9
23
|
for (const scene of scenes) {
|
|
24
|
+
if (!scene.slide)
|
|
25
|
+
continue;
|
|
26
|
+
const slideDurationMs = scene.slide.duration ?? DEFAULT_SLIDE_DURATION_MS;
|
|
10
27
|
const slideStartMs = scene.timestampMs + accumulated;
|
|
11
|
-
const slideEndMs = slideStartMs + slideDurationMs;
|
|
12
28
|
segments.push({
|
|
13
29
|
slideStartMs,
|
|
14
|
-
slideEndMs,
|
|
30
|
+
slideEndMs: slideStartMs + slideDurationMs,
|
|
31
|
+
slideDurationMs,
|
|
15
32
|
sceneTitle: scene.title,
|
|
16
33
|
sceneDescription: scene.description,
|
|
34
|
+
slideConfig: scene.slide,
|
|
17
35
|
});
|
|
18
36
|
accumulated += slideDurationMs;
|
|
19
37
|
}
|
|
@@ -24,34 +42,40 @@ export function computeSlideSegments(scenes, slideDurationMs) {
|
|
|
24
42
|
* During a slide, returns the scene's timestamp (freeze-frame).
|
|
25
43
|
* During video segments, subtracts accumulated slide durations.
|
|
26
44
|
*/
|
|
27
|
-
export function sourceTimeMs(outputTimeMs,
|
|
45
|
+
export function sourceTimeMs(outputTimeMs, slideScenes) {
|
|
46
|
+
const sorted = [...slideScenes].sort((a, b) => a.timestampMs - b.timestampMs);
|
|
28
47
|
let accumulated = 0;
|
|
29
|
-
for (const
|
|
30
|
-
const slideStart =
|
|
31
|
-
const slideEnd = slideStart + slideDurationMs;
|
|
48
|
+
for (const ss of sorted) {
|
|
49
|
+
const slideStart = ss.timestampMs + accumulated;
|
|
50
|
+
const slideEnd = slideStart + ss.slideDurationMs;
|
|
32
51
|
if (outputTimeMs < slideStart) {
|
|
33
52
|
return outputTimeMs - accumulated;
|
|
34
53
|
}
|
|
35
54
|
if (outputTimeMs < slideEnd) {
|
|
36
|
-
return
|
|
55
|
+
return ss.timestampMs;
|
|
37
56
|
}
|
|
38
|
-
accumulated += slideDurationMs;
|
|
57
|
+
accumulated += ss.slideDurationMs;
|
|
39
58
|
}
|
|
40
59
|
return outputTimeMs - accumulated;
|
|
41
60
|
}
|
|
42
|
-
export function totalSlideDurationMs(
|
|
43
|
-
|
|
61
|
+
export function totalSlideDurationMs(slideScenes) {
|
|
62
|
+
let total = 0;
|
|
63
|
+
for (const ss of slideScenes) {
|
|
64
|
+
total += ss.slideDurationMs;
|
|
65
|
+
}
|
|
66
|
+
return total;
|
|
44
67
|
}
|
|
45
68
|
/**
|
|
46
69
|
* Shift every event's timestampMs forward by the accumulated slide
|
|
47
70
|
* durations that precede it. Returns a new array (no mutation).
|
|
48
71
|
*/
|
|
49
|
-
export function remapEvents(events,
|
|
72
|
+
export function remapEvents(events, slideScenes) {
|
|
73
|
+
const sorted = [...slideScenes].sort((a, b) => a.timestampMs - b.timestampMs);
|
|
50
74
|
return events.map(event => {
|
|
51
75
|
let offset = 0;
|
|
52
|
-
for (const
|
|
53
|
-
if (event.timestampMs >=
|
|
54
|
-
offset += slideDurationMs;
|
|
76
|
+
for (const ss of sorted) {
|
|
77
|
+
if (event.timestampMs >= ss.timestampMs) {
|
|
78
|
+
offset += ss.slideDurationMs;
|
|
55
79
|
}
|
|
56
80
|
else {
|
|
57
81
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-remap.js","sourceRoot":"","sources":["../../../src/composition/time-remap.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"time-remap.js","sourceRoot":"","sources":["../../../src/composition/time-remap.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ export const openaiVoices = [
|
|
|
5
5
|
];
|
|
6
6
|
export const DEFAULT_TTS_INSTRUCTIONS = 'Speak in an upbeat, enthusiastic tone. This is a tech product demo video. ' +
|
|
7
7
|
'Be energetic and professional, like a friendly product evangelist.';
|
|
8
|
-
const hexColor = z.string().regex(/^#[0-9a-fA-F]{3
|
|
8
|
+
const hexColor = z.string().regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, 'Must be a hex color like #4F46E5');
|
|
9
9
|
export const brandingSchema = z.object({
|
|
10
10
|
brandColor: hexColor,
|
|
11
11
|
textColor: hexColor,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;IAClD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;CACpD,CAAC;AAIX,MAAM,CAAC,MAAM,wBAAwB,GACnC,4EAA4E;IAC5E,oEAAoE,CAAC;AAEvE,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;IAClD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;CACpD,CAAC;AAIX,MAAM,CAAC,MAAM,wBAAwB,GACnC,4EAA4E;IAC5E,oEAAoE,CAAC;AAEvE,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kEAAkE,EAAE,kCAAkC,CAAC,CAAC;AAE1I,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC;IAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACxC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACzD,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjD,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC;IACnE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const SYSTEM_PROMPT = "You are Screenwright, a tool that converts Playwright E2E tests into cinematic product demo scenarios.\n\nGiven a Playwright test file, generate a new TypeScript file that uses the Screenwright helpers API to create a polished demo with:\n- Human-friendly data (replace faker/test data with realistic values)\n- Narration cues (explain what's happening to the viewer)\n- Scene boundaries (organize the demo into logical chapters)\n\nThe output must be a valid TypeScript file with a default export function that takes a ScreenwrightHelpers parameter.\n\nAvailable helpers:\n- sw.scene(title, description?) \u2014
|
|
1
|
+
export declare const SYSTEM_PROMPT = "You are Screenwright, a tool that converts Playwright E2E tests into cinematic product demo scenarios.\n\nGiven a Playwright test file, generate a new TypeScript file that uses the Screenwright helpers API to create a polished demo with:\n- Human-friendly data (replace faker/test data with realistic values)\n- Narration cues (explain what's happening to the viewer)\n- Scene boundaries (organize the demo into logical chapters)\n\nThe output must be a valid TypeScript file with a default export function that takes a ScreenwrightHelpers parameter.\n\nAvailable helpers:\n- sw.scene(title) \u2014 scene marker only, no slide\n- sw.scene(title, description?) \u2014 scene marker with optional description, no slide\n- sw.scene(title, { description?, slide?: { duration?, brandColor?, textColor?, fontFamily?, titleFontSize? } }) \u2014 scene with optional transition slide\n- sw.navigate(url, { narration? }) \u2014 navigate to a URL\n- sw.click(selector, { narration? }) \u2014 click an element\n- sw.fill(selector, value, { narration? }) \u2014 type into an input\n- sw.hover(selector, { narration? }) \u2014 hover over an element\n- sw.press(key, { narration? }) \u2014 press a keyboard key\n- sw.wait(ms) \u2014 pause for pacing\n- sw.narrate(text) \u2014 speak narration without an action\n\nRules:\n1. Import only ScreenwrightHelpers from 'screenwright'\n2. Export a default async function\n3. Replace ALL test/faker data with realistic human-friendly values\n4. Add narration to key actions explaining what the user is doing\n5. Use sw.wait() for pacing \u2014 add deliberate pauses where the viewer needs a moment to absorb the screen.\n6. Use sw.scene() to organize into 2-5 scenes. Pass a slide option (e.g. sw.scene('Title', { slide: {} })) to add a transition slide.\n7. Keep the same user flow as the original test\n8. Do NOT include assertions \u2014 this is a demo, not a test\n\nOutput format \u2014 always follow this exact structure:\n\n```typescript\nimport type { ScreenwrightHelpers } from 'screenwright';\n\nexport default async function scenario(sw: ScreenwrightHelpers) {\n // Scene 1\n await sw.scene('...', { slide: {} });\n // ... actions ...\n\n // Scene 2\n await sw.scene('...', { slide: {} });\n // ... actions ...\n}\n```\n\nCommon mistakes \u2014 do NOT do any of these:\n- Do NOT use page.click(), page.fill(), or any page.* methods \u2014 use sw.click(), sw.fill() etc.\n- Do NOT import expect, assert, or any test library\n- Do NOT call expect() or assert()\n- Do NOT use page.evaluate() or page.waitForSelector()\n- Do NOT add test(), describe(), or beforeEach() wrappers\n- Do NOT use page.locator().click() \u2014 use sw.click(selector) directly";
|
|
2
2
|
export declare function buildUserPrompt(testSource: string, narrationStyle: 'brief' | 'detailed', appDescription?: string): string;
|
|
3
3
|
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/generator/prompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/generator/prompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,woFAqD4C,CAAC;AAEvE,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,OAAO,GAAG,UAAU,EACpC,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAmER"}
|
|
@@ -8,7 +8,9 @@ Given a Playwright test file, generate a new TypeScript file that uses the Scree
|
|
|
8
8
|
The output must be a valid TypeScript file with a default export function that takes a ScreenwrightHelpers parameter.
|
|
9
9
|
|
|
10
10
|
Available helpers:
|
|
11
|
-
- sw.scene(title
|
|
11
|
+
- sw.scene(title) — scene marker only, no slide
|
|
12
|
+
- sw.scene(title, description?) — scene marker with optional description, no slide
|
|
13
|
+
- sw.scene(title, { description?, slide?: { duration?, brandColor?, textColor?, fontFamily?, titleFontSize? } }) — scene with optional transition slide
|
|
12
14
|
- sw.navigate(url, { narration? }) — navigate to a URL
|
|
13
15
|
- sw.click(selector, { narration? }) — click an element
|
|
14
16
|
- sw.fill(selector, value, { narration? }) — type into an input
|
|
@@ -23,7 +25,7 @@ Rules:
|
|
|
23
25
|
3. Replace ALL test/faker data with realistic human-friendly values
|
|
24
26
|
4. Add narration to key actions explaining what the user is doing
|
|
25
27
|
5. Use sw.wait() for pacing — add deliberate pauses where the viewer needs a moment to absorb the screen.
|
|
26
|
-
6. Use sw.scene() to organize into 2-5 scenes
|
|
28
|
+
6. Use sw.scene() to organize into 2-5 scenes. Pass a slide option (e.g. sw.scene('Title', { slide: {} })) to add a transition slide.
|
|
27
29
|
7. Keep the same user flow as the original test
|
|
28
30
|
8. Do NOT include assertions — this is a demo, not a test
|
|
29
31
|
|
|
@@ -34,11 +36,11 @@ import type { ScreenwrightHelpers } from 'screenwright';
|
|
|
34
36
|
|
|
35
37
|
export default async function scenario(sw: ScreenwrightHelpers) {
|
|
36
38
|
// Scene 1
|
|
37
|
-
await sw.scene('...');
|
|
39
|
+
await sw.scene('...', { slide: {} });
|
|
38
40
|
// ... actions ...
|
|
39
41
|
|
|
40
42
|
// Scene 2
|
|
41
|
-
await sw.scene('...');
|
|
43
|
+
await sw.scene('...', { slide: {} });
|
|
42
44
|
// ... actions ...
|
|
43
45
|
}
|
|
44
46
|
\`\`\`
|
|
@@ -77,7 +79,7 @@ Output:
|
|
|
77
79
|
import type { ScreenwrightHelpers } from 'screenwright';
|
|
78
80
|
|
|
79
81
|
export default async function scenario(sw: ScreenwrightHelpers) {
|
|
80
|
-
await sw.scene('Shopping for a Laptop');
|
|
82
|
+
await sw.scene('Shopping for a Laptop', { slide: {} });
|
|
81
83
|
await sw.navigate('http://localhost:3000', {
|
|
82
84
|
narration: 'Let\\'s browse the electronics store.',
|
|
83
85
|
});
|
|
@@ -86,12 +88,12 @@ export default async function scenario(sw: ScreenwrightHelpers) {
|
|
|
86
88
|
narration: 'We\\'ll select the MacBook Pro.',
|
|
87
89
|
});
|
|
88
90
|
|
|
89
|
-
await sw.scene('Adding to Cart');
|
|
91
|
+
await sw.scene('Adding to Cart', { slide: {} });
|
|
90
92
|
await sw.click('[data-testid="add-to-cart"]', {
|
|
91
93
|
narration: 'Add it to our cart.',
|
|
92
94
|
});
|
|
93
95
|
|
|
94
|
-
await sw.scene('Checkout');
|
|
96
|
+
await sw.scene('Checkout', { slide: {} });
|
|
95
97
|
await sw.fill('[data-testid="email"]', 'sarah.chen@acme.co', {
|
|
96
98
|
narration: 'Enter our email address for the order confirmation.',
|
|
97
99
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/generator/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/generator/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEAqDyC,CAAC;AAEvE,MAAM,UAAU,eAAe,CAC7B,UAAkB,EAClB,cAAoC,EACpC,cAAuB;IAEvB,IAAI,MAAM,GAAG;;mBAEI,cAAc;EAC/B,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,8DAA8D,CAAC,CAAC,CAAC,yDAAyD;;EAEvJ,cAAc,CAAC,CAAC,CAAC,gBAAgB,cAAc,MAAM,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuD1D,UAAU;;;gDAGoC,CAAC;IAE/C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export type { ScreenwrightHelpers, ActionOptions } from './runtime/action-helpers.js';
|
|
1
|
+
export type { ScreenwrightHelpers, ActionOptions, SceneOptions } from './runtime/action-helpers.js';
|
|
2
2
|
export type { ScenarioFn } from './runtime/instrumented-page.js';
|
|
3
|
-
export type { Timeline, TimelineEvent, SceneEvent, ActionEvent, CursorTargetEvent, NarrationEvent, WaitEvent, FrameEntry } from './timeline/types.js';
|
|
3
|
+
export type { Timeline, TimelineEvent, SceneEvent, ActionEvent, CursorTargetEvent, NarrationEvent, WaitEvent, FrameEntry, SceneSlideConfig } from './timeline/types.js';
|
|
4
4
|
export type { ScreenwrightConfig, OpenaiVoice } from './config/config-schema.js';
|
|
5
5
|
export { openaiVoices } from './config/config-schema.js';
|
|
6
6
|
export { validateScenarioCode, extractScenarioCode } from './generator/scenario-generator.js';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACpG,YAAY,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACxK,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { Page } from 'playwright';
|
|
2
2
|
import type { TimelineCollector } from './timeline-collector.js';
|
|
3
|
+
import type { SceneSlideConfig } from '../timeline/types.js';
|
|
3
4
|
export interface ActionOptions {
|
|
4
5
|
narration?: string;
|
|
5
6
|
}
|
|
7
|
+
export interface SceneOptions {
|
|
8
|
+
description?: string;
|
|
9
|
+
slide?: SceneSlideConfig;
|
|
10
|
+
}
|
|
6
11
|
export interface ScreenwrightHelpers {
|
|
7
12
|
page: Page;
|
|
8
|
-
scene(title: string,
|
|
13
|
+
scene(title: string, descriptionOrOptions?: string | SceneOptions): Promise<void>;
|
|
9
14
|
navigate(url: string, opts?: ActionOptions): Promise<void>;
|
|
10
15
|
click(selector: string, opts?: ActionOptions): Promise<void>;
|
|
11
16
|
fill(selector: string, value: string, opts?: ActionOptions): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-helpers.d.ts","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"action-helpers.d.ts","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAYD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,GAAG,mBAAmB,CAgK3F"}
|
|
@@ -49,8 +49,14 @@ export function createHelpers(page, collector) {
|
|
|
49
49
|
}
|
|
50
50
|
return {
|
|
51
51
|
page,
|
|
52
|
-
async scene(title,
|
|
53
|
-
|
|
52
|
+
async scene(title, descriptionOrOptions) {
|
|
53
|
+
if (typeof descriptionOrOptions === 'string' || descriptionOrOptions === undefined) {
|
|
54
|
+
collector.emit({ type: 'scene', title, description: descriptionOrOptions });
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const { description, slide } = descriptionOrOptions;
|
|
58
|
+
collector.emit({ type: 'scene', title, description, slide });
|
|
59
|
+
}
|
|
54
60
|
},
|
|
55
61
|
async navigate(url, actionOpts) {
|
|
56
62
|
if (actionOpts?.narration)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-helpers.js","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action-helpers.js","sourceRoot":"","sources":["../../../src/runtime/action-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumented-page.d.ts","sourceRoot":"","sources":["../../../src/runtime/instrumented-page.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"instrumented-page.d.ts","sourceRoot":"","sources":["../../../src/runtime/instrumented-page.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAmJ5F"}
|