Propuesta · 5 nov 2026

Panel: un sistema de diseño propio para la administración de la tienda

He revisado las 66 pantallas del admin (≈17.000 líneas en src/app/(app)/admin y src/components/admin). Funciona bien, pero sus piezas vienen de la tienda y cada pantalla resuelve a mano lo que debería ser un componente. Esta propuesta separa el tema del admin, fija una escala densa para trabajo diario, añade los componentes que faltan y reorganiza el menú de 39 a 13 entradas.

Tema Densidad Marca de la tienda

Todo lo de esta página es interactivo y responde a estos tres controles: el color de marca es lo único que el admin toma de la tienda.

01 · Diagnóstico

Qué he encontrado

Datos sacados del código actual de la rama tienda-fases-0-7. Lo bueno se conserva: el marco con menú agrupado, Ctrl K, contadores de pendientes, AdminHeader en 67 pantallas y una buena base de accesibilidad.

02 · Principios

Cinco reglas para decidir

1 · Lo pendiente, primero

El inicio es una bandeja de trabajo antes que un informe. Cada número lleva a la lista ya filtrada.

2 · Denso pero respirable

Controles de 36 px (32 en compacto), texto base de 14 px y tablas de 48/38 px. Herramienta de trabajo, no escaparate.

3 · Color con significado

Neutros para la estructura, marca para la acción principal y cinco tonos de estado. Nada de ámbar o rojo escritos a mano.

4 · Un componente por problema

Si dos pantallas lo hacen, es un componente: filtros, selección masiva, confirmación, toast, campos.

5 · El admin no hereda la tienda

Cambiar la plantilla de la tienda (Nórdico, Lujo…) no puede romper el panel. Solo se comparte el color de marca.

6 · Teclado y accesibilidad

Todo alcanzable con teclado, contraste AA en ambos temas y el estado nunca solo por color: punto + texto.

03 · Demo

El dashboard con el sistema aplicado

Tres pantallas navegables: Inicio, Pedidos (pestañas de vista, filtros, selección masiva) y Pedido #1284 (progreso, historial, reembolso con confirmación). Prueba ⌘K / Ctrl K, el modo oscuro y la densidad compacta. Datos de ejemplo.

tienda.example/adminAbrir en otra pestaña
04 · Color

Tokens semánticos, no colores

Dos capas: primitivas (solo dentro de ds.css) y tokens con nombre de función, que son lo único que usan los componentes. El tema oscuro se elige token a token, no se invierte.

Superficies, bordes y texto

Marca (viene de la tienda)

Estados

TonoUsoMuestraTokens
neutralBorrador, archivado, reembolsado, sin datosBorrador--neutral-fg/bg/bd/solid
infoActivo, en curso, pagado, novedadesPagado--info-* (deriva de la marca)
successCompletado, enviado, entregado, subidasEntregado--success-*
warningRequiere acción pronto: pago pendiente, poco stockPendiente de pago--warning-*
dangerError, fallido, cancelado, acciones destructivasPago fallido--danger-*
violetFase de trabajo interna: en preparación, producciónEn preparación--violet-*
✓ HazloUsa text-warning-fg / bg-warning-bg o directamente <Badge tone="warning">.
✕ Evítalobg-amber-100 text-amber-900 escrito en la pantalla: no cambia con el tema oscuro y hoy aparece 31 veces.
05 · Tipografía

Ocho roles tipográficos, sin tamaños sueltos

Inter con cifras tabulares en tablas e importes. Sin tamaños arbitrarios (text-[11px] aparece 11 veces hoy) ni cuatro variantes de interletrado para el mismo rótulo.

RolMuestraTamaño / pesoDónde
display48.210 €30 / 650Cifra principal de un informe
titlePedidos24 / 650Título de pantalla (h1), uno por página
metric18628 / 650 · tabularValor de KPI
headingÚltimos pedidos16 / 600 (14 en tarjeta)Cabecera de tarjeta o sección (h2/h3)
bodySe ha avisado al cliente por email.14 / 400Texto general, celdas
smallEtiquetas de campo y botones13 / 500–550Controles, etiquetas, tablas compactas
captionHoy, 18:04 · Web12 / 400Metadatos, ayudas, ejes
overlineRequiere atención11 / 600 · 0,06 em · mayúsculasRótulo de grupo (menú, secciones)
06 · Espacio, forma y densidad

Base 4, cuatro radios, dos densidades

Hoy conviven 6 alturas de control (32–48 px), cinco radios y separaciones de página space-y-4/5/6/8. Se reduce a una escala cerrada.

Espacio
Radios
xs · 4 chips, kbd, casillas
sm · 6 botones, campos
md · 8 menús, avisos, toasts
lg · 12 tarjetas, diálogos
full badges, avatares
Densidad
CómodaCompacta
Control3632
Control sm3026
Fila de tabla4838
Relleno tarjeta2016
Margen página3224

Preferencia por usuario. En móvil, los objetivos táctiles crecen a 44 px.

Elevación

xs
Tarjetas, controles
sm
Elemento activo
md
Popover, arrastre
lg
Diálogo, menú, toast
07 · Componentes

Botones

Una sola acción primaria por zona. El tamaño por defecto del admin baja de 44 px (el de la tienda) a 36 px. Se añade la variante danger: hoy el diálogo de confirmación la fabrica sobrescribiendo clases.

Variantes
Tamaños e iconos
Estados

Formularios

