The static esm.sh import blocked module execution until the CDN resolved, so on a
cold load the popup rendered with empty text. Load @gradio/client via dynamic import
(ensureClient, awaited in send/sendWatch) and seed the popup with default text in HTML.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat: welcome popup on every open (reads pitch aloud, voice/tap close, video link)
- modal shows on every open, narrates the proposal (browser TTS), big close button
- speak on first tap (mobile autoplay-safe); desktop tries on load
- close by voice (close/fechar + broad words), button, Esc, or auto-close after narration
- EN/PT toggle in the popup; tap the mark to replay; don't re-narrate on same-session reload
- dialog a11y: role=dialog, focus trap, focus close, return focus; reduced-motion honored
- replaces the old first-run onboarding; camera now starts when the popup closes
- styled with the taste-skill tokens (Outfit, one accent, soft shadow)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ui: brand mark = minimal line eye (option 2); remove preview page
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
live mode: in-browser object-detection gate + browser-language onboarding
Marcus Ramalho+1: Claude Opus 4.8
2bdcfe3
- COCO-SSD (TF.js) gates the live mode: the VLM only wakes when a NEW object/person
class appears (semantic change, not pixels); per-class TTL avoids re-announcing;
graceful fallback to the pixel-diff if the detector can't load; scene baseline on start
- onboarding: default to the browser language, speak the welcome on first tap and offer
to switch by voice (listens 5s); 'tap to begin' prompt (screen-reader announced)
- detector model runs in the browser (~5MB) — does not count toward <=32B / Tiny Titan
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>