# Dangerous Pi - UI/UX Guidelines

## Design Philosophy

**Mobile-First, Resource-Constrained Excellence**: Build a beautiful, touch-optimized interface that works perfectly on smartphones while respecting the Pi Zero 2 W's limited resources.

### Core Principles

1. **Mobile-First** - PRIMARY target is smartphone users (📱 80% of usage)
2. **Touch-Optimized** - 44×44px minimum touch targets, gesture support
3. **Performance First** - Every byte counts, code splitting for charts
4. **Progressive Enhancement** - Works without JavaScript, better with it
5. **Cross-Platform** - Shared components for Web/Mobile/Desktop apps
6. **Instant Feedback** - Users should never wonder what's happening

---

## Technical Constraints

### Hardware Limitations
- **CPU**: Quad-core ARM Cortex-A53 @ 1GHz (limited)
- **RAM**: 512MB (shared with OS and backend)
- **Network**: WiFi only, potentially slow AP mode
- **Storage**: MicroSD (minimize writes)

### Performance Targets
- **First Contentful Paint**: < 1.5s
- **Time to Interactive**: < 3s
- **Base Bundle Size**: ~120KB (gzipped)
- **With Victory Charts**: ~170KB (via code splitting)
- **CSS**: < 20KB (gzipped)
- **Fonts**: System fonts only (no web fonts)

### Mobile-First Targets
- **Viewport**: 375px width (iPhone SE) as baseline
- **Touch Targets**: 44×44px minimum (iOS HIG)
- **Gesture Support**: Pan, zoom, swipe for charts
- **Orientation**: Portrait primary, landscape support

---

## Visual Design System

### Color Palette

```
Primary (Actions):
  - Blue: #2563eb (buttons, links, active states)
  - Blue Dark: #1e40af (hover states)

Status Colors:
  - Success: #059669 (connected, completed)
  - Warning: #d97706 (low battery, needs attention)
  - Error: #dc2626 (disconnected, failed)
  - Info: #0891b2 (notifications, tips)

Neutral (UI):
  - Background: #ffffff (light) / #1f2937 (dark)
  - Surface: #f9fafb (light) / #111827 (dark)
  - Border: #e5e7eb (light) / #374151 (dark)
  - Text Primary: #111827 (light) / #f9fafb (dark)
  - Text Secondary: #6b7280 (light) / #9ca3af (dark)
```

### Typography

```css
/* Use system font stack - zero download time */
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI",
             Roboto, "Helvetica Neue", Arial, sans-serif;

/* Type Scale */
text-xs:   0.75rem  (12px)  - Labels, captions
text-sm:   0.875rem (14px)  - Body small, secondary text
text-base: 1rem     (16px)  - Body text, inputs
text-lg:   1.125rem (18px)  - Emphasized text
text-xl:   1.25rem  (20px)  - Page titles
text-2xl:  1.5rem   (24px)  - Section headers

/* Line Height */
leading-tight:  1.25  - Headings
leading-normal: 1.5   - Body text
leading-relaxed: 1.75 - Long-form content
```

### Spacing System

```css
/* 4px base unit */
0:  0
1:  0.25rem (4px)
2:  0.5rem  (8px)
3:  0.75rem (12px)
4:  1rem    (16px)
6:  1.5rem  (24px)
8:  2rem    (32px)
12: 3rem    (48px)
```

### Components

#### Buttons
```
Primary:   Bold background, white text, clear call-to-action
Secondary: Border only, transparent background
Danger:    Red background for destructive actions
Icon-only: 44x44px minimum touch target
```

#### Cards
```
Light elevation, subtle border
Padding: 1rem (mobile) / 1.5rem (desktop)
Border radius: 0.5rem (8px)
```

#### Forms
```
Inputs: 44px min height (touch-friendly)
Labels: Always visible (no floating labels)
Validation: Inline, immediate feedback
```

---

## Layout Structure

### Grid System
- **Mobile**: Single column, full-width
- **Tablet**: 2 columns where appropriate
- **Desktop**: 3-column max (sidebar + main + auxiliary)

### Navigation
- **Mobile**: Bottom navigation bar (thumb-friendly)
- **Desktop**: Left sidebar (collapsible)
- **Max 5 items**: Dashboard, Commands, Settings, Logs, Help

### Page Structure
```
┌─────────────────────────────────┐
│ Header (always visible)         │
│ - Logo / Title                  │
│ - Status indicators             │
│ - Session info                  │
├─────────────────────────────────┤
│                                 │
│ Main Content Area               │
│ (scrollable)                    │
│                                 │
│ - Clear hierarchy               │
│ - Generous whitespace           │
│ - Focused tasks                 │
│                                 │
├─────────────────────────────────┤
│ Bottom Nav (mobile)             │
│ or Footer (desktop)             │
└─────────────────────────────────┘
```

