--- id: TASK-72 title: 'Standardize canvas header to match renderShell (MI bar, welcome, Try Demo)' status: Done assignee: [] created_date: '2026-02-28 01:10' labels: - fix - canvas - header - ux dependencies: [] references: - website/canvas.html - server/shell.ts - website/shell.ts priority: high --- ## Description Canvas.html was served as a static SPA fallback and had a hand-crafted header missing several features that renderShell() provides to all other rApp pages. Fixed to achieve full parity: 1. **RStackMi registration**: `` tag was in the HTML but never registered as a custom element — MI bar was dead on canvas. Added import + define(). 2. **"Try Demo" button**: Added to header right section, with visibility logic (hidden on demo space, shown on bare domain). 3. **Embedded iframe detection**: Added `rspace-embedded` CSS + early script to hide shell chrome when canvas is loaded inside an iframe (e.g. folk-rapp). 4. **Welcome overlay**: Full popup for first-time demo visitors with "Create a Space" + "Explore Demo" actions. 5. **Auto-space resolution**: Logged-in users on demo space get redirected to their personal space via `/api/spaces/auto-provision`. 6. **auth-change listener**: Reloads space switcher dropdown when user signs in/out. 7. **`window.__rspaceNavUrl` global**: Exposed nav URL helper globally, matching shell.js behavior. ## Acceptance Criteria - [ ] #1 RStackMi imported and defined — MI bar functional on canvas - [ ] #2 Try Demo button in canvas header with correct visibility logic - [ ] #3 rspace-embedded iframe detection hides chrome when embedded - [ ] #4 Welcome overlay shows for first-time demo visitors - [ ] #5 Auto-space resolution redirects logged-in demo users to personal space - [ ] #6 auth-change listener reloads space switcher on sign in/out - [ ] #7 bun run build passes with zero errors ## Final Summary Canvas.html now has full header parity with renderShell(). Added RStackMi registration (MI bar was dead), Try Demo button, iframe detection, welcome overlay, auto-space resolution, and auth-change listener. 1 file changed, +165 lines. Commit: 6c22559, merged dev→main as 6f80f7a.