afb3b7c749
Approved design for modernizing the gateway frontend with Tailwind CSS, responsive mobile-first layout, and swipeable page navigation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.8 KiB
5.8 KiB
Gateway UI Responsive Redesign
Date: 2026-02-18 Status: Approved
Goal
Redesign the Flynn gateway web frontend for a modern, responsive, mobile-friendly experience with monitoring dashboard as the primary mobile use case.
Decisions
- Visual style: Modern minimal (Linear/Vercel aesthetic), dark theme
- CSS framework: Tailwind CSS via CDN (Play CDN for zero build step)
- Mobile navigation: Swipeable pages via CSS scroll-snap with pill indicator
- Dependencies: Tailwind CDN only; no JS frameworks or gesture libraries
- Approach: Full rewrite of style.css → Tailwind utility classes in JS page renderers
Visual Language
Typography
- Body/UI: Inter (sans-serif) via Google Fonts CDN
- Code/technical values: JetBrains Mono (monospace) — session IDs, code blocks, config values only
Color Palette (Tailwind zinc scale)
| Role | Token | Value |
|---|---|---|
| Background deepest | zinc-950 | #09090b |
| Background card | zinc-900 | #18181b |
| Background elevated | zinc-800 | #27272a |
| Accent | blue-500 | #3b82f6 |
| Success | green-500 | #22c55e |
| Warning | amber-500 | #f59e0b |
| Error | red-500 | #ef4444 |
| Text primary | zinc-50 | #fafafa |
| Text secondary | zinc-400 | #a1a1aa |
| Text muted | zinc-600 | #52525b |
Spacing
- Tailwind 4px scale
- Cards:
p-4(16px) mobile,p-6(24px) desktop - Grid gaps:
gap-4consistent - Touch targets: minimum 44px
Borders & Depth
border-zinc-800subtle bordersring-1 ring-zinc-800for cards- No drop shadows — layered backgrounds create depth
Layout & Navigation
Desktop (≥1024px)
- Fixed left sidebar: 64px collapsed (icons only), 240px expanded on hover or pin
- Logo at top, 5 nav items with icons + labels, connection status at bottom
- Main content with max-width constraint for readability
Tablet (768px–1023px)
- Sidebar: 64px icon-only strip (always collapsed)
- Content fills remaining width
- Grids: 3 → 2 columns
Mobile (<768px)
- No sidebar. Replaced with:
- Top bar: logo + connection indicator + current page title
- Swipeable horizontal page container (
scroll-snap-type: x mandatory) - Pill indicator bar showing page position (tappable to jump)
- Page order: Dashboard → Chat → Sessions → Usage → Settings
- Each page is
100vwwide,scroll-snap-align: start - JS manages page lifecycle (teardown old page, render new page on snap)
Page Designs
Dashboard (Primary Mobile Target)
- Stat cards: Horizontally scrollable strip on mobile, grid on desktop. Compact: large value, small label, optional trend.
- Service status: Colored pill badges in a compact row. Green/amber/red dots + name.
- Session analytics: CSS-only bar chart for daily trend. Badge list for top tools/topics.
- Model performance: Horizontal-scroll table, sticky first column.
- Event stream: Collapsible, 5 most recent visible by default.
- Active requests: Only shown when in-flight, with animated indicator.
- Mobile pattern: All sections are collapsible accordion-style. Headers + summary visible, tap to expand.
Chat
- Full-height message area, bottom-anchored input
- Full-width messages on mobile (no side margins)
- Assistant messages: lighter card background. User messages: accent-tinted.
- Tool events: compact inline chips (expandable on tap)
- Slash command popup: bottom-sheet on mobile, floating on desktop
- File attachment: bottom sheet (mobile), drag-drop zone (desktop)
- Auto-growing textarea with always-visible send button on mobile
Sessions
- Mobile: Card list (not table). Each card: session ID, channel badge, message count, last activity. Tap to expand history.
- Desktop: Table with inline history viewer.
Usage
- Summary stat cards in scrollable strip (mobile) or grid (desktop)
- Per-session: stacked cards (mobile), table (desktop)
- Auto-refresh every 30s
Settings
- Sectioned form: each group in its own card
- Toggle switches for booleans, full-width inputs for text
- 44px minimum touch targets
- Sections: PA Mode, Push Notifications, Hook Patterns, Tools, Services, Config
Technical Approach
Tailwind Setup
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
fontFamily: {
sans: ['Inter', 'system-ui', 'sans-serif'],
mono: ['JetBrains Mono', 'Fira Code', 'monospace'],
}
}
}
}
</script>
Font Loading
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
Swipe Navigation (Mobile)
CSS scroll-snap container wrapping all page divs. JS IntersectionObserver or scrollend event detects which page is visible and updates the pill indicator + triggers page lifecycle.
Migration Strategy
- Replace
style.csswith a minimal base (resets, custom utilities not in Tailwind) - Rewrite
index.htmlshell with Tailwind classes - Rewrite each page renderer (JS) to emit Tailwind-classed HTML
- Update
app.jsrouter for scroll-snap container on mobile - Test each page at all breakpoints
Files Modified
src/gateway/ui/index.html— new shell, Tailwind CDN, fontssrc/gateway/ui/style.css— reduced to minimal base (~100 lines)src/gateway/ui/app.js— responsive router, swipe container, pill indicatorsrc/gateway/ui/pages/dashboard.js— Tailwind classes, accordion, scrollable statssrc/gateway/ui/pages/chat.js— Tailwind classes, bottom-sheet slash popupsrc/gateway/ui/pages/sessions.js— card list on mobilesrc/gateway/ui/pages/usage.js— card layout on mobilesrc/gateway/ui/pages/settings.js— form card layoutsrc/gateway/ui/sw.js— update cache versionsrc/gateway/ui/manifest.webmanifest— update theme color to zinc-950