videowright 0.1.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 (306) hide show
  1. package/README.md +91 -0
  2. package/dist/cli/argv.d.ts +28 -0
  3. package/dist/cli/argv.d.ts.map +1 -0
  4. package/dist/cli/argv.js +115 -0
  5. package/dist/cli/argv.js.map +1 -0
  6. package/dist/cli/bin.d.ts +7 -0
  7. package/dist/cli/bin.d.ts.map +1 -0
  8. package/dist/cli/bin.js +10 -0
  9. package/dist/cli/bin.js.map +1 -0
  10. package/dist/cli/dev.d.ts +19 -0
  11. package/dist/cli/dev.d.ts.map +1 -0
  12. package/dist/cli/dev.js +104 -0
  13. package/dist/cli/dev.js.map +1 -0
  14. package/dist/cli/discover.d.ts +29 -0
  15. package/dist/cli/discover.d.ts.map +1 -0
  16. package/dist/cli/discover.js +104 -0
  17. package/dist/cli/discover.js.map +1 -0
  18. package/dist/cli/discover_project.d.ts +29 -0
  19. package/dist/cli/discover_project.d.ts.map +1 -0
  20. package/dist/cli/discover_project.js +108 -0
  21. package/dist/cli/discover_project.js.map +1 -0
  22. package/dist/cli/errors.d.ts +10 -0
  23. package/dist/cli/errors.d.ts.map +1 -0
  24. package/dist/cli/errors.js +13 -0
  25. package/dist/cli/errors.js.map +1 -0
  26. package/dist/cli/ffmpeg.d.ts +57 -0
  27. package/dist/cli/ffmpeg.d.ts.map +1 -0
  28. package/dist/cli/ffmpeg.js +122 -0
  29. package/dist/cli/ffmpeg.js.map +1 -0
  30. package/dist/cli/index.d.ts +7 -0
  31. package/dist/cli/index.d.ts.map +1 -0
  32. package/dist/cli/index.js +152 -0
  33. package/dist/cli/index.js.map +1 -0
  34. package/dist/cli/playwright_check.d.ts +44 -0
  35. package/dist/cli/playwright_check.d.ts.map +1 -0
  36. package/dist/cli/playwright_check.js +20 -0
  37. package/dist/cli/playwright_check.js.map +1 -0
  38. package/dist/cli/prompt.d.ts +13 -0
  39. package/dist/cli/prompt.d.ts.map +1 -0
  40. package/dist/cli/prompt.js +47 -0
  41. package/dist/cli/prompt.js.map +1 -0
  42. package/dist/cli/render.d.ts +60 -0
  43. package/dist/cli/render.d.ts.map +1 -0
  44. package/dist/cli/render.js +471 -0
  45. package/dist/cli/render.js.map +1 -0
  46. package/dist/cli/script_cmd.d.ts +26 -0
  47. package/dist/cli/script_cmd.d.ts.map +1 -0
  48. package/dist/cli/script_cmd.js +88 -0
  49. package/dist/cli/script_cmd.js.map +1 -0
  50. package/dist/cli/time_shim.d.ts +44 -0
  51. package/dist/cli/time_shim.d.ts.map +1 -0
  52. package/dist/cli/time_shim.js +390 -0
  53. package/dist/cli/time_shim.js.map +1 -0
  54. package/dist/cli/ts_loader.d.ts +28 -0
  55. package/dist/cli/ts_loader.d.ts.map +1 -0
  56. package/dist/cli/ts_loader.js +95 -0
  57. package/dist/cli/ts_loader.js.map +1 -0
  58. package/dist/cli/vite_helpers.d.ts +62 -0
  59. package/dist/cli/vite_helpers.d.ts.map +1 -0
  60. package/dist/cli/vite_helpers.js +273 -0
  61. package/dist/cli/vite_helpers.js.map +1 -0
  62. package/dist/index.d.ts +11 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +14 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/player/hash_router.d.ts +23 -0
  67. package/dist/player/hash_router.d.ts.map +1 -0
  68. package/dist/player/hash_router.js +49 -0
  69. package/dist/player/hash_router.js.map +1 -0
  70. package/dist/player/hud.d.ts +33 -0
  71. package/dist/player/hud.d.ts.map +1 -0
  72. package/dist/player/hud.js +357 -0
  73. package/dist/player/hud.js.map +1 -0
  74. package/dist/player/index.d.ts +123 -0
  75. package/dist/player/index.d.ts.map +1 -0
  76. package/dist/player/index.js +848 -0
  77. package/dist/player/index.js.map +1 -0
  78. package/dist/player/input.d.ts +14 -0
  79. package/dist/player/input.d.ts.map +1 -0
  80. package/dist/player/input.js +90 -0
  81. package/dist/player/input.js.map +1 -0
  82. package/dist/player/slot.d.ts +22 -0
  83. package/dist/player/slot.d.ts.map +1 -0
  84. package/dist/player/slot.js +43 -0
  85. package/dist/player/slot.js.map +1 -0
  86. package/dist/player/transitions/cut.d.ts +7 -0
  87. package/dist/player/transitions/cut.d.ts.map +1 -0
  88. package/dist/player/transitions/cut.js +9 -0
  89. package/dist/player/transitions/cut.js.map +1 -0
  90. package/dist/player/transitions/fade.d.ts +7 -0
  91. package/dist/player/transitions/fade.d.ts.map +1 -0
  92. package/dist/player/transitions/fade.js +18 -0
  93. package/dist/player/transitions/fade.js.map +1 -0
  94. package/dist/player/transitions/index.d.ts +4 -0
  95. package/dist/player/transitions/index.d.ts.map +1 -0
  96. package/dist/player/transitions/index.js +4 -0
  97. package/dist/player/transitions/index.js.map +1 -0
  98. package/dist/player/transitions/slide.d.ts +6 -0
  99. package/dist/player/transitions/slide.d.ts.map +1 -0
  100. package/dist/player/transitions/slide.js +35 -0
  101. package/dist/player/transitions/slide.js.map +1 -0
  102. package/dist/script/index.d.ts +2 -0
  103. package/dist/script/index.d.ts.map +1 -0
  104. package/dist/script/index.js +2 -0
  105. package/dist/script/index.js.map +1 -0
  106. package/dist/script/script.d.ts +10 -0
  107. package/dist/script/script.d.ts.map +1 -0
  108. package/dist/script/script.js +41 -0
  109. package/dist/script/script.js.map +1 -0
  110. package/dist/segment/SegmentRunner.d.ts +52 -0
  111. package/dist/segment/SegmentRunner.d.ts.map +1 -0
  112. package/dist/segment/SegmentRunner.js +187 -0
  113. package/dist/segment/SegmentRunner.js.map +1 -0
  114. package/dist/segment/defineConfig.d.ts +6 -0
  115. package/dist/segment/defineConfig.d.ts.map +1 -0
  116. package/dist/segment/defineConfig.js +7 -0
  117. package/dist/segment/defineConfig.js.map +1 -0
  118. package/dist/segment/defineSegment.d.ts +7 -0
  119. package/dist/segment/defineSegment.d.ts.map +1 -0
  120. package/dist/segment/defineSegment.js +25 -0
  121. package/dist/segment/defineSegment.js.map +1 -0
  122. package/dist/segment/index.d.ts +5 -0
  123. package/dist/segment/index.d.ts.map +1 -0
  124. package/dist/segment/index.js +4 -0
  125. package/dist/segment/index.js.map +1 -0
  126. package/dist/timeline/index.d.ts +73 -0
  127. package/dist/timeline/index.d.ts.map +1 -0
  128. package/dist/timeline/index.js +142 -0
  129. package/dist/timeline/index.js.map +1 -0
  130. package/dist/timeline/loadAudioTrack.d.ts +18 -0
  131. package/dist/timeline/loadAudioTrack.d.ts.map +1 -0
  132. package/dist/timeline/loadAudioTrack.js +44 -0
  133. package/dist/timeline/loadAudioTrack.js.map +1 -0
  134. package/dist/timeline/loadVoiceover.d.ts +18 -0
  135. package/dist/timeline/loadVoiceover.d.ts.map +1 -0
  136. package/dist/timeline/loadVoiceover.js +38 -0
  137. package/dist/timeline/loadVoiceover.js.map +1 -0
  138. package/dist/timeline/resolveTiming.d.ts +28 -0
  139. package/dist/timeline/resolveTiming.d.ts.map +1 -0
  140. package/dist/timeline/resolveTiming.js +63 -0
  141. package/dist/timeline/resolveTiming.js.map +1 -0
  142. package/dist/timeline/validateTiming.d.ts +29 -0
  143. package/dist/timeline/validateTiming.d.ts.map +1 -0
  144. package/dist/timeline/validateTiming.js +62 -0
  145. package/dist/timeline/validateTiming.js.map +1 -0
  146. package/dist/types.d.ts +216 -0
  147. package/dist/types.d.ts.map +1 -0
  148. package/dist/types.js +6 -0
  149. package/dist/types.js.map +1 -0
  150. package/package.json +47 -0
  151. package/skill/SKILL.md +64 -0
  152. package/skill/assets/hello_world/PLAN.md +31 -0
  153. package/skill/assets/hello_world/README.md +27 -0
  154. package/skill/assets/hello_world/audio/audio_plan.md +14 -0
  155. package/skill/assets/hello_world/segments/hello_intro.ts +69 -0
  156. package/skill/assets/hello_world/segments/hello_outro.ts +71 -0
  157. package/skill/assets/hello_world/timeline.ts +15 -0
  158. package/skill/assets/hello_world/voiceover_script/script.md +10 -0
  159. package/skill/assets/install/package.json +10 -0
  160. package/skill/assets/install/tsconfig.json +23 -0
  161. package/skill/assets/styles/editorial-mono/STYLE.md +124 -0
  162. package/skill/assets/styles/editorial-mono/brand.md +85 -0
  163. package/skill/assets/styles/editorial-mono/reference/animations.jsx +752 -0
  164. package/skill/assets/styles/editorial-mono/reference/scenes.html +563 -0
  165. package/skill/assets/styles/editorial-mono/sample/bullet.ts +101 -0
  166. package/skill/assets/styles/editorial-mono/sample/content.ts +104 -0
  167. package/skill/assets/styles/editorial-mono/sample/cta.ts +113 -0
  168. package/skill/assets/styles/editorial-mono/sample/feature.ts +111 -0
  169. package/skill/assets/styles/editorial-mono/sample/grid.ts +97 -0
  170. package/skill/assets/styles/editorial-mono/sample/kinetic.ts +96 -0
  171. package/skill/assets/styles/editorial-mono/sample/section.ts +101 -0
  172. package/skill/assets/styles/editorial-mono/sample/stat.ts +128 -0
  173. package/skill/assets/styles/editorial-mono/sample/title.ts +97 -0
  174. package/skill/assets/styles/editorial-mono/sample/ui-showcase.ts +159 -0
  175. package/skill/assets/styles/editorial-mono/tokens.css +44 -0
  176. package/skill/assets/styles/iso-diagram/STYLE.md +109 -0
  177. package/skill/assets/styles/iso-diagram/brand.md +32 -0
  178. package/skill/assets/styles/iso-diagram/reference/animations.jsx +673 -0
  179. package/skill/assets/styles/iso-diagram/reference/scenes.html +427 -0
  180. package/skill/assets/styles/iso-diagram/sample/bullet.ts +144 -0
  181. package/skill/assets/styles/iso-diagram/sample/content.ts +192 -0
  182. package/skill/assets/styles/iso-diagram/sample/cta.ts +162 -0
  183. package/skill/assets/styles/iso-diagram/sample/feature.ts +205 -0
  184. package/skill/assets/styles/iso-diagram/sample/grid.ts +181 -0
  185. package/skill/assets/styles/iso-diagram/sample/kinetic.ts +102 -0
  186. package/skill/assets/styles/iso-diagram/sample/section.ts +149 -0
  187. package/skill/assets/styles/iso-diagram/sample/stat.ts +164 -0
  188. package/skill/assets/styles/iso-diagram/sample/title.ts +173 -0
  189. package/skill/assets/styles/iso-diagram/sample/ui-showcase.ts +162 -0
  190. package/skill/assets/styles/iso-diagram/tokens.css +40 -0
  191. package/skill/assets/styles/motion-engineering/STYLE.md +106 -0
  192. package/skill/assets/styles/motion-engineering/brand.md +29 -0
  193. package/skill/assets/styles/motion-engineering/reference/animations.jsx +673 -0
  194. package/skill/assets/styles/motion-engineering/reference/scenes.html +513 -0
  195. package/skill/assets/styles/motion-engineering/sample/bullet.ts +176 -0
  196. package/skill/assets/styles/motion-engineering/sample/content.ts +228 -0
  197. package/skill/assets/styles/motion-engineering/sample/cta.ts +209 -0
  198. package/skill/assets/styles/motion-engineering/sample/feature.ts +299 -0
  199. package/skill/assets/styles/motion-engineering/sample/grid.ts +190 -0
  200. package/skill/assets/styles/motion-engineering/sample/kinetic.ts +159 -0
  201. package/skill/assets/styles/motion-engineering/sample/section.ts +196 -0
  202. package/skill/assets/styles/motion-engineering/sample/stat.ts +230 -0
  203. package/skill/assets/styles/motion-engineering/sample/title.ts +219 -0
  204. package/skill/assets/styles/motion-engineering/sample/ui-showcase.ts +267 -0
  205. package/skill/assets/styles/motion-engineering/tokens.css +40 -0
  206. package/skill/assets/styles/neon-terminal/STYLE.md +105 -0
  207. package/skill/assets/styles/neon-terminal/brand.md +27 -0
  208. package/skill/assets/styles/neon-terminal/reference/animations.jsx +673 -0
  209. package/skill/assets/styles/neon-terminal/reference/scenes.html +387 -0
  210. package/skill/assets/styles/neon-terminal/sample/bullet.ts +113 -0
  211. package/skill/assets/styles/neon-terminal/sample/content.ts +117 -0
  212. package/skill/assets/styles/neon-terminal/sample/cta.ts +131 -0
  213. package/skill/assets/styles/neon-terminal/sample/feature.ts +112 -0
  214. package/skill/assets/styles/neon-terminal/sample/grid.ts +128 -0
  215. package/skill/assets/styles/neon-terminal/sample/kinetic.ts +105 -0
  216. package/skill/assets/styles/neon-terminal/sample/section.ts +96 -0
  217. package/skill/assets/styles/neon-terminal/sample/stat.ts +123 -0
  218. package/skill/assets/styles/neon-terminal/sample/title.ts +122 -0
  219. package/skill/assets/styles/neon-terminal/sample/ui-showcase.ts +127 -0
  220. package/skill/assets/styles/neon-terminal/tokens.css +39 -0
  221. package/skill/assets/styles/risograph/STYLE.md +110 -0
  222. package/skill/assets/styles/risograph/brand.md +26 -0
  223. package/skill/assets/styles/risograph/reference/animations.jsx +673 -0
  224. package/skill/assets/styles/risograph/reference/scenes.html +403 -0
  225. package/skill/assets/styles/risograph/sample/bullet.ts +124 -0
  226. package/skill/assets/styles/risograph/sample/content.ts +135 -0
  227. package/skill/assets/styles/risograph/sample/cta.ts +149 -0
  228. package/skill/assets/styles/risograph/sample/feature.ts +152 -0
  229. package/skill/assets/styles/risograph/sample/grid.ts +123 -0
  230. package/skill/assets/styles/risograph/sample/kinetic.ts +125 -0
  231. package/skill/assets/styles/risograph/sample/section.ts +130 -0
  232. package/skill/assets/styles/risograph/sample/stat.ts +145 -0
  233. package/skill/assets/styles/risograph/sample/title.ts +132 -0
  234. package/skill/assets/styles/risograph/sample/ui-showcase.ts +147 -0
  235. package/skill/assets/styles/risograph/tokens.css +39 -0
  236. package/skill/assets/styles/swiss-console/STYLE.md +107 -0
  237. package/skill/assets/styles/swiss-console/brand.md +37 -0
  238. package/skill/assets/styles/swiss-console/reference/animations.jsx +673 -0
  239. package/skill/assets/styles/swiss-console/reference/scenes.html +420 -0
  240. package/skill/assets/styles/swiss-console/sample/bullet.ts +122 -0
  241. package/skill/assets/styles/swiss-console/sample/content.ts +137 -0
  242. package/skill/assets/styles/swiss-console/sample/cta.ts +109 -0
  243. package/skill/assets/styles/swiss-console/sample/feature.ts +163 -0
  244. package/skill/assets/styles/swiss-console/sample/grid.ts +145 -0
  245. package/skill/assets/styles/swiss-console/sample/kinetic.ts +117 -0
  246. package/skill/assets/styles/swiss-console/sample/section.ts +127 -0
  247. package/skill/assets/styles/swiss-console/sample/stat.ts +148 -0
  248. package/skill/assets/styles/swiss-console/sample/title.ts +148 -0
  249. package/skill/assets/styles/swiss-console/sample/ui-showcase.ts +198 -0
  250. package/skill/assets/styles/swiss-console/tokens.css +39 -0
  251. package/skill/install/INSTALL.md +400 -0
  252. package/skill/references/audio/audio_plan.md +199 -0
  253. package/skill/references/audio/build.md +208 -0
  254. package/skill/references/audio/cue_template.md +219 -0
  255. package/skill/references/audio/ffmpeg_cookbook.md +267 -0
  256. package/skill/references/audio/music/music.md +171 -0
  257. package/skill/references/audio/music/providers/elevenlabs.md +170 -0
  258. package/skill/references/audio/music/providers/manual.md +140 -0
  259. package/skill/references/audio/music/providers/openverse.md +265 -0
  260. package/skill/references/audio/sfx/providers/elevenlabs.md +152 -0
  261. package/skill/references/audio/sfx/providers/manual.md +117 -0
  262. package/skill/references/audio/sfx/providers/openverse.md +243 -0
  263. package/skill/references/audio/sfx/sfx.md +149 -0
  264. package/skill/references/audio/styles.md +102 -0
  265. package/skill/references/audio/sync.md +237 -0
  266. package/skill/references/audio/voiceover/animation_sync.md +142 -0
  267. package/skill/references/audio/voiceover/provider_script.md +153 -0
  268. package/skill/references/audio/voiceover/providers/elevenlabs.md +288 -0
  269. package/skill/references/audio/voiceover/providers/manual.md +100 -0
  270. package/skill/references/audio/voiceover/script_writing.md +100 -0
  271. package/skill/references/audio/voiceover/style_intake.md +56 -0
  272. package/skill/references/audio/voiceover/sync_algorithm.md +167 -0
  273. package/skill/references/audio/voiceover.md +296 -0
  274. package/skill/references/audio.md +135 -0
  275. package/skill/references/authoring_segment.md +446 -0
  276. package/skill/references/create_or_edit_video.md +232 -0
  277. package/skill/references/dev_server.md +157 -0
  278. package/skill/references/export.md +145 -0
  279. package/skill/references/new_video.md +117 -0
  280. package/skill/references/project_structure.md +144 -0
  281. package/skill/references/setup.md +109 -0
  282. package/skill/references/setup_new_style.md +158 -0
  283. package/skill/references/styles.md +154 -0
  284. package/skill/references/testing.md +115 -0
  285. package/skill/references/types.md +240 -0
  286. package/src/cli/entry/components/copy_button.ts +42 -0
  287. package/src/cli/entry/components/download_modal.ts +204 -0
  288. package/src/cli/entry/components/empty_state.ts +55 -0
  289. package/src/cli/entry/components/hide_hud_tab.ts +37 -0
  290. package/src/cli/entry/components/icons.ts +31 -0
  291. package/src/cli/entry/components/top_bar.ts +69 -0
  292. package/src/cli/entry/components/video_card.ts +57 -0
  293. package/src/cli/entry/dev_frame.ts +189 -0
  294. package/src/cli/entry/entry_index.ts +16 -0
  295. package/src/cli/entry/entry_video.ts +24 -0
  296. package/src/cli/entry/index.html +12 -0
  297. package/src/cli/entry/parse_slug.ts +14 -0
  298. package/src/cli/entry/render.html +17 -0
  299. package/src/cli/entry/render_entry.ts +121 -0
  300. package/src/cli/entry/styles/base.css +45 -0
  301. package/src/cli/entry/styles/components.css +605 -0
  302. package/src/cli/entry/styles/tokens.css +44 -0
  303. package/src/cli/entry/video.html +22 -0
  304. package/src/cli/entry/views/homepage.ts +66 -0
  305. package/src/cli/entry/views/video_view.ts +286 -0
  306. package/src/cli/entry/virtual.d.ts +8 -0
