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,176 @@
1
+ import { defineSegment } from "videowright";
2
+
3
+ let host: HTMLElement | null = null;
4
+
5
+ function cornerTicks() {
6
+ return `
7
+ <div style="position: absolute; left: -1px; top: -1px; width: 24px; height: 24px;">
8
+ <div style="position: absolute; left: 0; top: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
9
+ <div style="position: absolute; left: 0; top: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
10
+ </div>
11
+ <div style="position: absolute; right: -1px; top: -1px; width: 24px; height: 24px;">
12
+ <div style="position: absolute; right: 0; top: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
13
+ <div style="position: absolute; right: 0; top: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
14
+ </div>
15
+ <div style="position: absolute; left: -1px; bottom: -1px; width: 24px; height: 24px;">
16
+ <div style="position: absolute; left: 0; bottom: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
17
+ <div style="position: absolute; left: 0; bottom: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
18
+ </div>
19
+ <div style="position: absolute; right: -1px; bottom: -1px; width: 24px; height: 24px;">
20
+ <div style="position: absolute; right: 0; bottom: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
21
+ <div style="position: absolute; right: 0; bottom: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
22
+ </div>`;
23
+ }
24
+
25
+ export default defineSegment({
26
+ id: "motion-engineering-sample-bullet",
27
+ advances: [2.5, 5.0],
28
+ voiceover:
29
+ "Bullet reveals in Motion Engineering. Items appear row by row with mono prefixes, hairline separators, and cyan measurement deltas on the right.",
30
+
31
+ mount(el) {
32
+ host = el;
33
+
34
+ const items = [
35
+ { n: "ITEM 01", text: "Context windows decay.", delta: "Δ = 12.4ms" },
36
+ { n: "ITEM 02", text: "Tool selection drifts.", delta: "Δ = 09.1ms" },
37
+ { n: "ITEM 03", text: "Plans go stale.", delta: "Δ = 22.6ms" },
38
+ { n: "ITEM 04", text: "Errors compound.", delta: "Δ = 31.0ms" },
39
+ { n: "ITEM 05", text: "Recovery requires restart.", delta: "Δ = 88.4ms" },
40
+ ];
41
+
42
+ const rowHtml = items
43
+ .map(
44
+ (item, i) => `
45
+ <div data-ref="row${i}" style="
46
+ display: grid;
47
+ grid-template-columns: 140px 1fr 200px;
48
+ align-items: baseline;
49
+ padding: 22px 0;
50
+ border-top: 1px solid var(--color-border);
51
+ opacity: 0;
52
+ ">
53
+ <span style="
54
+ font-family: var(--font-mono);
55
+ font-size: 13px;
56
+ letter-spacing: 0.2em;
57
+ color: var(--color-accent);
58
+ ">${item.n}</span>
59
+ <span style="font-size: 40px;">${item.text}</span>
60
+ <span style="
61
+ font-family: var(--font-mono);
62
+ font-size: 14px;
63
+ text-align: right;
64
+ color: var(--cyan);
65
+ font-variant-numeric: tabular-nums;
66
+ ">${item.delta}</span>
67
+ </div>`,
68
+ )
69
+ .join("");
70
+
71
+ el.innerHTML = `
72
+ <div style="
73
+ position: relative;
74
+ height: 100%;
75
+ background: var(--color-bg);
76
+ color: var(--color-fg);
77
+ font-family: var(--font-body);
78
+ overflow: hidden;
79
+ ">
80
+ <div style="
81
+ position: absolute; inset: 0; pointer-events: none;
82
+ background:
83
+ linear-gradient(var(--grid-line) 1px, transparent 1px) 0 0 / 64px 64px,
84
+ linear-gradient(90deg, var(--grid-line) 1px, transparent 1px) 0 0 / 64px 64px;
85
+ "></div>
86
+
87
+ <div data-ref="frame" style="
88
+ position: absolute;
89
+ inset: var(--safe-y) var(--safe-x);
90
+ border: 1px solid var(--color-border);
91
+ opacity: 0;
92
+ ">
93
+ ${cornerTicks()}
94
+
95
+ <div data-ref="header" style="position: absolute; left: 80px; top: 100px; opacity: 0;">
96
+ <div style="
97
+ font-family: var(--font-mono);
98
+ font-size: 14px;
99
+ letter-spacing: 0.25em;
100
+ color: var(--color-accent);
101
+ margin-bottom: 18px;
102
+ ">&#9698; 4.1 KNOWN FAILURE MODES (n=5)</div>
103
+ <div style="
104
+ font-family: var(--font-display);
105
+ font-weight: 500;
106
+ font-size: 84px;
107
+ line-height: 1.0;
108
+ ">Where agents break.</div>
109
+ </div>
110
+
111
+ <div style="position: absolute; left: 80px; right: 80px; top: 360px;">
112
+ ${rowHtml}
113
+ </div>
114
+ </div>
115
+
116
+ <div data-ref="coord" style="
117
+ position: absolute; left: var(--safe-x); right: var(--safe-x); bottom: 28px;
118
+ display: flex; gap: 32px;
119
+ font-family: var(--font-mono);
120
+ font-size: 12px;
121
+ color: var(--color-muted);
122
+ letter-spacing: 0.1em;
123
+ opacity: 0;
124
+ ">
125
+ <span>X 1240.00</span><span>Y 360.00</span><span>T 0.00s</span>
126
+ <span style="margin-left: auto;">UNIT: PX &middot; SCALE 1:1</span>
127
+ </div>
128
+ </div>
129
+ `;
130
+ },
131
+
132
+ async play(ctx) {
133
+ const frame = host?.querySelector('[data-ref="frame"]') as HTMLElement;
134
+ const header = host?.querySelector('[data-ref="header"]') as HTMLElement;
135
+ const coord = host?.querySelector('[data-ref="coord"]') as HTMLElement;
136
+
137
+ const ease = "cubic-bezier(0.2, 0.8, 0.2, 1)";
138
+ const opts = { fill: "forwards" as const, easing: ease };
139
+
140
+ frame.animate([{ opacity: 0 }, { opacity: 1 }], {
141
+ ...opts,
142
+ duration: 360,
143
+ });
144
+
145
+ coord.animate([{ opacity: 0 }, { opacity: 1 }], {
146
+ ...opts,
147
+ duration: 300,
148
+ delay: 100,
149
+ });
150
+
151
+ header.animate(
152
+ [
153
+ { opacity: 0, transform: "translateY(8px)" },
154
+ { opacity: 1, transform: "translateY(0)" },
155
+ ],
156
+ { ...opts, duration: 360, delay: 200 },
157
+ );
158
+
159
+ for (let i = 0; i < 5; i++) {
160
+ const row = host?.querySelector(`[data-ref="row${i}"]`) as HTMLElement;
161
+ row.animate(
162
+ [
163
+ { opacity: 0, transform: "translateY(10px)" },
164
+ { opacity: 1, transform: "translateY(0)" },
165
+ ],
166
+ { ...opts, duration: 300, delay: 600 + i * 180 },
167
+ );
168
+ }
169
+
170
+ await ctx.waitForNext();
171
+ },
172
+
173
+ unmount() {
174
+ host = null;
175
+ },
176
+ });
@@ -0,0 +1,228 @@
1
+ import { defineSegment } from "videowright";
2
+
3
+ let host: HTMLElement | null = null;
4
+
5
+ function cornerTicks() {
6
+ return `
7
+ <div style="position: absolute; left: -1px; top: -1px; width: 24px; height: 24px;">
8
+ <div style="position: absolute; left: 0; top: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
9
+ <div style="position: absolute; left: 0; top: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
10
+ </div>
11
+ <div style="position: absolute; right: -1px; top: -1px; width: 24px; height: 24px;">
12
+ <div style="position: absolute; right: 0; top: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
13
+ <div style="position: absolute; right: 0; top: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
14
+ </div>
15
+ <div style="position: absolute; left: -1px; bottom: -1px; width: 24px; height: 24px;">
16
+ <div style="position: absolute; left: 0; bottom: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
17
+ <div style="position: absolute; left: 0; bottom: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
18
+ </div>
19
+ <div style="position: absolute; right: -1px; bottom: -1px; width: 24px; height: 24px;">
20
+ <div style="position: absolute; right: 0; bottom: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
21
+ <div style="position: absolute; right: 0; bottom: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
22
+ </div>`;
23
+ }
24
+
25
+ export default defineSegment({
26
+ id: "motion-engineering-sample-content",
27
+ advances: [2.5, 5.0],
28
+ voiceover:
29
+ "Content cards in Motion Engineering. A title with a crosshair marker, body in two columns, and an inline annotation with a leader line.",
30
+
31
+ mount(el) {
32
+ host = el;
33
+ el.innerHTML = `
34
+ <div style="
35
+ position: relative;
36
+ height: 100%;
37
+ background: var(--color-bg);
38
+ color: var(--color-fg);
39
+ font-family: var(--font-body);
40
+ overflow: hidden;
41
+ ">
42
+ <div style="
43
+ position: absolute; inset: 0; pointer-events: none;
44
+ background:
45
+ linear-gradient(var(--grid-line) 1px, transparent 1px) 0 0 / 64px 64px,
46
+ linear-gradient(90deg, var(--grid-line) 1px, transparent 1px) 0 0 / 64px 64px;
47
+ "></div>
48
+
49
+ <div data-ref="frame" style="
50
+ position: absolute;
51
+ inset: var(--safe-y) var(--safe-x);
52
+ border: 1px solid var(--color-border);
53
+ opacity: 0;
54
+ ">
55
+ ${cornerTicks()}
56
+
57
+ <div data-ref="tag" style="
58
+ position: absolute; left: 80px; top: 100px;
59
+ font-family: var(--font-mono);
60
+ font-size: 13px;
61
+ letter-spacing: 0.25em;
62
+ color: var(--color-accent);
63
+ opacity: 0;
64
+ ">&#9698; MEMO &middot; 2026.05 &middot; BEACON.TEAM</div>
65
+
66
+ <div data-ref="heading" style="
67
+ position: absolute; left: 80px; top: 160px;
68
+ font-family: var(--font-display);
69
+ font-weight: 500;
70
+ font-size: 84px;
71
+ margin-bottom: 56px;
72
+ opacity: 0;
73
+ ">What we believe.</div>
74
+
75
+ <svg data-ref="chMark" style="position: absolute; left: 52px; top: 180px; overflow: visible;" width="20" height="20">
76
+ <line x1="0" y1="10" x2="20" y2="10" stroke="var(--color-accent)" stroke-width="1.5" style="transform-origin: 10px 10px; transform: scaleX(0);" />
77
+ <line x1="10" y1="0" x2="10" y2="20" stroke="var(--color-accent)" stroke-width="1.5" style="transform-origin: 10px 10px; transform: scaleY(0);" />
78
+ </svg>
79
+
80
+ <div style="
81
+ position: absolute; left: 80px; right: 80px; top: 380px;
82
+ display: grid; grid-template-columns: 1fr 1fr; gap: 56px;
83
+ ">
84
+ <div data-ref="colA" style="opacity: 0;">
85
+ <div style="font-size: 30px; line-height: 1.45; margin-bottom: 24px;">
86
+ The next decade of AI infrastructure will be built around <span style="color: var(--color-accent);">long runs</span> &mdash; agents that work for hours, not seconds.
87
+ </div>
88
+ <div style="
89
+ font-family: var(--font-mono);
90
+ font-size: 12px;
91
+ letter-spacing: 0.25em;
92
+ padding-top: 16px;
93
+ border-top: 1px solid var(--color-border);
94
+ color: var(--color-muted);
95
+ ">&mdash;&mdash; THESIS A &mdash;&mdash;</div>
96
+ </div>
97
+ <div data-ref="colB" style="opacity: 0; position: relative;">
98
+ <div style="font-size: 26px; line-height: 1.5; color: var(--color-muted); margin-bottom: 24px;">
99
+ The bottleneck won't be the model. It will be everything around the model &mdash; memory, recovery, observability. The unglamorous parts. The parts we are building.
100
+ </div>
101
+ <div style="
102
+ font-family: var(--font-mono);
103
+ font-size: 12px;
104
+ letter-spacing: 0.25em;
105
+ padding-top: 16px;
106
+ border-top: 1px solid var(--color-border);
107
+ color: var(--color-muted);
108
+ ">&mdash;&mdash; THESIS B &mdash;&mdash;</div>
109
+ </div>
110
+ </div>
111
+ </div>
112
+
113
+ <svg data-ref="leaderLine" style="
114
+ position: absolute; left: 0; top: 0; width: 100%; height: 100%;
115
+ pointer-events: none; overflow: visible;
116
+ ">
117
+ <line x1="960" y1="580" x2="1100" y2="520" stroke="var(--color-accent)" stroke-width="1" style="opacity: 0;" data-ref="ll" />
118
+ <text x="1105" y="516" fill="var(--color-accent)" font-family="var(--font-mono)" font-size="11" letter-spacing="0.15em" style="opacity: 0;" data-ref="llLabel">&#9698; KEY INSIGHT</text>
119
+ </svg>
120
+
121
+ <div data-ref="coord" style="
122
+ position: absolute; left: var(--safe-x); right: var(--safe-x); bottom: 28px;
123
+ display: flex; gap: 32px;
124
+ font-family: var(--font-mono);
125
+ font-size: 12px;
126
+ color: var(--color-muted);
127
+ letter-spacing: 0.1em;
128
+ opacity: 0;
129
+ ">
130
+ <span>X 1240.00</span><span>Y 360.00</span><span>T 0.00s</span>
131
+ <span style="margin-left: auto;">UNIT: PX &middot; SCALE 1:1</span>
132
+ </div>
133
+ </div>
134
+ `;
135
+ },
136
+
137
+ async play(ctx) {
138
+ const frame = host?.querySelector('[data-ref="frame"]') as HTMLElement;
139
+ const tag = host?.querySelector('[data-ref="tag"]') as HTMLElement;
140
+ const heading = host?.querySelector('[data-ref="heading"]') as HTMLElement;
141
+ const colA = host?.querySelector('[data-ref="colA"]') as HTMLElement;
142
+ const colB = host?.querySelector('[data-ref="colB"]') as HTMLElement;
143
+ const coord = host?.querySelector('[data-ref="coord"]') as HTMLElement;
144
+
145
+ const chMarkSvg = host?.querySelector('[data-ref="chMark"]') as SVGElement;
146
+ const chH = chMarkSvg?.querySelector("line:nth-child(1)") as SVGLineElement;
147
+ const chV = chMarkSvg?.querySelector("line:nth-child(2)") as SVGLineElement;
148
+
149
+ const ll = host?.querySelector('[data-ref="ll"]') as SVGLineElement;
150
+ const llLabel = host?.querySelector('[data-ref="llLabel"]') as SVGTextElement;
151
+
152
+ const ease = "cubic-bezier(0.2, 0.8, 0.2, 1)";
153
+ const opts = { fill: "forwards" as const, easing: ease };
154
+
155
+ frame.animate([{ opacity: 0 }, { opacity: 1 }], {
156
+ ...opts,
157
+ duration: 360,
158
+ });
159
+
160
+ coord.animate([{ opacity: 0 }, { opacity: 1 }], {
161
+ ...opts,
162
+ duration: 300,
163
+ delay: 100,
164
+ });
165
+
166
+ tag.animate(
167
+ [
168
+ { opacity: 0, transform: "translateY(8px)" },
169
+ { opacity: 1, transform: "translateY(0)" },
170
+ ],
171
+ { ...opts, duration: 300, delay: 200 },
172
+ );
173
+
174
+ heading.animate(
175
+ [
176
+ { opacity: 0, transform: "translateY(12px)" },
177
+ { opacity: 1, transform: "translateY(0)" },
178
+ ],
179
+ { ...opts, duration: 400, delay: 400 },
180
+ );
181
+
182
+ chH.animate([{ transform: "scaleX(0)" }, { transform: "scaleX(1)" }], {
183
+ ...opts,
184
+ duration: 300,
185
+ delay: 500,
186
+ });
187
+
188
+ chV.animate([{ transform: "scaleY(0)" }, { transform: "scaleY(1)" }], {
189
+ ...opts,
190
+ duration: 300,
191
+ delay: 550,
192
+ });
193
+
194
+ colA.animate(
195
+ [
196
+ { opacity: 0, transform: "translateY(12px)" },
197
+ { opacity: 1, transform: "translateY(0)" },
198
+ ],
199
+ { ...opts, duration: 360, delay: 700 },
200
+ );
201
+
202
+ colB.animate(
203
+ [
204
+ { opacity: 0, transform: "translateY(12px)" },
205
+ { opacity: 1, transform: "translateY(0)" },
206
+ ],
207
+ { ...opts, duration: 360, delay: 1000 },
208
+ );
209
+
210
+ ll.animate([{ opacity: 0 }, { opacity: 1 }], {
211
+ ...opts,
212
+ duration: 300,
213
+ delay: 1300,
214
+ });
215
+
216
+ llLabel.animate([{ opacity: 0 }, { opacity: 1 }], {
217
+ ...opts,
218
+ duration: 200,
219
+ delay: 1500,
220
+ });
221
+
222
+ await ctx.waitForNext();
223
+ },
224
+
225
+ unmount() {
226
+ host = null;
227
+ },
228
+ });
@@ -0,0 +1,209 @@
1
+ import { defineSegment } from "videowright";
2
+
3
+ let host: HTMLElement | null = null;
4
+
5
+ function cornerTicks() {
6
+ return `
7
+ <div style="position: absolute; left: -1px; top: -1px; width: 24px; height: 24px;">
8
+ <div style="position: absolute; left: 0; top: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
9
+ <div style="position: absolute; left: 0; top: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
10
+ </div>
11
+ <div style="position: absolute; right: -1px; top: -1px; width: 24px; height: 24px;">
12
+ <div style="position: absolute; right: 0; top: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
13
+ <div style="position: absolute; right: 0; top: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
14
+ </div>
15
+ <div style="position: absolute; left: -1px; bottom: -1px; width: 24px; height: 24px;">
16
+ <div style="position: absolute; left: 0; bottom: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
17
+ <div style="position: absolute; left: 0; bottom: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
18
+ </div>
19
+ <div style="position: absolute; right: -1px; bottom: -1px; width: 24px; height: 24px;">
20
+ <div style="position: absolute; right: 0; bottom: 0; width: 24px; height: 1.5px; background: var(--color-accent);"></div>
21
+ <div style="position: absolute; right: 0; bottom: 0; width: 1.5px; height: 24px; background: var(--color-accent);"></div>
22
+ </div>`;
23
+ }
24
+
25
+ export default defineSegment({
26
+ id: "motion-engineering-sample-cta",
27
+ advances: [2.0, 4.5],
28
+ voiceover:
29
+ "CTA cards in Motion Engineering. A target reticle centers on the call to action, corner ticks frame the scene, and a coordinate readout shows the URL.",
30
+
31
+ mount(el) {
32
+ host = el;
33
+ el.innerHTML = `
34
+ <div style="
35
+ position: relative;
36
+ height: 100%;
37
+ background: var(--color-bg);
38
+ color: var(--color-fg);
39
+ font-family: var(--font-body);
40
+ overflow: hidden;
41
+ ">
42
+ <div style="
43
+ position: absolute; inset: 0; pointer-events: none;
44
+ background:
45
+ linear-gradient(var(--grid-line) 1px, transparent 1px) 0 0 / 64px 64px,
46
+ linear-gradient(90deg, var(--grid-line) 1px, transparent 1px) 0 0 / 64px 64px;
47
+ "></div>
48
+
49
+ <div data-ref="frame" style="
50
+ position: absolute;
51
+ inset: var(--safe-y) var(--safe-x);
52
+ border: 1px solid var(--color-border);
53
+ opacity: 0;
54
+ ">
55
+ ${cornerTicks()}
56
+
57
+ <svg data-ref="reticle" style="
58
+ position: absolute; left: 50%; top: 46%;
59
+ width: 600px; height: 600px;
60
+ transform: translate(-50%, -50%);
61
+ overflow: visible;
62
+ ">
63
+ <circle data-ref="outerRing" cx="300" cy="300" r="220" fill="none" stroke="var(--color-accent)" stroke-width="1.5" style="opacity: 0;" />
64
+ <circle data-ref="innerRing" cx="300" cy="300" r="160" fill="none" stroke="var(--color-muted)" stroke-width="1" stroke-dasharray="3 4" style="opacity: 0;" />
65
+ <line data-ref="rTop" x1="300" y1="20" x2="300" y2="120" stroke="var(--color-accent)" stroke-width="1.5" style="transform-origin: 300px 70px; transform: scaleY(0);" />
66
+ <line data-ref="rBot" x1="300" y1="580" x2="300" y2="480" stroke="var(--color-accent)" stroke-width="1.5" style="transform-origin: 300px 530px; transform: scaleY(0);" />
67
+ <line data-ref="rLeft" x1="20" y1="300" x2="120" y2="300" stroke="var(--color-accent)" stroke-width="1.5" style="transform-origin: 70px 300px; transform: scaleX(0);" />
68
+ <line data-ref="rRight" x1="580" y1="300" x2="480" y2="300" stroke="var(--color-accent)" stroke-width="1.5" style="transform-origin: 530px 300px; transform: scaleX(0);" />
69
+ </svg>
70
+
71
+ <div data-ref="headline" style="
72
+ position: absolute; left: 0; right: 0; top: 42%;
73
+ text-align: center;
74
+ font-family: var(--font-display);
75
+ font-weight: 500;
76
+ font-size: 160px;
77
+ line-height: 1.0;
78
+ opacity: 0;
79
+ ">Start the agent.</div>
80
+
81
+ <div data-ref="url" style="
82
+ position: absolute; left: 0; right: 0; top: 64%;
83
+ text-align: center;
84
+ font-family: var(--font-mono);
85
+ font-size: 28px;
86
+ letter-spacing: 0.15em;
87
+ color: var(--color-accent);
88
+ opacity: 0;
89
+ ">BEACON.RUN/START</div>
90
+
91
+ <div data-ref="footer" style="
92
+ position: absolute; left: 0; right: 0; bottom: 60px;
93
+ text-align: center;
94
+ font-family: var(--font-mono);
95
+ font-size: 13px;
96
+ letter-spacing: 0.3em;
97
+ color: var(--color-muted);
98
+ opacity: 0;
99
+ ">&mdash;&mdash;&mdash;&mdash;&mdash;&mdash; BEACON &middot; MAY 2026 &middot; v0.4.0 &mdash;&mdash;&mdash;&mdash;&mdash;&mdash;</div>
100
+ </div>
101
+
102
+ <div data-ref="coord" style="
103
+ position: absolute; left: var(--safe-x); right: var(--safe-x); bottom: 28px;
104
+ display: flex; gap: 32px;
105
+ font-family: var(--font-mono);
106
+ font-size: 12px;
107
+ color: var(--color-muted);
108
+ letter-spacing: 0.1em;
109
+ opacity: 0;
110
+ ">
111
+ <span>X BEACON.RUN/START</span><span>Y 360.00</span><span>T 0.00s</span>
112
+ <span style="margin-left: auto;">UNIT: PX &middot; SCALE 1:1</span>
113
+ </div>
114
+ </div>
115
+ `;
116
+ },
117
+
118
+ async play(ctx) {
119
+ const frame = host?.querySelector('[data-ref="frame"]') as HTMLElement;
120
+ const outerRing = host?.querySelector('[data-ref="outerRing"]') as SVGCircleElement;
121
+ const innerRing = host?.querySelector('[data-ref="innerRing"]') as SVGCircleElement;
122
+ const rTop = host?.querySelector('[data-ref="rTop"]') as SVGLineElement;
123
+ const rBot = host?.querySelector('[data-ref="rBot"]') as SVGLineElement;
124
+ const rLeft = host?.querySelector('[data-ref="rLeft"]') as SVGLineElement;
125
+ const rRight = host?.querySelector('[data-ref="rRight"]') as SVGLineElement;
126
+ const headline = host?.querySelector('[data-ref="headline"]') as HTMLElement;
127
+ const url = host?.querySelector('[data-ref="url"]') as HTMLElement;
128
+ const footer = host?.querySelector('[data-ref="footer"]') as HTMLElement;
129
+ const coord = host?.querySelector('[data-ref="coord"]') as HTMLElement;
130
+
131
+ const ease = "cubic-bezier(0.2, 0.8, 0.2, 1)";
132
+ const opts = { fill: "forwards" as const, easing: ease };
133
+
134
+ frame.animate([{ opacity: 0 }, { opacity: 1 }], {
135
+ ...opts,
136
+ duration: 360,
137
+ });
138
+
139
+ coord.animate([{ opacity: 0 }, { opacity: 1 }], {
140
+ ...opts,
141
+ duration: 300,
142
+ delay: 100,
143
+ });
144
+
145
+ outerRing.animate([{ opacity: 0 }, { opacity: 1 }], {
146
+ ...opts,
147
+ duration: 400,
148
+ delay: 300,
149
+ });
150
+
151
+ innerRing.animate([{ opacity: 0 }, { opacity: 1 }], {
152
+ ...opts,
153
+ duration: 400,
154
+ delay: 350,
155
+ });
156
+
157
+ rTop.animate([{ transform: "scaleY(0)" }, { transform: "scaleY(1)" }], {
158
+ ...opts,
159
+ duration: 400,
160
+ delay: 600,
161
+ });
162
+
163
+ rBot.animate([{ transform: "scaleY(0)" }, { transform: "scaleY(1)" }], {
164
+ ...opts,
165
+ duration: 400,
166
+ delay: 650,
167
+ });
168
+
169
+ rLeft.animate([{ transform: "scaleX(0)" }, { transform: "scaleX(1)" }], {
170
+ ...opts,
171
+ duration: 400,
172
+ delay: 600,
173
+ });
174
+
175
+ rRight.animate([{ transform: "scaleX(0)" }, { transform: "scaleX(1)" }], {
176
+ ...opts,
177
+ duration: 400,
178
+ delay: 650,
179
+ });
180
+
181
+ headline.animate(
182
+ [
183
+ { opacity: 0, transform: "translateY(12px)" },
184
+ { opacity: 1, transform: "translateY(0)" },
185
+ ],
186
+ { ...opts, duration: 400, delay: 900 },
187
+ );
188
+
189
+ url.animate(
190
+ [
191
+ { opacity: 0, transform: "translateY(8px)" },
192
+ { opacity: 1, transform: "translateY(0)" },
193
+ ],
194
+ { ...opts, duration: 360, delay: 1200 },
195
+ );
196
+
197
+ footer.animate([{ opacity: 0 }, { opacity: 1 }], {
198
+ ...opts,
199
+ duration: 360,
200
+ delay: 1500,
201
+ });
202
+
203
+ await ctx.waitForNext();
204
+ },
205
+
206
+ unmount() {
207
+ host = null;
208
+ },
209
+ });