---

## Interaction Patterns

### Loading States
1. **Skeleton screens** for initial load (CSS only, no spinners)
2. **Inline progress** for actions (e.g., "Executing...")
3. **Toast notifications** for completion/errors (auto-dismiss)

### Error Handling
1. **Inline validation** - Show errors near the field
2. **Error boundaries** - Graceful degradation
3. **Retry options** - Always offer a way forward

---

## Data Visualization (Victory Charts)

### Mobile-First Chart Design

**Victory** is the official charting library for cross-platform support:
- Web (Remix.js)
- React Native (iOS/Android)
- Electron (Desktop)

### Chart Guidelines

#### Touch Interactions
```typescript
// Victory provides built-in mobile gestures
<VictoryChart
  containerComponent={
    <VictoryZoomContainer
      zoomDimension="x"        // Horizontal zoom
      allowPan={true}          // Swipe to pan
      allowZoom={true}         // Pinch to zoom
      minimumZoom={{ x: 1 }}
    />
  }
>
  <VictoryLine data={waveformData} />
</VictoryChart>
```

#### Responsive Sizing
- **Mobile**: Full-width charts (375px - 20px padding)
- **Tablet**: 60-80% width with legends
- **Desktop**: Max 800px width

#### Performance
- **Code Splitting**: Lazy load charts only when needed
- **Data Points**: Limit to 1000 points for smooth interaction
- **Downsampling**: For waveforms > 10k samples

### Color Scheme for Charts

```css
/* Match cyberpunk theme */
--chart-primary: #00ffff;     /* Cyan - main data line */
--chart-secondary: #ff00ff;   /* Magenta - comparison */
--chart-accent: #00ff88;      /* Green - success threshold */
--chart-warning: #ffaa00;     /* Orange - warning threshold */
--chart-grid: rgba(255, 255, 255, 0.1);  /* Subtle grid */
```

### Guided Workflow UI

Multi-step wizards for PM3 operations:

#### Progress Indicator
```
[✓] Tune Antenna → [●] Read Card → [ ] Write Target
```

#### Step Navigation
- **Mobile**: Full-screen steps, clear back/next buttons (bottom)
- **Desktop**: Sidebar with step list, main area for content
- **Validation**: Disable "Next" until step requirements met

#### Touch-Optimized Actions
```
┌─────────────────────────────────┐
│ Step 2: Read Source Card        │
├─────────────────────────────────┤
│                                 │
│ [Large icon: Card on reader]   │
│                                 │
│ Place card on Proxmark3         │
│ antenna and tap button below    │
│                                 │
│  ┌───────────────────────────┐ │
│  │    Read Card (44px)       │ │  ← Touch target
│  └───────────────────────────┘ │
│                                 │
│ [Progress: 0 of 64 blocks]     │
│                                 │
├─────────────────────────────────┤
│ [Back]              [Next →]   │  ← Navigation
└─────────────────────────────────┘
```
4. **Clear messages** - Explain what happened and why

### Real-Time Updates (SSE)
1. **Status badges** - Live connection indicator
2. **Notification dot** - New events available
3. **Auto-update** - Background refresh without disruption
4. **Rate limiting** - Debounce rapid updates

### Command Execution Flow
```
1. User enters command
2. Instant visual feedback (disable button, show "Executing...")
3. Command sent to backend
4. Progress indication (if long-running)
5. Result display (success/error with output)
6. Re-enable interface
```

---

## Page Specifications

### 1. Dashboard (`/`)
**Purpose**: Quick status overview, jump to common actions

**Content**:
- System status card (CPU temp, memory, disk)
- PM3 connection status
- UPS battery level (if present)
- Quick actions (Scan, Clone, Settings)
- Recent activity log (last 5 commands)
- Update notification (if available)

**Layout**: 2-3 cards on mobile (stacked), 3-4 cards on desktop (grid)

### 2. Commands (`/commands`)
**Purpose**: Execute PM3 commands with guided workflows

**Tabs**:
- **Quick Actions**: Buttons for common commands (hw status, hf search, lf search)
- **Custom**: Text input for advanced users
- **Wizards**: Step-by-step guides (Clone Card, Format T5577, etc.)

**Output**: Monospace terminal-style display with syntax highlighting

### 3. Settings (`/settings`)
**Purpose**: Configure system behavior

**Sections**:
- Wi-Fi (mode selection, credentials)
- Updates (auto-update toggle, check now)
- Session (timeout setting, current session info)
- Backup (schedule, restore)
- Security (auth enable, HTTPS)
- Advanced (PM3 device path, timeouts)

**Layout**: Accordion on mobile, tabs on desktop

### 4. Logs (`/logs`)
**Purpose**: View command history and system logs

**Features**:
- Filterable table (date, command, status)
- Export option (CSV)
- Clear history button (with confirmation)