@@ -0,0 +1,123 @@
1
+ import { defineSegment } from "videowright";
2
+
3
+ let host: HTMLElement | null = null;
4
+
5
+ export default defineSegment({
6
+ id: "neon-terminal-sample-stat",
7
+ advances: [2.5, 5.0],
8
+ voiceover:
9
+ "Stat cards in Neon Terminal. A big number counts up digit by digit with a phosphor glow, caption below in muted.",
10
+
11
+ mount(el) {
12
+ host = el;
13
+ el.innerHTML = `
14
+ <div style="
15
+ position: relative;
16
+ height: 100%;
17
+ background: var(--color-bg);
18
+ color: var(--color-fg);
19
+ font-family: var(--font-mono);
20
+ overflow: hidden;
21
+ ">
22
+ <div style="
23
+ position: absolute; inset: 0; pointer-events: none;
24
+ background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(74, 222, 128, 0.04) 3px 4px);
25
+ "></div>
26
+
27
+ <div style="
28
+ position: absolute;
29
+ inset: var(--safe-y) var(--safe-x);
30
+ border: 1px solid var(--color-border);
31
+ background: rgba(10,14,11,0.6);
32
+ ">
33
+ <div style="
34
+ display: flex; align-items: center;
35
+ padding: 14px 20px;
36
+ border-bottom: 1px solid var(--color-border);
37
+ gap: 12px; font-size: 14px; color: var(--color-muted);
38
+ ">
39
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
40
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
41
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
42
+ <span style="margin-left: 16px;">beacon@console:~$ metrics --id=03</span>
43
+ <span style="margin-left: auto; color: var(--color-accent); text-shadow: var(--glow);">[ Q1 2026 ]</span>
44
+ </div>
45
+
46
+ <div style="padding: 48px 56px; overflow: hidden;">
47
+ <div data-ref="prompt" style="font-size: 22px; color: var(--color-muted); opacity: 0;">
48
+ $ metrics.failure_rate(step > 4)
49
+ </div>
50
+
51
+ <div data-ref="number" style="
52
+ font-size: 320px; font-weight: 500; line-height: 0.95;
53
+ margin-top: 48px;
54
+ color: var(--color-accent); text-shadow: var(--glow);
55
+ opacity: 0;
56
+ "><span data-ref="digits">0</span>%</div>
57
+
58
+ <div data-ref="caption" style="font-size: 26px; margin-top: 28px; max-width: 1300px; opacity: 0;">
59
+ <span style="color: var(--color-muted);">// </span>of agent failures occur after the 4<span style="color: var(--color-muted);">th</span> tool call.
60
+ </div>
61
+
62
+ <div data-ref="source" style="font-size: 18px; color: var(--color-muted); margin-top: 16px; opacity: 0;">
63
+ source: beacon.logs · n=12,840 sessions
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ `;
69
+ },
70
+
71
+ async play(ctx) {
72
+ const prompt = host?.querySelector('[data-ref="prompt"]') as HTMLElement;
73
+ const number = host?.querySelector('[data-ref="number"]') as HTMLElement;
74
+ const digits = host?.querySelector('[data-ref="digits"]') as HTMLElement;
75
+ const caption = host?.querySelector('[data-ref="caption"]') as HTMLElement;
76
+ const source = host?.querySelector('[data-ref="source"]') as HTMLElement;
77
+
78
+ const ease = "steps(8, end)";
79
+ const opts = { fill: "forwards" as const, easing: ease };
80
+
81
+ prompt.animate([{ opacity: 0 }, { opacity: 1 }], {
82
+ ...opts,
83
+ duration: 250,
84
+ });
85
+
86
+ number.animate([{ opacity: 0 }, { opacity: 1 }], {
87
+ ...opts,
88
+ duration: 200,
89
+ delay: 300,
90
+ });
91
+
92
+ // Count up from 0 to 84 using discrete ctx.hold steps.
93
+ // Counter/ticker animations are discrete text changes that cannot use WAAPI.
94
+ const target = 84;
95
+ const steps = 20;
96
+ const stepDuration = 600 / steps;
97
+ await ctx.hold(350);
98
+ for (let i = 1; i <= steps; i++) {
99
+ const progress = i / steps;
100
+ const eased = 1 - (1 - progress) ** 3;
101
+ digits.textContent = String(Math.round(eased * target));
102
+ await ctx.hold(stepDuration);
103
+ }
104
+ digits.textContent = String(target);
105
+
106
+ caption.animate([{ opacity: 0 }, { opacity: 1 }], {
107
+ ...opts,
108
+ duration: 200,
109
+ });
110
+
111
+ source.animate([{ opacity: 0 }, { opacity: 1 }], {
112
+ ...opts,
113
+ duration: 200,
114
+ delay: 160,
115
+ });
116
+
117
+ await ctx.waitForNext();
118
+ },
119
+
120
+ unmount() {
121
+ host = null;
122
+ },
123
+ });
@@ -0,0 +1,122 @@
1
+ import { defineSegment } from "videowright";
2
+
3
+ let host: HTMLElement | null = null;
4
+
5
+ export default defineSegment({
6
+ id: "neon-terminal-sample-title",
7
+ advances: [2.5, 5.0],
8
+ voiceover:
9
+ "Title cards in Neon Terminal. A boot sequence types in, then an ASCII logo block and tagline appear stepped.",
10
+
11
+ mount(el) {
12
+ host = el;
13
+ el.innerHTML = `
14
+ <style>
15
+ @keyframes nt-blink { 0%,49% { opacity: 1 } 50%,100% { opacity: 0 } }
16
+ </style>
17
+ <div style="
18
+ position: relative;
19
+ height: 100%;
20
+ background: var(--color-bg);
21
+ color: var(--color-fg);
22
+ font-family: var(--font-mono);
23
+ overflow: hidden;
24
+ ">
25
+ <div style="
26
+ position: absolute; inset: 0; pointer-events: none;
27
+ background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(74, 222, 128, 0.04) 3px 4px);
28
+ "></div>
29
+
30
+ <div style="
31
+ position: absolute;
32
+ inset: var(--safe-y) var(--safe-x);
33
+ border: 1px solid var(--color-border);
34
+ background: rgba(10,14,11,0.6);
35
+ ">
36
+ <div style="
37
+ display: flex; align-items: center;
38
+ padding: 14px 20px;
39
+ border-bottom: 1px solid var(--color-border);
40
+ gap: 12px; font-size: 14px; color: var(--color-muted);
41
+ ">
42
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
43
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
44
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
45
+ <span style="margin-left: 16px;">beacon@console:~$</span>
46
+ <span style="margin-left: auto; color: var(--color-accent); text-shadow: var(--glow);">[ booting ]</span>
47
+ </div>
48
+
49
+ <div style="padding: 48px 56px; overflow: hidden; position: relative;">
50
+ <div data-ref="prompt" style="font-size: 22px; color: var(--color-muted); opacity: 0;">
51
+ $ beacon --launch
52
+ </div>
53
+
54
+ <div data-ref="init" style="font-size: 22px; color: var(--color-muted); margin-top: 8px; opacity: 0;">
55
+ loaded 12 modules in 240ms
56
+ </div>
57
+
58
+ <pre data-ref="logo" style="
59
+ font-size: 72px; line-height: 1.1; font-weight: 500;
60
+ margin: 40px 0 24px; white-space: pre;
61
+ color: var(--color-accent); text-shadow: var(--glow);
62
+ opacity: 0;
63
+ "> ____ ___ ___ ___ ___ _ _
64
+ | __ )| __| / __| / __/ _ \\| \\| |
65
+ | _ \\| _| | (__ | (_| (_) | . |
66
+ |___/|___| \\___| \\___\\___/|_|\\_|</pre>
67
+
68
+ <div data-ref="tagline" style="font-size: 28px; font-weight: 500; margin-top: 28px; opacity: 0;">
69
+ // long-running agents for research labs<span style="
70
+ display: inline-block; width: 0.6em; height: 1em;
71
+ background: var(--color-accent);
72
+ box-shadow: 0 0 12px rgba(74,222,128,0.7);
73
+ vertical-align: text-bottom;
74
+ animation: nt-blink 1s steps(2, end) infinite;
75
+ margin-left: 4px;
76
+ "></span>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ `;
82
+ },
83
+
84
+ async play(ctx) {
85
+ const prompt = host?.querySelector('[data-ref="prompt"]') as HTMLElement;
86
+ const init = host?.querySelector('[data-ref="init"]') as HTMLElement;
87
+ const logo = host?.querySelector('[data-ref="logo"]') as HTMLElement;
88
+ const tagline = host?.querySelector('[data-ref="tagline"]') as HTMLElement;
89
+
90
+ const ease = "steps(8, end)";
91
+ const opts = { fill: "forwards" as const, easing: ease };
92
+
93
+ prompt.animate([{ opacity: 0 }, { opacity: 1 }], {
94
+ ...opts,
95
+ duration: 250,
96
+ });
97
+
98
+ init.animate([{ opacity: 0 }, { opacity: 1 }], {
99
+ ...opts,
100
+ duration: 250,
101
+ delay: 400,
102
+ });
103
+
104
+ logo.animate([{ opacity: 0 }, { opacity: 1 }], {
105
+ ...opts,
106
+ duration: 250,
107
+ delay: 800,
108
+ });
109
+
110
+ tagline.animate([{ opacity: 0 }, { opacity: 1 }], {
111
+ ...opts,
112
+ duration: 250,
113
+ delay: 1200,
114
+ });
115
+
116
+ await ctx.waitForNext();
117
+ },
118
+
119
+ unmount() {
120
+ host = null;
121
+ },
122
+ });
@@ -0,0 +1,127 @@
1
+ import { defineSegment } from "videowright";
2
+
3
+ let host: HTMLElement | null = null;
4
+
5
+ export default defineSegment({
6
+ id: "neon-terminal-sample-ui-showcase",
7
+ advances: [2.5, 5.0],
8
+ voiceover:
9
+ "UI showcases in Neon Terminal. A full TUI mock with sidebar navigation, main plan pane, and memory panel on the right.",
10
+
11
+ mount(el) {
12
+ host = el;
13
+
14
+ const menuItems = ["run", "memory", "plan", "tools", "trace", "eval"];
15
+ const menuHtml = menuItems
16
+ .map(
17
+ (x, i) =>
18
+ `<div style="
19
+ padding: 6px 10px; font-size: 16px;
20
+ ${i === 2 ? "color: var(--color-accent); text-shadow: var(--glow); background: rgba(74,222,128,0.08);" : "color: var(--color-muted);"}
21
+ ">${i === 2 ? "▸ " : " "}${x}</div>`,
22
+ )
23
+ .join("");
24
+
25
+ const planItems = [
26
+ { status: "done", text: "Read eval spec" },
27
+ { status: "done", text: "Generate 12 candidate prompts" },
28
+ { status: "done", text: "Score each against rubric" },
29
+ { status: "··", text: "Select top-3 by F1" },
30
+ { status: "··", text: "Iterate with reasoning trace" },
31
+ { status: "··", text: "Submit batch to coordinator" },
32
+ ];
33
+ const planHtml = planItems
34
+ .map(
35
+ (item, i) =>
36
+ `<div style="display: flex; gap: 14px; padding: 10px 0; border-bottom: 1px solid var(--color-border);">
37
+ <span style="min-width: 20px; color: var(--color-muted);">${String(i + 1).padStart(2, "0")}</span>
38
+ <span style="flex: 1; font-size: 16px;">${item.text}</span>
39
+ <span style="
40
+ min-width: 60px; text-align: right;
41
+ ${item.status === "done" ? "color: var(--color-accent); text-shadow: var(--glow);" : "color: var(--amber); text-shadow: 0 0 12px rgba(245,158,11,0.45);"}
42
+ ">[${item.status}]</span>
43
+ </div>`,
44
+ )
45
+ .join("");
46
+
47
+ el.innerHTML = `
48
+ <div style="
49
+ position: relative;
50
+ height: 100%;
51
+ background: var(--color-bg);
52
+ color: var(--color-fg);
53
+ font-family: var(--font-mono);
54
+ overflow: hidden;
55
+ ">
56
+ <div style="
57
+ position: absolute; inset: 0; pointer-events: none;
58
+ background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(74, 222, 128, 0.04) 3px 4px);
59
+ "></div>
60
+
61
+ <div style="
62
+ position: absolute;
63
+ inset: var(--safe-y) var(--safe-x);
64
+ border: 1px solid var(--color-border);
65
+ background: rgba(10,14,11,0.6);
66
+ ">
67
+ <div style="
68
+ display: flex; align-items: center;
69
+ padding: 14px 20px;
70
+ border-bottom: 1px solid var(--color-border);
71
+ gap: 12px; font-size: 14px; color: var(--color-muted);
72
+ ">
73
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
74
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
75
+ <span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
76
+ <span style="margin-left: 16px;">beacon@console:~$ tui --session=41ac</span>
77
+ <span style="margin-left: auto; color: var(--color-accent); text-shadow: var(--glow);">[ live ]</span>
78
+ </div>
79
+
80
+ <div style="padding: 16px; overflow: hidden;">
81
+ <div data-ref="tui" style="
82
+ display: grid; grid-template-columns: 200px 1fr 240px;
83
+ height: 720px; border: 1px solid var(--color-border);
84
+ font-size: 16px; opacity: 0;
85
+ ">
86
+ <div style="padding: 16px; border-right: 1px solid var(--color-border); display: flex; flex-direction: column; gap: 6px;">
87
+ <div style="font-size: 12px; color: var(--color-muted); margin-bottom: 8px;">── MENU ──</div>
88
+ ${menuHtml}
89
+ <div style="margin-top: auto; color: var(--color-muted);">── status ──</div>
90
+ <div style="color: var(--color-accent); text-shadow: var(--glow); font-size: 14px;">● running 00:14:22</div>
91
+ </div>
92
+
93
+ <div style="padding: 20px;">
94
+ <div style="font-size: 14px; color: var(--color-muted);">── PLAN · v3 ────────────────────────────</div>
95
+ ${planHtml}
96
+ </div>
97
+
98
+ <div style="padding: 16px; border-left: 1px solid var(--color-border);">
99
+ <div style="font-size: 14px; color: var(--color-muted); margin-bottom: 12px;">── MEMORY ──</div>
100
+ <pre style="font-size: 14px; margin: 0; line-height: 1.7; color: var(--color-muted);">t=00:02 ✓ snap_001
101
+ t=00:05 ✓ snap_002
102
+ t=00:09 ✓ snap_003</pre>
103
+ <pre style="font-size: 14px; margin: 0; line-height: 1.7; color: var(--color-accent); text-shadow: var(--glow);">t=00:14 ● snap_004</pre>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ `;
110
+ },
111
+
112
+ async play(ctx) {
113
+ const tui = host?.querySelector('[data-ref="tui"]') as HTMLElement;
114
+
115
+ tui.animate([{ opacity: 0 }, { opacity: 1 }], {
116
+ duration: 250,
117
+ easing: "steps(8, end)",
118
+ fill: "forwards",
119
+ });
120
+
121
+ await ctx.waitForNext();
122
+ },
123
+
124
+ unmount() {
125
+ host = null;
126
+ },
127
+ });
@@ -0,0 +1,39 @@
1
+ /* Neon Terminal — design tokens
2
+ * Dark-mode native. Phosphor green on near-black. Mono dominant.
3
+ */
4
+ :root {
5
+ --color-bg: #0a0e0b;
6
+ --color-fg: #d8f3d8;
7
+ --color-accent: #4ade80; /* phosphor green */
8
+
9
+ --color-muted: #5a6f5c;
10
+ --color-border: #1f2a21;
11
+ --color-surface: #11171210;
12
+
13
+ --font-display: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
14
+ --font-body: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
15
+ --font-mono: "JetBrains Mono", ui-monospace, monospace;
16
+
17
+ --space-sm: 12px;
18
+ --space-md: 24px;
19
+ --space-lg: 48px;
20
+ --space-xl: 96px;
21
+
22
+ --duration-fast: 100ms;
23
+ --duration-normal: 250ms;
24
+ --duration-slow: 600ms;
25
+
26
+ --radius-sm: 0px;
27
+ --radius-md: 2px;
28
+ --stagger: 40ms;
29
+ --ease-out: steps(8, end);
30
+ --ease-in: steps(8, end);
31
+ --scene-hold: 4s;
32
+
33
+ --safe-x: 96px;
34
+ --safe-y: 80px;
35
+
36
+ --glow: 0 0 12px rgba(74, 222, 128, 0.45);
37
+ --glow-soft: 0 0 24px rgba(74, 222, 128, 0.18);
38
+ --amber: #f59e0b;
39
+ }
@@ -0,0 +1,110 @@
1
+ ---
2
+ title: Risograph
3
+ slug: risograph
4
+ picker_description: 'Two-color screen-print on warm paper. Pink + ink-blue, visible grain, stop-motion cadence.'
5
+ font_sources:
6
+ - https://fonts.googleapis.com/css2?family=Archivo+Black&display=swap
7
+ - https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700&display=swap
8
+ - https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap
9
+ mood: [playful, tactile, indie, energetic, warm]
10
+ good_for:
11
+ - Creative tools, design products
12
+ - Indie launches with personality
13
+ - Brand-forward consumer products
14
+ - Anything that wants charm without going corny
15
+ bad_for:
16
+ - Enterprise / serious B2B
17
+ - Fintech, security, infra
18
+ - Anything technically dense
19
+ tags: [print, two-color, grain, indie, playful, type-led]
20
+ references: [It's Nice That, riso zines, modern indie design studios]
21
+ ---
22
+
23
+ # Risograph — STYLE.md
24
+
25
+ ## Identity
26
+
27
+ A two-color screen-print aesthetic on warm uncoated paper. Fluorescent pink and ink blue, with paper showing through. Visible grain. Slight color-channel misregistration on display type. Motion has a stop-motion cadence — stepped easing, 6–8 frames per move, like flipping through a riso-printed zine.
28
+
29
+ This is the *personality* template. Type-led, opinionated, alive. It's the right choice when a script wants to feel like a small studio made it on a Saturday.
30
+
31
+ **Mood:** playful, tactile, indie, energetic, warm.
32
+
33
+ ## When to use
34
+
35
+ - Creative tools, design products
36
+ - Indie launches with personality
37
+ - Brand-forward consumer products
38
+ - "We're not corporate" launches
39
+
40
+ ## When to avoid
41
+
42
+ - Enterprise / serious B2B
43
+ - Fintech, security, infrastructure
44
+ - Anything technically dense or specification-heavy
45
+
46
+ ## Layout principles
47
+
48
+ - **Big type, asymmetric.** Display type is the protagonist. Lines wrap dramatically. Some lines are intentionally angled (-2° to -6°).
49
+ - **Type bleeds.** Display type runs into the edge of the safe area or off-canvas.
50
+ - **Layering.** Type on top of duotone color shapes, or two type elements overlapping with one in pink, one in blue. Don't fear overlap.
51
+ - **Paper grain everywhere.** A subtle noise/grain layer is permanent.
52
+ - **Misregistration on heavy display type only.** Pink ghost 3px offset to the right; blue layer on top. Not on body. Not on icons.
53
+
54
+ ## Color application
55
+
56
+ - Cream paper bg, ink-blue fg.
57
+ - **Pink accent** for kinetic emphasis, key words, large shapes.
58
+ - **Yellow** (`--color-second`) sparingly — for a third punctuation note on at most one scene per video.
59
+ - Solid fills only. No gradients. No glow.
60
+
61
+ ## Type rules
62
+
63
+ - **Display: Archivo Black** (heavy display sans, free, similar to Druk Wide). For everything large. Sizes 64–280.
64
+ - **Body: Archivo** (regular & medium). 22–34px.
65
+ - **Mono: JetBrains Mono.** For numbers and labels only.
66
+ - Lowercase headlines are fair game (alongside Title Case). Lean expressive.
67
+ - Misregistered display: render the text twice in absolute-positioned siblings — pink layer offset by `--misreg`, blue on top.
68
+
69
+ ## Motion principles
70
+
71
+ - **Stop-motion stepped.** `steps(6, end)` or `steps(8, end)` easing. Things jump-cut into position.
72
+ - **Color flashes.** A frame of pure pink may flash for 80ms between scenes.
73
+ - **Type bounces in chunks.** A whole word "stamps" into position in 4–6 frames.
74
+ - **Grain breathes.** The grain layer shifts subtly every 200ms (re-randomized).
75
+ - **Scene transitions:** **stamp-cut** — old scene flashes pink, new scene snaps in.
76
+ - **Ambient layer:** grain noise drift; a small repeating motif (asterisk, star, arrow) ticks in a corner.
77
+ - **Forbidden:** smooth easing, gradients, glow, blur, drop shadows, anything "pro."
78
+
79
+ ## Pacing
80
+
81
+ Brisk. 3.5–4s per scene. Stop-motion cadence keeps energy up.
82
+
83
+ ## Per-scene recipes
84
+
85
+ | Scene | Recipe |
86
+ |---|---|
87
+ | **Title** | Huge misregistered display title (one word per line). Pink star/asterisk stamps in. |
88
+ | **Section** | Big chapter number (pink) overlapping the section title (blue). Tilted -3°. |
89
+ | **Kinetic** | Sentence stamps in word-by-word. Last word in pink at 1.5× size. |
90
+ | **Bullet** | Each item is its own riso row: pink number, blue text, optional yellow tag chip. Hand-stamped feel. |
91
+ | **Stat** | Huge pink stat number; misregistered. Caption in blue body underneath in a slim column. |
92
+ | **Feature** | Left: a riso-style cut-paper illustration (blob shape + pink overlap). Right: heavy display name + body. |
93
+ | **Grid** | 3 cards, each with a duotone shape on top and display name beneath. Different shape per card. |
94
+ | **UI showcase** | Product UI redrawn flat in two colors — solid fills, no gradients, slightly misregistered. |
95
+ | **Content** | A short paragraph in body. One phrase highlighter-marked (pink rectangle behind text). |
96
+ | **CTA** | Massive CTA in misregistered display. Pink star stamps. URL in mono beneath. |
97
+
98
+ ### Connective elements
99
+
100
+ - **Lower third:** `★ scene 4 ★` in pink, stop-motion ticking
101
+ - **Scene transition:** pink flash → snap
102
+ - **Ambient:** grain drift, small repeating ★ motif in corner
103
+
104
+ ## Pitfalls
105
+
106
+ - **Don't overdo misregistration.** Display type only. Body, icons, labels stay clean.
107
+ - **Don't use more than 3 colors per scene.** Even with yellow available, two is usually right.
108
+ - **Don't smooth-fade.** Stamp-cut everything.
109
+ - **Don't use rounded corners.** Print doesn't have them.
110
+ - **No emoji.** Riso glyph set: ★ ◆ ● ► ▲ ✱ ➜
@@ -0,0 +1,26 @@
1
+ # Risograph — Brand
2
+
3
+ ## Color
4
+
5
+ **`--color-bg` `#F2EBDC`** — warm uncoated paper. Cream with a slight pink tilt. Reads as printed-on-stock.
6
+
7
+ **`--color-fg` `#1A2A6A`** — riso ink blue. Deep, slightly violet. Standard riso "Federal Blue" / "Blue."
8
+
9
+ **`--color-accent` `#FF4F8B`** — fluorescent pink. The signature riso flat color.
10
+
11
+ **`--color-second` `#FFC83D`** — riso yellow. The "use once per video" third color.
12
+
13
+ ## Grain & misregistration
14
+
15
+ - **Grain layer:** SVG fractal noise at 18% opacity, on top of everything. Re-randomized every 200ms for a "breathing" feel.
16
+ - **Misregistration:** display type rendered twice — pink layer at `(+3px, +3px)`, blue layer on top. Body type stays sharp.
17
+
18
+ ## Typography
19
+
20
+ **Archivo Black** is a free near-substitute for **Druk Wide** — the canonical riso display face. Set it tight (`letter-spacing: -0.02em`), heavy, expressive.
21
+
22
+ **Archivo** Regular/Medium for body.
23
+
24
+ ## Motion
25
+
26
+ Stepped easing (`steps(6, end)`). Stamps and snaps, not slides and fades. Pink flash transitions between scenes for energy.