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.
- package/README.md +91 -0
- package/dist/cli/argv.d.ts +28 -0
- package/dist/cli/argv.d.ts.map +1 -0
- package/dist/cli/argv.js +115 -0
- package/dist/cli/argv.js.map +1 -0
- package/dist/cli/bin.d.ts +7 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +10 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/dev.d.ts +19 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +104 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/discover.d.ts +29 -0
- package/dist/cli/discover.d.ts.map +1 -0
- package/dist/cli/discover.js +104 -0
- package/dist/cli/discover.js.map +1 -0
- package/dist/cli/discover_project.d.ts +29 -0
- package/dist/cli/discover_project.d.ts.map +1 -0
- package/dist/cli/discover_project.js +108 -0
- package/dist/cli/discover_project.js.map +1 -0
- package/dist/cli/errors.d.ts +10 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +13 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/ffmpeg.d.ts +57 -0
- package/dist/cli/ffmpeg.d.ts.map +1 -0
- package/dist/cli/ffmpeg.js +122 -0
- package/dist/cli/ffmpeg.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +152 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/playwright_check.d.ts +44 -0
- package/dist/cli/playwright_check.d.ts.map +1 -0
- package/dist/cli/playwright_check.js +20 -0
- package/dist/cli/playwright_check.js.map +1 -0
- package/dist/cli/prompt.d.ts +13 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +47 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/render.d.ts +60 -0
- package/dist/cli/render.d.ts.map +1 -0
- package/dist/cli/render.js +471 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/script_cmd.d.ts +26 -0
- package/dist/cli/script_cmd.d.ts.map +1 -0
- package/dist/cli/script_cmd.js +88 -0
- package/dist/cli/script_cmd.js.map +1 -0
- package/dist/cli/time_shim.d.ts +44 -0
- package/dist/cli/time_shim.d.ts.map +1 -0
- package/dist/cli/time_shim.js +390 -0
- package/dist/cli/time_shim.js.map +1 -0
- package/dist/cli/ts_loader.d.ts +28 -0
- package/dist/cli/ts_loader.d.ts.map +1 -0
- package/dist/cli/ts_loader.js +95 -0
- package/dist/cli/ts_loader.js.map +1 -0
- package/dist/cli/vite_helpers.d.ts +62 -0
- package/dist/cli/vite_helpers.d.ts.map +1 -0
- package/dist/cli/vite_helpers.js +273 -0
- package/dist/cli/vite_helpers.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/player/hash_router.d.ts +23 -0
- package/dist/player/hash_router.d.ts.map +1 -0
- package/dist/player/hash_router.js +49 -0
- package/dist/player/hash_router.js.map +1 -0
- package/dist/player/hud.d.ts +33 -0
- package/dist/player/hud.d.ts.map +1 -0
- package/dist/player/hud.js +357 -0
- package/dist/player/hud.js.map +1 -0
- package/dist/player/index.d.ts +123 -0
- package/dist/player/index.d.ts.map +1 -0
- package/dist/player/index.js +848 -0
- package/dist/player/index.js.map +1 -0
- package/dist/player/input.d.ts +14 -0
- package/dist/player/input.d.ts.map +1 -0
- package/dist/player/input.js +90 -0
- package/dist/player/input.js.map +1 -0
- package/dist/player/slot.d.ts +22 -0
- package/dist/player/slot.d.ts.map +1 -0
- package/dist/player/slot.js +43 -0
- package/dist/player/slot.js.map +1 -0
- package/dist/player/transitions/cut.d.ts +7 -0
- package/dist/player/transitions/cut.d.ts.map +1 -0
- package/dist/player/transitions/cut.js +9 -0
- package/dist/player/transitions/cut.js.map +1 -0
- package/dist/player/transitions/fade.d.ts +7 -0
- package/dist/player/transitions/fade.d.ts.map +1 -0
- package/dist/player/transitions/fade.js +18 -0
- package/dist/player/transitions/fade.js.map +1 -0
- package/dist/player/transitions/index.d.ts +4 -0
- package/dist/player/transitions/index.d.ts.map +1 -0
- package/dist/player/transitions/index.js +4 -0
- package/dist/player/transitions/index.js.map +1 -0
- package/dist/player/transitions/slide.d.ts +6 -0
- package/dist/player/transitions/slide.d.ts.map +1 -0
- package/dist/player/transitions/slide.js +35 -0
- package/dist/player/transitions/slide.js.map +1 -0
- package/dist/script/index.d.ts +2 -0
- package/dist/script/index.d.ts.map +1 -0
- package/dist/script/index.js +2 -0
- package/dist/script/index.js.map +1 -0
- package/dist/script/script.d.ts +10 -0
- package/dist/script/script.d.ts.map +1 -0
- package/dist/script/script.js +41 -0
- package/dist/script/script.js.map +1 -0
- package/dist/segment/SegmentRunner.d.ts +52 -0
- package/dist/segment/SegmentRunner.d.ts.map +1 -0
- package/dist/segment/SegmentRunner.js +187 -0
- package/dist/segment/SegmentRunner.js.map +1 -0
- package/dist/segment/defineConfig.d.ts +6 -0
- package/dist/segment/defineConfig.d.ts.map +1 -0
- package/dist/segment/defineConfig.js +7 -0
- package/dist/segment/defineConfig.js.map +1 -0
- package/dist/segment/defineSegment.d.ts +7 -0
- package/dist/segment/defineSegment.d.ts.map +1 -0
- package/dist/segment/defineSegment.js +25 -0
- package/dist/segment/defineSegment.js.map +1 -0
- package/dist/segment/index.d.ts +5 -0
- package/dist/segment/index.d.ts.map +1 -0
- package/dist/segment/index.js +4 -0
- package/dist/segment/index.js.map +1 -0
- package/dist/timeline/index.d.ts +73 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +142 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/timeline/loadAudioTrack.d.ts +18 -0
- package/dist/timeline/loadAudioTrack.d.ts.map +1 -0
- package/dist/timeline/loadAudioTrack.js +44 -0
- package/dist/timeline/loadAudioTrack.js.map +1 -0
- package/dist/timeline/loadVoiceover.d.ts +18 -0
- package/dist/timeline/loadVoiceover.d.ts.map +1 -0
- package/dist/timeline/loadVoiceover.js +38 -0
- package/dist/timeline/loadVoiceover.js.map +1 -0
- package/dist/timeline/resolveTiming.d.ts +28 -0
- package/dist/timeline/resolveTiming.d.ts.map +1 -0
- package/dist/timeline/resolveTiming.js +63 -0
- package/dist/timeline/resolveTiming.js.map +1 -0
- package/dist/timeline/validateTiming.d.ts +29 -0
- package/dist/timeline/validateTiming.d.ts.map +1 -0
- package/dist/timeline/validateTiming.js +62 -0
- package/dist/timeline/validateTiming.js.map +1 -0
- package/dist/types.d.ts +216 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
- package/skill/SKILL.md +64 -0
- package/skill/assets/hello_world/PLAN.md +31 -0
- package/skill/assets/hello_world/README.md +27 -0
- package/skill/assets/hello_world/audio/audio_plan.md +14 -0
- package/skill/assets/hello_world/segments/hello_intro.ts +69 -0
- package/skill/assets/hello_world/segments/hello_outro.ts +71 -0
- package/skill/assets/hello_world/timeline.ts +15 -0
- package/skill/assets/hello_world/voiceover_script/script.md +10 -0
- package/skill/assets/install/package.json +10 -0
- package/skill/assets/install/tsconfig.json +23 -0
- package/skill/assets/styles/editorial-mono/STYLE.md +124 -0
- package/skill/assets/styles/editorial-mono/brand.md +85 -0
- package/skill/assets/styles/editorial-mono/reference/animations.jsx +752 -0
- package/skill/assets/styles/editorial-mono/reference/scenes.html +563 -0
- package/skill/assets/styles/editorial-mono/sample/bullet.ts +101 -0
- package/skill/assets/styles/editorial-mono/sample/content.ts +104 -0
- package/skill/assets/styles/editorial-mono/sample/cta.ts +113 -0
- package/skill/assets/styles/editorial-mono/sample/feature.ts +111 -0
- package/skill/assets/styles/editorial-mono/sample/grid.ts +97 -0
- package/skill/assets/styles/editorial-mono/sample/kinetic.ts +96 -0
- package/skill/assets/styles/editorial-mono/sample/section.ts +101 -0
- package/skill/assets/styles/editorial-mono/sample/stat.ts +128 -0
- package/skill/assets/styles/editorial-mono/sample/title.ts +97 -0
- package/skill/assets/styles/editorial-mono/sample/ui-showcase.ts +159 -0
- package/skill/assets/styles/editorial-mono/tokens.css +44 -0
- package/skill/assets/styles/iso-diagram/STYLE.md +109 -0
- package/skill/assets/styles/iso-diagram/brand.md +32 -0
- package/skill/assets/styles/iso-diagram/reference/animations.jsx +673 -0
- package/skill/assets/styles/iso-diagram/reference/scenes.html +427 -0
- package/skill/assets/styles/iso-diagram/sample/bullet.ts +144 -0
- package/skill/assets/styles/iso-diagram/sample/content.ts +192 -0
- package/skill/assets/styles/iso-diagram/sample/cta.ts +162 -0
- package/skill/assets/styles/iso-diagram/sample/feature.ts +205 -0
- package/skill/assets/styles/iso-diagram/sample/grid.ts +181 -0
- package/skill/assets/styles/iso-diagram/sample/kinetic.ts +102 -0
- package/skill/assets/styles/iso-diagram/sample/section.ts +149 -0
- package/skill/assets/styles/iso-diagram/sample/stat.ts +164 -0
- package/skill/assets/styles/iso-diagram/sample/title.ts +173 -0
- package/skill/assets/styles/iso-diagram/sample/ui-showcase.ts +162 -0
- package/skill/assets/styles/iso-diagram/tokens.css +40 -0
- package/skill/assets/styles/motion-engineering/STYLE.md +106 -0
- package/skill/assets/styles/motion-engineering/brand.md +29 -0
- package/skill/assets/styles/motion-engineering/reference/animations.jsx +673 -0
- package/skill/assets/styles/motion-engineering/reference/scenes.html +513 -0
- package/skill/assets/styles/motion-engineering/sample/bullet.ts +176 -0
- package/skill/assets/styles/motion-engineering/sample/content.ts +228 -0
- package/skill/assets/styles/motion-engineering/sample/cta.ts +209 -0
- package/skill/assets/styles/motion-engineering/sample/feature.ts +299 -0
- package/skill/assets/styles/motion-engineering/sample/grid.ts +190 -0
- package/skill/assets/styles/motion-engineering/sample/kinetic.ts +159 -0
- package/skill/assets/styles/motion-engineering/sample/section.ts +196 -0
- package/skill/assets/styles/motion-engineering/sample/stat.ts +230 -0
- package/skill/assets/styles/motion-engineering/sample/title.ts +219 -0
- package/skill/assets/styles/motion-engineering/sample/ui-showcase.ts +267 -0
- package/skill/assets/styles/motion-engineering/tokens.css +40 -0
- package/skill/assets/styles/neon-terminal/STYLE.md +105 -0
- package/skill/assets/styles/neon-terminal/brand.md +27 -0
- package/skill/assets/styles/neon-terminal/reference/animations.jsx +673 -0
- package/skill/assets/styles/neon-terminal/reference/scenes.html +387 -0
- package/skill/assets/styles/neon-terminal/sample/bullet.ts +113 -0
- package/skill/assets/styles/neon-terminal/sample/content.ts +117 -0
- package/skill/assets/styles/neon-terminal/sample/cta.ts +131 -0
- package/skill/assets/styles/neon-terminal/sample/feature.ts +112 -0
- package/skill/assets/styles/neon-terminal/sample/grid.ts +128 -0
- package/skill/assets/styles/neon-terminal/sample/kinetic.ts +105 -0
- package/skill/assets/styles/neon-terminal/sample/section.ts +96 -0
- package/skill/assets/styles/neon-terminal/sample/stat.ts +123 -0
- package/skill/assets/styles/neon-terminal/sample/title.ts +122 -0
- package/skill/assets/styles/neon-terminal/sample/ui-showcase.ts +127 -0
- package/skill/assets/styles/neon-terminal/tokens.css +39 -0
- package/skill/assets/styles/risograph/STYLE.md +110 -0
- package/skill/assets/styles/risograph/brand.md +26 -0
- package/skill/assets/styles/risograph/reference/animations.jsx +673 -0
- package/skill/assets/styles/risograph/reference/scenes.html +403 -0
- package/skill/assets/styles/risograph/sample/bullet.ts +124 -0
- package/skill/assets/styles/risograph/sample/content.ts +135 -0
- package/skill/assets/styles/risograph/sample/cta.ts +149 -0
- package/skill/assets/styles/risograph/sample/feature.ts +152 -0
- package/skill/assets/styles/risograph/sample/grid.ts +123 -0
- package/skill/assets/styles/risograph/sample/kinetic.ts +125 -0
- package/skill/assets/styles/risograph/sample/section.ts +130 -0
- package/skill/assets/styles/risograph/sample/stat.ts +145 -0
- package/skill/assets/styles/risograph/sample/title.ts +132 -0
- package/skill/assets/styles/risograph/sample/ui-showcase.ts +147 -0
- package/skill/assets/styles/risograph/tokens.css +39 -0
- package/skill/assets/styles/swiss-console/STYLE.md +107 -0
- package/skill/assets/styles/swiss-console/brand.md +37 -0
- package/skill/assets/styles/swiss-console/reference/animations.jsx +673 -0
- package/skill/assets/styles/swiss-console/reference/scenes.html +420 -0
- package/skill/assets/styles/swiss-console/sample/bullet.ts +122 -0
- package/skill/assets/styles/swiss-console/sample/content.ts +137 -0
- package/skill/assets/styles/swiss-console/sample/cta.ts +109 -0
- package/skill/assets/styles/swiss-console/sample/feature.ts +163 -0
- package/skill/assets/styles/swiss-console/sample/grid.ts +145 -0
- package/skill/assets/styles/swiss-console/sample/kinetic.ts +117 -0
- package/skill/assets/styles/swiss-console/sample/section.ts +127 -0
- package/skill/assets/styles/swiss-console/sample/stat.ts +148 -0
- package/skill/assets/styles/swiss-console/sample/title.ts +148 -0
- package/skill/assets/styles/swiss-console/sample/ui-showcase.ts +198 -0
- package/skill/assets/styles/swiss-console/tokens.css +39 -0
- package/skill/install/INSTALL.md +400 -0
- package/skill/references/audio/audio_plan.md +199 -0
- package/skill/references/audio/build.md +208 -0
- package/skill/references/audio/cue_template.md +219 -0
- package/skill/references/audio/ffmpeg_cookbook.md +267 -0
- package/skill/references/audio/music/music.md +171 -0
- package/skill/references/audio/music/providers/elevenlabs.md +170 -0
- package/skill/references/audio/music/providers/manual.md +140 -0
- package/skill/references/audio/music/providers/openverse.md +265 -0
- package/skill/references/audio/sfx/providers/elevenlabs.md +152 -0
- package/skill/references/audio/sfx/providers/manual.md +117 -0
- package/skill/references/audio/sfx/providers/openverse.md +243 -0
- package/skill/references/audio/sfx/sfx.md +149 -0
- package/skill/references/audio/styles.md +102 -0
- package/skill/references/audio/sync.md +237 -0
- package/skill/references/audio/voiceover/animation_sync.md +142 -0
- package/skill/references/audio/voiceover/provider_script.md +153 -0
- package/skill/references/audio/voiceover/providers/elevenlabs.md +288 -0
- package/skill/references/audio/voiceover/providers/manual.md +100 -0
- package/skill/references/audio/voiceover/script_writing.md +100 -0
- package/skill/references/audio/voiceover/style_intake.md +56 -0
- package/skill/references/audio/voiceover/sync_algorithm.md +167 -0
- package/skill/references/audio/voiceover.md +296 -0
- package/skill/references/audio.md +135 -0
- package/skill/references/authoring_segment.md +446 -0
- package/skill/references/create_or_edit_video.md +232 -0
- package/skill/references/dev_server.md +157 -0
- package/skill/references/export.md +145 -0
- package/skill/references/new_video.md +117 -0
- package/skill/references/project_structure.md +144 -0
- package/skill/references/setup.md +109 -0
- package/skill/references/setup_new_style.md +158 -0
- package/skill/references/styles.md +154 -0
- package/skill/references/testing.md +115 -0
- package/skill/references/types.md +240 -0
- package/src/cli/entry/components/copy_button.ts +42 -0
- package/src/cli/entry/components/download_modal.ts +204 -0
- package/src/cli/entry/components/empty_state.ts +55 -0
- package/src/cli/entry/components/hide_hud_tab.ts +37 -0
- package/src/cli/entry/components/icons.ts +31 -0
- package/src/cli/entry/components/top_bar.ts +69 -0
- package/src/cli/entry/components/video_card.ts +57 -0
- package/src/cli/entry/dev_frame.ts +189 -0
- package/src/cli/entry/entry_index.ts +16 -0
- package/src/cli/entry/entry_video.ts +24 -0
- package/src/cli/entry/index.html +12 -0
- package/src/cli/entry/parse_slug.ts +14 -0
- package/src/cli/entry/render.html +17 -0
- package/src/cli/entry/render_entry.ts +121 -0
- package/src/cli/entry/styles/base.css +45 -0
- package/src/cli/entry/styles/components.css +605 -0
- package/src/cli/entry/styles/tokens.css +44 -0
- package/src/cli/entry/video.html +22 -0
- package/src/cli/entry/views/homepage.ts +66 -0
- package/src/cli/entry/views/video_view.ts +286 -0
- 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 · 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.
|