### 5. Help (`/help`)
**Purpose**: Embedded documentation

**Content**:
- Quick start guide
- Common PM3 commands
- Troubleshooting
- Link to full documentation

---

## Accessibility (a11y)

### WCAG 2.1 AA Compliance
- **Color contrast**: 4.5:1 minimum for text
- **Keyboard navigation**: All interactive elements reachable
- **Focus indicators**: Clear, visible focus styles
- **ARIA labels**: Meaningful labels for screen readers
- **Alt text**: All images/icons have descriptions

### Touch Targets
- **Minimum size**: 44x44px
- **Spacing**: 8px minimum between targets
- **Feedback**: Visual response to all interactions

---

## Performance Optimization

### CSS Strategy
```
✅ DO:
- Use vanilla CSS (no framework overhead)
- CSS Grid & Flexbox for layouts
- CSS variables for theming
- Minimal animations (transform/opacity only)
- Mobile-first media queries

❌ DON'T:
- Heavy CSS frameworks (Bootstrap, Material UI)
- Web fonts (use system fonts)
- Complex animations (drains CPU)
- Excessive shadows/gradients
- Unused CSS
```

### JavaScript Strategy
```
✅ DO:
- Remix SSR (minimal client JS)
- Progressive enhancement
- Code splitting by route
- Debounce user input
- Use native APIs where possible

❌ DON'T:
- Heavy libraries (moment.js, lodash)
- Polyfills for modern browsers only
- Unnecessary dependencies
- Client-side rendering (use SSR)
- Global state (use URL/forms)
```

### Image Strategy
```
✅ DO:
- Inline SVG icons (<2KB each)
- System emoji for decorative elements
- Lazy loading for below-fold images
- Serve WebP with fallbacks

❌ DON'T:
- Icon fonts (Flash of Unstyled Text)
- Large images (compress heavily)
- Unoptimized assets
- Background images (use CSS colors)
```

---

## Dark Mode

### Implementation
- **System preference detection**: `prefers-color-scheme`
- **Manual toggle**: Persisted in localStorage
- **CSS variables**: Single source of truth for colors
- **No flash**: SSR with cookie-based preference

### Colors
```css
:root {
  /* Light mode (default) */
  --color-bg: #ffffff;
  --color-surface: #f9fafb;
  --color-text: #111827;
}

@media (prefers-color-scheme: dark) {
  :root {
    --color-bg: #1f2937;
    --color-surface: #111827;
    --color-text: #f9fafb;
  }
}
```

---

## Mobile Considerations

### Touch-First Design
- Large buttons (44x44px minimum)
- Bottom navigation (thumb zone)
- Swipe gestures (optional, enhance)
- Avoid hover-only interactions

### Viewport
```html
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5">
```

### PWA Support
- Add to home screen
- Offline fallback page
- Service worker for caching
- App manifest

---

## Development Checklist

### Before Committing
- [ ] Lighthouse score > 90 (Performance, A11y, Best Practices)
- [ ] Works without JavaScript
- [ ] Mobile responsive (320px - 1920px)
- [ ] Dark mode tested
- [ ] Keyboard navigation works
- [ ] Screen reader tested
- [ ] Bundle size < 150KB gzipped

### Testing Devices
- iPhone SE (375px width)
- iPad Mini (768px width)
- Desktop (1280px+ width)

---

## Quick Reference

### Breakpoints
```css
sm: 640px   /* Tablets */
md: 768px   /* Small laptops */
lg: 1024px  /* Desktop */
```

### Animation Durations
```css
fast:   150ms /* Hovers, simple transitions */
normal: 250ms /* Most UI animations */
slow:   350ms /* Page transitions */
```

### Z-Index Scale
```css
base:    0   /* Normal content */
dropdown: 10  /* Dropdowns, tooltips */
modal:   100  /* Modals, dialogs */
toast:   200  /* Notifications */
```

---

## Resources

- **Remix Docs**: https://remix.run/docs
- **CSS Grid**: https://css-tricks.com/snippets/css/complete-guide-grid/
- **A11y Checklist**: https://www.a11yproject.com/checklist/
- **Performance Budget**: https://web.dev/performance-budgets-101/

---

## Example Component: Status Badge

```css
/* Lightweight, semantic, accessible */
.status-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.25rem 0.75rem;
  border-radius: 9999px;
  font-size: 0.875rem;
  font-weight: 500;
}

.status-badge--success {
  background: #d1fae5;
  color: #065f46;
}

.status-badge--error {
  background: #fee2e2;
  color: #991b1b;
}
```

```jsx
<span className="status-badge status-badge--success" role="status">
  <span aria-hidden="true">●</span>
  Connected
</span>
```

**Why it's good**:
- Semantic HTML
- CSS-only styling (no JS)
- Accessible (role="status")
- Visual and text indicator
- Small footprint (~100 bytes)
