Pulse Site — Mobile-First Responsive Redesign Plan
Pulse Site — Mobile-First Responsive Redesign Plan
Owner: Nova (Design & Creative)
Stack: Nuxt 3 (v4.4.8) · Vue 3 · Tailwind CSS v4 · @tailwindcss/viteSite root: ~/pulse-site (Nuxt dev on :3000)
Scope: All primary pages — Dashboard (/), Market Watch (/watch), Watchlist, Research (/research, /research/[slug]), Podcast, Chat (/chat), Account, Stock detail (/stock/[ticker], /quote/[ticker]), News, Heatmap.
1. Current-State Assessment
What already works well ✅
- Global scaffold is responsive:
mainusesmax-w-[1600px] px-4 sm:px-6, gutters scale properly. - Most 2-col layouts already use
lg:grid-cols-[1fr_320px]/lg:grid-cols-[260px_1fr]— collapse to single col on mobile ✅. SearchBoxhas a responsive width (w-28 … sm:w-36 focus:w-44).- Data
tableelements are wrapped inoverflow-x-autocontainers (Dashboard brief, Account portfolio, watchlist) — safe from horizontal blowout ✅. - Tab bars use
overflow-x-autowithshrink-0(Dashboard trends tabs) — scrollable on narrow screens ✅. - Chat bubbles
max-w-[88%] sm:max-w-[75%]— thumb-friendly ✅. - Charts isolated in
<ClientOnly>with explicit height. - Existing
*.vuefixtures already usesm:/lg:prefixes on 12 of 16 files.
Friction points — the real work 🚨
A. Header — no mobile navigation (CRITICAL, affects ALL pages)components/AppHeader.vue renders logo + 4 nav links + divider + search + date chip + account button in one row. There is no hamburger / collapsible nav.
On a 360–390px phone this overflows and clips the account CTA / nav — the highest-traffic breakage.
B. Stock detail grids not responsive (pages/stock/[ticker].vue)
- Loading shimmer:
grid grid-cols-3at line 13 — never collapses → 3 columns squeezed into phone width, chips crush. - MA50 status:
grid grid-cols-2 gap-3(line 79) — acceptable on mobile but tight; should becomegrid-cols-1 sm:grid-cols-2.
C. Chat page height collapse (pages/chat.vue)
- Root is
flex h-full flex-colbutapp.vuemain has no defined height / min-height. On mobile the chat panel can collapse to near-zero height — the input + history can't scroll properly. Needs amin-h+100dvhfuel for the flex chain.
D. Viewport / overscroll niceties missing
nuxt.config.tsviewport meta is present (width=device-width, initial-scale=1) but noviewport-fit=cover→ iPhone notch inset issues in landscape.- No
overscroll-behavior, no safe-area padding for iOS bottom bars (affects sticky header + chat input).
E. Touch targets below 44px
- Header account button
px-3 py-1.5 text-xs(~28px tall) — below Apple's 44px guideline. - Podcast audio
<audio>controls are native and tiny. - Some suggestion/table rows have insufficient hit area.
F. Table density on mobile
- Daily Brief portfolio table is fine (wrapped), but research/brief tables should get a mobile "stacked card" fallback for >3 columns rather than forcing horizontal scroll on the primary reading surface.
G. Empty/edge states
- Index and account use
overflow-x-autocorrectly, butresearch.vuegrid and podcast episode list should be verified for card stretching only inlg.
2. Design Token Alignment
Tokens already defined in assets/css/main.css @theme. No palette change — keep the dark neon-green system. Add responsive-safe utilities:
--color-surface: #09090b (page)
--color-card: #101014 (panels)
--color-card2: #16161c
--color-brand-500: #39FF14 (accent)
--color-foreground: #e4e4e7
Mobile-first default rule: every grid-cols-* must be grid-cols-1 (or a safe small count) at the base, escalating with sm:/md:/lg:. Never grid-cols-3 at base.
Contrast / a11y: keep text-brand-400 on bg-card (contrast ≥ 4.5:1), enlarge touch targets to ≥44px. Tabular numerals (tabular-nums) already applied to all price figures.
3. Micro-Interaction & Telemetry Loop
- Sticky header: add a subtle
backdrop-blur+ bottom hairline that appears after 4px scroll (bg-surface/85), and on mobile swap to a two-row compact header with a hamburger that reveals a full-height slide-in drawer (respecting100dvh). - Mobile nav drawer: slide-in from the right,
overscroll-behavior-contain, close on route change / backdrop tap /Esc. Current nav item gets a neon left indicator. - Chat input: sticky composer pinned above iOS home indicator using
env(safe-area-inset-bottom)padding; send button ring glows when typing. - Loading telemetry: existing
.shimmerutilities reused; ensure skeleton grids collapse correctly per breakpoint so users see a true mobile skeleton, not a desktop crushed one.
4. Implementation Checklist (by page)
Global
components/AppHeader.vue— rewrite nav:lg:show inline nav links (as-is).- below
lg:render hamburger button (≥44px target); add drawer<nav>with all 4 tabs + search + account CTA. - Keep sticky + backdrop.
app.vue— addmin-h-[100dvh], set viewportviewport-fit=coverinnuxt.config.ts, add safe-area bottom padding to footer,overscroll-behavior-y: noneon body.components/SearchBox.vue— widen base tow-32, ensure it sits inside drawer on mobile (not inline flex).- Add global
min-h-[44px]for interactive controls;rounded-*cleanup already globally square per Young fixture.
Dashboard / (index.vue)
- Verify podcast row: on mobile the audio
max-w-[240px]should becomew-fullstacked (currentlyflex-wraphandles it — good), tighten gap-y. - Trends tab bar works (scrollable). Confirm tab content tables use
overflow-x-auto(Daily Brief already does). - Confirm neon left-border section pattern from
pulse-tv-home-design.mdif that rev lands. This task is responsiveness not re-theme — flag for Sol whether TV rev ships in parallel.
Stock /stock/[ticker] + /quote/[ticker]
- Line 13: loading shimmer
grid grid-cols-3 gap-3→grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3. - Line 79:
grid grid-cols-2 gap-3→grid grid-cols-1 gap-3 sm:grid-cols-2. - Chart height
400→ accept100%/responsive: use:heightbound to viewport with<ClientOnly>(e.g.min(400, 55dvh)).
Research /research + /research/[slug]
/researchcard grid: ensure base is 1-col (grid-cols-1 md:grid-cols-2 lg:grid-cols-3), check current base (audit flagged)./research/[slug]— alreadymax-w-2xlarticle column (good reading measure on mobile). Keep.
Podcast /podcast
- Episode
<audio>widthsw-44 sm:w-64andmax-w-xs sm:w-72— make mobilew-fullstacked under the meta row.
Chat /chat
- Fix height collapse: give the outer chat card
h-[calc(100dvh-...)]or the main amin-h-[100dvh]flex chain so the composer + history scroll cleanly on mobile. - Composer:
pb-[env(safe-area-inset-bottom)]; textareamin-h-[44px]. - Ensure bubbles wrap (already
max-w-[88%]) — keep.
Account /account
- Verified
lg:grid-cols-[260px_1fr]✅. On mobile, convert the sidebar to a horizontal scrollable tab strip (overflow-x-auto flex) instead of a vertical card — better thumb access. - Portfolio table already wrapped in
overflow-x-auto✅.
Market Watch / Watchlist / News / Heatmap
watch.vue+watchlist.vuegrids already use responsivesm:/md:/lg:counts ✅.news.vue— verify list items useflex-wrapfor source badges; confirm no fixed widths.
5. Testing Matrix
| Breakpoint | Width | Primary checks |
|---|---|---|
| Small phone | 320–374px | Header fits, drawer works, no horizontal scroll, chat full-height |
| Phone | 375–430px | Tap targets ≥44px, podcast audio stacks, stock stats 1–2 col |
| Fold / phablet | 430–600px | All 1-col layouts correct, tables in scroll rail |
| Tablet | 768–1024px | 2-col kick-in, nav inline at lg? (chosen at lg=1024) |
| Laptop | 1024–1440px | Inline nav, 3-col stock shimmer, section grids |
| Desktop | 1440–1600px | Max-width caps, spacing sane |
Validation tools: Chrome DevTools device toolbar (iPhone 12/14, Pixel 7, Galaxy Fold), nuxt build + Lighthouse mobile run for CLS/tap-target scores, Playwright viewport sweep.
6. Execution Plan
| # | Work item | Owner |
|---|---|---|
| 1 | Mobile nav drawer + header rewrite | Ace (impl) |
| 2 | app.vue 100dvh + safe-area + viewport-fit | Ace |
| 3 | Stock page grid fixes (2 spots) + chart height | Ace |
| 4 | Chat height collapse fix + composer safe-area | Ace |
| 5 | Research layout base-column fix | Ace |
| 6 | Podcast audio stacking | Ace |
| 7 | Account sidebar → mobile tab strip | Ace |
| 8 | Touch-target pass (≥44px) | Ace |
| 9 | Viewport sweep + Lighthouse regression | Ace |
| 10 | Playwright responsive test suite | Ace |
Design handoff: Nova provides final specs + this checklist; Ace implements in ~/pulse-site, verifies against testing matrix, reports evidence (screenshots at breakpoints). Sol flags if the TV-home re-theme ships in parallel to avoid conflicting grid overrides.
Prepared by Nova · SolOS Design & Creative
Based on audit of current ~/pulse-site at commit state 2026-08-19.

