Vera
Sistema de diseño · v0.3

El sistema completo.

Tokens, tipografía, componentes y patrones. Renderizado en vivo desde el código. Cambia con el sistema.

Light & Dark · v0.3 — Premium Product
I

Las referencias.

El bar. Los productos contra los que este sistema se mide, con la contribución específica de cada uno.

ReferenciaQué tomamos
LinearSuperficies, motion snap, dark mode maestro. La UI premium del era actual.
Cal.comVocabulario moderno de booking. Prueba de que scheduling puede sentirse premium.
CronPrecisión tipográfica a tamaños pequeños. Tratamiento glass de las superficies.
MercuryRestraint de grado bancario. Paleta neutra confiada. Premium por tipografía.
VercelPureza geométrica. Geist como tipografía workhorse en todo el producto.
ArcMicrointeracciones pulidas. El nivel de detalle que separa «diseñado» de «premium».
RaycastCommand palette. Diseño keyboard-first. Timing de animación rápido.
One MedicalUI de salud que no se siente clínica. Cálido sin ser blando.
II

Color.

Todos los colores se definen en OKLCH para uniformidad perceptual entre temas. El acento es un solo color — terracota — usado con disciplina: máximo tres elementos por viewport.

Modo claro

Superficies
--bgoklch(0.985 0.002 250)#FAFAFB
--bg-raisedoklch(1.000 0 0)#FFFFFF
--bg-sunkenoklch(0.965 0.003 250)#F3F4F5
--bg-overlayoklch(0.995 0.001 250)#FCFCFD
Ink
--inkoklch(0.18 0.005 250)#16181C
--ink-softoklch(0.32 0.005 250)#2E3239
--ink-faintoklch(0.48 0.005 250)#545962
--mutedoklch(0.58 0.005 250)#717680
Líneas
--ruleoklch(0.92 0.003 250)#E5E6E8
--rule-strongoklch(0.85 0.005 250)#D2D4D7
--rule-faintoklch(0.95 0.003 250)#EFF0F1
Acento
--accentoklch(0.52 0.17 32)#A6402F
--accent-softoklch(0.62 0.15 32)#C46550
--accent-paleoklch(0.94 0.025 32)#F5E8E3
--accent-inkoklch(0.99 0.005 32)#FCFAF9
Semántica
--successoklch(0.58 0.13 150)#4E8B5C
--warningoklch(0.72 0.14 75)#BE9028
--dangeroklch(0.55 0.20 27)#B33B26

Modo oscuro

Los swatches de abajo aplican .theme-dark localmente, así puedes verlos en su valor oscuro sin cambiar el tema de la página.

Superficies
--bgoklch(0.17 0.005 250)#1B1D21
--bg-raisedoklch(0.21 0.005 250)#25272B
--bg-sunkenoklch(0.14 0.005 250)#16181B
--bg-overlayoklch(0.24 0.005 250)#2C2E33
Ink
--inkoklch(0.96 0.003 250)#F2F3F5
--ink-softoklch(0.82 0.003 250)#CFD0D3
--ink-faintoklch(0.65 0.005 250)#9CA0A6
--mutedoklch(0.55 0.005 250)#7C808A
Líneas
--ruleoklch(0.28 0.005 250)#3D4045
--rule-strongoklch(0.38 0.005 250)#55585E
--rule-faintoklch(0.22 0.005 250)#2D2F33
Acento
--accentoklch(0.68 0.17 32)#D87560
--accent-softoklch(0.58 0.15 32)#B85F4A
--accent-paleoklch(0.30 0.05 32)#4A2A23
--accent-inkoklch(0.12 0.005 32)#1A1614
Semántica
--successoklch(0.72 0.13 150)#7FB088
--warningoklch(0.80 0.14 75)#D9B056
--dangeroklch(0.70 0.20 27)#D86A52
III

Superficies y elevación.

El sistema de superficies es la identidad visual primaria. La profundidad viene del contraste entre --bg y --bg-raised, no de sombras.

--bgCanvas base
--bg-sunkenSumergido
--bg-raisedElevado
--bg-overlayFlotante
--bgCanvas base
--bg-sunkenSumergido
--bg-raisedElevado
--bg-overlayFlotante

Sombras (solo modo producto, superficies flotantes)

--shadow-sm
--shadow-md
--shadow-lg
--shadow-xl
IV

