bridge-app

bridge-app — Visión de Diseño

Qué es bridge-app

Una webapp mobile-first que reemplaza Termius. Te conectás a tus sesiones tmux desde el navegador con una UI táctil amigable. El caso de uso principal es “estoy en el celular y necesito ver/controlar mis sesiones de tmux en la VPS”.

Core loop: Login → ver sidebar con sesiones tmux → click en una → ver terminales funcionando con xterm.js → toolbar táctil para teclas que no están en el teclado mobile.

Audiencia & contexto

Stack visual

Rutas y vistas

/login

/sessions (Dashboard)

Sidebar content:

Main content cuando no hay sesión seleccionada:

/sessions/$sessionId (Detalle de sesión)

Sistema de componentes

Componentes de Layout

| Componente | Props | Descripción | |—|—|—| | AppShell | children | Layout principal con sidebar + main. Maneja responsive breakpoints | | TopBar | — | Barra superior con user menu. Solo visible en desktop/tablet | | Sidebar | open, onClose | Panel lateral con lista de sesiones. Drawer en mobile, fixed en desktop |

Componentes de Sesión

| Componente | Props | Descripción | |—|—|—| | SessionList | sessions, activeId, onSelect | Lista de sesiones con estados: loading, empty, error, data | | SessionCard | session, active, onClick | Card expandible con nombre, ventanas, indicadores | | WindowTabs | windows, activeId, onSelect | Tabs horizontales para cambiar de ventana | | PaneGrid | panes, layout | Grid responsivo de panes según layout de tmux | | CreateSessionButton | — | FAB o botón en sidebar para crear sesión |

Componentes de Terminal

| Componente | Props | Descripción | |—|—|—| | TerminalView | sessionId, windowId, paneId, token | Instancia de xterm.js + WebSocket. Maneja ciclo de vida | | TerminalTabs | terminals | Múltiples terminales en tabs (si el usuario abre varios panes) | | MobileToolbar | onKey, visible | Barra táctil fija abajo. Solo en mobile |

Componentes de Auth

| Componente | Props | Descripción | |—|—|—| | LoginForm | — | Formulario de login auto-contenido | | ProtectedRoute | children | Redirect a /login si no hay token |

Componentes UI base

Design tokens (Tailwind v4)

Definir en globals.css con @theme:

Estados por componente

Cada componente que carga datos debe contemplar:

  1. Loading — skeleton/spinner mientras se resuelve la query/WS
  2. Empty — estado vacío con CTA (ej: “No sessions” + botón crear)
  3. Error — mensaje de error + botón retry
  4. Data — los datos renderizados normalmente

Interacciones touch clave (mobile)

  1. Sidebar drawer: swipe right desde el borde izquierdo abre el sidebar. Swipe left o tap fuera lo cierra. También botón hamburger en top-left.
  2. MobileToolbar:
    • Barra fija en el bottom, altura ~44px
    • Botones con mínimo 44x44px touch target
    • Long-press en Ctrl/Alt → “sticky mode” (el botón queda presionado visualmente hasta que se toca de nuevo)
    • Swipe up en la toolbar → revela fila extendida con /, :, -, Space, Enter
  3. Window tabs: scroll horizontal nativo con overflow-x: auto, snap points opcionales
  4. Terminal focus: tap en cualquier parte del terminal para enfocar (y mostrar toolbar si está oculta)
  5. Pinch-to-zoom: deshabilitado en el terminal (touch-action: none en el contenedor de xterm.js)

Tema

Lo que NO necesita diseño (por ahora)

Entregables esperados

  1. Design system en Tailwind v4: tokens, colores, tipografía, spacing, border-radius
  2. Componentes base: Button, Input, Modal, Spinner con todas las variantes y estados
  3. Layout responsive: AppShell que funcione en los 3 breakpoints
  4. MobileToolbar: estilizado y con estados visuales (normal, hover/active, sticky-enabled)
  5. TerminalView skeleton: wrapper para xterm.js con su scrollbar y resize
  6. LoginForm: centrado, accesible, con estados de error