Day 10ff+ : FreshVibeOrigin visible when ?legacy=0

Status: SHIPPED 2026-08-19 17:25 CEST

Commit: 76017ec (pushed to origin/legacy-toggle)

Live: https://vibecoder.freshvibeapps.com/?legacy=0

What the operator saw

"WOW i expected when it hid i would see the vibecoder origin website behind as it supposed to be" — operator's screenshot showed only chrome pills (top-left "Legacy UI hidden" + right side Pro/Edge/VibeChat pills) on a completely blank canvas.

The ID10 v0.6 plan a643 (Day 4) promised that hiding the legacy React VibeChatApp would reveal the FreshVibeOrigin main canvas underneath. But the canvas was empty because:

The fix (3 changes)

Change 1: Replace origin stub with full 6-section template

Copied Day 10dd's full FreshVibeOrigin implementation from origin/day10-vibechat-pm2-only into src/gallery/origin/freshvibe-origin/:

Change 2: Inline position: fixed on canvas

injectMainCanvas() in src/host/host-boot.js now sets canvas.style.cssText with explicit position: fixed; top: 0; left: var(--fv-cms-width, 0px); right: var(--fv-edge-width, 0px); bottom: var(--fv-vibechat-height, 0px). This bypasses the Vite CSS scoping issue and works regardless of chrome state.

Change 3: Inject section styles inline

New injectOriginStyles() in src/host/host-boot.js injects a <style id="fv-origin-styles"> tag with the section CSS rules (.fv-hero, .fv-showcase, etc). Inline <style> tags aren't scoped by Vite.

Verification (Playwright)

Before fix: Canvas position: static; top: auto; width: 1280; height: 0; childCount: 0. Screenshot: blank white page with only pills.

After fix: Canvas position: fixed; top: 0px; left: 0px; right: 0px; bottom: 0px; width: 1280; height: 720; childCount: 1; section_count: 6. Screenshot: Full FreshVibeOrigin with:

Whats still missing (operator decision)

Files changed (commit 76017ec)

Branch state

Lesson (added to bug log 2026-08-19)

CSS scoping by Vite is a footgun for chrome elements: when the css file is imported from a JS module, all selectors get scoped under the closest "ancestor" class. Inline <style> or style.cssText bypasses this and is the right tool for chrome elements that live outside the React tree.

Related