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,123 @@
|
|
|
1
|
+
import { defineSegment } from "videowright";
|
|
2
|
+
|
|
3
|
+
let host: HTMLElement | null = null;
|
|
4
|
+
|
|
5
|
+
export default defineSegment({
|
|
6
|
+
id: "neon-terminal-sample-stat",
|
|
7
|
+
advances: [2.5, 5.0],
|
|
8
|
+
voiceover:
|
|
9
|
+
"Stat cards in Neon Terminal. A big number counts up digit by digit with a phosphor glow, caption below in muted.",
|
|
10
|
+
|
|
11
|
+
mount(el) {
|
|
12
|
+
host = el;
|
|
13
|
+
el.innerHTML = `
|
|
14
|
+
<div style="
|
|
15
|
+
position: relative;
|
|
16
|
+
height: 100%;
|
|
17
|
+
background: var(--color-bg);
|
|
18
|
+
color: var(--color-fg);
|
|
19
|
+
font-family: var(--font-mono);
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
">
|
|
22
|
+
<div style="
|
|
23
|
+
position: absolute; inset: 0; pointer-events: none;
|
|
24
|
+
background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(74, 222, 128, 0.04) 3px 4px);
|
|
25
|
+
"></div>
|
|
26
|
+
|
|
27
|
+
<div style="
|
|
28
|
+
position: absolute;
|
|
29
|
+
inset: var(--safe-y) var(--safe-x);
|
|
30
|
+
border: 1px solid var(--color-border);
|
|
31
|
+
background: rgba(10,14,11,0.6);
|
|
32
|
+
">
|
|
33
|
+
<div style="
|
|
34
|
+
display: flex; align-items: center;
|
|
35
|
+
padding: 14px 20px;
|
|
36
|
+
border-bottom: 1px solid var(--color-border);
|
|
37
|
+
gap: 12px; font-size: 14px; color: var(--color-muted);
|
|
38
|
+
">
|
|
39
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
40
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
41
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
42
|
+
<span style="margin-left: 16px;">beacon@console:~$ metrics --id=03</span>
|
|
43
|
+
<span style="margin-left: auto; color: var(--color-accent); text-shadow: var(--glow);">[ Q1 2026 ]</span>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div style="padding: 48px 56px; overflow: hidden;">
|
|
47
|
+
<div data-ref="prompt" style="font-size: 22px; color: var(--color-muted); opacity: 0;">
|
|
48
|
+
$ metrics.failure_rate(step > 4)
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<div data-ref="number" style="
|
|
52
|
+
font-size: 320px; font-weight: 500; line-height: 0.95;
|
|
53
|
+
margin-top: 48px;
|
|
54
|
+
color: var(--color-accent); text-shadow: var(--glow);
|
|
55
|
+
opacity: 0;
|
|
56
|
+
"><span data-ref="digits">0</span>%</div>
|
|
57
|
+
|
|
58
|
+
<div data-ref="caption" style="font-size: 26px; margin-top: 28px; max-width: 1300px; opacity: 0;">
|
|
59
|
+
<span style="color: var(--color-muted);">// </span>of agent failures occur after the 4<span style="color: var(--color-muted);">th</span> tool call.
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div data-ref="source" style="font-size: 18px; color: var(--color-muted); margin-top: 16px; opacity: 0;">
|
|
63
|
+
source: beacon.logs · n=12,840 sessions
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
`;
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
async play(ctx) {
|
|
72
|
+
const prompt = host?.querySelector('[data-ref="prompt"]') as HTMLElement;
|
|
73
|
+
const number = host?.querySelector('[data-ref="number"]') as HTMLElement;
|
|
74
|
+
const digits = host?.querySelector('[data-ref="digits"]') as HTMLElement;
|
|
75
|
+
const caption = host?.querySelector('[data-ref="caption"]') as HTMLElement;
|
|
76
|
+
const source = host?.querySelector('[data-ref="source"]') as HTMLElement;
|
|
77
|
+
|
|
78
|
+
const ease = "steps(8, end)";
|
|
79
|
+
const opts = { fill: "forwards" as const, easing: ease };
|
|
80
|
+
|
|
81
|
+
prompt.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
82
|
+
...opts,
|
|
83
|
+
duration: 250,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
number.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
87
|
+
...opts,
|
|
88
|
+
duration: 200,
|
|
89
|
+
delay: 300,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// Count up from 0 to 84 using discrete ctx.hold steps.
|
|
93
|
+
// Counter/ticker animations are discrete text changes that cannot use WAAPI.
|
|
94
|
+
const target = 84;
|
|
95
|
+
const steps = 20;
|
|
96
|
+
const stepDuration = 600 / steps;
|
|
97
|
+
await ctx.hold(350);
|
|
98
|
+
for (let i = 1; i <= steps; i++) {
|
|
99
|
+
const progress = i / steps;
|
|
100
|
+
const eased = 1 - (1 - progress) ** 3;
|
|
101
|
+
digits.textContent = String(Math.round(eased * target));
|
|
102
|
+
await ctx.hold(stepDuration);
|
|
103
|
+
}
|
|
104
|
+
digits.textContent = String(target);
|
|
105
|
+
|
|
106
|
+
caption.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
107
|
+
...opts,
|
|
108
|
+
duration: 200,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
source.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
112
|
+
...opts,
|
|
113
|
+
duration: 200,
|
|
114
|
+
delay: 160,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
await ctx.waitForNext();
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
unmount() {
|
|
121
|
+
host = null;
|
|
122
|
+
},
|
|
123
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { defineSegment } from "videowright";
|
|
2
|
+
|
|
3
|
+
let host: HTMLElement | null = null;
|
|
4
|
+
|
|
5
|
+
export default defineSegment({
|
|
6
|
+
id: "neon-terminal-sample-title",
|
|
7
|
+
advances: [2.5, 5.0],
|
|
8
|
+
voiceover:
|
|
9
|
+
"Title cards in Neon Terminal. A boot sequence types in, then an ASCII logo block and tagline appear stepped.",
|
|
10
|
+
|
|
11
|
+
mount(el) {
|
|
12
|
+
host = el;
|
|
13
|
+
el.innerHTML = `
|
|
14
|
+
<style>
|
|
15
|
+
@keyframes nt-blink { 0%,49% { opacity: 1 } 50%,100% { opacity: 0 } }
|
|
16
|
+
</style>
|
|
17
|
+
<div style="
|
|
18
|
+
position: relative;
|
|
19
|
+
height: 100%;
|
|
20
|
+
background: var(--color-bg);
|
|
21
|
+
color: var(--color-fg);
|
|
22
|
+
font-family: var(--font-mono);
|
|
23
|
+
overflow: hidden;
|
|
24
|
+
">
|
|
25
|
+
<div style="
|
|
26
|
+
position: absolute; inset: 0; pointer-events: none;
|
|
27
|
+
background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(74, 222, 128, 0.04) 3px 4px);
|
|
28
|
+
"></div>
|
|
29
|
+
|
|
30
|
+
<div style="
|
|
31
|
+
position: absolute;
|
|
32
|
+
inset: var(--safe-y) var(--safe-x);
|
|
33
|
+
border: 1px solid var(--color-border);
|
|
34
|
+
background: rgba(10,14,11,0.6);
|
|
35
|
+
">
|
|
36
|
+
<div style="
|
|
37
|
+
display: flex; align-items: center;
|
|
38
|
+
padding: 14px 20px;
|
|
39
|
+
border-bottom: 1px solid var(--color-border);
|
|
40
|
+
gap: 12px; font-size: 14px; color: var(--color-muted);
|
|
41
|
+
">
|
|
42
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
43
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
44
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
45
|
+
<span style="margin-left: 16px;">beacon@console:~$</span>
|
|
46
|
+
<span style="margin-left: auto; color: var(--color-accent); text-shadow: var(--glow);">[ booting ]</span>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<div style="padding: 48px 56px; overflow: hidden; position: relative;">
|
|
50
|
+
<div data-ref="prompt" style="font-size: 22px; color: var(--color-muted); opacity: 0;">
|
|
51
|
+
$ beacon --launch
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div data-ref="init" style="font-size: 22px; color: var(--color-muted); margin-top: 8px; opacity: 0;">
|
|
55
|
+
loaded 12 modules in 240ms
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<pre data-ref="logo" style="
|
|
59
|
+
font-size: 72px; line-height: 1.1; font-weight: 500;
|
|
60
|
+
margin: 40px 0 24px; white-space: pre;
|
|
61
|
+
color: var(--color-accent); text-shadow: var(--glow);
|
|
62
|
+
opacity: 0;
|
|
63
|
+
"> ____ ___ ___ ___ ___ _ _
|
|
64
|
+
| __ )| __| / __| / __/ _ \\| \\| |
|
|
65
|
+
| _ \\| _| | (__ | (_| (_) | . |
|
|
66
|
+
|___/|___| \\___| \\___\\___/|_|\\_|</pre>
|
|
67
|
+
|
|
68
|
+
<div data-ref="tagline" style="font-size: 28px; font-weight: 500; margin-top: 28px; opacity: 0;">
|
|
69
|
+
// long-running agents for research labs<span style="
|
|
70
|
+
display: inline-block; width: 0.6em; height: 1em;
|
|
71
|
+
background: var(--color-accent);
|
|
72
|
+
box-shadow: 0 0 12px rgba(74,222,128,0.7);
|
|
73
|
+
vertical-align: text-bottom;
|
|
74
|
+
animation: nt-blink 1s steps(2, end) infinite;
|
|
75
|
+
margin-left: 4px;
|
|
76
|
+
"></span>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
`;
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
async play(ctx) {
|
|
85
|
+
const prompt = host?.querySelector('[data-ref="prompt"]') as HTMLElement;
|
|
86
|
+
const init = host?.querySelector('[data-ref="init"]') as HTMLElement;
|
|
87
|
+
const logo = host?.querySelector('[data-ref="logo"]') as HTMLElement;
|
|
88
|
+
const tagline = host?.querySelector('[data-ref="tagline"]') as HTMLElement;
|
|
89
|
+
|
|
90
|
+
const ease = "steps(8, end)";
|
|
91
|
+
const opts = { fill: "forwards" as const, easing: ease };
|
|
92
|
+
|
|
93
|
+
prompt.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
94
|
+
...opts,
|
|
95
|
+
duration: 250,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
init.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
99
|
+
...opts,
|
|
100
|
+
duration: 250,
|
|
101
|
+
delay: 400,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
logo.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
105
|
+
...opts,
|
|
106
|
+
duration: 250,
|
|
107
|
+
delay: 800,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
tagline.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
111
|
+
...opts,
|
|
112
|
+
duration: 250,
|
|
113
|
+
delay: 1200,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
await ctx.waitForNext();
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
unmount() {
|
|
120
|
+
host = null;
|
|
121
|
+
},
|
|
122
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { defineSegment } from "videowright";
|
|
2
|
+
|
|
3
|
+
let host: HTMLElement | null = null;
|
|
4
|
+
|
|
5
|
+
export default defineSegment({
|
|
6
|
+
id: "neon-terminal-sample-ui-showcase",
|
|
7
|
+
advances: [2.5, 5.0],
|
|
8
|
+
voiceover:
|
|
9
|
+
"UI showcases in Neon Terminal. A full TUI mock with sidebar navigation, main plan pane, and memory panel on the right.",
|
|
10
|
+
|
|
11
|
+
mount(el) {
|
|
12
|
+
host = el;
|
|
13
|
+
|
|
14
|
+
const menuItems = ["run", "memory", "plan", "tools", "trace", "eval"];
|
|
15
|
+
const menuHtml = menuItems
|
|
16
|
+
.map(
|
|
17
|
+
(x, i) =>
|
|
18
|
+
`<div style="
|
|
19
|
+
padding: 6px 10px; font-size: 16px;
|
|
20
|
+
${i === 2 ? "color: var(--color-accent); text-shadow: var(--glow); background: rgba(74,222,128,0.08);" : "color: var(--color-muted);"}
|
|
21
|
+
">${i === 2 ? "▸ " : " "}${x}</div>`,
|
|
22
|
+
)
|
|
23
|
+
.join("");
|
|
24
|
+
|
|
25
|
+
const planItems = [
|
|
26
|
+
{ status: "done", text: "Read eval spec" },
|
|
27
|
+
{ status: "done", text: "Generate 12 candidate prompts" },
|
|
28
|
+
{ status: "done", text: "Score each against rubric" },
|
|
29
|
+
{ status: "··", text: "Select top-3 by F1" },
|
|
30
|
+
{ status: "··", text: "Iterate with reasoning trace" },
|
|
31
|
+
{ status: "··", text: "Submit batch to coordinator" },
|
|
32
|
+
];
|
|
33
|
+
const planHtml = planItems
|
|
34
|
+
.map(
|
|
35
|
+
(item, i) =>
|
|
36
|
+
`<div style="display: flex; gap: 14px; padding: 10px 0; border-bottom: 1px solid var(--color-border);">
|
|
37
|
+
<span style="min-width: 20px; color: var(--color-muted);">${String(i + 1).padStart(2, "0")}</span>
|
|
38
|
+
<span style="flex: 1; font-size: 16px;">${item.text}</span>
|
|
39
|
+
<span style="
|
|
40
|
+
min-width: 60px; text-align: right;
|
|
41
|
+
${item.status === "done" ? "color: var(--color-accent); text-shadow: var(--glow);" : "color: var(--amber); text-shadow: 0 0 12px rgba(245,158,11,0.45);"}
|
|
42
|
+
">[${item.status}]</span>
|
|
43
|
+
</div>`,
|
|
44
|
+
)
|
|
45
|
+
.join("");
|
|
46
|
+
|
|
47
|
+
el.innerHTML = `
|
|
48
|
+
<div style="
|
|
49
|
+
position: relative;
|
|
50
|
+
height: 100%;
|
|
51
|
+
background: var(--color-bg);
|
|
52
|
+
color: var(--color-fg);
|
|
53
|
+
font-family: var(--font-mono);
|
|
54
|
+
overflow: hidden;
|
|
55
|
+
">
|
|
56
|
+
<div style="
|
|
57
|
+
position: absolute; inset: 0; pointer-events: none;
|
|
58
|
+
background: repeating-linear-gradient(0deg, transparent 0 3px, rgba(74, 222, 128, 0.04) 3px 4px);
|
|
59
|
+
"></div>
|
|
60
|
+
|
|
61
|
+
<div style="
|
|
62
|
+
position: absolute;
|
|
63
|
+
inset: var(--safe-y) var(--safe-x);
|
|
64
|
+
border: 1px solid var(--color-border);
|
|
65
|
+
background: rgba(10,14,11,0.6);
|
|
66
|
+
">
|
|
67
|
+
<div style="
|
|
68
|
+
display: flex; align-items: center;
|
|
69
|
+
padding: 14px 20px;
|
|
70
|
+
border-bottom: 1px solid var(--color-border);
|
|
71
|
+
gap: 12px; font-size: 14px; color: var(--color-muted);
|
|
72
|
+
">
|
|
73
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
74
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
75
|
+
<span style="width: 10px; height: 10px; border-radius: 5px; background: var(--color-border);"></span>
|
|
76
|
+
<span style="margin-left: 16px;">beacon@console:~$ tui --session=41ac</span>
|
|
77
|
+
<span style="margin-left: auto; color: var(--color-accent); text-shadow: var(--glow);">[ live ]</span>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<div style="padding: 16px; overflow: hidden;">
|
|
81
|
+
<div data-ref="tui" style="
|
|
82
|
+
display: grid; grid-template-columns: 200px 1fr 240px;
|
|
83
|
+
height: 720px; border: 1px solid var(--color-border);
|
|
84
|
+
font-size: 16px; opacity: 0;
|
|
85
|
+
">
|
|
86
|
+
<div style="padding: 16px; border-right: 1px solid var(--color-border); display: flex; flex-direction: column; gap: 6px;">
|
|
87
|
+
<div style="font-size: 12px; color: var(--color-muted); margin-bottom: 8px;">── MENU ──</div>
|
|
88
|
+
${menuHtml}
|
|
89
|
+
<div style="margin-top: auto; color: var(--color-muted);">── status ──</div>
|
|
90
|
+
<div style="color: var(--color-accent); text-shadow: var(--glow); font-size: 14px;">● running 00:14:22</div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<div style="padding: 20px;">
|
|
94
|
+
<div style="font-size: 14px; color: var(--color-muted);">── PLAN · v3 ────────────────────────────</div>
|
|
95
|
+
${planHtml}
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div style="padding: 16px; border-left: 1px solid var(--color-border);">
|
|
99
|
+
<div style="font-size: 14px; color: var(--color-muted); margin-bottom: 12px;">── MEMORY ──</div>
|
|
100
|
+
<pre style="font-size: 14px; margin: 0; line-height: 1.7; color: var(--color-muted);">t=00:02 ✓ snap_001
|
|
101
|
+
t=00:05 ✓ snap_002
|
|
102
|
+
t=00:09 ✓ snap_003</pre>
|
|
103
|
+
<pre style="font-size: 14px; margin: 0; line-height: 1.7; color: var(--color-accent); text-shadow: var(--glow);">t=00:14 ● snap_004</pre>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
`;
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
async play(ctx) {
|
|
113
|
+
const tui = host?.querySelector('[data-ref="tui"]') as HTMLElement;
|
|
114
|
+
|
|
115
|
+
tui.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
116
|
+
duration: 250,
|
|
117
|
+
easing: "steps(8, end)",
|
|
118
|
+
fill: "forwards",
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
await ctx.waitForNext();
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
unmount() {
|
|
125
|
+
host = null;
|
|
126
|
+
},
|
|
127
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* Neon Terminal — design tokens
|
|
2
|
+
* Dark-mode native. Phosphor green on near-black. Mono dominant.
|
|
3
|
+
*/
|
|
4
|
+
:root {
|
|
5
|
+
--color-bg: #0a0e0b;
|
|
6
|
+
--color-fg: #d8f3d8;
|
|
7
|
+
--color-accent: #4ade80; /* phosphor green */
|
|
8
|
+
|
|
9
|
+
--color-muted: #5a6f5c;
|
|
10
|
+
--color-border: #1f2a21;
|
|
11
|
+
--color-surface: #11171210;
|
|
12
|
+
|
|
13
|
+
--font-display: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
|
|
14
|
+
--font-body: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
|
|
15
|
+
--font-mono: "JetBrains Mono", ui-monospace, monospace;
|
|
16
|
+
|
|
17
|
+
--space-sm: 12px;
|
|
18
|
+
--space-md: 24px;
|
|
19
|
+
--space-lg: 48px;
|
|
20
|
+
--space-xl: 96px;
|
|
21
|
+
|
|
22
|
+
--duration-fast: 100ms;
|
|
23
|
+
--duration-normal: 250ms;
|
|
24
|
+
--duration-slow: 600ms;
|
|
25
|
+
|
|
26
|
+
--radius-sm: 0px;
|
|
27
|
+
--radius-md: 2px;
|
|
28
|
+
--stagger: 40ms;
|
|
29
|
+
--ease-out: steps(8, end);
|
|
30
|
+
--ease-in: steps(8, end);
|
|
31
|
+
--scene-hold: 4s;
|
|
32
|
+
|
|
33
|
+
--safe-x: 96px;
|
|
34
|
+
--safe-y: 80px;
|
|
35
|
+
|
|
36
|
+
--glow: 0 0 12px rgba(74, 222, 128, 0.45);
|
|
37
|
+
--glow-soft: 0 0 24px rgba(74, 222, 128, 0.18);
|
|
38
|
+
--amber: #f59e0b;
|
|
39
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Risograph
|
|
3
|
+
slug: risograph
|
|
4
|
+
picker_description: 'Two-color screen-print on warm paper. Pink + ink-blue, visible grain, stop-motion cadence.'
|
|
5
|
+
font_sources:
|
|
6
|
+
- https://fonts.googleapis.com/css2?family=Archivo+Black&display=swap
|
|
7
|
+
- https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700&display=swap
|
|
8
|
+
- https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap
|
|
9
|
+
mood: [playful, tactile, indie, energetic, warm]
|
|
10
|
+
good_for:
|
|
11
|
+
- Creative tools, design products
|
|
12
|
+
- Indie launches with personality
|
|
13
|
+
- Brand-forward consumer products
|
|
14
|
+
- Anything that wants charm without going corny
|
|
15
|
+
bad_for:
|
|
16
|
+
- Enterprise / serious B2B
|
|
17
|
+
- Fintech, security, infra
|
|
18
|
+
- Anything technically dense
|
|
19
|
+
tags: [print, two-color, grain, indie, playful, type-led]
|
|
20
|
+
references: [It's Nice That, riso zines, modern indie design studios]
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Risograph — STYLE.md
|
|
24
|
+
|
|
25
|
+
## Identity
|
|
26
|
+
|
|
27
|
+
A two-color screen-print aesthetic on warm uncoated paper. Fluorescent pink and ink blue, with paper showing through. Visible grain. Slight color-channel misregistration on display type. Motion has a stop-motion cadence — stepped easing, 6–8 frames per move, like flipping through a riso-printed zine.
|
|
28
|
+
|
|
29
|
+
This is the *personality* template. Type-led, opinionated, alive. It's the right choice when a script wants to feel like a small studio made it on a Saturday.
|
|
30
|
+
|
|
31
|
+
**Mood:** playful, tactile, indie, energetic, warm.
|
|
32
|
+
|
|
33
|
+
## When to use
|
|
34
|
+
|
|
35
|
+
- Creative tools, design products
|
|
36
|
+
- Indie launches with personality
|
|
37
|
+
- Brand-forward consumer products
|
|
38
|
+
- "We're not corporate" launches
|
|
39
|
+
|
|
40
|
+
## When to avoid
|
|
41
|
+
|
|
42
|
+
- Enterprise / serious B2B
|
|
43
|
+
- Fintech, security, infrastructure
|
|
44
|
+
- Anything technically dense or specification-heavy
|
|
45
|
+
|
|
46
|
+
## Layout principles
|
|
47
|
+
|
|
48
|
+
- **Big type, asymmetric.** Display type is the protagonist. Lines wrap dramatically. Some lines are intentionally angled (-2° to -6°).
|
|
49
|
+
- **Type bleeds.** Display type runs into the edge of the safe area or off-canvas.
|
|
50
|
+
- **Layering.** Type on top of duotone color shapes, or two type elements overlapping with one in pink, one in blue. Don't fear overlap.
|
|
51
|
+
- **Paper grain everywhere.** A subtle noise/grain layer is permanent.
|
|
52
|
+
- **Misregistration on heavy display type only.** Pink ghost 3px offset to the right; blue layer on top. Not on body. Not on icons.
|
|
53
|
+
|
|
54
|
+
## Color application
|
|
55
|
+
|
|
56
|
+
- Cream paper bg, ink-blue fg.
|
|
57
|
+
- **Pink accent** for kinetic emphasis, key words, large shapes.
|
|
58
|
+
- **Yellow** (`--color-second`) sparingly — for a third punctuation note on at most one scene per video.
|
|
59
|
+
- Solid fills only. No gradients. No glow.
|
|
60
|
+
|
|
61
|
+
## Type rules
|
|
62
|
+
|
|
63
|
+
- **Display: Archivo Black** (heavy display sans, free, similar to Druk Wide). For everything large. Sizes 64–280.
|
|
64
|
+
- **Body: Archivo** (regular & medium). 22–34px.
|
|
65
|
+
- **Mono: JetBrains Mono.** For numbers and labels only.
|
|
66
|
+
- Lowercase headlines are fair game (alongside Title Case). Lean expressive.
|
|
67
|
+
- Misregistered display: render the text twice in absolute-positioned siblings — pink layer offset by `--misreg`, blue on top.
|
|
68
|
+
|
|
69
|
+
## Motion principles
|
|
70
|
+
|
|
71
|
+
- **Stop-motion stepped.** `steps(6, end)` or `steps(8, end)` easing. Things jump-cut into position.
|
|
72
|
+
- **Color flashes.** A frame of pure pink may flash for 80ms between scenes.
|
|
73
|
+
- **Type bounces in chunks.** A whole word "stamps" into position in 4–6 frames.
|
|
74
|
+
- **Grain breathes.** The grain layer shifts subtly every 200ms (re-randomized).
|
|
75
|
+
- **Scene transitions:** **stamp-cut** — old scene flashes pink, new scene snaps in.
|
|
76
|
+
- **Ambient layer:** grain noise drift; a small repeating motif (asterisk, star, arrow) ticks in a corner.
|
|
77
|
+
- **Forbidden:** smooth easing, gradients, glow, blur, drop shadows, anything "pro."
|
|
78
|
+
|
|
79
|
+
## Pacing
|
|
80
|
+
|
|
81
|
+
Brisk. 3.5–4s per scene. Stop-motion cadence keeps energy up.
|
|
82
|
+
|
|
83
|
+
## Per-scene recipes
|
|
84
|
+
|
|
85
|
+
| Scene | Recipe |
|
|
86
|
+
|---|---|
|
|
87
|
+
| **Title** | Huge misregistered display title (one word per line). Pink star/asterisk stamps in. |
|
|
88
|
+
| **Section** | Big chapter number (pink) overlapping the section title (blue). Tilted -3°. |
|
|
89
|
+
| **Kinetic** | Sentence stamps in word-by-word. Last word in pink at 1.5× size. |
|
|
90
|
+
| **Bullet** | Each item is its own riso row: pink number, blue text, optional yellow tag chip. Hand-stamped feel. |
|
|
91
|
+
| **Stat** | Huge pink stat number; misregistered. Caption in blue body underneath in a slim column. |
|
|
92
|
+
| **Feature** | Left: a riso-style cut-paper illustration (blob shape + pink overlap). Right: heavy display name + body. |
|
|
93
|
+
| **Grid** | 3 cards, each with a duotone shape on top and display name beneath. Different shape per card. |
|
|
94
|
+
| **UI showcase** | Product UI redrawn flat in two colors — solid fills, no gradients, slightly misregistered. |
|
|
95
|
+
| **Content** | A short paragraph in body. One phrase highlighter-marked (pink rectangle behind text). |
|
|
96
|
+
| **CTA** | Massive CTA in misregistered display. Pink star stamps. URL in mono beneath. |
|
|
97
|
+
|
|
98
|
+
### Connective elements
|
|
99
|
+
|
|
100
|
+
- **Lower third:** `★ scene 4 ★` in pink, stop-motion ticking
|
|
101
|
+
- **Scene transition:** pink flash → snap
|
|
102
|
+
- **Ambient:** grain drift, small repeating ★ motif in corner
|
|
103
|
+
|
|
104
|
+
## Pitfalls
|
|
105
|
+
|
|
106
|
+
- **Don't overdo misregistration.** Display type only. Body, icons, labels stay clean.
|
|
107
|
+
- **Don't use more than 3 colors per scene.** Even with yellow available, two is usually right.
|
|
108
|
+
- **Don't smooth-fade.** Stamp-cut everything.
|
|
109
|
+
- **Don't use rounded corners.** Print doesn't have them.
|
|
110
|
+
- **No emoji.** Riso glyph set: ★ ◆ ● ► ▲ ✱ ➜
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Risograph — Brand
|
|
2
|
+
|
|
3
|
+
## Color
|
|
4
|
+
|
|
5
|
+
**`--color-bg` `#F2EBDC`** — warm uncoated paper. Cream with a slight pink tilt. Reads as printed-on-stock.
|
|
6
|
+
|
|
7
|
+
**`--color-fg` `#1A2A6A`** — riso ink blue. Deep, slightly violet. Standard riso "Federal Blue" / "Blue."
|
|
8
|
+
|
|
9
|
+
**`--color-accent` `#FF4F8B`** — fluorescent pink. The signature riso flat color.
|
|
10
|
+
|
|
11
|
+
**`--color-second` `#FFC83D`** — riso yellow. The "use once per video" third color.
|
|
12
|
+
|
|
13
|
+
## Grain & misregistration
|
|
14
|
+
|
|
15
|
+
- **Grain layer:** SVG fractal noise at 18% opacity, on top of everything. Re-randomized every 200ms for a "breathing" feel.
|
|
16
|
+
- **Misregistration:** display type rendered twice — pink layer at `(+3px, +3px)`, blue layer on top. Body type stays sharp.
|
|
17
|
+
|
|
18
|
+
## Typography
|
|
19
|
+
|
|
20
|
+
**Archivo Black** is a free near-substitute for **Druk Wide** — the canonical riso display face. Set it tight (`letter-spacing: -0.02em`), heavy, expressive.
|
|
21
|
+
|
|
22
|
+
**Archivo** Regular/Medium for body.
|
|
23
|
+
|
|
24
|
+
## Motion
|
|
25
|
+
|
|
26
|
+
Stepped easing (`steps(6, end)`). Stamps and snaps, not slides and fades. Pink flash transitions between scenes for energy.
|