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,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-mode HUD overlay.
|
|
3
|
+
* Shows segment info, timing, voiceover, mode, keyboard reference, errors.
|
|
4
|
+
*/
|
|
5
|
+
const HUD_STYLES = `
|
|
6
|
+
.vw-hud {
|
|
7
|
+
position: absolute;
|
|
8
|
+
inset: 0;
|
|
9
|
+
pointer-events: none;
|
|
10
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
11
|
+
font-size: 13px;
|
|
12
|
+
color: #fff;
|
|
13
|
+
z-index: 9999;
|
|
14
|
+
}
|
|
15
|
+
.vw-hud-inner {
|
|
16
|
+
position: absolute;
|
|
17
|
+
bottom: 0;
|
|
18
|
+
left: 0;
|
|
19
|
+
right: 0;
|
|
20
|
+
background: rgba(0,0,0,0.75);
|
|
21
|
+
padding: 10px 14px;
|
|
22
|
+
pointer-events: auto;
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-wrap: nowrap;
|
|
25
|
+
gap: 6px 16px;
|
|
26
|
+
align-items: center;
|
|
27
|
+
height: 100%;
|
|
28
|
+
max-width: 100vw;
|
|
29
|
+
max-height: 80px;
|
|
30
|
+
overflow: hidden;
|
|
31
|
+
}
|
|
32
|
+
.vw-hud-info {
|
|
33
|
+
position: relative;
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: column;
|
|
36
|
+
flex: 0 0 auto;
|
|
37
|
+
max-width: 30vw;
|
|
38
|
+
min-width: 0;
|
|
39
|
+
gap: 2px;
|
|
40
|
+
}
|
|
41
|
+
.vw-hud-row {
|
|
42
|
+
display: flex;
|
|
43
|
+
align-items: center;
|
|
44
|
+
gap: 8px;
|
|
45
|
+
}
|
|
46
|
+
.vw-hud-item {
|
|
47
|
+
white-space: nowrap;
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
text-overflow: ellipsis;
|
|
50
|
+
flex-shrink: 0;
|
|
51
|
+
}
|
|
52
|
+
.vw-hud-label { opacity: 0.6; margin-right: 4px; }
|
|
53
|
+
.vw-hud-separator { opacity: 0.5; }
|
|
54
|
+
.vw-hud-vo {
|
|
55
|
+
opacity: 0.8;
|
|
56
|
+
font-style: italic;
|
|
57
|
+
min-width: 0;
|
|
58
|
+
flex: 1 1 0;
|
|
59
|
+
overflow-y: auto;
|
|
60
|
+
overflow-x: hidden;
|
|
61
|
+
max-height: 80px;
|
|
62
|
+
}
|
|
63
|
+
.vw-hud-keys {
|
|
64
|
+
opacity: 0.4;
|
|
65
|
+
font-size: 11px;
|
|
66
|
+
margin-left: auto;
|
|
67
|
+
flex: 0 0 auto;
|
|
68
|
+
display: grid;
|
|
69
|
+
grid-template-columns: auto auto;
|
|
70
|
+
grid-template-rows: repeat(3, auto);
|
|
71
|
+
gap: 0 12px;
|
|
72
|
+
max-height: 80px;
|
|
73
|
+
overflow-y: auto;
|
|
74
|
+
}
|
|
75
|
+
.vw-hud-key-item { white-space: nowrap; }
|
|
76
|
+
.vw-hud-ended {
|
|
77
|
+
font-size: 10px;
|
|
78
|
+
text-transform: uppercase;
|
|
79
|
+
opacity: 0.7;
|
|
80
|
+
line-height: 1;
|
|
81
|
+
position: absolute;
|
|
82
|
+
top: -12px;
|
|
83
|
+
left: 0;
|
|
84
|
+
}
|
|
85
|
+
/* Error display: horizontal layout for fixed-height HUD strip.
|
|
86
|
+
Left accent + icon | two-line title+message (truncated) | reload button.
|
|
87
|
+
Click the error text to log the full stack trace to the browser console,
|
|
88
|
+
since the fixed 80px HUD height is too small for inline stack display. */
|
|
89
|
+
.vw-hud-error-overlay {
|
|
90
|
+
position: absolute;
|
|
91
|
+
inset: 0;
|
|
92
|
+
background: rgba(50,10,10,0.95);
|
|
93
|
+
border-left: 4px solid #e54;
|
|
94
|
+
display: flex;
|
|
95
|
+
flex-direction: row;
|
|
96
|
+
align-items: center;
|
|
97
|
+
pointer-events: auto;
|
|
98
|
+
padding: 0 16px;
|
|
99
|
+
gap: 12px;
|
|
100
|
+
overflow: hidden;
|
|
101
|
+
}
|
|
102
|
+
.vw-hud-error-icon {
|
|
103
|
+
font-size: 24px;
|
|
104
|
+
line-height: 1;
|
|
105
|
+
flex-shrink: 0;
|
|
106
|
+
opacity: 0.9;
|
|
107
|
+
}
|
|
108
|
+
.vw-hud-error-text {
|
|
109
|
+
flex: 1 1 0;
|
|
110
|
+
min-width: 0;
|
|
111
|
+
overflow: hidden;
|
|
112
|
+
cursor: pointer;
|
|
113
|
+
}
|
|
114
|
+
.vw-hud-error-title {
|
|
115
|
+
font-size: 14px;
|
|
116
|
+
font-weight: 600;
|
|
117
|
+
white-space: nowrap;
|
|
118
|
+
overflow: hidden;
|
|
119
|
+
text-overflow: ellipsis;
|
|
120
|
+
margin: 0;
|
|
121
|
+
}
|
|
122
|
+
.vw-hud-error-message {
|
|
123
|
+
font-size: 13px;
|
|
124
|
+
opacity: 0.8;
|
|
125
|
+
white-space: nowrap;
|
|
126
|
+
overflow: hidden;
|
|
127
|
+
text-overflow: ellipsis;
|
|
128
|
+
margin: 2px 0 0;
|
|
129
|
+
}
|
|
130
|
+
.vw-hud-btn {
|
|
131
|
+
background: rgba(255,255,255,0.2);
|
|
132
|
+
border: 1px solid rgba(255,255,255,0.4);
|
|
133
|
+
color: #fff;
|
|
134
|
+
padding: 6px 14px;
|
|
135
|
+
border-radius: 4px;
|
|
136
|
+
cursor: pointer;
|
|
137
|
+
font-size: 13px;
|
|
138
|
+
white-space: nowrap;
|
|
139
|
+
flex-shrink: 0;
|
|
140
|
+
}
|
|
141
|
+
.vw-hud-btn:hover { background: rgba(255,255,255,0.3); }
|
|
142
|
+
.vw-hud-play {
|
|
143
|
+
background: rgba(255,255,255,0.15);
|
|
144
|
+
border: 1px solid rgba(255,255,255,0.35);
|
|
145
|
+
color: #fff;
|
|
146
|
+
width: 36px;
|
|
147
|
+
height: 36px;
|
|
148
|
+
border-radius: 50%;
|
|
149
|
+
cursor: pointer;
|
|
150
|
+
font-size: 16px;
|
|
151
|
+
display: flex;
|
|
152
|
+
align-items: center;
|
|
153
|
+
justify-content: center;
|
|
154
|
+
pointer-events: auto;
|
|
155
|
+
padding: 0;
|
|
156
|
+
line-height: 1;
|
|
157
|
+
flex-shrink: 0;
|
|
158
|
+
}
|
|
159
|
+
.vw-hud-play:hover { background: rgba(255,255,255,0.3); }
|
|
160
|
+
`;
|
|
161
|
+
const KEY_BINDINGS = [
|
|
162
|
+
"→: next",
|
|
163
|
+
"←: prev",
|
|
164
|
+
"Space: play/pause",
|
|
165
|
+
"R: restart",
|
|
166
|
+
"H: HUD",
|
|
167
|
+
"1-9: jump",
|
|
168
|
+
];
|
|
169
|
+
function formatTime(ms) {
|
|
170
|
+
const s = Math.floor(ms / 1000);
|
|
171
|
+
const m = Math.floor(s / 60);
|
|
172
|
+
const sec = s % 60;
|
|
173
|
+
return `${m}:${sec.toString().padStart(2, "0")}`;
|
|
174
|
+
}
|
|
175
|
+
let hudStyleRefCount = 0;
|
|
176
|
+
function acquireHudStyles() {
|
|
177
|
+
hudStyleRefCount++;
|
|
178
|
+
if (hudStyleRefCount === 1) {
|
|
179
|
+
const style = document.createElement("style");
|
|
180
|
+
style.setAttribute("data-vw-hud", "");
|
|
181
|
+
style.textContent = HUD_STYLES;
|
|
182
|
+
document.head.appendChild(style);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function releaseHudStyles() {
|
|
186
|
+
hudStyleRefCount--;
|
|
187
|
+
if (hudStyleRefCount <= 0) {
|
|
188
|
+
hudStyleRefCount = 0;
|
|
189
|
+
const style = document.querySelector("style[data-vw-hud]");
|
|
190
|
+
if (style)
|
|
191
|
+
style.remove();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
export function createHud(options) {
|
|
195
|
+
const el = document.createElement("div");
|
|
196
|
+
el.className = "vw-hud";
|
|
197
|
+
acquireHudStyles();
|
|
198
|
+
let isVisible = true;
|
|
199
|
+
// Persistent play button -- created once, updated on each render.
|
|
200
|
+
let playBtn = null;
|
|
201
|
+
if (options?.onPlayToggle) {
|
|
202
|
+
playBtn = document.createElement("button");
|
|
203
|
+
playBtn.className = "vw-hud-play";
|
|
204
|
+
playBtn.textContent = "▶";
|
|
205
|
+
playBtn.title = "Play";
|
|
206
|
+
const handler = options.onPlayToggle;
|
|
207
|
+
playBtn.addEventListener("click", (e) => {
|
|
208
|
+
e.stopPropagation();
|
|
209
|
+
handler();
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
const hud = {
|
|
213
|
+
el,
|
|
214
|
+
get visible() {
|
|
215
|
+
return isVisible;
|
|
216
|
+
},
|
|
217
|
+
update(state) {
|
|
218
|
+
el.innerHTML = "";
|
|
219
|
+
if (state.error) {
|
|
220
|
+
el.appendChild(renderError(state.error));
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (!isVisible)
|
|
224
|
+
return;
|
|
225
|
+
const inner = document.createElement("div");
|
|
226
|
+
inner.className = "vw-hud-inner";
|
|
227
|
+
// Play/pause button (shown in dev mode, not render)
|
|
228
|
+
if (state.mode !== "render" && playBtn) {
|
|
229
|
+
playBtn.textContent = state.playbackMode === "playing" ? "⏸" : "▶";
|
|
230
|
+
playBtn.title = state.playbackMode === "playing" ? "Pause" : "Play";
|
|
231
|
+
inner.appendChild(playBtn);
|
|
232
|
+
}
|
|
233
|
+
// Info column: segment label + timing row
|
|
234
|
+
const info = document.createElement("div");
|
|
235
|
+
info.className = "vw-hud-info";
|
|
236
|
+
// Ended indicator (absolutely positioned above segment line)
|
|
237
|
+
if (state.ended) {
|
|
238
|
+
const badge = document.createElement("div");
|
|
239
|
+
badge.className = "vw-hud-ended";
|
|
240
|
+
badge.textContent = "END OF TIMELINE";
|
|
241
|
+
info.appendChild(badge);
|
|
242
|
+
}
|
|
243
|
+
// Row 0: segment label
|
|
244
|
+
const row0 = document.createElement("div");
|
|
245
|
+
row0.className = "vw-hud-row";
|
|
246
|
+
const segItem = document.createElement("span");
|
|
247
|
+
segItem.className = "vw-hud-item";
|
|
248
|
+
const segLabel = document.createElement("span");
|
|
249
|
+
segLabel.className = "vw-hud-label";
|
|
250
|
+
segLabel.textContent = "segment:";
|
|
251
|
+
segItem.appendChild(segLabel);
|
|
252
|
+
segItem.appendChild(document.createTextNode(`${state.beat} ${state.segmentId}`));
|
|
253
|
+
row0.appendChild(segItem);
|
|
254
|
+
info.appendChild(row0);
|
|
255
|
+
// Row 1: timing row
|
|
256
|
+
const row1 = document.createElement("div");
|
|
257
|
+
row1.className = "vw-hud-row";
|
|
258
|
+
const segTimeItem = document.createElement("span");
|
|
259
|
+
segTimeItem.className = "vw-hud-item";
|
|
260
|
+
const segTimeLabel = document.createElement("span");
|
|
261
|
+
segTimeLabel.className = "vw-hud-label";
|
|
262
|
+
segTimeLabel.textContent = "seg time:";
|
|
263
|
+
segTimeItem.appendChild(segTimeLabel);
|
|
264
|
+
segTimeItem.appendChild(document.createTextNode(formatTime(state.segmentTime)));
|
|
265
|
+
row1.appendChild(segTimeItem);
|
|
266
|
+
const separator = document.createElement("span");
|
|
267
|
+
separator.className = "vw-hud-separator";
|
|
268
|
+
separator.textContent = "·";
|
|
269
|
+
row1.appendChild(separator);
|
|
270
|
+
const totalItem = document.createElement("span");
|
|
271
|
+
totalItem.className = "vw-hud-item";
|
|
272
|
+
const totalLabel = document.createElement("span");
|
|
273
|
+
totalLabel.className = "vw-hud-label";
|
|
274
|
+
totalLabel.textContent = "total:";
|
|
275
|
+
totalItem.appendChild(totalLabel);
|
|
276
|
+
totalItem.appendChild(document.createTextNode(formatTime(state.totalTime)));
|
|
277
|
+
row1.appendChild(totalItem);
|
|
278
|
+
info.appendChild(row1);
|
|
279
|
+
inner.appendChild(info);
|
|
280
|
+
// Voiceover (only when truthy)
|
|
281
|
+
if (state.voiceover) {
|
|
282
|
+
const vo = document.createElement("div");
|
|
283
|
+
vo.className = "vw-hud-vo";
|
|
284
|
+
vo.textContent = state.voiceover;
|
|
285
|
+
inner.appendChild(vo);
|
|
286
|
+
}
|
|
287
|
+
// Keyboard shortcuts
|
|
288
|
+
const keys = document.createElement("div");
|
|
289
|
+
keys.className = "vw-hud-keys";
|
|
290
|
+
for (const binding of KEY_BINDINGS) {
|
|
291
|
+
const keyItem = document.createElement("span");
|
|
292
|
+
keyItem.className = "vw-hud-key-item";
|
|
293
|
+
keyItem.textContent = binding;
|
|
294
|
+
keys.appendChild(keyItem);
|
|
295
|
+
}
|
|
296
|
+
inner.appendChild(keys);
|
|
297
|
+
el.appendChild(inner);
|
|
298
|
+
},
|
|
299
|
+
show() {
|
|
300
|
+
isVisible = true;
|
|
301
|
+
el.style.display = "";
|
|
302
|
+
},
|
|
303
|
+
hide() {
|
|
304
|
+
isVisible = false;
|
|
305
|
+
el.style.display = "none";
|
|
306
|
+
},
|
|
307
|
+
toggle() {
|
|
308
|
+
if (isVisible)
|
|
309
|
+
hud.hide();
|
|
310
|
+
else
|
|
311
|
+
hud.show();
|
|
312
|
+
},
|
|
313
|
+
destroy() {
|
|
314
|
+
releaseHudStyles();
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
return hud;
|
|
318
|
+
}
|
|
319
|
+
function renderError(error) {
|
|
320
|
+
const overlay = document.createElement("div");
|
|
321
|
+
overlay.className = "vw-hud-error-overlay";
|
|
322
|
+
// Error icon
|
|
323
|
+
const icon = document.createElement("span");
|
|
324
|
+
icon.className = "vw-hud-error-icon";
|
|
325
|
+
icon.textContent = "⚠"; // warning sign
|
|
326
|
+
overlay.appendChild(icon);
|
|
327
|
+
// Two-line text block: title + message (both truncated with ellipsis)
|
|
328
|
+
const textBlock = document.createElement("div");
|
|
329
|
+
textBlock.className = "vw-hud-error-text";
|
|
330
|
+
const title = document.createElement("div");
|
|
331
|
+
title.className = "vw-hud-error-title";
|
|
332
|
+
title.textContent = `Segment error: ${error.segmentId}`;
|
|
333
|
+
title.title = `Segment error: ${error.segmentId}`;
|
|
334
|
+
textBlock.appendChild(title);
|
|
335
|
+
const msg = document.createElement("div");
|
|
336
|
+
msg.className = "vw-hud-error-message";
|
|
337
|
+
msg.textContent = error.message;
|
|
338
|
+
msg.title = error.stack ? `${error.message}\n\n${error.stack}` : error.message;
|
|
339
|
+
textBlock.appendChild(msg);
|
|
340
|
+
textBlock.addEventListener("click", () => {
|
|
341
|
+
if (error.stack) {
|
|
342
|
+
console.error(`[Videowright] Segment error: ${error.segmentId}\n${error.message}\n\n${error.stack}`);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
console.error(`[Videowright] Segment error: ${error.segmentId}\n${error.message}`);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
overlay.appendChild(textBlock);
|
|
349
|
+
// Reload button
|
|
350
|
+
const reloadBtn = document.createElement("button");
|
|
351
|
+
reloadBtn.className = "vw-hud-btn";
|
|
352
|
+
reloadBtn.textContent = "Reload";
|
|
353
|
+
reloadBtn.addEventListener("click", () => location.reload());
|
|
354
|
+
overlay.appendChild(reloadBtn);
|
|
355
|
+
return overlay;
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=hud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hud.js","sourceRoot":"","sources":["../../src/player/hud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Player runtime.
|
|
3
|
+
* Orchestrates segment lifecycle, transitions, input, hash routing, and HUD.
|
|
4
|
+
*/
|
|
5
|
+
import type { SegmentLoaderMap, TransitionLoaderMap } from "../timeline/index.js";
|
|
6
|
+
import type { Timeline } from "../types.js";
|
|
7
|
+
export interface PlayerOptions {
|
|
8
|
+
hud?: boolean;
|
|
9
|
+
/** Enable render mode: deterministic frame-by-frame advance, no interactive input. */
|
|
10
|
+
renderMode?: boolean;
|
|
11
|
+
/** Frames per second for render mode clock. Default 60. */
|
|
12
|
+
fps?: number;
|
|
13
|
+
/** Vite-served audio file URL for voiceover playback (dev only). */
|
|
14
|
+
audioFile?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Fully resolved per-segment timing for auto-advance.
|
|
17
|
+
* Keys are segment ids; values are advance times in seconds (segment-relative).
|
|
18
|
+
*/
|
|
19
|
+
resolvedTiming?: Record<string, number[]>;
|
|
20
|
+
}
|
|
21
|
+
type PlayerState = "idle" | "loading" | "playing" | "transitioning" | "ended" | "errored";
|
|
22
|
+
export declare class Player {
|
|
23
|
+
private host;
|
|
24
|
+
private hostWrapper;
|
|
25
|
+
private options;
|
|
26
|
+
private state;
|
|
27
|
+
private timeline;
|
|
28
|
+
private segmentLoaders;
|
|
29
|
+
private transitionLoaders;
|
|
30
|
+
private slotA;
|
|
31
|
+
private slotB;
|
|
32
|
+
private currentSlot;
|
|
33
|
+
private hud;
|
|
34
|
+
private cleanupInput;
|
|
35
|
+
private cleanupHashChange;
|
|
36
|
+
private startedAt;
|
|
37
|
+
private started;
|
|
38
|
+
private transitioning;
|
|
39
|
+
private audioEl;
|
|
40
|
+
private _playbackMode;
|
|
41
|
+
private autoAdvanceTimer;
|
|
42
|
+
/** Drift tolerance in ms: snap audio if it drifts beyond this threshold. */
|
|
43
|
+
private static readonly DRIFT_TOLERANCE_MS;
|
|
44
|
+
constructor(host: HTMLElement, options?: PlayerOptions);
|
|
45
|
+
load(timeline: Timeline, segmentLoaders: SegmentLoaderMap, transitionLoaders?: TransitionLoaderMap): Promise<void>;
|
|
46
|
+
start(): Promise<void>;
|
|
47
|
+
destroy(): void;
|
|
48
|
+
get currentState(): PlayerState;
|
|
49
|
+
get currentSegmentId(): string | null;
|
|
50
|
+
get currentTimelineIndex(): number;
|
|
51
|
+
get isEnded(): boolean;
|
|
52
|
+
get isTransitioning(): boolean;
|
|
53
|
+
get playbackMode(): "idle" | "playing";
|
|
54
|
+
togglePlayback(): void;
|
|
55
|
+
private enterPlaying;
|
|
56
|
+
private enterIdle;
|
|
57
|
+
private cancelAutoAdvance;
|
|
58
|
+
/**
|
|
59
|
+
* Compute the logical audio time based on where we are in the timeline.
|
|
60
|
+
* Walks the resolved timing from segment 0 up to the current segment + beat.
|
|
61
|
+
*/
|
|
62
|
+
private computeLogicalAudioTime;
|
|
63
|
+
/**
|
|
64
|
+
* Compute the time until the next advance in the current segment, then schedule it.
|
|
65
|
+
*
|
|
66
|
+
* @param driftCorrectionMs - Signed milliseconds to add to the delay.
|
|
67
|
+
* Positive = schedule is ahead of audio, so delay is lengthened.
|
|
68
|
+
* Negative = schedule is behind audio, so delay is shortened.
|
|
69
|
+
* Passed from autoAdvanceTick when drift exceeds DRIFT_TOLERANCE_MS.
|
|
70
|
+
*/
|
|
71
|
+
private scheduleNextAutoAdvance;
|
|
72
|
+
private autoAdvanceTick;
|
|
73
|
+
/**
|
|
74
|
+
* Advance one beat in render mode. Returns false when the timeline is exhausted.
|
|
75
|
+
* Only valid when the player was constructed with renderMode: true.
|
|
76
|
+
*
|
|
77
|
+
* @param isLast - true when this is the final scheduled advance for the
|
|
78
|
+
* current segment. On the last beat the method always transitions to the
|
|
79
|
+
* next segment (after draining any pending waitForNext resolver).
|
|
80
|
+
*
|
|
81
|
+
* Transitions are NOT awaited — WAAPI animations are driven by the JS time
|
|
82
|
+
* shim's virtual clock, so they complete as the render driver advances time.
|
|
83
|
+
* Awaiting transition completion here would deadlock because the transition's
|
|
84
|
+
* `.finished` promises only resolve when the shim advances the clock.
|
|
85
|
+
*/
|
|
86
|
+
renderAdvance(isLast: boolean): Promise<boolean>;
|
|
87
|
+
private handleCommand;
|
|
88
|
+
/**
|
|
89
|
+
* Advance one beat. In manual-nav mode (isLastAdvance omitted / false),
|
|
90
|
+
* draining a pending waitForNext resolver counts as consuming the press
|
|
91
|
+
* and the player stays on the current segment. When called from
|
|
92
|
+
* autoAdvanceTick with isLastAdvance=true, the method forces a segment
|
|
93
|
+
* transition after draining the resolver -- otherwise the last scheduled
|
|
94
|
+
* advance would be consumed without ever transitioning out.
|
|
95
|
+
*/
|
|
96
|
+
private handleNext;
|
|
97
|
+
private handlePrev;
|
|
98
|
+
private handleRestart;
|
|
99
|
+
private jumpToIndex;
|
|
100
|
+
private transitionTo;
|
|
101
|
+
private mountSegmentAt;
|
|
102
|
+
private resolveTransition;
|
|
103
|
+
private getTransitionDuration;
|
|
104
|
+
private onExternalHashChange;
|
|
105
|
+
private jumpToSegmentBeat;
|
|
106
|
+
private handleLifecycleError;
|
|
107
|
+
private setError;
|
|
108
|
+
private updateHud;
|
|
109
|
+
private totalElapsed;
|
|
110
|
+
/**
|
|
111
|
+
* Set document.body.dataset.vwState to the current player state.
|
|
112
|
+
* Used by the render driver to detect when the player is idle (not transitioning)
|
|
113
|
+
* and ready for the next action.
|
|
114
|
+
*
|
|
115
|
+
* States: "idle" | "loading" | "playing" | "transitioning" | "ended" | "errored"
|
|
116
|
+
*/
|
|
117
|
+
private broadcastState;
|
|
118
|
+
private getCurrentSlot;
|
|
119
|
+
private getOtherSlot;
|
|
120
|
+
private findSegmentIndex;
|
|
121
|
+
}
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/player/index.ts"],"names":[],"mappings":"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"}
|