Tipografía.

Dos tipografías. Geist Sans para todo: UI, marketing, contenido. Geist Mono para numéricos, código y contenido técnico. La jerarquía se construye con peso, tamaño y tracking.

Tipo display

Reservas para profesionales independientes.

Escala de tipos

--text-2xs11pxEtiqueta o atajo de teclado
--text-xs12pxEtiqueta de sección · uppercase
--text-sm13pxTexto terciario
--text-base14pxCuerpo del producto por defecto
--text-md15pxCuerpo ligeramente enfatizado
--text-lg16pxApertura · UI prominente
--text-xl18pxh5 · título de tarjeta
--text-2xl22pxh4
--text-3xl28pxh3
--text-4xl36pxh2
--text-5xl48pxh1
--text-6xl64pxHero
--text-7xl80pxVera

Pesos

400Regular
Aa Geist Sans 0123
500Medium
Aa Geist Sans 0123
600Semibold
Aa Geist Sans 0123
700Bold
Aa Geist Sans 0123

Mono

ServicioDuraciónPrecio
Consulta inicial60 min$1,200 MXN
Sesión de seguimiento45 min$900 MXN
Valoración rápida20 min$500 MXN
V

Espaciado.

Unidad base de 4 píxeles. Los componentes referencian tokens nombrados, nunca valores crudos. Las superficies de producto premium son más densas que las editoriales — el whitespace es para momentos.

--space-14px
--space-28px
--space-312px
--space-416px
--space-520px
--space-624px
--space-832px
--space-1040px
--space-1248px
--space-1664px
--space-2080px
--space-2496px
VI

Radios.

Cinco valores. No hay --radius-none — todo en este sistema tiene al menos un radio sutil. Ángulos rectos leen utilitario.

--radius-xs4px
--radius-sm6px
--radius-md8px
--radius-lg12px
--radius-xl16px
VII

Movimiento.

Snap-tight. Linear es la referencia. Cada interacción se completa antes de que termines de pensarla.

--ease-outOut · default snappy out
--ease-snapSnap · default for most interactions
--ease-glideGlide · hero moments only
--ease-emphasisEmphasis · dramatic curve, used sparingly
DuraciónValor
--dur-instant60ms
--dur-quick100ms
--dur-base180ms
--dur-snap240ms
--dur-smooth400ms
--dur-ambient800ms
VIII

Microinteracciones.

Los detalles que separan «bien diseñado» de «se siente premium». Focus rings, selección, scrollbars, skeletons.

Focus ring
Selección

Selecciona este texto. El color del fondo usa --accent-pale y el ink usa --accent.

Scrollbar

Scroll dentro de esta caja para ver el scrollbar custom — fino, color --rule, redondeado.

Línea de relleno · 1

Línea de relleno · 2

Línea de relleno · 3

Línea de relleno · 4

Línea de relleno · 5

Línea de relleno · 6

Final de la caja.

Skeleton
IX

Iconografía.

Lucide a 1.5px de stroke. 20px standalone es el default; 16px y 24px para inline y prominent. Color heredado, nunca como única señal de interacción.

Calendar
Clock
MapPin
Phone
Mail
MessageCircle
Check
X
ArrowRight
Plus
Settings
User
Sun
Moon
Search
Command
X

Componentes.

Marcados como Implementado cuando viven en el código que renderiza esta página, o como Boceto cuando solo está documentado su contrato visual.

Foundation

Button

Implementado

Primary, secondary, ghost, destructive. Tamaños xs / sm / md / lg.

IconButton

Implementado

Botón icon-only con aria-label requerido. Tamaños xs / sm / md.

Input + Label

Implementado

Border completo, focus shifts to --accent, focus ring aparece.

Badge

Implementado

Pill con tracking ancho. Variantes neutral, accent, success, warning, danger.

NeutralAcentoConfirmadaReagendadaCancelada

Sheet · Dialog

Implementado

Bottom-sheet en móvil, modal centrado en desktop. Backdrop con blur. Usa la primitiva Dialog de @base-ui.

Vivo en DemoRibbon, BookingSheet (flujo de reserva, paso a paso), BlockTimeSheet (panel · disponibilidad), KebabMenu y la sheet de exit en /registro.

Toast · Menu

Implementado

