@assistkick/create 1.7.0 → 1.8.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.
Files changed (200) hide show
  1. package/dist/bin/create.js +0 -0
  2. package/package.json +9 -7
  3. package/templates/assistkick-product-system/.env.example +1 -0
  4. package/templates/assistkick-product-system/local.db +0 -0
  5. package/templates/assistkick-product-system/package.json +4 -2
  6. package/templates/assistkick-product-system/packages/backend/package.json +2 -0
  7. package/templates/assistkick-product-system/packages/backend/src/routes/agents.ts +165 -0
  8. package/templates/assistkick-product-system/packages/backend/src/routes/files.test.ts +358 -0
  9. package/templates/assistkick-product-system/packages/backend/src/routes/files.ts +356 -0
  10. package/templates/assistkick-product-system/packages/backend/src/routes/git.ts +96 -1
  11. package/templates/assistkick-product-system/packages/backend/src/routes/graph.ts +1 -0
  12. package/templates/assistkick-product-system/packages/backend/src/routes/kanban.ts +43 -4
  13. package/templates/assistkick-product-system/packages/backend/src/routes/pipeline.ts +200 -84
  14. package/templates/assistkick-product-system/packages/backend/src/routes/projects.ts +6 -3
  15. package/templates/assistkick-product-system/packages/backend/src/routes/terminal.ts +53 -17
  16. package/templates/assistkick-product-system/packages/backend/src/routes/video.ts +218 -0
  17. package/templates/assistkick-product-system/packages/backend/src/routes/workflow_groups.ts +119 -0
  18. package/templates/assistkick-product-system/packages/backend/src/routes/workflows.ts +154 -0
  19. package/templates/assistkick-product-system/packages/backend/src/server.ts +81 -9
  20. package/templates/assistkick-product-system/packages/backend/src/services/agent_service.test.ts +489 -0
  21. package/templates/assistkick-product-system/packages/backend/src/services/agent_service.ts +416 -0
  22. package/templates/assistkick-product-system/packages/backend/src/services/bundle_service.test.ts +189 -0
  23. package/templates/assistkick-product-system/packages/backend/src/services/bundle_service.ts +182 -0
  24. package/templates/assistkick-product-system/packages/backend/src/services/init.ts +28 -78
  25. package/templates/assistkick-product-system/packages/backend/src/services/project_service.test.ts +16 -0
  26. package/templates/assistkick-product-system/packages/backend/src/services/project_service.ts +73 -2
  27. package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.test.ts +4 -4
  28. package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.ts +87 -11
  29. package/templates/assistkick-product-system/packages/backend/src/services/pty_session_manager.test.ts +210 -69
  30. package/templates/assistkick-product-system/packages/backend/src/services/pty_session_manager.ts +210 -215
  31. package/templates/assistkick-product-system/packages/backend/src/services/ssh_key_service.test.ts +162 -0
  32. package/templates/assistkick-product-system/packages/backend/src/services/ssh_key_service.ts +148 -0
  33. package/templates/assistkick-product-system/packages/backend/src/services/terminal_ws_handler.ts +11 -5
  34. package/templates/assistkick-product-system/packages/backend/src/services/tts_service.test.ts +64 -0
  35. package/templates/assistkick-product-system/packages/backend/src/services/tts_service.ts +134 -0
  36. package/templates/assistkick-product-system/packages/backend/src/services/video_render_service.test.ts +256 -0
  37. package/templates/assistkick-product-system/packages/backend/src/services/video_render_service.ts +258 -0
  38. package/templates/assistkick-product-system/packages/backend/src/services/workflow_group_service.ts +106 -0
  39. package/templates/assistkick-product-system/packages/backend/src/services/workflow_service.test.ts +275 -0
  40. package/templates/assistkick-product-system/packages/backend/src/services/workflow_service.ts +222 -0
  41. package/templates/assistkick-product-system/packages/frontend/package-lock.json +3455 -0
  42. package/templates/assistkick-product-system/packages/frontend/package.json +6 -0
  43. package/templates/assistkick-product-system/packages/frontend/src/App.tsx +8 -0
  44. package/templates/assistkick-product-system/packages/frontend/src/api/client.ts +456 -16
  45. package/templates/assistkick-product-system/packages/frontend/src/api/client_files.test.ts +172 -0
  46. package/templates/assistkick-product-system/packages/frontend/src/api/client_video.test.ts +238 -0
  47. package/templates/assistkick-product-system/packages/frontend/src/components/AgentsView.tsx +307 -0
  48. package/templates/assistkick-product-system/packages/frontend/src/components/CoherenceView.tsx +82 -66
  49. package/templates/assistkick-product-system/packages/frontend/src/components/CompositionPlaceholder.tsx +97 -0
  50. package/templates/assistkick-product-system/packages/frontend/src/components/DesignSystemView.tsx +20 -0
  51. package/templates/assistkick-product-system/packages/frontend/src/components/EditorTabBar.tsx +57 -0
  52. package/templates/assistkick-product-system/packages/frontend/src/components/FileTree.tsx +313 -0
  53. package/templates/assistkick-product-system/packages/frontend/src/components/FileTreeContextMenu.tsx +61 -0
  54. package/templates/assistkick-product-system/packages/frontend/src/components/FileTreeInlineInput.tsx +73 -0
  55. package/templates/assistkick-product-system/packages/frontend/src/components/FilesView.tsx +404 -0
  56. package/templates/assistkick-product-system/packages/frontend/src/components/GitRepoModal.tsx +187 -56
  57. package/templates/assistkick-product-system/packages/frontend/src/components/GraphLegend.tsx +71 -73
  58. package/templates/assistkick-product-system/packages/frontend/src/components/GraphSettings.tsx +8 -8
  59. package/templates/assistkick-product-system/packages/frontend/src/components/GraphView.tsx +1 -1
  60. package/templates/assistkick-product-system/packages/frontend/src/components/InviteUserDialog.tsx +15 -11
  61. package/templates/assistkick-product-system/packages/frontend/src/components/KanbanView.tsx +202 -171
  62. package/templates/assistkick-product-system/packages/frontend/src/components/LoginPage.tsx +14 -14
  63. package/templates/assistkick-product-system/packages/frontend/src/components/ProjectSelector.tsx +54 -33
  64. package/templates/assistkick-product-system/packages/frontend/src/components/QaIssueSheet.tsx +32 -49
  65. package/templates/assistkick-product-system/packages/frontend/src/components/SidePanel.tsx +43 -48
  66. package/templates/assistkick-product-system/packages/frontend/src/components/TerminalView.tsx +121 -52
  67. package/templates/assistkick-product-system/packages/frontend/src/components/Toolbar.tsx +20 -14
  68. package/templates/assistkick-product-system/packages/frontend/src/components/UsersView.tsx +52 -52
  69. package/templates/assistkick-product-system/packages/frontend/src/components/VideoGallery.tsx +313 -0
  70. package/templates/assistkick-product-system/packages/frontend/src/components/VideographyView.tsx +250 -0
  71. package/templates/assistkick-product-system/packages/frontend/src/components/WorkflowsView.tsx +474 -0
  72. package/templates/assistkick-product-system/packages/frontend/src/components/ds/AccentBorderList.tsx +53 -0
  73. package/templates/assistkick-product-system/packages/frontend/src/components/ds/Button.tsx +87 -0
  74. package/templates/assistkick-product-system/packages/frontend/src/components/ds/ButtonGroup.tsx +29 -0
  75. package/templates/assistkick-product-system/packages/frontend/src/components/ds/ButtonShowcase.tsx +221 -0
  76. package/templates/assistkick-product-system/packages/frontend/src/components/ds/CardGlass.tsx +141 -0
  77. package/templates/assistkick-product-system/packages/frontend/src/components/ds/CompletionRing.tsx +30 -0
  78. package/templates/assistkick-product-system/packages/frontend/src/components/ds/ContentCard.tsx +34 -0
  79. package/templates/assistkick-product-system/packages/frontend/src/components/ds/IconButton.tsx +74 -0
  80. package/templates/assistkick-product-system/packages/frontend/src/components/ds/KanbanCard.tsx +103 -87
  81. package/templates/assistkick-product-system/packages/frontend/src/components/ds/KanbanCardShowcase.tsx +9 -188
  82. package/templates/assistkick-product-system/packages/frontend/src/components/ds/Kbd.tsx +11 -0
  83. package/templates/assistkick-product-system/packages/frontend/src/components/ds/KindBadge.tsx +21 -0
  84. package/templates/assistkick-product-system/packages/frontend/src/components/ds/NavBarSidekick.tsx +81 -37
  85. package/templates/assistkick-product-system/packages/frontend/src/components/ds/SidePanelShowcase.tsx +370 -0
  86. package/templates/assistkick-product-system/packages/frontend/src/components/ds/SideSheet.tsx +64 -0
  87. package/templates/assistkick-product-system/packages/frontend/src/components/ds/StatusDot.tsx +18 -0
  88. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/CheckCardPositionNode.tsx +36 -0
  89. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/CheckCycleCountNode.tsx +60 -0
  90. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/EndNode.tsx +42 -0
  91. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/GroupNode.tsx +189 -0
  92. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/NodePalette.tsx +123 -0
  93. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/RunAgentNode.tsx +51 -0
  94. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/SetCardMetadataNode.tsx +53 -0
  95. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/StartNode.tsx +18 -0
  96. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/TransitionCardNode.tsx +59 -0
  97. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/WorkflowCanvas.tsx +335 -0
  98. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/WorkflowMonitorModal.tsx +634 -0
  99. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/autoLayout.ts +103 -0
  100. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/edgeColors.ts +35 -0
  101. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/monitor_nodes.tsx +208 -0
  102. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/workflow_types.test.ts +119 -0
  103. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/workflow_types.ts +107 -0
  104. package/templates/assistkick-product-system/packages/frontend/src/constants/graph.ts +13 -11
  105. package/templates/assistkick-product-system/packages/frontend/src/hooks/useAutoSave.ts +75 -0
  106. package/templates/assistkick-product-system/packages/frontend/src/hooks/useToast.tsx +16 -3
  107. package/templates/assistkick-product-system/packages/frontend/src/pages/accept_invitation_page.tsx +30 -27
  108. package/templates/assistkick-product-system/packages/frontend/src/pages/forgot_password_page.tsx +18 -15
  109. package/templates/assistkick-product-system/packages/frontend/src/pages/register_page.tsx +21 -18
  110. package/templates/assistkick-product-system/packages/frontend/src/pages/reset_password_page.tsx +28 -25
  111. package/templates/assistkick-product-system/packages/frontend/src/routes/AgentsRoute.tsx +6 -0
  112. package/templates/assistkick-product-system/packages/frontend/src/routes/CoherenceRoute.tsx +1 -1
  113. package/templates/assistkick-product-system/packages/frontend/src/routes/DashboardLayout.tsx +2 -2
  114. package/templates/assistkick-product-system/packages/frontend/src/routes/FilesRoute.tsx +13 -0
  115. package/templates/assistkick-product-system/packages/frontend/src/routes/GraphRoute.tsx +2 -2
  116. package/templates/assistkick-product-system/packages/frontend/src/routes/VideographyRoute.tsx +13 -0
  117. package/templates/assistkick-product-system/packages/frontend/src/routes/WorkflowsRoute.tsx +6 -0
  118. package/templates/assistkick-product-system/packages/frontend/src/stores/useProjectStore.ts +6 -3
  119. package/templates/assistkick-product-system/packages/frontend/src/stores/useSidePanelStore.ts +4 -4
  120. package/templates/assistkick-product-system/packages/frontend/src/styles/index.css +275 -3535
  121. package/templates/assistkick-product-system/packages/frontend/src/utils/auto_save_service.test.ts +167 -0
  122. package/templates/assistkick-product-system/packages/frontend/src/utils/auto_save_service.ts +101 -0
  123. package/templates/assistkick-product-system/packages/frontend/src/utils/composition_matcher.test.ts +42 -0
  124. package/templates/assistkick-product-system/packages/frontend/src/utils/composition_matcher.ts +17 -0
  125. package/templates/assistkick-product-system/packages/frontend/src/utils/file_utils.test.ts +145 -0
  126. package/templates/assistkick-product-system/packages/frontend/src/utils/file_utils.ts +42 -0
  127. package/templates/assistkick-product-system/packages/frontend/src/utils/task_status.test.ts +4 -10
  128. package/templates/assistkick-product-system/packages/frontend/src/utils/task_status.ts +19 -1
  129. package/templates/assistkick-product-system/packages/frontend/vite.config.ts +5 -0
  130. package/templates/assistkick-product-system/packages/shared/db/local.db +0 -0
  131. package/templates/assistkick-product-system/packages/shared/db/migrations/0004_tidy_matthew_murdock.sql +9 -0
  132. package/templates/assistkick-product-system/packages/shared/db/migrations/0005_mysterious_falcon.sql +692 -0
  133. package/templates/assistkick-product-system/packages/shared/db/migrations/0006_next_venom.sql +9 -0
  134. package/templates/assistkick-product-system/packages/shared/db/migrations/0007_deep_barracuda.sql +39 -0
  135. package/templates/assistkick-product-system/packages/shared/db/migrations/0008_puzzling_hannibal_king.sql +1 -0
  136. package/templates/assistkick-product-system/packages/shared/db/migrations/0009_amused_beast.sql +8 -0
  137. package/templates/assistkick-product-system/packages/shared/db/migrations/0010_spotty_moira_mactaggert.sql +9 -0
  138. package/templates/assistkick-product-system/packages/shared/db/migrations/0011_goofy_snowbird.sql +3 -0
  139. package/templates/assistkick-product-system/packages/shared/db/migrations/0011_supreme_doctor_octopus.sql +3 -0
  140. package/templates/assistkick-product-system/packages/shared/db/migrations/0013_reflective_prowler.sql +15 -0
  141. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0004_snapshot.json +921 -0
  142. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0005_snapshot.json +1042 -0
  143. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0006_snapshot.json +1101 -0
  144. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0007_snapshot.json +1336 -0
  145. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0008_snapshot.json +1275 -0
  146. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0009_snapshot.json +1327 -0
  147. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0010_snapshot.json +1393 -0
  148. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0011_snapshot.json +1436 -0
  149. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0013_snapshot.json +1538 -0
  150. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/_journal.json +70 -0
  151. package/templates/assistkick-product-system/packages/shared/db/schema.ts +113 -0
  152. package/templates/assistkick-product-system/packages/shared/lib/claude-service.ts +32 -7
  153. package/templates/assistkick-product-system/packages/shared/lib/constants.ts +9 -0
  154. package/templates/assistkick-product-system/packages/shared/lib/git_workflow.ts +12 -4
  155. package/templates/assistkick-product-system/packages/shared/lib/graph.ts +5 -0
  156. package/templates/assistkick-product-system/packages/shared/lib/workflow_engine.test.ts +1753 -0
  157. package/templates/assistkick-product-system/packages/shared/lib/workflow_engine.ts +1281 -0
  158. package/templates/assistkick-product-system/packages/shared/lib/workflow_orchestrator.ts +211 -0
  159. package/templates/assistkick-product-system/packages/shared/tools/add_node.test.ts +43 -0
  160. package/templates/assistkick-product-system/packages/shared/tools/add_node.ts +13 -2
  161. package/templates/assistkick-product-system/packages/shared/tools/get_kanban.ts +1 -1
  162. package/templates/assistkick-product-system/packages/shared/tools/migrate_epics.test.ts +226 -0
  163. package/templates/assistkick-product-system/packages/shared/tools/migrate_epics.ts +251 -0
  164. package/templates/assistkick-product-system/packages/shared/tools/update_node.ts +2 -2
  165. package/templates/assistkick-product-system/packages/shared/utils/hello_workflow.test.ts +10 -0
  166. package/templates/assistkick-product-system/packages/shared/utils/hello_workflow.ts +6 -0
  167. package/templates/assistkick-product-system/packages/video/Root.tsx +85 -0
  168. package/templates/assistkick-product-system/packages/video/components/email_scene.tsx +231 -0
  169. package/templates/assistkick-product-system/packages/video/components/outro_scene.tsx +153 -0
  170. package/templates/assistkick-product-system/packages/video/components/part_divider.tsx +90 -0
  171. package/templates/assistkick-product-system/packages/video/components/scene.tsx +226 -0
  172. package/templates/assistkick-product-system/packages/video/components/theme.ts +22 -0
  173. package/templates/assistkick-product-system/packages/video/components/title_scene.tsx +169 -0
  174. package/templates/assistkick-product-system/packages/video/components/video_split_layout.tsx +84 -0
  175. package/templates/assistkick-product-system/packages/video/compositions/.gitkeep +0 -0
  176. package/templates/assistkick-product-system/packages/video/index.ts +4 -0
  177. package/templates/assistkick-product-system/packages/video/package.json +28 -0
  178. package/templates/assistkick-product-system/packages/video/remotion.config.ts +11 -0
  179. package/templates/assistkick-product-system/packages/video/scripts/process_script.test.ts +326 -0
  180. package/templates/assistkick-product-system/packages/video/scripts/process_script.ts +630 -0
  181. package/templates/assistkick-product-system/packages/video/style.css +1 -0
  182. package/templates/assistkick-product-system/packages/video/tsconfig.json +18 -0
  183. package/templates/assistkick-product-system/tests/graph_legend.test.ts +2 -1
  184. package/templates/assistkick-product-system/tests/video_render_service.test.ts +179 -0
  185. package/templates/assistkick-product-system/tests/web_terminal.test.ts +219 -455
  186. package/templates/assistkick-product-system/tests/workflow_integration.test.ts +341 -0
  187. package/templates/skills/assistkick-developer/SKILL.md +3 -0
  188. package/templates/skills/assistkick-developer/references/react_development_guidelines.md +225 -0
  189. package/templates/skills/product-system/graph.json +1890 -0
  190. package/templates/skills/product-system/kanban.json +304 -0
  191. package/templates/skills/product-system/nodes/comp_001.md +56 -0
  192. package/templates/skills/product-system/nodes/comp_002.md +57 -0
  193. package/templates/skills/product-system/nodes/data_001.md +51 -0
  194. package/templates/skills/product-system/nodes/data_002.md +40 -0
  195. package/templates/skills/product-system/nodes/data_004.md +38 -0
  196. package/templates/skills/product-system/nodes/dec_001.md +34 -0
  197. package/templates/skills/product-system/nodes/dec_016.md +32 -0
  198. package/templates/skills/product-system/nodes/feat_008.md +30 -0
  199. package/templates/skills/video-composition-agent/SKILL.md +232 -0
  200. package/templates/skills/video-script-writer/SKILL.md +136 -0
