10 KiB
10 KiB
ADM-001 / ADM-002 / ADM-003 — Design
1. Design System
Palette
| Token | Hex | Uso |
|---|---|---|
--color-primary |
#2D6A4F |
Acciones principales |
--color-primary-hover |
#1B4332 |
Hover primary |
--color-danger |
#DC2626 |
Acciones destructivas |
--color-warning |
#D97706 |
Estados de atención |
--color-success |
#059669 |
Confirmaciones, éxito |
--color-bg |
#F9FAFB |
Fondo de página |
--color-surface |
#FFFFFF |
Tarjetas, panels |
--color-border |
#E5E7EB |
Bordes |
--color-text |
#111827 |
Texto principal |
--color-muted |
#6B7280 |
Texto secundario |
Typography
- Headings:
Playfair Display(fuente de marca) o fallbackserif - Body/UI:
Inter(fuente del storefront) o fallbacksans-serif - Monospace (SKU, IDs):
font-mono
Spacing
- Base unit: 4px
- Consistent: 4, 8, 12, 16, 24, 32, 48px
Border radius
- Buttons/inputs:
rounded-lg(8px) - Cards:
rounded-xl(12px) - Modals:
rounded-2xl(16px)
2. Login Page Design
Desktop (≥1024px)
┌─────────────────────────────────────┐
│ │
│ 🌿 MercadoDeVida │
│ ───────────────── │
│ │
│ Iniciar sesión │
│ │
│ Email │
│ ┌─────────────────────────┐ │
│ │ tu@email.com │ │
│ └─────────────────────────┘ │
│ │
│ Contraseña │
│ ┌─────────────────────────┐ │
│ │ •••••••• │ │
│ └─────────────────────────┘ │
│ │
│ ┌─────────────────────────┐ │
│ │ Iniciar sesión │ │
│ └─────────────────────────┘ │
│ │
└─────────────────────────────────────┘
- Centrado vertical y horizontalmente
- Card blanca con sombra suave
- Logo de marca
- Inputs: border gris, focus ring verde
- Botón: full-width, verde primary
Mobile (< 768px)
- Padding lateral 24px
- Mismo layout, inputs 100% del card
States
Loading: Botón deshabilitado con spinner Error: Card con border rojo, mensaje debajo del form Success: Redirect inmediato
3. Admin Shell Design
Desktop (≥1024px)
┌─────────────────────────────────────────────────────────────┐
│ 🌿 MercadoDeVida Admin admin@mdv.es [Logout] │
├──────────┬──────────────────────────────────────────────────┤
│ │ │
│ Dashboard│ [Page Title] [+ Nueva acción] │
│ 📦 Productos│ ─────────────────────────────────────────── │
│ 🧾 Pedidos│ │
│ 📊 Inventario│ [Content Area] │
│ 👥 Clientes│ │
│ 🏷 Categorías│ │
│ 🏷 Marcas│ │
│ 🏷 Promociones│ │
│ ⭐ Reseñas│ │
│ 📄 CMS │ │
│ ⚙ Ajustes│ │
│ │ │
│ ├──────────────────────────────────────────────────┤
│ │ © 2026 MercadoDeVida. Panel de administración. │
└──────────┴──────────────────────────────────────────────────┘
- Sidebar: 240px fija, bg white, border-right
- Header: 64px, bg white, sticky top
- Content: bg
--color-bg, padding 32px - Footer: minimal copyright
Tablet (768px – 1023px)
- Sidebar colapsa a 64px (solo iconos)
- Toggle para expandir
Mobile (< 768px)
- Sidebar como drawer overlay desde la izquierda
- Hamburger button en header
- Overlay oscuro al abrir drawer
Navigation Items
| Icon | Label | Permission | Badge (opcional) |
|---|---|---|---|
| 📊 | Dashboard | (dashboard) | |
| 📦 | Productos | products.read | |
| 🧾 | Pedidos | orders.read | 3 (pendientes) |
| 📊 | Inventario | inventory.read | |
| 👥 | Clientes | customers.read | |
| 🏷️ | Categorías | categories.read | |
| 🏷️ | Marcas | brands.read | |
| 🏷️ | Promociones | promotions.read | |
| ⭐ | Reseñas | reviews.read | 5 (pendientes) |
| 📄 | CMS | cms.read | |
| ⚙️ | Ajustes | (settings) |
Active state: bg primary/10, text primary, left border 3px primary
4. Status Colors (Accessible)
| Status | Color | Pattern |
|---|---|---|
| Active | Green | bg-green-100 text-green-800 |
| Inactive | Gray | bg-gray-100 text-gray-600 |
| Pending | Amber | bg-amber-100 text-amber-800 |
| Paid | Green | bg-green-100 text-green-800 |
| Processing | Blue | bg-blue-100 text-blue-800 |
| Shipped | Indigo | bg-indigo-100 text-indigo-800 |
| Delivered | Green | bg-green-100 text-green-800 |
| Cancelled | Red | bg-red-100 text-red-800 |
| Refunded | Purple | bg-purple-100 text-purple-800 |
⚠️ Usar ALWAYS el label junto al color, nunca solo el color.
5. Component Library (Admin Primitives)
Button
<Button variant="primary" size="md" loading={saving} onClick={save}>
Guardar
</Button>
<Button variant="danger" onClick={confirmDelete}>
Eliminar
</Button>
<Button variant="ghost" onClick={cancel}>
Cancelar
</Button>
Input / Textarea
<Input
label="Nombre del producto"
value={name}
onChange={setName}
error={errors.name}
required
/>
<Textarea
label="Descripción"
value={description}
onChange={setDescription}
rows={4}
/>
DataTable
Props: columns, data, pagination, onSort, onFilter, loading, empty, error
<DataTable
columns={columns}
data={products}
pagination={{ page, total, onPageChange }}
loading={isLoading}
/>
Dialog (Confirmation)
<Dialog
open={confirming}
title="Confirmar eliminación"
description="Esta acción no se puede deshacer."
confirmLabel="Eliminar"
variant="danger"
onConfirm={delete}
onCancel={() => setConfirming(false)}
/>
Badge
<Badge variant="success">Activo</Badge>
<Badge variant="warning">Pendiente</Badge>
<Badge variant="error">Cancelado</Badge>
Skeleton
<TableSkeleton rows={10} columns={4} />
<FormSkeleton fields={5} />
6. Error States
| State | Visual | Action |
|---|---|---|
| Loading | Skeleton que refleja la estructura | Ninguna |
| Empty | Ilustración + "No hay datos" | CTA si aplica |
| Error | Icono error + mensaje + retry btn | Botón retry |
| 403 | Icono candado + "Sin permisos" | Volver atrás |
| 404 | Icono búsqueda + "No encontrado" | Volver atrás |
7. Toast Notifications
// Success
toast.success('Producto guardado correctamente');
// Error
toast.error('Error al guardar. Intenta de nuevo.');
// Warning
toast.warning('Este campo es requerido.');
// Position: top-right
// Duration: 4s
// Dismissible
8. Responsive Strategy
| Breakpoint | Admin Layout | Tables | Forms |
|---|---|---|---|
| 1440px | Sidebar 240px | All columns | Full layout |
| 1280px | Sidebar 240px | All columns | Full layout |
| 1024px | Sidebar collapsed 64px | Scroll horizontal | Full layout |
| 768px | Sidebar as drawer | Cards, no table headers | Stacked fields |
| 430px | Sidebar as drawer | Cards | Full width inputs |
9. Accessibility
- All interactive elements keyboard-navigable
- Focus ring visible en todos los elementos
- ARIA labels en iconos sin texto
- Error messages linked via
aria-describedby - Color contrast ≥ 4.5:1 para texto
- Tables con
scope="col"headers - Dialogs con
role="dialog"y focus trap