Superficies flotantes con --bg-overlay, --shadow-md, microinteractions cuidadas. ToastProvider cuelga del layout de Vera.

Toast con cuatro tonos (default · success · warning · danger) y auto-dismiss a 4 s. Menu (KebabMenu) sobre la primitiva Menu de @base-ui en cada ServiceEditor.

Switch · SegmentedControl

Implementado

Toggle binario y toggle 2–4 opciones. Usados en LocationEditor, BlockTimeSheet, ReminderTypeToggle.

Vivos en /panel/perfil (modalidad presencial · online), /panel/disponibilidad (¿todo el día?), /panel/proximos-recordatorios (T-24h · T-2h).

Kbd

Implementado

Indicador de tecla. Geist Mono, --bg-sunken, --rule border.

Kabre el command palette

Producto · superficie de reserva

DateStrip · SlotList · BookingForm · ConfirmationCard

Implementado

Componentes del flujo de reserva. Selected state invierte color al --accent. Conflict-checks contra el slot tomado en localStorage.

Vivos en /projects/vera/dra-sofia-ramirez/reservar (5 pasos), reusados en /projects/vera/cita/[token]/reagendar.

WhatsAppPreview

Implementado

La pieza central del portafolio. Marco de iPhone con notch, status bar, header verde de WhatsApp, burbuja con tail squareada y double-check azul.

10:00
Dra. Sofía Ramírez
en línea
Tu cita está confirmada. Consulta inicial con Dra. Sofía Ramírez, jueves, 21 de mayo a las 11:00. Av. Álvaro Obregón 145, interior 304, Colonia Roma Norte. Si necesitas reagendar o cancelar, aquí: vera.app/cita/DEMO-WHATSAPP
10:00

WhatsAppDraftPreview

Implementado

Variante en modo composición — sin burbuja entrante, composer editable abajo, botones para copiar o abrir en wa.me.

Vivo en /panel/disponibilidad cuando un bloqueo afecta citas existentes — abre desde AffectedBookingsWarning.

Producto · superficie de doctora

AppointmentRow

Implementado

Fila de cita expandible inline. Tiempo en mono accent, paciente, servicio, badge de duración. Expanded revela teléfono, email, nota, y acciones efímeras.

Vivo en /projects/vera/panel · vista «Hoy». La próxima cita upcoming recibe un tinte sutil --accent-pale.

WeekCalendar

Implementado

Grid de 7 columnas × medias horas. Booking blocks absolute-positioned con barra izquierda --accent. Bloqueados con hatch diagonal. Out-of-hours --bg-sunken.

Vivo en /projects/vera/panel/semana. Tap a un bloque abre el detalle de la cita en una Sheet.

AvailabilityGrid

Implementado

Editor variant del calendario semanal — un botón por celda. Drag-to-paint con pointer-events unificados (mouse + touch). touch-action:none impide scroll de página durante el drag.

Vivo en /panel/disponibilidad y reusado en /registro paso 4 (variante compact).

NextSlotPill

Implementado

Indicador persistente: «Próxima disponibilidad jueves a las 11:00». Recomputa al hidratar incluyendo las reservas locales del visitante.

Cargando próxima disponibilidad…

CommandPalette · Kbd

Implementado