Etiqueta arriba, ayuda debajo, error con icono. Hoy hay 58 <input> sin componente (casillas, radios, interruptores hechos a mano): se crean Checkbox, Radio, Switch y Field.

Aparece en la ficha, el carrito y los emails.
€
Sin espacios: usa guiones (CAM-ORG).
/productos/
Cambios sin guardar

Estados y badges

Un badge = punto + texto, nunca solo color. Forma redonda para el estado del pedido (el flujo), cuadrada para atributos secundarios (pago, canal). Los estados personalizados de la tienda usan custom con su propio color en el punto.

Estado del pedido
BorradorPendiente de pagoPagadoEn preparaciónEnviadoEntregadoReembolsadoCanceladoPago fallido
Estados personalizados (color elegido por la tienda)
Esperando proveedorListo para recogerEn taller
Atributos, contadores y teclas
PagadoManualBIENVENIDA101231⌘KLMAR
Progreso del pedido
RecibidoPagado3En preparación4Enviado5Entregado

KPIs y gráficos

Etiqueta → valor → variación con signo y flecha (no solo color) → contexto → minigráfico. Una sola serie en color de marca; la comparación en gris discontinuo; tooltip con ratón y teclado (flechas).

Ventas netas
Diarias, últimos 30 días
Este periodoAnterior
✓ HazloUn eje, una serie destacada, cuadrícula tenue y una vista de tabla para quien la necesite.
✕ EvítaloDos ejes Y, arcoíris de colores por serie o el color de estado (rojo/verde) para pintar series.

Tablas y listas

Un único patrón de listado para todas las pantallas: pestañas de vista (filtros guardados con recuento) → barra de búsqueda y filtros en chips → tabla con cabecera fija, ordenación y selección → barra de acciones masivas flotante → paginación. Ver la demo de Pedidos.

Producto EstadoStockPrecio
Camiseta de algodón orgánico
6 variantes · Ropa
Publicado13224,90 €
Mochila urbana impermeable
2 variantes · Accesorios
Publicado289,00 €
Gorra bordada
1 variante · Accesorios
Borrador019,00 €
3 de 48 productos
Aún no hay productosCrea el primero o impórtalos desde un CSV.
3 seleccionados

Avisos y confirmaciones

Hoy hay 19 window.confirm() y 36 mensajes role="status" sueltos bajo los botones. Se sustituyen por un diálogo de confirmación que explica la consecuencia y por toasts globales (con «Deshacer» cuando se pueda).

Modo de prueba
Los pagos de Stripe no se cobran de verdad.
Dominio verificado
Apple Pay y Google Pay ya están activos.
Faltan datos fiscales
Complétalos para poder emitir facturas. Completar
Disputa abierta
Aporta pruebas antes del 12 de noviembre o se perderá el importe.
08 · Patrones

Cuatro plantillas cubren las 66 pantallas

Cada pantalla elige una; así desaparecen los 68 px-6 py-6 con space-y distinto y los márgenes salen del marco.

Cabecera
Bandeja pendiente
KPIs + gráfico
Listas
ResumenInicio, Informes, Estado del sistema
Cabecera + acciones
Pestañas de vista
Filtros
Tabla + acciones masivas
ListaPedidos, Productos, Clientes, Reseñas, Emails… (≈30)
Cabecera + estado + acción principal
Contenido + historial
Panel lateral
DetallePedido, Cliente, Devolución, Ticket, Factura
Cabecera
Índice
Secciones del formulario
Barra fija: guardar / descartar
FormularioProducto, Ajustes, Plantillas, Métodos de pago
09 · Plan

Cómo llevarlo al código

Por fases, cada una entregable sola y sin romper pantallas. Todo genérico (nada de la tienda en src/).

1
Tokens y tema propio del admin
  • Bloque [data-surface="admin"] en globals.css con los tokens de esta página (claro y oscuro); la plantilla de la tienda solo aporta --brand.
  • Ampliar tailwind.config.ts: success/warning/danger/info/violet con -fg/-bg/-bd/-solid, surface-2, sunken, text-2/3, sombras xs–lg, radios xs–lg.
  • Sustituir los 31 amber-* y los text-[11px].
2
Primitivas revisadas
  • Button: tamaño admin 36 px, variantes danger y danger-soft, prop loading.
  • Badge con prop tone + punto; OrderStatusBadge usa los seis tonos y los estados personalizados su color.
  • Nuevos: Field, Checkbox, Radio, Switch, Segmented, Tooltip, DropdownMenu, Dialog (Radix ya está instalado).
3
Feedback global
  • <Toaster> en el marco y useConfirm(); retirar los 19 window.confirm y los mensajes sueltos.
4
Marco y menú
  • AdminShell: barra superior con migas, búsqueda, avisos, tema; menú de 13 entradas con subpantallas de la sección activa (admin-nav.ts pasa a árbol).
  • Preferencias de tema y densidad guardadas por usuario.
5
Plantillas de pantalla
  • AdminPage (resumen/lista/detalle/formulario) sustituye los px-6 py-6.
  • ListView: pestañas de vista, filtros en chips, selección y acciones masivas, paginación. Migrar Pedidos, Productos y Clientes primero.
  • Inicio rediseñado como en la demo; ficha de pedido con progreso e historial.
6
Verificación
  • E2E de las pantallas migradas en claro/oscuro y móvil; npm run build; revisión de contraste AA con axe.

Archivos de esta propuesta: docs/design-system/admin/ (ds.css = tokens y componentes de referencia, dashboard.html = demo, esta página).