@devinilabs/reelstack 1.3.1 → 1.4.0

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.
@@ -3023,7 +3023,7 @@ export const StitchReel: React.FC = () => {
3023
3023
 
3024
3024
  return (
3025
3025
  <AbsoluteFill style={{ backgroundColor: C.bg, fontFamily: FONT }}>
3026
- {/* REFERENCE-STRIP: <Audio> tag removed — bring your own voiceover */}
3026
+ {/* REFERENCE-STRIP: voiceover tag removed — bring your own voiceover */}
3027
3027
 
3028
3028
  <Background frame={frame} fps={fps} />
3029
3029
 
@@ -0,0 +1,162 @@
1
+ /**
2
+ * REFERENCE — Stitch2Reel (Family: dark)
3
+ *
4
+ * Canonical example of the dark family's motion vocabulary, frame-locked
5
+ * BEAT structure, and scene choreography. Bundled with ReelStack v1.4+
6
+ * for STUDY and as the source for the scaffold-from-reference flow.
7
+ *
8
+ * Asset imports stripped (look for REFERENCE-STRIP markers). Bring your own
9
+ * voiceover, brand SVGs, captures.
10
+ *
11
+ * License: study + adapt patterns OK. Verbatim re-publication as your own
12
+ * template NOT OK. See ReelStack LICENSE.
13
+ *
14
+ * Source: my-video/src/Stitch2Reel.tsx
15
+ * Bundled at: 2026-05-12T19:40:04.828Z
16
+ */
17
+ import React from "react";
18
+ import {
19
+ AbsoluteFill,
20
+ Sequence,
21
+ OffthreadVideo,
22
+ staticFile,
23
+ useCurrentFrame,
24
+ interpolate,
25
+ Easing,
26
+ } from "remotion";
27
+ import { ds } from "./designSystem";
28
+
29
+ // Composition: 1080x1920 @ 30fps, 600 frames (20s — matches hero.mp4 duration).
30
+ // Instagram safe zones: reserve top 288px and bottom ~422px.
31
+ const SAFE_TOP = 288;
32
+ const SAFE_BOT_OFFSET = 422;
33
+
34
+ // Hero video intrinsic dimensions: 2304x1440 (3:2 landscape).
35
+ // Letterboxed into 1080 wide → scaled height = 1080 * (1440 / 2304) = 675.
36
+ const VIDEO_W = 1080;
37
+ const VIDEO_H = 675;
38
+
39
+ const C = {
40
+ bg: "#0a0a0b",
41
+ fg: "#f5f5f7",
42
+ fgMuted: "#8e8e93",
43
+ stitch: "#ff4d9b",
44
+ stitchDim: "rgba(255,77,155,0.15)",
45
+ } as const;
46
+
47
+ export const Stitch2Reel: React.FC = () => {
48
+ const frame = useCurrentFrame();
49
+
50
+ const titleFade = interpolate(frame, [0, 20], [0, 1], {
51
+ extrapolateRight: "clamp",
52
+ easing: Easing.out(Easing.cubic),
53
+ });
54
+ const titleLift = interpolate(frame, [0, 20], [24, 0], {
55
+ extrapolateRight: "clamp",
56
+ easing: Easing.out(Easing.cubic),
57
+ });
58
+
59
+ const videoFade = interpolate(frame, [10, 30], [0, 1], {
60
+ extrapolateRight: "clamp",
61
+ easing: Easing.out(Easing.cubic),
62
+ });
63
+
64
+ return (
65
+ <AbsoluteFill style={{ backgroundColor: C.bg, fontFamily: ds.font.sans }}>
66
+ {/* Title — inside the top safe zone */}
67
+ <div
68
+ style={{
69
+ position: "absolute",
70
+ top: 80,
71
+ left: 0,
72
+ right: 0,
73
+ padding: "0 64px",
74
+ opacity: titleFade,
75
+ transform: `translateY(${titleLift}px)`,
76
+ textAlign: "center",
77
+ }}
78
+ >
79
+ <div
80
+ style={{
81
+ display: "inline-block",
82
+ padding: "8px 20px",
83
+ borderRadius: 999,
84
+ background: C.stitchDim,
85
+ color: C.stitch,
86
+ fontSize: 32,
87
+ fontWeight: 600,
88
+ letterSpacing: 1,
89
+ textTransform: "uppercase",
90
+ }}
91
+ >
92
+ Google Labs
93
+ </div>
94
+ <h1
95
+ style={{
96
+ margin: "20px 0 8px",
97
+ fontSize: 96,
98
+ fontWeight: 800,
99
+ color: C.fg,
100
+ lineHeight: 1,
101
+ letterSpacing: -2,
102
+ }}
103
+ >
104
+ Stitch 2.0
105
+ </h1>
106
+ <p
107
+ style={{
108
+ margin: 0,
109
+ fontSize: 34,
110
+ color: C.fgMuted,
111
+ fontWeight: 500,
112
+ }}
113
+ >
114
+ Vibe-design production UI in seconds
115
+ </p>
116
+ </div>
117
+
118
+ {/* Video — wrapped in Sequence per Remotion OffthreadVideo timing rule */}
119
+ <Sequence from={0} durationInFrames={600}>
120
+ <AbsoluteFill
121
+ style={{
122
+ top: SAFE_TOP,
123
+ bottom: SAFE_BOT_OFFSET,
124
+ justifyContent: "center",
125
+ alignItems: "center",
126
+ opacity: videoFade,
127
+ }}
128
+ >
129
+ <div
130
+ style={{
131
+ width: VIDEO_W,
132
+ height: VIDEO_H,
133
+ borderRadius: 24,
134
+ overflow: "hidden",
135
+ boxShadow: "0 40px 100px rgba(255,77,155,0.18), 0 0 0 1px rgba(255,255,255,0.08)",
136
+ }}
137
+ >
138
+ {/* REFERENCE-STRIP: <OffthreadVideo> removed — bring your own clip */}
139
+ </div>
140
+ </AbsoluteFill>
141
+ </Sequence>
142
+
143
+ {/* Footer tag — inside bottom safe-zone clearance */}
144
+ <div
145
+ style={{
146
+ position: "absolute",
147
+ bottom: 120,
148
+ left: 0,
149
+ right: 0,
150
+ textAlign: "center",
151
+ color: C.fgMuted,
152
+ fontSize: 30,
153
+ fontWeight: 500,
154
+ letterSpacing: 0.5,
155
+ opacity: videoFade,
156
+ }}
157
+ >
158
+ stitch.withgoogle.com
159
+ </div>
160
+ </AbsoluteFill>
161
+ );
162
+ };
@@ -17,7 +17,6 @@
17
17
  import React from "react";
18
18
  import {
19
19
  AbsoluteFill,
20
- Audio,
21
20
  Easing,
22
21
  Img,
23
22
  OffthreadVideo,
@@ -2630,7 +2629,7 @@ export const HereticReel: React.FC = () => {
2630
2629
  {frame >= HBEAT.stars && frame < HBEAT.cta && <StarsScene />}
2631
2630
  {frame >= HBEAT.cta && frame < HBEAT.end && <CtaScene />}
2632
2631
 
2633
- {/* REFERENCE-STRIP: <Audio> tag removed — bring your own voiceover */}
2632
+ {/* REFERENCE-STRIP: voiceover tag removed — bring your own voiceover */}
2634
2633
  </AbsoluteFill>
2635
2634
  );
2636
2635
  };
@@ -17,7 +17,6 @@
17
17
  import React from "react";
18
18
  import {
19
19
  AbsoluteFill,
20
- Audio,
21
20
  Easing,
22
21
  Img,
23
22
  OffthreadVideo,
@@ -818,9 +817,10 @@ const HookScene: React.FC = () => {
818
817
  top: "55%",
819
818
  left: -2,
820
819
  height: 4,
820
+ width: "calc(100% + 4px)",
821
821
  background: C.crimson,
822
- width: `calc(${strikeWidth}% + 4px)`,
823
- transform: "translateY(-50%) rotate(-2deg)",
822
+ transform: `translateY(-50%) rotate(-2deg) scaleX(${strikeWidth / 100})`,
823
+ transformOrigin: "left center",
824
824
  boxShadow: `0 0 12px ${C.crimson}`,
825
825
  borderRadius: 2,
826
826
  }}
@@ -3777,7 +3777,7 @@ export const ClaudeWatchReel: React.FC<{ embedded?: boolean }> = ({
3777
3777
  fontFamily: FONT,
3778
3778
  }}
3779
3779
  >
3780
- {!embedded && {/* REFERENCE-STRIP: <Audio> tag removed — bring your own voiceover */}}
3780
+ {!embedded && {/* REFERENCE-STRIP: voiceover tag removed — bring your own voiceover */}}
3781
3781
 
3782
3782
  {/* Perpetual atmosphere — runs all scenes (skipped when embedded; host provides bg+caustics) */}
3783
3783
  {!embedded && <CausticBlobs />}