⌘K en cualquier ruta /panel/*. Filtro instantáneo, navegación con ↑↓, Enter ejecuta. Acciones: ir a hoy/semana/horarios, ver página pública, cambiar tema, limpiar datos.

Trigger:K

Producto · onboarding

OnboardingShell · OnboardingProgress

Implementado

Wrapper de seis pasos. Wordmark + barra de progreso + bottom action bar fixed en móvil, static en desktop. Sheet de confirmación al intentar salir.

Vivo en /projects/vera/registro. Diseñado para completarse en menos de dos minutos.

FloatingLabelInput · SpecialtyAutocombobox · SlugPreview

Implementado

Inputs estilo Stripe / Material 3 — la label flota arriba al focus o cuando hay valor. Slug se autogenera del nombre con un check de disponible debounced 400 ms.

Vivos en /registro pasos 2–3.

EmbeddedProfilePreview

Implementado

iframe con el perfil público real, dentro de un marco con fade gradient abajo. Cierra el círculo del onboarding mostrando lo que la doctora acaba de configurar.

Vivo en /registro paso 6 — celebración.

Marketing & meta

MarketingHero · FeatureBlock

Implementado

Compuestos de marketing. Densidad comfortable, hero scale clamp(48–80px).

Vivos en /projects/vera y /projects/vera/sobre.

ModePicker

Implementado

«Como paciente / Como doctora» — dos cards lado a lado en desktop, apiladas en móvil.

Vivo en el landing. Hover lifts border to --accent.

ThemeToggle

Implementado

Ciclo light → dark → auto. Persiste a localStorage. Sin FOUC gracias al script inline.

XI

Patrones.

Composiciones consistentes entre superficies.

Header de página

┌──────────────────────────────────────┐
│ Vera   Sobre  Sistema  ☼   Reservar  │   ← transparente arriba
└──────────────────────────────────────┘
        ↓ scroll > 40px
┌──────────────────────────────────────┐
│ Vera   Sobre  Sistema  ☼   Reservar  │   ← bg/0.8 + blur
└──────────────────────────────────────┘

Sticky on scroll. Transparente arriba; aplica --bg/0.8 + backdrop-blur después de 40px. Border-bottom aparece simultáneamente.

Sheet / Modal

Móvil:                        Desktop:
┌────────────┐                ┌──────────────────┐
│            │                │     ┌──────┐     │
│            │                │     │ modal│     │
│            │                │     └──────┘     │
│ ━━━━━━━━━━ │  ← handle      │                  │
│ ▼ Sheet ▼  │                │                  │
└────────────┘                └──────────────────┘

Móvil < 768px: bottom-sheet con drag handle, 90vh máx, drag-to-dismiss. Desktop ≥ 768px: modal centrado, max-w varía sm/md/lg.

Densidad

compact:        --row-height-base: 40px · --field-height-base: 36px
comfortable:    --row-height-base: 48px · --field-height-base: 44px

Compact por defecto en superficies de producto. .density-comfortable se aplica al hero del landing, al onboarding y a la pantalla de celebración.

XII

Accesibilidad.

Baseline no negociable. Verificado independientemente para ambos temas.

  • Focus rings visibles en todos los elementos interactivos
  • Contraste mínimo AA contra la superficie correspondiente; AAA para --ink sobre --bg
  • Tap targets mínimo 44×44px en touch
  • HTML semántico — <button>, <nav>, <main>
  • Skip-to-content link en todas las plantillas de página
  • Las etiquetas de formulario nunca se reemplazan por placeholders solos
  • aria-label en todos los botones icon-only
  • aria-live="polite" en regiones de toast
  • Focus trap en sheets, dialogs, drawers — retorna foco al trigger al desmontar
  • ESC cierra todos los overlays
  • prefers-reduced-motion respetado en todo el sistema
  • El color nunca es la única señal — siempre acompañado de texto o icono
  • Ambos temas cumplen mínimos de contraste de manera independiente
XIII

Lo que el sistema no es.

La lista corta de elecciones que romperían el sistema. Cada vez que el producto crece, la primera pregunta es: ¿estamos a punto de hacer una de estas?

  1. 01No introducir tipografías adicionales — dos es el techo.
  2. 02No agregar gradientes — los productos premium los ganan, no los toman.
  3. 03No usar iconos sin etiqueta en flujos de producto.
  4. 04No usar serif en cualquier lugar del producto.
  5. 05No usar itálica en display — lee editorial.
  6. 06No introducir azul, verde o morado como colores primarios.
  7. 07No usar emoji en copy de producto.
  8. 08No replicar componentes de davhera.com — construir fresco dentro del scope.
  9. 09No usar negro puro o blanco puro (excepto --bg-raised en modo claro).
  10. 10No shipear solo modo claro — ambos son de primera clase.
  11. 11No usar sombras en cards en modo claro — el contraste de superficie es suficiente.
  12. 12No usar ease-in-out del navegador — usa los easings nombrados.
  13. 13No escribir copy de marketing en estilo ensayo.
  14. 14No agregar overlays de grano, drop caps, pull quotes — toda decoración editorial.
Documentación viva. Cambia con el código.v0.3 (Premium Product) · v0.2 (Dark mode) · v0.1 (inicial)← Volver al landing
Vera · Una pieza de portafolio de Davhera
SobreSistemaGitHub
Diseñado y construido en Rio de Janeiro · 2026