@@ -0,0 +1,153 @@
1
+ /** @jsxImportSource react */
2
+ import {
3
+ AbsoluteFill,
4
+ useCurrentFrame,
5
+ useVideoConfig,
6
+ interpolate,
7
+ spring,
8
+ } from "remotion";
9
+ import { colors, fonts } from "./theme";
10
+
11
+ type OutroSceneProps = {
12
+ title?: string;
13
+ subtitle?: string;
14
+ callToAction?: string;
15
+ };
16
+
17
+ export const OutroScene: React.FC<OutroSceneProps> = ({
18
+ title = "Done!",
19
+ subtitle = "The process is complete",
20
+ callToAction,
21
+ }) => {
22
+ const frame = useCurrentFrame();
23
+ const { fps } = useVideoConfig();
24
+
25
+ const checkSpring = spring({
26
+ frame,
27
+ fps,
28
+ config: { damping: 12 },
29
+ });
30
+
31
+ const checkScale = interpolate(checkSpring, [0, 1], [0, 1]);
32
+
33
+ const textOpacity = interpolate(frame, [0.5 * fps, 1 * fps], [0, 1], {
34
+ extrapolateLeft: "clamp",
35
+ extrapolateRight: "clamp",
36
+ });
37
+
38
+ const textY = interpolate(frame, [0.5 * fps, 1 * fps], [20, 0], {
39
+ extrapolateLeft: "clamp",
40
+ extrapolateRight: "clamp",
41
+ });
42
+
43
+ const urlOpacity = interpolate(frame, [1.2 * fps, 1.7 * fps], [0, 1], {
44
+ extrapolateLeft: "clamp",
45
+ extrapolateRight: "clamp",
46
+ });
47
+
48
+ return (
49
+ <AbsoluteFill
50
+ style={{
51
+ backgroundColor: colors.baseDark,
52
+ fontFamily: fonts.sans,
53
+ display: "flex",
54
+ alignItems: "center",
55
+ justifyContent: "center",
56
+ }}
57
+ >
58
+ {/* Background gradient circle */}
59
+ <div
60
+ style={{
61
+ position: "absolute",
62
+ width: 600,
63
+ height: 600,
64
+ borderRadius: "50%",
65
+ background:
66
+ "radial-gradient(circle, rgba(220,241,131,0.15) 0%, transparent 70%)",
67
+ top: "50%",
68
+ left: "50%",
69
+ transform: "translate(-50%, -50%)",
70
+ }}
71
+ />
72
+
73
+ <div style={{ textAlign: "center" }}>
74
+ {/* Checkmark */}
75
+ <div
76
+ style={{
77
+ width: 100,
78
+ height: 100,
79
+ borderRadius: "50%",
80
+ backgroundColor: colors.accentSecondary,
81
+ display: "flex",
82
+ alignItems: "center",
83
+ justifyContent: "center",
84
+ margin: "0 auto 32px",
85
+ transform: `scale(${checkScale})`,
86
+ }}
87
+ >
88
+ <svg
89
+ width="50"
90
+ height="50"
91
+ viewBox="0 0 24 24"
92
+ fill="none"
93
+ stroke="white"
94
+ strokeWidth="3"
95
+ strokeLinecap="round"
96
+ strokeLinejoin="round"
97
+ >
98
+ <polyline points="20 6 9 17 4 12" />
99
+ </svg>
100
+ </div>
101
+
102
+ <h1
103
+ style={{
104
+ color: "white",
105
+ fontSize: 52,
106
+ fontWeight: 700,
107
+ margin: "0 0 16px 0",
108
+ opacity: textOpacity,
109
+ transform: `translateY(${textY}px)`,
110
+ }}
111
+ >
112
+ {title}
113
+ </h1>
114
+
115
+ <p
116
+ style={{
117
+ color: "rgba(255,255,255,0.6)",
118
+ fontSize: 28,
119
+ margin: "0 0 40px 0",
120
+ opacity: textOpacity,
121
+ transform: `translateY(${textY}px)`,
122
+ }}
123
+ >
124
+ {subtitle}
125
+ </p>
126
+
127
+ {callToAction && (
128
+ <div
129
+ style={{
130
+ opacity: urlOpacity,
131
+ display: "inline-flex",
132
+ alignItems: "center",
133
+ backgroundColor: "rgba(255,255,255,0.08)",
134
+ borderRadius: 12,
135
+ padding: "12px 28px",
136
+ border: "1px solid rgba(255,255,255,0.12)",
137
+ }}
138
+ >
139
+ <code
140
+ style={{
141
+ color: colors.accentPrimary,
142
+ fontSize: 22,
143
+ fontFamily: fonts.mono,
144
+ }}
145
+ >
146
+ {callToAction}
147
+ </code>
148
+ </div>
149
+ )}
150
+ </div>
151
+ </AbsoluteFill>
152
+ );
153
+ };
@@ -0,0 +1,90 @@
1
+ /** @jsxImportSource react */
2
+ import {
3
+ AbsoluteFill,
4
+ useCurrentFrame,
5
+ useVideoConfig,
6
+ interpolate,
7
+ spring,
8
+ } from "remotion";
9
+ import { colors, fonts } from "./theme";
10
+
11
+ type PartDividerProps = {
12
+ partNumber: number;
13
+ title: string;
14
+ color: string;
15
+ };
16
+
17
+ export const PartDivider: React.FC<PartDividerProps> = ({
18
+ partNumber,
19
+ title,
20
+ color,
21
+ }) => {
22
+ const frame = useCurrentFrame();
23
+ const { fps } = useVideoConfig();
24
+
25
+ const lineWidth = interpolate(frame, [0, 0.6 * fps], [0, 800], {
26
+ extrapolateLeft: "clamp",
27
+ extrapolateRight: "clamp",
28
+ });
29
+
30
+ const textSpring = spring({
31
+ frame: frame - 0.3 * fps,
32
+ fps,
33
+ config: { damping: 200 },
34
+ });
35
+
36
+ const textOpacity = interpolate(textSpring, [0, 1], [0, 1]);
37
+ const textY = interpolate(textSpring, [0, 1], [30, 0]);
38
+
39
+ return (
40
+ <AbsoluteFill
41
+ style={{
42
+ backgroundColor: colors.baseDark,
43
+ fontFamily: fonts.sans,
44
+ display: "flex",
45
+ alignItems: "center",
46
+ justifyContent: "center",
47
+ }}
48
+ >
49
+ <div style={{ textAlign: "center" }}>
50
+ <div
51
+ style={{
52
+ width: lineWidth,
53
+ height: 3,
54
+ backgroundColor: color,
55
+ margin: "0 auto 32px",
56
+ borderRadius: 2,
57
+ }}
58
+ />
59
+ <div
60
+ style={{
61
+ opacity: textOpacity,
62
+ transform: `translateY(${textY}px)`,
63
+ }}
64
+ >
65
+ <span
66
+ style={{
67
+ color,
68
+ fontSize: 22,
69
+ fontWeight: 600,
70
+ textTransform: "uppercase",
71
+ letterSpacing: 4,
72
+ }}
73
+ >
74
+ Part {partNumber}
75
+ </span>
76
+ <h2
77
+ style={{
78
+ color: "white",
79
+ fontSize: 56,
80
+ fontWeight: 700,
81
+ margin: "12px 0 0 0",
82
+ }}
83
+ >
84
+ {title}
85
+ </h2>
86
+ </div>
87
+ </div>
88
+ </AbsoluteFill>
89
+ );
90
+ };
@@ -0,0 +1,226 @@
1
+ /** @jsxImportSource react */
2
+ import {
3
+ useCurrentFrame,
4
+ useVideoConfig,
5
+ interpolate,
6
+ spring,
7
+ } from "remotion";
8
+ import { VideoSplitLayout } from "./video_split_layout";
9
+ import { colors, fonts } from "./theme";
10
+
11
+ type SceneProps = {
12
+ stepNumber: number;
13
+ title: string;
14
+ bullets: string[];
15
+ route?: string;
16
+ part: "primary" | "secondary";
17
+ highlight?: string;
18
+ video?: string;
19
+ partLabel?: string;
20
+ };
21
+
22
+ export const Scene: React.FC<SceneProps> = ({
23
+ stepNumber,
24
+ title,
25
+ bullets,
26
+ route,
27
+ part,
28
+ highlight,
29
+ video,
30
+ partLabel,
31
+ }) => {
32
+ const frame = useCurrentFrame();
33
+ const { fps } = useVideoConfig();
34
+
35
+ const bgColor = part === "primary" ? colors.primary : colors.secondary;
36
+ const accentColor =
37
+ part === "primary" ? colors.accentPrimary : colors.accentSecondary;
38
+
39
+ const titleSpring = spring({
40
+ frame,
41
+ fps,
42
+ config: { damping: 200 },
43
+ });
44
+
45
+ const titleY = interpolate(titleSpring, [0, 1], [40, 0]);
46
+ const titleOpacity = interpolate(titleSpring, [0, 1], [0, 1]);
47
+
48
+ const routeOpacity = interpolate(frame, [0.3 * fps, 0.6 * fps], [0, 1], {
49
+ extrapolateLeft: "clamp",
50
+ extrapolateRight: "clamp",
51
+ });
52
+
53
+ return (
54
+ <VideoSplitLayout
55
+ video={video}
56
+ backgroundColor={bgColor}
57
+ accentColor={accentColor}
58
+ >
59
+ {(hasVideo) => (
60
+ <>
61
+ {/* Step badge */}
62
+ <div
63
+ style={{
64
+ opacity: titleOpacity,
65
+ transform: `translateY(${titleY}px)`,
66
+ marginBottom: 24,
67
+ }}
68
+ >
69
+ <div
70
+ style={{
71
+ display: "flex",
72
+ alignItems: "center",
73
+ gap: 16,
74
+ }}
75
+ >
76
+ <div
77
+ style={{
78
+ width: 56,
79
+ height: 56,
80
+ borderRadius: "50%",
81
+ backgroundColor: accentColor,
82
+ display: "flex",
83
+ alignItems: "center",
84
+ justifyContent: "center",
85
+ color: "white",
86
+ fontSize: 28,
87
+ fontWeight: 700,
88
+ }}
89
+ >
90
+ {stepNumber}
91
+ </div>
92
+ {partLabel && (
93
+ <span
94
+ style={{
95
+ color: accentColor,
96
+ fontSize: 20,
97
+ fontWeight: 600,
98
+ textTransform: "uppercase",
99
+ letterSpacing: 2,
100
+ }}
101
+ >
102
+ {partLabel}
103
+ </span>
104
+ )}
105
+ </div>
106
+ </div>
107
+
108
+ {/* Title */}
109
+ <div
110
+ style={{
111
+ opacity: titleOpacity,
112
+ transform: `translateY(${titleY}px)`,
113
+ marginBottom: 20,
114
+ }}
115
+ >
116
+ <h1
117
+ style={{
118
+ color: "white",
119
+ fontSize: hasVideo ? 42 : 52,
120
+ fontWeight: 700,
121
+ margin: 0,
122
+ lineHeight: 1.2,
123
+ }}
124
+ >
125
+ {title}
126
+ </h1>
127
+ </div>
128
+
129
+ {/* Route indicator */}
130
+ {route && (
131
+ <div
132
+ style={{
133
+ opacity: routeOpacity,
134
+ marginBottom: 24,
135
+ }}
136
+ >
137
+ <div
138
+ style={{
139
+ display: "inline-flex",
140
+ alignItems: "center",
141
+ backgroundColor: "rgba(255,255,255,0.1)",
142
+ borderRadius: 8,
143
+ padding: "8px 20px",
144
+ border: "1px solid rgba(255,255,255,0.15)",
145
+ }}
146
+ >
147
+ <span
148
+ style={{
149
+ color: "rgba(255,255,255,0.5)",
150
+ fontSize: 16,
151
+ marginRight: 8,
152
+ }}
153
+ >
154
+ URL:
155
+ </span>
156
+ <code
157
+ style={{
158
+ color: accentColor,
159
+ fontSize: hasVideo ? 18 : 22,
160
+ fontFamily: fonts.mono,
161
+ fontWeight: 600,
162
+ }}
163
+ >
164
+ {route}
165
+ </code>
166
+ </div>
167
+ </div>
168
+ )}
169
+
170
+ {/* Bullets */}
171
+ <div>
172
+ {bullets.map((bullet, i) => {
173
+ const bulletDelay = 0.5 * fps + i * 0.4 * fps;
174
+ const bulletSpring = spring({
175
+ frame: frame - bulletDelay,
176
+ fps,
177
+ config: { damping: 200 },
178
+ });
179
+ const bulletX = interpolate(bulletSpring, [0, 1], [30, 0]);
180
+ const bulletOp = interpolate(bulletSpring, [0, 1], [0, 1]);
181
+
182
+ const isHighlighted = highlight && bullet.includes(highlight);
183
+
184
+ return (
185
+ <div
186
+ key={i}
187
+ style={{
188
+ opacity: bulletOp,
189
+ transform: `translateX(${bulletX}px)`,
190
+ display: "flex",
191
+ alignItems: "flex-start",
192
+ gap: 16,
193
+ marginBottom: hasVideo ? 18 : 24,
194
+ }}
195
+ >
196
+ <div
197
+ style={{
198
+ width: 8,
199
+ height: 8,
200
+ borderRadius: "50%",
201
+ backgroundColor: accentColor,
202
+ marginTop: 12,
203
+ flexShrink: 0,
204
+ }}
205
+ />
206
+ <span
207
+ style={{
208
+ color: isHighlighted
209
+ ? accentColor
210
+ : "rgba(255,255,255,0.9)",
211
+ fontSize: hasVideo ? 24 : 28,
212
+ lineHeight: 1.5,
213
+ fontWeight: isHighlighted ? 600 : 400,
214
+ }}
215
+ >
216
+ {bullet}
217
+ </span>
218
+ </div>
219
+ );
220
+ })}
221
+ </div>
222
+ </>
223
+ )}
224
+ </VideoSplitLayout>
225
+ );
226
+ };
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Remotion video theme — color palette and font families.
3
+ * Compositions can override these defaults via inputProps.
4
+ */
5
+
6
+ export const fonts = {
7
+ sans: "'DM Sans', sans-serif",
8
+ mono: "'JetBrains Mono', 'Fira Code', monospace",
9
+ } as const;
10
+
11
+ export const colors = {
12
+ /** Primary dark teal — primary scene backgrounds */
13
+ primary: "#124142",
14
+ /** Muted-800 — secondary scene backgrounds */
15
+ secondary: "#272b26",
16
+ /** Light teal — primary accent */
17
+ accentPrimary: "#bbdedd",
18
+ /** Yellow-green — secondary accent / CTAs */
19
+ accentSecondary: "#dcf183",
20
+ /** Muted-950 — darkest background */
21
+ baseDark: "#0e100e",
22
+ } as const;
@@ -0,0 +1,169 @@
1
+ /** @jsxImportSource react */
2
+ import {
3
+ AbsoluteFill,
4
+ useCurrentFrame,
5
+ useVideoConfig,
6
+ interpolate,
7
+ spring,
8
+ } from "remotion";
9
+ import { colors, fonts } from "./theme";
10
+
11
+ type TitleSceneProps = {
12
+ brandName?: string;
13
+ title: string;
14
+ subtitle?: string;
15
+ titleAccent?: string;
16
+ };
17
+
18
+ export const TitleScene: React.FC<TitleSceneProps> = ({
19
+ brandName,
20
+ title,
21
+ subtitle,
22
+ titleAccent,
23
+ }) => {
24
+ const frame = useCurrentFrame();
25
+ const { fps } = useVideoConfig();
26
+
27
+ const titleSpring = spring({
28
+ frame,
29
+ fps,
30
+ config: { damping: 200 },
31
+ });
32
+
33
+ const titleScale = interpolate(titleSpring, [0, 1], [0.8, 1]);
34
+ const titleOpacity = interpolate(titleSpring, [0, 1], [0, 1]);
35
+
36
+ const subtitleOpacity = interpolate(
37
+ frame,
38
+ [0.8 * fps, 1.3 * fps],
39
+ [0, 1],
40
+ {
41
+ extrapolateLeft: "clamp",
42
+ extrapolateRight: "clamp",
43
+ },
44
+ );
45
+
46
+ const subtitleY = interpolate(frame, [0.8 * fps, 1.3 * fps], [20, 0], {
47
+ extrapolateLeft: "clamp",
48
+ extrapolateRight: "clamp",
49
+ });
50
+
51
+ const lineWidth = interpolate(frame, [0.5 * fps, 1.2 * fps], [0, 400], {
52
+ extrapolateLeft: "clamp",
53
+ extrapolateRight: "clamp",
54
+ });
55
+
56
+ return (
57
+ <AbsoluteFill
58
+ style={{
59
+ backgroundColor: colors.baseDark,
60
+ fontFamily: fonts.sans,
61
+ display: "flex",
62
+ alignItems: "center",
63
+ justifyContent: "center",
64
+ }}
65
+ >
66
+ {/* Background gradient circles */}
67
+ <div
68
+ style={{
69
+ position: "absolute",
70
+ width: 600,
71
+ height: 600,
72
+ borderRadius: "50%",
73
+ background:
74
+ "radial-gradient(circle, rgba(187,222,221,0.15) 0%, transparent 70%)",
75
+ top: -100,
76
+ right: -100,
77
+ }}
78
+ />
79
+ <div
80
+ style={{
81
+ position: "absolute",
82
+ width: 500,
83
+ height: 500,
84
+ borderRadius: "50%",
85
+ background:
86
+ "radial-gradient(circle, rgba(220,241,131,0.12) 0%, transparent 70%)",
87
+ bottom: -100,
88
+ left: -100,
89
+ }}
90
+ />
91
+
92
+ <div
93
+ style={{
94
+ textAlign: "center",
95
+ opacity: titleOpacity,
96
+ transform: `scale(${titleScale})`,
97
+ }}
98
+ >
99
+ {/* Brand name */}
100
+ {brandName && (
101
+ <div
102
+ style={{
103
+ color: colors.accentPrimary,
104
+ fontSize: 24,
105
+ fontWeight: 600,
106
+ textTransform: "uppercase",
107
+ letterSpacing: 4,
108
+ marginBottom: 24,
109
+ }}
110
+ >
111
+ {brandName}
112
+ </div>
113
+ )}
114
+
115
+ {/* Main title */}
116
+ <h1
117
+ style={{
118
+ color: "white",
119
+ fontSize: 64,
120
+ fontWeight: 800,
121
+ margin: 0,
122
+ lineHeight: 1.2,
123
+ }}
124
+ >
125
+ {title}
126
+ </h1>
127
+ {titleAccent && (
128
+ <h2
129
+ style={{
130
+ color: colors.accentPrimary,
131
+ fontSize: 56,
132
+ fontWeight: 700,
133
+ margin: "8px 0 0 0",
134
+ }}
135
+ >
136
+ {titleAccent}
137
+ </h2>
138
+ )}
139
+
140
+ {/* Decorative line */}
141
+ <div
142
+ style={{
143
+ width: lineWidth,
144
+ height: 3,
145
+ backgroundColor: colors.accentPrimary,
146
+ margin: "32px auto",
147
+ borderRadius: 2,
148
+ }}
149
+ />
150
+
151
+ {/* Subtitle */}
152
+ {subtitle && (
153
+ <p
154
+ style={{
155
+ color: "rgba(255,255,255,0.6)",
156
+ fontSize: 28,
157
+ fontWeight: 400,
158
+ opacity: subtitleOpacity,
159
+ transform: `translateY(${subtitleY}px)`,
160
+ margin: 0,
161
+ }}
162
+ >
163
+ {subtitle}
164
+ </p>
165
+ )}
166
+ </div>
167
+ </AbsoluteFill>
168
+ );
169
+ };