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,173 @@
1
+ import { defineSegment } from "videowright";
2
+
3
+ let host: HTMLElement | null = null;
4
+
5
+ export default defineSegment({
6
+ id: "iso-diagram-sample-title",
7
+ advances: [2.5, 5.0],
8
+ voiceover:
9
+ "Title cards in Iso Diagram. A handwritten title on paper, a wavy underline that draws itself, and a small isometric cube in the corner.",
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-body);
20
+ overflow: hidden;
21
+ ">
22
+ <div style="
23
+ position: absolute; inset: 0; pointer-events: none;
24
+ background-image: radial-gradient(circle, rgba(42,38,32,0.10) 1px, transparent 1.6px);
25
+ background-size: 32px 32px;
26
+ "></div>
27
+
28
+ <svg data-ref="cube" style="position: absolute; left: var(--safe-x); top: 100px; overflow: visible; opacity: 0;" width="180" height="180">
29
+ <path data-ref="cubeTop" d="M0,60 L60,0 L120,60 L60,120 Z" fill="var(--fill-yellow)" opacity="0" />
30
+ <path data-ref="cubeFrontL" d="M0,60 L60,120 L60,180 L0,120 Z" fill="var(--fill-yellow)" opacity="0" />
31
+ <path data-ref="cubeFrontR" d="M60,120 L120,60 L120,120 L60,180 Z" fill="var(--fill-yellow)" opacity="0" />
32
+ <path data-ref="cubeOutline" d="M0,60 L60,0 L120,60 L60,120 Z M0,60 L60,120 L60,180 L0,120 Z M60,120 L120,60 L120,120 L60,180" stroke="var(--color-fg)" stroke-width="2.4" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="800" stroke-dashoffset="800" />
33
+ </svg>
34
+
35
+ <div data-ref="label" style="
36
+ position: absolute;
37
+ left: var(--safe-x);
38
+ top: 320px;
39
+ font-family: var(--font-mono);
40
+ font-size: 22px;
41
+ letter-spacing: 0.1em;
42
+ color: var(--color-muted);
43
+ opacity: 0;
44
+ ">BEACON &middot; v0.4</div>
45
+
46
+ <div data-ref="headline" style="
47
+ position: absolute;
48
+ left: var(--safe-x);
49
+ top: 380px;
50
+ font-family: var(--font-display);
51
+ font-size: 280px;
52
+ color: var(--color-accent);
53
+ line-height: 1.0;
54
+ opacity: 0;
55
+ ">Beacon.</div>
56
+
57
+ <div data-ref="subtitle" style="
58
+ position: absolute;
59
+ left: var(--safe-x);
60
+ top: 720px;
61
+ font-family: var(--font-body);
62
+ font-size: 44px;
63
+ font-weight: 600;
64
+ opacity: 0;
65
+ ">Long-running agents,</div>
66
+
67
+ <div data-ref="subtitleMuted" style="
68
+ position: absolute;
69
+ left: var(--safe-x);
70
+ top: 780px;
71
+ font-family: var(--font-body);
72
+ font-size: 44px;
73
+ font-weight: 400;
74
+ color: var(--color-muted);
75
+ opacity: 0;
76
+ ">that don't forget where they were.</div>
77
+
78
+ <svg data-ref="underlineSvg" style="position: absolute; left: var(--safe-x); top: 855px;" width="580" height="14">
79
+ <path data-ref="underline" d="M 0 6 q 96 -8 192 0 t 192 0 t 192 0" stroke="var(--color-accent)" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-dasharray="700" stroke-dashoffset="700" />
80
+ </svg>
81
+
82
+ <div data-ref="counter" style="
83
+ position: absolute;
84
+ right: var(--safe-x);
85
+ top: 36px;
86
+ font-family: var(--font-display);
87
+ font-size: 28px;
88
+ color: var(--color-muted);
89
+ transform: rotate(-2deg);
90
+ opacity: 0;
91
+ ">~ scene 1 of 10 ~</div>
92
+ </div>
93
+ `;
94
+ },
95
+
96
+ async play(ctx) {
97
+ const cube = host?.querySelector('[data-ref="cube"]') as SVGElement;
98
+ const cubeOutline = host?.querySelector('[data-ref="cubeOutline"]') as SVGPathElement;
99
+ const cubeTop = host?.querySelector('[data-ref="cubeTop"]') as SVGPathElement;
100
+ const cubeFrontL = host?.querySelector('[data-ref="cubeFrontL"]') as SVGPathElement;
101
+ const cubeFrontR = host?.querySelector('[data-ref="cubeFrontR"]') as SVGPathElement;
102
+ const label = host?.querySelector('[data-ref="label"]') as HTMLElement;
103
+ const headline = host?.querySelector('[data-ref="headline"]') as HTMLElement;
104
+ const subtitle = host?.querySelector('[data-ref="subtitle"]') as HTMLElement;
105
+ const subtitleMuted = host?.querySelector('[data-ref="subtitleMuted"]') as HTMLElement;
106
+ const underline = host?.querySelector('[data-ref="underline"]') as SVGPathElement;
107
+ const counter = host?.querySelector('[data-ref="counter"]') as HTMLElement;
108
+
109
+ const ease = "cubic-bezier(0.34, 1.2, 0.64, 1)";
110
+ const opts = { fill: "forwards" as const, easing: ease };
111
+
112
+ // Cube outline draws on
113
+ cube.animate([{ opacity: 0 }, { opacity: 1 }], { ...opts, duration: 200 });
114
+ cubeOutline.animate([{ strokeDashoffset: "800" }, { strokeDashoffset: "0" }], {
115
+ ...opts,
116
+ duration: 600,
117
+ delay: 200,
118
+ });
119
+ // Fills flood in after outline
120
+ cubeTop.animate([{ opacity: 0 }, { opacity: 0.95 }], { ...opts, duration: 400, delay: 700 });
121
+ cubeFrontL.animate([{ opacity: 0 }, { opacity: 0.7 }], { ...opts, duration: 400, delay: 750 });
122
+ cubeFrontR.animate([{ opacity: 0 }, { opacity: 0.55 }], { ...opts, duration: 400, delay: 750 });
123
+
124
+ // Label swings in
125
+ label.animate(
126
+ [
127
+ { opacity: 0, transform: "rotate(-2deg) translateY(12px)" },
128
+ { opacity: 1, transform: "rotate(0deg) translateY(0)" },
129
+ ],
130
+ { ...opts, duration: 300, delay: 800 },
131
+ );
132
+
133
+ // Headline fades in
134
+ headline.animate(
135
+ [
136
+ { opacity: 0, transform: "translateY(12px)" },
137
+ { opacity: 1, transform: "translateY(0)" },
138
+ ],
139
+ { ...opts, duration: 400, delay: 1100 },
140
+ );
141
+
142
+ // Subtitles
143
+ subtitle.animate(
144
+ [
145
+ { opacity: 0, transform: "translateY(12px)" },
146
+ { opacity: 1, transform: "translateY(0)" },
147
+ ],
148
+ { ...opts, duration: 350, delay: 1700 },
149
+ );
150
+ subtitleMuted.animate(
151
+ [
152
+ { opacity: 0, transform: "translateY(12px)" },
153
+ { opacity: 1, transform: "translateY(0)" },
154
+ ],
155
+ { ...opts, duration: 350, delay: 1800 },
156
+ );
157
+
158
+ // Underline draws on
159
+ underline.animate([{ strokeDashoffset: "700" }, { strokeDashoffset: "0" }], {
160
+ ...opts,
161
+ duration: 500,
162
+ delay: 2000,
163
+ });
164
+
165
+ counter.animate([{ opacity: 0 }, { opacity: 1 }], { ...opts, duration: 300, delay: 300 });
166
+
167
+ await ctx.waitForNext();
168
+ },
169
+
170
+ unmount() {
171
+ host = null;
172
+ },
173
+ });
@@ -0,0 +1,162 @@
1
+ import { defineSegment } from "videowright";
2
+
3
+ let host: HTMLElement | null = null;
4
+
5
+ export default defineSegment({
6
+ id: "iso-diagram-sample-ui-showcase",
7
+ advances: [2.5, 5.0],
8
+ voiceover:
9
+ "UI showcases in Iso Diagram. An exploded isometric view with four stacked diamond layers, each drawing its outline then flooding with pastel fill.",
10
+
11
+ mount(el) {
12
+ host = el;
13
+
14
+ const layers = [
15
+ { y: 360, fill: "var(--fill-blue)", label: "TIMELINE" },
16
+ { y: 240, fill: "var(--fill-yellow)", label: "MEMORY" },
17
+ { y: 120, fill: "var(--fill-pink)", label: "TRACES" },
18
+ { y: 0, fill: "var(--fill-green)", label: "AGENT" },
19
+ ];
20
+
21
+ const layerHtml = layers
22
+ .map(
23
+ (layer, i) => `
24
+ <g data-ref="layer${i}" transform="translate(80,${layer.y})">
25
+ <polygon data-ref="layerFill${i}" points="0,80 360,-80 720,80 360,240" fill="${layer.fill}" opacity="0" />
26
+ <path data-ref="layerOutline${i}" d="M 0 80 L 360 -80 L 720 80 L 360 240 Z" stroke="var(--color-fg)" stroke-width="2.4" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1800" stroke-dashoffset="1800" />
27
+ <text data-ref="layerLabel${i}" x="760" y="70" font-family="var(--font-display)" font-size="44" fill="var(--color-fg)" opacity="0">${layer.label}</text>
28
+ <path data-ref="layerTick${i}" d="M 740 60 L 800 60" stroke="var(--color-accent)" stroke-width="2.4" fill="none" stroke-linecap="round" stroke-dasharray="60" stroke-dashoffset="60" />
29
+ </g>`,
30
+ )
31
+ .join("");
32
+
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-image: radial-gradient(circle, rgba(42,38,32,0.10) 1px, transparent 1.6px);
45
+ background-size: 32px 32px;
46
+ "></div>
47
+
48
+ <div data-ref="heading" style="
49
+ position: absolute;
50
+ left: 140px;
51
+ top: 120px;
52
+ opacity: 0;
53
+ ">
54
+ <div style="font-family: var(--font-display); font-size: 110px;">Beacon Console.</div>
55
+ <svg style="margin-top: 8px;" width="480" height="14">
56
+ <path data-ref="headingUnderline" d="M 0 6 q 80 -8 160 0 t 160 0 t 160 0" stroke="var(--color-accent)" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-dasharray="600" stroke-dashoffset="600" />
57
+ </svg>
58
+ </div>
59
+
60
+ <svg style="position: absolute; left: 240px; top: 340px; overflow: visible;" width="1100" height="700">
61
+ ${layerHtml}
62
+ </svg>
63
+
64
+ <div data-ref="caption" style="
65
+ position: absolute;
66
+ right: 140px;
67
+ bottom: 180px;
68
+ width: 480px;
69
+ opacity: 0;
70
+ ">
71
+ <div style="font-family: var(--font-body); font-size: 26px; font-weight: 600;">Four layers, one console.</div>
72
+ <div style="font-family: var(--font-body); font-size: 22px; margin-top: 8px; color: var(--color-muted);">Each layer is independently inspectable and pinnable to the timeline.</div>
73
+ </div>
74
+
75
+ <div data-ref="counter" style="
76
+ position: absolute;
77
+ right: var(--safe-x);
78
+ top: 36px;
79
+ font-family: var(--font-display);
80
+ font-size: 28px;
81
+ color: var(--color-muted);
82
+ transform: rotate(-2deg);
83
+ opacity: 0;
84
+ ">~ scene 8 of 10 ~</div>
85
+ </div>
86
+ `;
87
+ },
88
+
89
+ async play(ctx) {
90
+ const heading = host?.querySelector('[data-ref="heading"]') as HTMLElement;
91
+ const headingUnderline = host?.querySelector('[data-ref="headingUnderline"]') as SVGPathElement;
92
+ const caption = host?.querySelector('[data-ref="caption"]') as HTMLElement;
93
+ const counter = host?.querySelector('[data-ref="counter"]') as HTMLElement;
94
+
95
+ const ease = "cubic-bezier(0.34, 1.2, 0.64, 1)";
96
+ const opts = { fill: "forwards" as const, easing: ease };
97
+
98
+ counter.animate([{ opacity: 0 }, { opacity: 1 }], { ...opts, duration: 300 });
99
+
100
+ heading.animate(
101
+ [
102
+ { opacity: 0, transform: "translateY(12px)" },
103
+ { opacity: 1, transform: "translateY(0)" },
104
+ ],
105
+ { ...opts, duration: 350, delay: 300 },
106
+ );
107
+
108
+ headingUnderline.animate([{ strokeDashoffset: "600" }, { strokeDashoffset: "0" }], {
109
+ ...opts,
110
+ duration: 500,
111
+ delay: 700,
112
+ });
113
+
114
+ // Each layer: outline draws on, fill floods, label + tick appear
115
+ for (let i = 0; i < 4; i++) {
116
+ const outline = host?.querySelector(`[data-ref="layerOutline${i}"]`) as SVGPathElement;
117
+ const fill = host?.querySelector(`[data-ref="layerFill${i}"]`) as SVGPolygonElement;
118
+ const label = host?.querySelector(`[data-ref="layerLabel${i}"]`) as SVGTextElement;
119
+ const tick = host?.querySelector(`[data-ref="layerTick${i}"]`) as SVGPathElement;
120
+
121
+ const base = 700 + i * 250;
122
+
123
+ outline.animate([{ strokeDashoffset: "1800" }, { strokeDashoffset: "0" }], {
124
+ ...opts,
125
+ duration: 500,
126
+ delay: base,
127
+ });
128
+
129
+ fill.animate([{ opacity: 0 }, { opacity: 0.85 }], {
130
+ ...opts,
131
+ duration: 400,
132
+ delay: base + 400,
133
+ });
134
+
135
+ label.animate([{ opacity: 0 }, { opacity: 1 }], {
136
+ ...opts,
137
+ duration: 300,
138
+ delay: base + 300,
139
+ });
140
+
141
+ tick.animate([{ strokeDashoffset: "60" }, { strokeDashoffset: "0" }], {
142
+ ...opts,
143
+ duration: 300,
144
+ delay: base + 300,
145
+ });
146
+ }
147
+
148
+ caption.animate(
149
+ [
150
+ { opacity: 0, transform: "rotate(-2deg) translateY(12px)" },
151
+ { opacity: 1, transform: "rotate(0deg) translateY(0)" },
152
+ ],
153
+ { ...opts, duration: 350, delay: 2500 },
154
+ );
155
+
156
+ await ctx.waitForNext();
157
+ },
158
+
159
+ unmount() {
160
+ host = null;
161
+ },
162
+ });
@@ -0,0 +1,40 @@
1
+ /* Iso Diagram — design tokens
2
+ * Pencil-and-paper aesthetic, soft pastel fills, hand-built but precise.
3
+ */
4
+ :root {
5
+ --color-bg: #faf7f2; /* paper */
6
+ --color-fg: #2a2620; /* graphite */
7
+ --color-accent: #1f6fb3; /* pencil blue */
8
+
9
+ --color-muted: #8b8174;
10
+ --color-border: #2a2620;
11
+ --color-surface: #ffffff;
12
+
13
+ --fill-blue: #c8deef;
14
+ --fill-pink: #f4cfcb;
15
+ --fill-yellow: #f5e4a8;
16
+ --fill-green: #c9dec6;
17
+ --fill-lavender: #dcd3e8;
18
+
19
+ --font-display: "Caveat", "Marker Felt", cursive;
20
+ --font-body: "Nunito", "Inter", system-ui, sans-serif;
21
+ --font-mono: "JetBrains Mono", ui-monospace, monospace;
22
+
23
+ --space-sm: 12px;
24
+ --space-md: 24px;
25
+ --space-lg: 48px;
26
+ --space-xl: 96px;
27
+
28
+ --duration-fast: 220ms;
29
+ --duration-normal: 480ms;
30
+ --duration-slow: 900ms;
31
+
32
+ --stroke: 2.4px;
33
+ --stagger: 80ms;
34
+ --ease-out: cubic-bezier(0.34, 1.2, 0.64, 1); /* soft overshoot */
35
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
36
+ --scene-hold: 4.5s;
37
+
38
+ --safe-x: 120px;
39
+ --safe-y: 96px;
40
+ }
@@ -0,0 +1,106 @@
1
+ ---
2
+ title: Motion Engineering
3
+ slug: motion-engineering
4
+ picker_description: 'Aerospace HUD on a blueprint grid. Dimension lines, crosshairs, leader-lined callouts.'
5
+ font_sources:
6
+ - https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;700&display=swap
7
+ - https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap
8
+ mood: [technical, precise, industrial, mechanical, methodical]
9
+ good_for:
10
+ - Hardware launches (robotics, drones, sensors, devices)
11
+ - Industrial / B2B technical products
12
+ - Explainers where annotation is the point (parts callouts, measurements)
13
+ - AI infrastructure that wants to feel engineered
14
+ bad_for:
15
+ - Soft consumer apps
16
+ - Lifestyle / brand launches
17
+ - Anything where the script doesn't have specifics to annotate
18
+ tags: [hud, blueprint, technical, annotation, dark-mode, industrial]
19
+ references: [SpaceX webcast graphics, Linear annotations, For All Mankind UI, CAD documentation]
20
+ ---
21
+
22
+ # Motion Engineering — STYLE.md
23
+
24
+ ## Identity
25
+
26
+ An engineering-document aesthetic — half aerospace HUD, half CAD blueprint. Charcoal canvas with a faint grid; cyan-white type; an amber HUD accent. Elements *measure themselves in*: dimension lines draw, crosshairs sweep, callouts arrive on leader lines. Every scene looks like it was extracted from a technical drawing.
27
+
28
+ **Mood:** technical, precise, industrial, mechanical, methodical.
29
+
30
+ ## When to use
31
+
32
+ - Hardware launches (robotics, drones, sensors, devices)
33
+ - Industrial / B2B technical products
34
+ - Explainers where annotation is the point (parts callouts, measurements)
35
+ - AI infrastructure that wants to feel engineered
36
+
37
+ ## When to avoid
38
+
39
+ - Soft consumer apps
40
+ - Lifestyle / brand launches
41
+ - Anything where the script doesn't have specifics to annotate
42
+
43
+ ## Layout principles
44
+
45
+ - **Faint grid is always visible.** 8% opacity, 32px or 64px cells. The scene sits on a drawing.
46
+ - **Crosshairs and corner ticks frame the content area.** Top-left `+`, top-right `+`, bottom corners likewise. They sweep in on enter.
47
+ - **Leader lines connect labels to things.** Never float a label — connect it with a 1px line to its referent.
48
+ - **Tabular numerals everywhere.** All metrics in mono with `tnum`.
49
+ - **Coordinate readouts.** Bottom strip shows `X 1240.00 Y 360.00` ticking subtly.
50
+
51
+ ## Color application
52
+
53
+ - Charcoal bg, cyan-white fg.
54
+ - **Amber accent (`--color-accent`) is the HUD signal.** Used for primary highlights, callouts, target marks, the active reading.
55
+ - Cyan (`--cyan`) for measurement lines and secondary highlights.
56
+ - Warning amber (`--warn`) for transitions / in-progress.
57
+ - Muted slate for grid labels, axes, secondary type.
58
+
59
+ ## Type rules
60
+
61
+ - **Display: Space Grotesk.** Geometric, slightly mechanical. Medium weight (500). Sizes 56–200.
62
+ - **Body: Space Grotesk.** Regular (400), 20–32px.
63
+ - **Mono: JetBrains Mono.** For all numerals, coordinates, units, identifiers.
64
+ - Numerals always tabular. Units always set apart in mono at smaller size (`84` big, `mm` mono small below).
65
+
66
+ ## Motion principles
67
+
68
+ - **Things draw in.** Lines extend, dimension arrows arrive at their endpoints, crosshairs sweep to position.
69
+ - **Numbers tick.** Counter-style updates, not smooth interpolation — each digit flips.
70
+ - **Stagger 50ms.** Many small staged events build up a frame.
71
+ - **Scene transitions:** crosshair-sweep wipe (a thin amber line sweeps L→R, content updates as it passes).
72
+ - **Ambient layer:** coordinate readout ticks; grid lines pulse very subtly; one crosshair on the canvas marks the camera origin.
73
+ - **Forbidden:** bounce, spring, ease-in-out for entries, fade-only without geometry.
74
+
75
+ ## Pacing
76
+
77
+ Methodical. 3.5–4s per scene. Multiple measurement reveals per scene — let each one land before the next starts.
78
+
79
+ ## Per-scene recipes
80
+
81
+ | Scene | Recipe |
82
+ |---|---|
83
+ | **Title** | Crosshair tracks to center on the title; dimension lines bracket it left/right showing total width; small coordinate label below. |
84
+ | **Section** | `CHAPTER 02 · SECTION TITLE` with a sweeping amber line under it. Grid intensifies briefly. |
85
+ | **Kinetic** | Sentence reveals word-by-word. Each word is bracketed top and bottom with tiny tick marks. Last word boxed in amber. |
86
+ | **Bullet** | Each item has an `[ITEM 01]` mono prefix; rows separated by hairlines; right column shows a tiny measurement (`Δ = 12.4 ms`). |
87
+ | **Stat** | Big number with dimension lines drawing above and below it showing its "size." Caption in mono with unit. |
88
+ | **Feature** | Two columns: left has a wireframe schematic with crosshair callouts; right has feature name and prose. |
89
+ | **Grid** | 3 cards, each framed with corner ticks. Inside each: small wireframe diagram + name + metric. |
90
+ | **UI showcase** | A wireframe of the product UI with amber leader-lined callouts pointing to parts. The mock looks like a blueprint of the app. |
91
+ | **Content** | Title with crosshair marker; body in two columns; one block has an inline annotation with leader line. |
92
+ | **CTA** | Target reticle centered on the CTA text; corner ticks; coordinate readout shows the URL as a coordinate. |
93
+
94
+ ### Connective elements
95
+
96
+ - **Lower third:** measured bracket at bottom — `├── narration · t = 00:24 ──┤`
97
+ - **Scene transition:** crosshair-sweep wipe
98
+ - **Ambient:** coordinate ticker, grid pulse, one persistent canvas crosshair
99
+
100
+ ## Pitfalls
101
+
102
+ - **Don't drop the grid.** The grid is the canvas of this style.
103
+ - **Don't float a label without a leader line.** Connect everything.
104
+ - **Don't use serifs.** Or any non-Grotesk/Mono.
105
+ - **Don't smooth-number.** Numbers tick / flip.
106
+ - **Don't use red.** Amber and cyan only.
@@ -0,0 +1,29 @@
1
+ # Motion Engineering — Brand
2
+
3
+ ## Color
4
+
5
+ **`--color-bg` `#0E141A`** — deep charcoal with a slight blue tilt. Reads as "drawing paper" in dark mode.
6
+
7
+ **`--color-fg` `#E8EEF5`** — cyan-white. Crisper than warm white, matches the engineering register.
8
+
9
+ **`--color-accent` `#FF8800`** — HUD amber. The signal color. Used for active readings, primary callouts.
10
+
11
+ **`--cyan` `#4FD1E0`** — dimension-line cyan. Secondary measurement color.
12
+
13
+ **`--warn` `#FFB800`** — warning amber. For in-progress, transitions.
14
+
15
+ **`--color-muted` `#6F8294`** — slate. Grid labels, axes, secondary type.
16
+
17
+ ## Typography
18
+
19
+ **Space Grotesk** is the closest free analogue to the geometric-mechanical grotesks used in modern HUDs and CAD UIs. Slight personality where Helvetica would be neutral.
20
+
21
+ **JetBrains Mono** for all numerals and identifiers — non-negotiable in this style.
22
+
23
+ ## Motion
24
+
25
+ Geometry-led entries: lines draw, brackets close, crosshairs sweep. Smooth easing on the lines themselves; ticking on the numbers.
26
+
27
+ ## Grid
28
+
29
+ The faint background grid is part of the brand. 64px cells at 6% white opacity. Always present on every scene.