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,128 @@
|
|
|
1
|
+
import { defineSegment } from "videowright";
|
|
2
|
+
|
|
3
|
+
let host: HTMLElement | null = null;
|
|
4
|
+
|
|
5
|
+
export default defineSegment({
|
|
6
|
+
id: "editorial-mono-sample-stat",
|
|
7
|
+
advances: [2.5, 5.0],
|
|
8
|
+
voiceover:
|
|
9
|
+
"Stat cards in Editorial Mono. A large serif number counts up, then a red underline draws beneath it.",
|
|
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
|
+
display: grid;
|
|
20
|
+
grid-template-columns: 1fr 1fr;
|
|
21
|
+
align-items: center;
|
|
22
|
+
padding: 0 var(--safe-x);
|
|
23
|
+
gap: 80px;
|
|
24
|
+
box-sizing: border-box;
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
">
|
|
27
|
+
<div>
|
|
28
|
+
<div data-ref="label" style="
|
|
29
|
+
font-family: var(--font-mono);
|
|
30
|
+
font-size: 14px;
|
|
31
|
+
letter-spacing: 0.16em;
|
|
32
|
+
text-transform: uppercase;
|
|
33
|
+
color: var(--color-muted);
|
|
34
|
+
margin-bottom: 48px;
|
|
35
|
+
opacity: 0;
|
|
36
|
+
">Finding / 03</div>
|
|
37
|
+
|
|
38
|
+
<div style="position: relative; display: inline-block;">
|
|
39
|
+
<div data-ref="number" style="
|
|
40
|
+
font-family: var(--font-display);
|
|
41
|
+
font-size: 320px;
|
|
42
|
+
line-height: 0.9;
|
|
43
|
+
"><span data-ref="digits">0</span><span style="color: var(--color-accent);">%</span></div>
|
|
44
|
+
|
|
45
|
+
<div data-ref="underline" style="
|
|
46
|
+
position: absolute;
|
|
47
|
+
left: 0;
|
|
48
|
+
bottom: -16px;
|
|
49
|
+
height: 6px;
|
|
50
|
+
width: 0;
|
|
51
|
+
background: var(--color-accent);
|
|
52
|
+
"></div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<div data-ref="description" style="opacity: 0;">
|
|
57
|
+
<div style="
|
|
58
|
+
font-family: var(--font-body);
|
|
59
|
+
font-size: 40px;
|
|
60
|
+
line-height: 1.3;
|
|
61
|
+
font-weight: 400;
|
|
62
|
+
max-width: 640px;
|
|
63
|
+
">of agent failures occur <em style="font-family: var(--font-display); font-style: italic;">after</em> the fourth tool call.</div>
|
|
64
|
+
|
|
65
|
+
<div style="
|
|
66
|
+
font-family: var(--font-mono);
|
|
67
|
+
font-size: 14px;
|
|
68
|
+
letter-spacing: 0.16em;
|
|
69
|
+
text-transform: uppercase;
|
|
70
|
+
color: var(--color-muted);
|
|
71
|
+
margin-top: 32px;
|
|
72
|
+
">Source / Internal Logs, Q1 2026</div>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
`;
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
async play(ctx) {
|
|
79
|
+
const label = host?.querySelector('[data-ref="label"]') as HTMLElement;
|
|
80
|
+
const digits = host?.querySelector('[data-ref="digits"]') as HTMLElement;
|
|
81
|
+
const description = host?.querySelector('[data-ref="description"]') as HTMLElement;
|
|
82
|
+
const underline = host?.querySelector('[data-ref="underline"]') as HTMLElement;
|
|
83
|
+
|
|
84
|
+
const ease = "cubic-bezier(0.16, 1, 0.3, 1)";
|
|
85
|
+
const opts = { fill: "forwards" as const, easing: ease };
|
|
86
|
+
|
|
87
|
+
label.animate([{ opacity: 0 }, { opacity: 1 }], { ...opts, duration: 480 });
|
|
88
|
+
|
|
89
|
+
// Count up from 0 to 84 over --duration-slow (900ms) using stepped holds.
|
|
90
|
+
// This is the documented exception to "avoid hold-driven mutation loops":
|
|
91
|
+
// counter/ticker animations are discrete text changes that cannot use WAAPI,
|
|
92
|
+
// so a ctx.hold loop with DOM text updates is the correct pattern here.
|
|
93
|
+
// See architecture.md §4.6 and authoring_segment.md render-safety checklist.
|
|
94
|
+
const target = 84;
|
|
95
|
+
const steps = 30;
|
|
96
|
+
const stepDuration = 900 / steps;
|
|
97
|
+
await ctx.hold(200);
|
|
98
|
+
for (let i = 1; i <= steps; i++) {
|
|
99
|
+
const progress = i / steps;
|
|
100
|
+
// easeOutQuart curve for the count-up
|
|
101
|
+
const eased = 1 - (1 - progress) ** 4;
|
|
102
|
+
digits.textContent = String(Math.round(eased * target));
|
|
103
|
+
await ctx.hold(stepDuration);
|
|
104
|
+
}
|
|
105
|
+
digits.textContent = String(target);
|
|
106
|
+
|
|
107
|
+
description.animate(
|
|
108
|
+
[
|
|
109
|
+
{ opacity: 0, transform: "translateY(20px)" },
|
|
110
|
+
{ opacity: 1, transform: "translateY(0)" },
|
|
111
|
+
],
|
|
112
|
+
{ ...opts, duration: 480 },
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
underline.animate([{ width: "0%" }, { width: "80%" }], {
|
|
116
|
+
duration: 900,
|
|
117
|
+
delay: 200,
|
|
118
|
+
fill: "forwards",
|
|
119
|
+
easing: ease,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
await ctx.waitForNext();
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
unmount() {
|
|
126
|
+
host = null;
|
|
127
|
+
},
|
|
128
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { defineSegment } from "videowright";
|
|
2
|
+
|
|
3
|
+
let host: HTMLElement | null = null;
|
|
4
|
+
|
|
5
|
+
export default defineSegment({
|
|
6
|
+
id: "editorial-mono-sample-title",
|
|
7
|
+
advances: [2.0, 5.0],
|
|
8
|
+
voiceover:
|
|
9
|
+
"The Editorial Mono title card. Cream paper, serif display, a red period that lands at the end.",
|
|
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;
|
|
24
|
+
left: var(--safe-x);
|
|
25
|
+
top: var(--safe-y);
|
|
26
|
+
right: var(--safe-x);
|
|
27
|
+
height: 1px;
|
|
28
|
+
background: var(--color-border);
|
|
29
|
+
"></div>
|
|
30
|
+
|
|
31
|
+
<div style="position: absolute; left: var(--safe-x); top: 240px;">
|
|
32
|
+
<div data-ref="label" style="
|
|
33
|
+
font-family: var(--font-mono);
|
|
34
|
+
font-size: 14px;
|
|
35
|
+
letter-spacing: 0.16em;
|
|
36
|
+
text-transform: uppercase;
|
|
37
|
+
color: var(--color-muted);
|
|
38
|
+
margin-bottom: 48px;
|
|
39
|
+
opacity: 0;
|
|
40
|
+
">Vol. 01 / 2026</div>
|
|
41
|
+
|
|
42
|
+
<div data-ref="headline" style="
|
|
43
|
+
font-family: var(--font-display);
|
|
44
|
+
font-size: 200px;
|
|
45
|
+
line-height: 0.98;
|
|
46
|
+
letter-spacing: -0.01em;
|
|
47
|
+
opacity: 0;
|
|
48
|
+
">Sample<span style="color: var(--color-accent); font-style: italic;">.</span></div>
|
|
49
|
+
|
|
50
|
+
<div data-ref="subtitle" style="
|
|
51
|
+
font-family: var(--font-display);
|
|
52
|
+
font-style: italic;
|
|
53
|
+
font-size: 40px;
|
|
54
|
+
margin-top: 56px;
|
|
55
|
+
opacity: 0;
|
|
56
|
+
">A demonstration of the editorial register.</div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
`;
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
async play(ctx) {
|
|
63
|
+
const label = host?.querySelector('[data-ref="label"]') as HTMLElement;
|
|
64
|
+
const headline = host?.querySelector('[data-ref="headline"]') as HTMLElement;
|
|
65
|
+
const subtitle = host?.querySelector('[data-ref="subtitle"]') as HTMLElement;
|
|
66
|
+
|
|
67
|
+
const ease = "cubic-bezier(0.16, 1, 0.3, 1)";
|
|
68
|
+
|
|
69
|
+
label.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
70
|
+
duration: 480,
|
|
71
|
+
fill: "forwards",
|
|
72
|
+
easing: ease,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
headline.animate(
|
|
76
|
+
[
|
|
77
|
+
{ opacity: 0, transform: "translateY(16px)" },
|
|
78
|
+
{ opacity: 1, transform: "translateY(0)" },
|
|
79
|
+
],
|
|
80
|
+
{ duration: 480, delay: 480, fill: "forwards", easing: ease },
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
subtitle.animate(
|
|
84
|
+
[
|
|
85
|
+
{ opacity: 0, transform: "translateY(16px)" },
|
|
86
|
+
{ opacity: 1, transform: "translateY(0)" },
|
|
87
|
+
],
|
|
88
|
+
{ duration: 480, delay: 560, fill: "forwards", easing: ease },
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
await ctx.waitForNext();
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
unmount() {
|
|
95
|
+
host = null;
|
|
96
|
+
},
|
|
97
|
+
});
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { defineSegment } from "videowright";
|
|
2
|
+
|
|
3
|
+
let host: HTMLElement | null = null;
|
|
4
|
+
|
|
5
|
+
export default defineSegment({
|
|
6
|
+
id: "editorial-mono-sample-ui-showcase",
|
|
7
|
+
advances: [2.5, 5.0],
|
|
8
|
+
voiceover:
|
|
9
|
+
"UI showcases in Editorial Mono. A product mock framed in hairline rules with red callout arrows.",
|
|
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
|
+
overflow: hidden;
|
|
20
|
+
">
|
|
21
|
+
<div data-ref="label" style="
|
|
22
|
+
position: absolute;
|
|
23
|
+
left: var(--safe-x);
|
|
24
|
+
top: 110px;
|
|
25
|
+
font-family: var(--font-mono);
|
|
26
|
+
font-size: 14px;
|
|
27
|
+
letter-spacing: 0.16em;
|
|
28
|
+
text-transform: uppercase;
|
|
29
|
+
color: var(--color-muted);
|
|
30
|
+
opacity: 0;
|
|
31
|
+
">Plate II / The Console</div>
|
|
32
|
+
|
|
33
|
+
<div data-ref="mock" style="
|
|
34
|
+
position: absolute;
|
|
35
|
+
left: 360px;
|
|
36
|
+
top: 200px;
|
|
37
|
+
width: 1200px;
|
|
38
|
+
height: 680px;
|
|
39
|
+
background: var(--color-surface);
|
|
40
|
+
border: var(--rule-weight) solid var(--color-fg);
|
|
41
|
+
opacity: 0;
|
|
42
|
+
">
|
|
43
|
+
<div style="
|
|
44
|
+
height: 48px;
|
|
45
|
+
border-bottom: var(--rule-weight) solid var(--color-fg);
|
|
46
|
+
display: flex;
|
|
47
|
+
align-items: center;
|
|
48
|
+
padding: 0 20px;
|
|
49
|
+
gap: 10px;
|
|
50
|
+
">
|
|
51
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; border: 1px solid var(--color-fg);"></span>
|
|
52
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; border: 1px solid var(--color-fg);"></span>
|
|
53
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; border: 1px solid var(--color-fg);"></span>
|
|
54
|
+
<span style="font-family: var(--font-mono); font-size: 13px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--color-muted); margin-left: 16px;">SESSION 41ac</span>
|
|
55
|
+
</div>
|
|
56
|
+
<div style="padding: 32px; display: grid; grid-template-columns: 240px 1fr; gap: 32px; height: calc(100% - 48px); box-sizing: border-box;">
|
|
57
|
+
<div style="border-right: var(--rule-weight) solid var(--color-border); padding-right: 24px; display: flex; flex-direction: column; gap: 14px;">
|
|
58
|
+
<div style="font-family: var(--font-body); font-size: 18px; color: var(--color-muted);">Run</div>
|
|
59
|
+
<div style="font-family: var(--font-body); font-size: 18px; color: var(--color-muted);">Memory</div>
|
|
60
|
+
<div style="font-family: var(--font-body); font-size: 18px; color: var(--color-fg); font-weight: 500;">Plan</div>
|
|
61
|
+
<div style="font-family: var(--font-body); font-size: 18px; color: var(--color-muted);">Tools</div>
|
|
62
|
+
<div style="font-family: var(--font-body); font-size: 18px; color: var(--color-muted);">Trace</div>
|
|
63
|
+
</div>
|
|
64
|
+
<div style="display: flex; flex-direction: column; gap: 18px;">
|
|
65
|
+
<div style="font-family: var(--font-display); font-size: 36px;">Plan / v3</div>
|
|
66
|
+
<div style="display: flex; gap: 16px; align-items: baseline;">
|
|
67
|
+
<span style="font-family: var(--font-mono); font-size: 13px; color: var(--color-muted); min-width: 32px;">01</span>
|
|
68
|
+
<span style="font-family: var(--font-body); font-size: 20px;">Read the eval spec</span>
|
|
69
|
+
</div>
|
|
70
|
+
<div style="display: flex; gap: 16px; align-items: baseline;">
|
|
71
|
+
<span style="font-family: var(--font-mono); font-size: 13px; color: var(--color-muted); min-width: 32px;">02</span>
|
|
72
|
+
<span style="font-family: var(--font-body); font-size: 20px;">Generate candidate prompts</span>
|
|
73
|
+
</div>
|
|
74
|
+
<div style="display: flex; gap: 16px; align-items: baseline;">
|
|
75
|
+
<span style="font-family: var(--font-mono); font-size: 13px; color: var(--color-muted); min-width: 32px;">03</span>
|
|
76
|
+
<span style="font-family: var(--font-body); font-size: 20px;">Score against the rubric</span>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<div data-ref="callout-a" style="
|
|
83
|
+
position: absolute;
|
|
84
|
+
left: 80px;
|
|
85
|
+
top: 360px;
|
|
86
|
+
width: 280px;
|
|
87
|
+
opacity: 0;
|
|
88
|
+
">
|
|
89
|
+
<div style="font-family: var(--font-mono); font-size: 14px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--color-accent);">A / Sidebar</div>
|
|
90
|
+
<div style="font-family: var(--font-body); font-size: 20px; margin-top: 8px; line-height: 1.35;">Five views of the same run.</div>
|
|
91
|
+
<div data-ref="arrow-a" style="height: 1px; width: 0; background: var(--color-accent); margin-top: 14px;"></div>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<div data-ref="callout-b" style="
|
|
95
|
+
position: absolute;
|
|
96
|
+
right: var(--safe-x);
|
|
97
|
+
top: 540px;
|
|
98
|
+
width: 260px;
|
|
99
|
+
text-align: right;
|
|
100
|
+
opacity: 0;
|
|
101
|
+
">
|
|
102
|
+
<div style="font-family: var(--font-mono); font-size: 14px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--color-accent);">B / Plan</div>
|
|
103
|
+
<div style="font-family: var(--font-body); font-size: 20px; margin-top: 8px; line-height: 1.35;">Versioned, diff-able, replayable.</div>
|
|
104
|
+
<div data-ref="arrow-b" style="height: 1px; width: 0; background: var(--color-accent); margin-top: 14px; margin-left: auto;"></div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
`;
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
async play(ctx) {
|
|
111
|
+
const label = host?.querySelector('[data-ref="label"]') as HTMLElement;
|
|
112
|
+
const mock = host?.querySelector('[data-ref="mock"]') as HTMLElement;
|
|
113
|
+
const calloutA = host?.querySelector('[data-ref="callout-a"]') as HTMLElement;
|
|
114
|
+
const calloutB = host?.querySelector('[data-ref="callout-b"]') as HTMLElement;
|
|
115
|
+
const arrowA = host?.querySelector('[data-ref="arrow-a"]') as HTMLElement;
|
|
116
|
+
const arrowB = host?.querySelector('[data-ref="arrow-b"]') as HTMLElement;
|
|
117
|
+
|
|
118
|
+
const ease = "cubic-bezier(0.16, 1, 0.3, 1)";
|
|
119
|
+
const opts = { fill: "forwards" as const, easing: ease };
|
|
120
|
+
|
|
121
|
+
label.animate([{ opacity: 0 }, { opacity: 1 }], { ...opts, duration: 480 });
|
|
122
|
+
|
|
123
|
+
mock.animate(
|
|
124
|
+
[
|
|
125
|
+
{ opacity: 0, transform: "translateY(16px)" },
|
|
126
|
+
{ opacity: 1, transform: "translateY(0)" },
|
|
127
|
+
],
|
|
128
|
+
{ ...opts, duration: 480, delay: 200 },
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
calloutA.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
132
|
+
...opts,
|
|
133
|
+
duration: 480,
|
|
134
|
+
delay: 1000,
|
|
135
|
+
});
|
|
136
|
+
arrowA.animate([{ width: "0px" }, { width: "200px" }], {
|
|
137
|
+
...opts,
|
|
138
|
+
duration: 480,
|
|
139
|
+
delay: 1000,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
calloutB.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
143
|
+
...opts,
|
|
144
|
+
duration: 480,
|
|
145
|
+
delay: 1400,
|
|
146
|
+
});
|
|
147
|
+
arrowB.animate([{ width: "0px" }, { width: "200px" }], {
|
|
148
|
+
...opts,
|
|
149
|
+
duration: 480,
|
|
150
|
+
delay: 1400,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
await ctx.waitForNext();
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
unmount() {
|
|
157
|
+
host = null;
|
|
158
|
+
},
|
|
159
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* Editorial Mono — design tokens
|
|
2
|
+
* Black ink on cream paper. One red accent. Long-form editorial feel.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
:root {
|
|
6
|
+
/* Core palette */
|
|
7
|
+
--color-bg: #f2efe8; /* warm cream paper */
|
|
8
|
+
--color-fg: #14110e; /* near-black ink */
|
|
9
|
+
--color-accent: #c8392c; /* editorial red */
|
|
10
|
+
|
|
11
|
+
/* Extended palette */
|
|
12
|
+
--color-muted: #7b756b; /* warm gray for secondary type */
|
|
13
|
+
--color-border: #d9d3c7; /* hairline rule, very subtle */
|
|
14
|
+
--color-surface: #ebe7dd; /* slightly darker paper for cards */
|
|
15
|
+
|
|
16
|
+
/* Typography */
|
|
17
|
+
--font-display: "Instrument Serif", "Times New Roman", serif;
|
|
18
|
+
--font-body: "Geist", "Helvetica Neue", system-ui, sans-serif;
|
|
19
|
+
--font-mono: "JetBrains Mono", ui-monospace, monospace;
|
|
20
|
+
|
|
21
|
+
/* Spacing (px on 1920×1080 canvas) */
|
|
22
|
+
--space-sm: 16px;
|
|
23
|
+
--space-md: 32px;
|
|
24
|
+
--space-lg: 64px;
|
|
25
|
+
--space-xl: 128px;
|
|
26
|
+
|
|
27
|
+
/* Motion */
|
|
28
|
+
--duration-fast: 220ms;
|
|
29
|
+
--duration-normal: 480ms;
|
|
30
|
+
--duration-slow: 900ms;
|
|
31
|
+
|
|
32
|
+
/* Template-specific extensions */
|
|
33
|
+
--radius-sm: 2px; /* almost no rounding — print sensibility */
|
|
34
|
+
--radius-md: 4px;
|
|
35
|
+
--stagger: 80ms; /* base stagger increment */
|
|
36
|
+
--ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* easeOutQuart */
|
|
37
|
+
--ease-in: cubic-bezier(0.7, 0, 0.84, 0);
|
|
38
|
+
--rule-weight: 1px; /* hairline rule */
|
|
39
|
+
--scene-hold: 4s; /* default per-scene duration */
|
|
40
|
+
|
|
41
|
+
/* Safe area for 1920×1080 */
|
|
42
|
+
--safe-x: 128px;
|
|
43
|
+
--safe-y: 96px;
|
|
44
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Iso Diagram
|
|
3
|
+
slug: iso-diagram
|
|
4
|
+
picker_description: 'Pencil-and-paper explainer aesthetic. Hand-drawn lines, pastel fills, isometric drawings.'
|
|
5
|
+
font_sources:
|
|
6
|
+
- https://fonts.googleapis.com/css2?family=Caveat:wght@400;500;700&display=swap
|
|
7
|
+
- https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap
|
|
8
|
+
- https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&display=swap
|
|
9
|
+
mood: [explanatory, warm, thoughtful, hand-built, approachable]
|
|
10
|
+
good_for:
|
|
11
|
+
- Concept explainers and educational content
|
|
12
|
+
- Onboarding videos
|
|
13
|
+
- Technical ideas that benefit from a picture
|
|
14
|
+
- Products with abstract value props that need to be visualized
|
|
15
|
+
bad_for:
|
|
16
|
+
- Hard product launches with specific UI
|
|
17
|
+
- Lifestyle / brand-led launches
|
|
18
|
+
- Anything that needs to feel enterprise-serious
|
|
19
|
+
tags: [illustration, isometric, explainer, pastel, warm, hand-drawn]
|
|
20
|
+
references: [Excalidraw, "Maggie Appleton's notes", "Stripe's old illustrations", Explorable Explanations]
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Iso Diagram — STYLE.md
|
|
24
|
+
|
|
25
|
+
## Identity
|
|
26
|
+
|
|
27
|
+
Paper background, graphite line, pastel fills. The aesthetic of a brilliant whiteboard explanation — hand-feeling but precise. Things *draw themselves on*. Fills flood in. Labels arrive on curly leader lines.
|
|
28
|
+
|
|
29
|
+
This is the *explainer* template. It's designed for scripts that *teach a concept* rather than *announce a product*.
|
|
30
|
+
|
|
31
|
+
**Mood:** explanatory, warm, thoughtful, hand-built, approachable.
|
|
32
|
+
|
|
33
|
+
## When to use
|
|
34
|
+
|
|
35
|
+
- Concept explainers and educational content
|
|
36
|
+
- Onboarding videos
|
|
37
|
+
- Technical ideas that benefit from a picture
|
|
38
|
+
- Products with abstract value props that need to be visualized
|
|
39
|
+
|
|
40
|
+
## When to avoid
|
|
41
|
+
|
|
42
|
+
- Hard product launches with specific UI to showcase
|
|
43
|
+
- Brand/lifestyle reels
|
|
44
|
+
- Anything that needs to feel enterprise-serious or premium-luxury
|
|
45
|
+
|
|
46
|
+
## Layout principles
|
|
47
|
+
|
|
48
|
+
- **Paper canvas.** Slight off-white. Optional very faint dot-grid (5% opacity, 32px).
|
|
49
|
+
- **Isometric drawings.** 30° projection. Boxes, columns, planes. Stack 3D objects with clear faces.
|
|
50
|
+
- **Labels float, leader lines connect.** Curly hand-drawn leader lines (a slight curve, not straight). Each label has an underline.
|
|
51
|
+
- **Hand-written display, set sans body.** Display in **Caveat** (handwritten), body in **Nunito** (rounded sans).
|
|
52
|
+
- **Generous margins.** Drawings need air around them.
|
|
53
|
+
|
|
54
|
+
## Color application
|
|
55
|
+
|
|
56
|
+
- Paper bg, graphite fg.
|
|
57
|
+
- One accent color per scene (pencil blue is default).
|
|
58
|
+
- Pastel fills (`--fill-*`) inside iso shapes. Different objects use different fills — but only 2–3 colors per scene.
|
|
59
|
+
- No hard saturated colors. Everything is soft.
|
|
60
|
+
|
|
61
|
+
## Type rules
|
|
62
|
+
|
|
63
|
+
- **Display: Caveat** (handwritten). For titles, headlines, kinetic words, labels on diagrams. Sizes 56–220.
|
|
64
|
+
- **Body: Nunito.** Regular (400) and SemiBold (600). 22–34px.
|
|
65
|
+
- **Mono: JetBrains Mono.** Sparingly, for measurements/coordinates only — this style isn't mono-heavy.
|
|
66
|
+
- Title-case headlines. Sentence-case body. Underline key words with a hand-drawn pen line.
|
|
67
|
+
|
|
68
|
+
## Motion principles
|
|
69
|
+
|
|
70
|
+
- **Strokes draw on.** SVG `stroke-dashoffset` animation. ~400–600ms per stroke.
|
|
71
|
+
- **Fills flood in after strokes.** A soft fill arrives 150ms after its outline closes.
|
|
72
|
+
- **Labels swing in.** Slight rotate + fade. ~250ms with soft overshoot ease.
|
|
73
|
+
- **Numbers count up.** Tickers like Motion Engineering, but with a gentler curve.
|
|
74
|
+
- **Scene transitions:** the next drawing "erases" the current one — a soft white-paper wipe.
|
|
75
|
+
- **Ambient layer:** a thin pencil "doodle" cursor occasionally appears in margins making a stray mark.
|
|
76
|
+
- **Forbidden:** smooth gradients, glow, blur, hard cuts, mono motion (this isn't a terminal).
|
|
77
|
+
|
|
78
|
+
## Pacing
|
|
79
|
+
|
|
80
|
+
Patient. 4.0–4.5s per scene. The drawing itself is the content; let it finish before the label lands.
|
|
81
|
+
|
|
82
|
+
## Per-scene recipes
|
|
83
|
+
|
|
84
|
+
| Scene | Recipe |
|
|
85
|
+
|---|---|
|
|
86
|
+
| **Title** | Hand-written title draws stroke-by-stroke. Underline scribble below. Small iso icon (cube, paper stack) in corner. |
|
|
87
|
+
| **Section** | Big handwritten chapter number "02" with the section title written below. A curly underline draws on. |
|
|
88
|
+
| **Kinetic** | Sentence written word-by-word in handwriting. Key word boxed with a hand-drawn ellipse (irregular oval) in accent color. |
|
|
89
|
+
| **Bullet** | Each item has a hand-drawn checkbox/dot-pip on the left. Underline scribbles under each. |
|
|
90
|
+
| **Stat** | Big handwritten number with concentric hand-drawn circles around it. Arrow leader to a caption. |
|
|
91
|
+
| **Feature** | Left: an isometric drawing of the concept (e.g. stacked memory blocks). Right: handwritten feature name + sans body description. |
|
|
92
|
+
| **Grid** | 3 isometric mini-diagrams in a row, each with a hand-drawn box around it. Labels under. |
|
|
93
|
+
| **UI showcase** | Isometric "exploded view" of the product — the app surface lifted off a base, with floating layered components. Curly leader-line callouts. |
|
|
94
|
+
| **Content** | A short paragraph in body sans with one phrase circled/underlined; an arrow points from it to a small inline drawing. |
|
|
95
|
+
| **CTA** | Handwritten CTA inside a hand-drawn rectangle that "draws itself." Small iso icon below. |
|
|
96
|
+
|
|
97
|
+
### Connective elements
|
|
98
|
+
|
|
99
|
+
- **Lower third:** small notebook-margin annotation — `~ scene 4 ~` in handwriting
|
|
100
|
+
- **Scene transition:** paper wipe / "erase" effect
|
|
101
|
+
- **Ambient:** occasional pencil scribble in margin, faint dot grid breathing
|
|
102
|
+
|
|
103
|
+
## Pitfalls
|
|
104
|
+
|
|
105
|
+
- **Don't make the iso drawings actually 3D-rendered.** They must look hand-built — line drawings filled with flat pastel.
|
|
106
|
+
- **Don't use more than 2-3 pastel colors in one scene.** Otherwise it becomes a children's book.
|
|
107
|
+
- **Don't keep leader lines straight.** They should curve gently.
|
|
108
|
+
- **Don't go cute.** Restraint is what separates this from clipart.
|
|
109
|
+
- **No emoji.** Hand-drawn glyphs only.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Iso Diagram — Brand
|
|
2
|
+
|
|
3
|
+
## Color
|
|
4
|
+
|
|
5
|
+
**`--color-bg` `#FAF7F2`** — warm paper. Slight cream, not pure white. Reads as "notebook page."
|
|
6
|
+
|
|
7
|
+
**`--color-fg` `#2A2620`** — soft graphite. Not black; warmer and softer.
|
|
8
|
+
|
|
9
|
+
**`--color-accent` `#1F6FB3`** — pencil blue. The default accent — the color of a Pilot G2.
|
|
10
|
+
|
|
11
|
+
**Pastel fills:**
|
|
12
|
+
- `--fill-blue` `#C8DEEF` — sky
|
|
13
|
+
- `--fill-pink` `#F4CFCB` — coral
|
|
14
|
+
- `--fill-yellow` `#F5E4A8` — paper-yellow
|
|
15
|
+
- `--fill-green` `#C9DEC6` — sage
|
|
16
|
+
- `--fill-lavender` `#DCD3E8` — lavender
|
|
17
|
+
|
|
18
|
+
Use 2–3 per scene. Don't mix all five at once.
|
|
19
|
+
|
|
20
|
+
## Typography
|
|
21
|
+
|
|
22
|
+
**Caveat** — Google Fonts handwriting face. Slightly irregular, readable, warm. For all display, kinetic text, and diagram labels.
|
|
23
|
+
|
|
24
|
+
**Nunito** — soft, rounded sans for body. Plays well with the handwritten display.
|
|
25
|
+
|
|
26
|
+
## Motion
|
|
27
|
+
|
|
28
|
+
The signature motion is **drawing on**: outlines extend along their path, then fills flood. Use SVG `stroke-dasharray` + `stroke-dashoffset` for the line drawing effect.
|
|
29
|
+
|
|
30
|
+
## Pencil cursor
|
|
31
|
+
|
|
32
|
+
An invisible "pencil tip" leads each stroke as it draws. Reveal-points are paced like someone is actually drawing — not too fast.
|