PulsePass Design System

Resident Advisor style — Editorial, sobrio, moderno. Para la comunidad electrónica real.

👆 Usá el botón arriba para cambiar entre light y dark mode

Tipografía

Heading 1

Eventos electrónicos

Heading 2

Próximos eventos

Heading 3

Panel de control

Body Text

La ticketera más simple y estética para fiestas electrónicas, con control de acceso impecable y pensada para la comunidad real.

Monospace (código/QR)

QR-2025-ABC-123-XYZ

Paleta de Colores

Primary (Lime)

Acento principal — CTAs, acciones importantes

Secondary (Petrol)

Acento secundario — Links, acciones alternativas

Destructive

Errores, eliminaciones, alertas críticas

Success

Confirmaciones, operaciones exitosas

Warning

Advertencias, atención moderada

Muted

Fondos sutiles, texto secundario

Sistema de Botones

Componentes semánticos para acciones consistentes

Form Buttons

FormButton
Para submit en formularios
<FormButton loading={isLoading} />
FormSecondaryButton
OAuth y acciones alternativas
✅ Contraste optimizado en hover (light y dark mode)
<FormSecondaryButton />

Action Buttons

PrimaryButton
CTAs principales
<PrimaryButton />
SecondaryButton
Acciones secundarias
✅ Contraste optimizado en hover (light y dark mode)
<SecondaryButton />

Utility Buttons

IconButton
Solo iconos
<IconButton icon={<Menu />} />
DangerButton
Acciones destructivas
<DangerButton />
LinkButton
Navegación de texto
<LinkButton />

Typography System

Componentes de texto semánticos y reutilizables

Headings

Display & Headings
Jerarquía tipográfica para títulos

Display

Welcome to PulsePass

H1

My Dashboard

H2

Upcoming Events

H3

Event Details

H4

Payment Method

<H1>My Dashboard</H1>

Body Text

Lead
Texto introductorio

Discover the best electronic music events in your city

<Lead>...</Lead>
Body
Texto de cuerpo estándar

This event will take place at the main venue downtown. Limited capacity available.

<Body>...</Body>
BodyLarge
Párrafos destacados

Important information about your tickets and event access.

<BodyLarge>...</BodyLarge>
BodySmall
Texto secundario

Limited capacity. First come, first served.

<BodySmall>...</BodySmall>

Utility Text

Muted
Texto atenuado

Last updated 2 hours ago

<Muted>...</Muted>
Small
Texto muy pequeño

* Terms and conditions apply

<Small>...</Small>
Code
Código inline
TKT-2024-1234<Code>...</Code>

Status Text

ErrorText
Mensajes de error

Invalid email format

<ErrorText>...</ErrorText>
SuccessText
Mensajes de éxito

Account created successfully!

<SuccessText>...</SuccessText>

Prices

Price
Precio principal

$45.00

✅ Color primary en dark mode para contraste
<Price>$45.00</Price>
PriceSmall
Precio en listas

$25

<PriceSmall>$25</PriceSmall>

Special Text

TextLink
Enlaces inline

Read our privacy policy for details.

<TextLink>...</TextLink>
GradientText
Texto con gradiente

The Future of Events

<GradientText>...</GradientText>
Ejemplo Real - Card de Evento
Combinando componentes de texto

Summer Electronic Festival

Electronic Music · Downtown

Featured

Join us for an unforgettable night of electronic music with world-class DJs.

From

$45.00

Available

<Card> <H3>Summer Electronic Festival</H3> <Muted>Electronic Music · Downtown</Muted> <BodySmall>Join us for...</BodySmall> <Price>$45.00</Price> <SuccessText>Available</SuccessText> </Card>

Form Components

Sistema completo de componentes para formularios

FormField

Campo Completo con Validación
Label + Input + Error en un solo componente

Password must be at least 8 characters

Only letters, numbers and underscores

<FormField label="Email" type="email" registration={register("email")} error={errors.email?.message} icon={<Mail className="w-4 h-4" />} />

FormActions

Stack Layout
Mobile-first (default)
<FormActions submitText="Create" onCancel={handleCancel} />
Row Layout
Horizontal en desktop
<FormActions layout="row" submitText="Save" />

Form Messages

Error, Success & Hint
Mensajes de estado del formulario

FormError

⚠️Invalid credentials. Please try again.

FormSuccess

Account created successfully!

FormHint

💡Your password must be at least 8 characters and include a number.

<FormError error={error} /> <FormSuccess message={success} /> <FormHint>Tip here</FormHint>

FormDivider

Separador con Texto
Para dividir secciones o métodos de login
or continue with
or
<FormDivider text="or continue with" />

FormSection

Agrupación de Campos
Organiza campos relacionados con título

Account Details

Your login credentials

Personal Information

Tell us about yourself

<FormSection title="Account Details" description="Your credentials" > <FormField label="Email" /> <FormField label="Password" /> </FormSection>
Ejemplo Completo - Formulario de Login
Todos los componentes trabajando juntos

Sign In

Welcome back to PulsePass

or continue with
<form onSubmit={handleSubmit(onSubmit)}> <FormField label="Email" registration={register("email")} error={errors.email?.message} icon={<Mail className="w-4 h-4" />} /> <FormField label="Password" type="password" registration={register("password")} error={errors.password?.message} /> <FormActions submitText="Sign In" isSubmitting={isLoading} /> <FormDivider text="or" /> <FormSecondaryButton onClick={handleGoogle}> Sign in with Google </FormSecondaryButton> </form>

Event Cards

Componente principal para mostrar eventos

Características
Imagen optimizada con lazy loading
Badge de estado (On Sale, Sold Out)
Hover effect con botón animado
Información de precio y disponibilidad
Responsive (mobile-first)

Event Slider

Carrusel de eventos en homepage

Características
Navegación con flechas y dots
Autoplay opcional
Touch/swipe support en móvil
Responsive breakpoints
Integra EventCard component

Layout Components

Contenedores reutilizables para páginas

FormPageLayout
Para páginas de formularios (login, signup)
Centra contenido verticalmente
Calcula altura (100vh - header)
Padding responsivo
<FormPageLayout> <LoginForm /> </FormPageLayout>
PageLayout
Para páginas de contenido general
Max-width configurable
Contenedor responsivo
Sin scroll innecesario
<PageLayout maxWidth="7xl"> <Content /> </PageLayout>

Dashboard Stats

Tickets vendidos

1,248

+12% vs mes pasado

Eventos activos

24

8 esta semana

Asistentes

892

71% tasa de conversión

Revenue

$18,750

+24% este mes

Formularios

Crear evento
Completa los datos para publicar tu evento

Sistema de Espaciado

Componentes para spacing consistente y semántico

Stack - Espaciado Vertical
Apila elementos verticalmente con spacing consistente

Micro spacing (elementos muy cercanos)

Item 1
Item 2
Item 3

Compact spacing (elementos relacionados)

Item 1
Item 2
Item 3

Comfortable spacing (secciones)

Section 1
Section 2

Spacious spacing (grandes secciones)

Major Section 1
Major Section 2
Inline - Espaciado Horizontal
Organiza elementos horizontalmente con flexbox

Compact spacing con diferentes alineaciones

LeftCenterRight

Wrap para múltiples elementos

Tag 1Tag 2Tag 3Tag 4Tag 5Tag 6Tag 7Tag 8
Grid - Layout Cuadrícula
Grid responsivo con spacing consistente

Grid 1-2-3 columnas con gap comfortable

Feature 1

Description

Feature 2

Description

Feature 3

Description

Grid 1-2-4 columnas con gap compact

Card 1

Card 2

Card 3

Card 4

Spacer & Divider
Espaciado flexible y separadores visuales

Spacer vertical

Content Above
Content Below (lg spacer)

Divider con label

Content above divider

or

Content below divider

Divider decorativo

Section 1

Section 2

Section & Inset
Containers con padding y spacing consistente

Section con padding comfortable

Section Title

Section con padding y spacing interno consistente

Inset con padding en diferentes lados

Padding all sides (md)

Padding horizontal only (lg)

Padding vertical only (sm)

Ejemplo Práctico - Formulario
Combinando Stack, Inline y Spacer

Sign In

Enter your credentials to continue

or

Don't have an account?

Sign up
💡Documentación

Ver la SPACING_SYSTEM.md para guías completas, mejores prácticas y ejemplos de migración.

Skeleton/Loading System

Componentes para estados de carga consistentes

Skeleton Base & Text
Componentes base para crear skeletons

Skeleton básico con diferentes formas

SkeletonText con diferentes configuraciones

Pulse animation (default)

Wave animation

Skeleton Cards & Avatars
Componentes compuestos para diferentes contextos

SkeletonCard completo

SkeletonCard con avatar

Diferentes tamaños de avatar

Loading Indicators
Spinners, dots y pulsos animados

LoadingSpinner en diferentes tamaños

LoadingSpinner en diferentes variantes

Ejemplos Prácticos
Usos comunes en la aplicación

Grid de eventos loading

Botón con loading state

Diferentes tipos de imagen skeleton

Square

Video (16:9)

Portrait (3:4)

Wide (21:9)

💡Documentación

Ver la SKELETON_SYSTEM.md para guías completas, mejores prácticas y patrones de uso.

Badge/Tag System

Componentes para categorías, estados, etiquetas y más

StatusBadge - Estados del Sistema
Para mostrar estados (aprobado, pendiente, cancelado, etc.)

Estados básicos

AprobadoPendienteCanceladoAdvertenciaInformaciónInactivo

Con punto de color

PagadoProcesandoRechazado

Diferentes tamaños

PequeñoMedianoGrande
<StatusBadge status="success">Aprobado</StatusBadge><StatusBadge status="pending" withDot>Procesando</StatusBadge>
CategoryBadge - Categorías
Para categorías de eventos/items

Variante subtle (default)

ConciertoDeportesTeatro

Variante outline

MúsicaRockElectrónica

Variante solid

FestivalEn vivoWarehouse
<CategoryBadge>Concierto</CategoryBadge><CategoryBadge variant="outline" color="secondary">Rock</CategoryBadge>
PriceBadge - Precios y Ofertas
Para precios, descuentos y ofertas especiales

Tipos de precio

$45.00-20%¡Oferta!GRATIS

Tamaños

$25.00$45.00$75.00
<PriceBadge>$45.00</PriceBadge><PriceBadge type="discount">-20%</PriceBadge>
CountBadge - Notificaciones y Contadores
Para mostrar contadores (notificaciones, mensajes, etc.)

Notificaciones con límite

3
42
99+

Variantes

5128
<CountBadge count={5} /><CountBadge count={150} max={99} /> // Muestra 99+
InteractiveBadge - Clickeables/Removibles
Para filtros, tags removibles y acciones

Tags removibles

RockElectrónicaHouse

Clickeables

Ver másFiltrar

Deshabilitado

No disponible
<InteractiveBadge onRemove={() => remove()}>Rock</InteractiveBadge><InteractiveBadge onClick={() => filter()}>Ver más</InteractiveBadge>
IconBadge - Con Iconos
Para destacar con iconos (Premium, Verificado, etc.)

Con iconos (izquierda)

PremiumVIPVerificadoRápido

Icono a la derecha

Completado

Variantes

DefaultOutlineSubtle
<IconBadge icon={<Star className="w-3 h-3" />}>Premium</IconBadge>
BadgeGroup - Agrupación
Para agrupar múltiples badges con espaciado consistente

Grupo básico

MúsicaRockEn vivoBuenos Aires

Con límite de visibles (maxVisible=3)

TechnoHouseElectrónica+2

Spacing comfortable

AprobadoPendienteInformación
<BadgeGroup maxVisible={3}> {tags.map(tag => <CategoryBadge key={tag}>{tag}</CategoryBadge>)}</BadgeGroup>
GradientBadge - Con Gradientes
Para destacar elementos importantes con gradientes

Gradientes disponibles

PrimarySunsetOceanForestPurple

Con animación pulse

¡Últimas entradas!Nuevo
<GradientBadge gradient="sunset">Destacado</GradientBadge><GradientBadge gradient="ocean" animate>Nuevo</GradientBadge>
Ejemplos Prácticos
Usos comunes en la aplicación

Card de evento con badges

Activo-30%

Techno Warehouse Session

25 de Octubre, 23:00 - Buenos Aires

TechnoHouseElectrónica+1
PremiumDestacado

Panel de usuario con badges

Juan Pérez

PremiumVerificado
TechnoHouseElectrónica

Lista de pedidos

Pedido #1234

Completado
$45.00

Pedido #1235

Procesando
$80.00

Pedido #1236

Cancelado
$25.00
💡Documentación

Ver la BADGE_SYSTEM.md para guías completas, mejores prácticas y patrones de uso.

Empty State System

Componentes para estados vacíos, errores y sin contenido

EmptyState - Componente Base
Componente base para crear empty states personalizados

Empty state básico

No hay mensajes

Tu bandeja de entrada está vacía

Con acción

No hay mensajes

Tu bandeja de entrada está vacía

Diferentes tamaños

Pequeño

Mediano

Grande

<EmptyState icon={<Inbox />} title="No hay mensajes" />
Empty States Específicos
Componentes predefinidos para casos comunes

EmptySearch - Sin resultados de búsqueda

No encontramos resultados para "techno party"

Prueba buscando: house, electrónica, trance

EmptyList - Lista vacía con creación

No hay eventos

Aún no has creado ningún evento

<EmptySearch searchTerm="techno" onClear={...} /><EmptyList title="No hay eventos" onCreate={...} />
EmptyEvents - Sin Eventos
Adaptado según el rol del usuario (creator/attendee)

Vista de Creador

Aún no has creado eventos

Crea tu primer evento y comienza a vender entradas

Vista de Asistente

No hay eventos disponibles

Vuelve pronto para ver próximos eventos

<EmptyEvents userRole="creator" onCreate={...} /><EmptyEvents userRole="attendee" onBrowse={...} />
Estados de Error
Para errores 404, 500 y sin permisos

Error404 - Página no encontrada

Página no encontrada

La página que buscas no existe o fue movida

Error500 - Error del servidor

Algo salió mal

Ocurrió un error en nuestros servidores. Estamos trabajando para solucionarlo.

NoPermission - Acceso denegado

Acceso denegado

No tienes permisos para acceder a esta página

<Error404 onGoHome={() => navigate("/")} /><Error500 onRetry={() => window.location.reload()} /><NoPermission onGoBack={() => navigate(-1)} />
Ejemplos Prácticos
Integración con loading states y listas

Lista con loading y empty state

Mis Eventos

No hay eventos

Aún no has creado ningún evento

Dashboard con widgets vacíos

Notificaciones

Sin notificaciones nuevas

Favoritos

No tienes favoritos aún

Búsqueda sin resultados

Resultados de búsqueda

No encontramos resultados para "evento inexistente"

Intenta con otros términos de búsqueda o revisa la ortografía

💡Documentación

Ver la EMPTY_STATE_SYSTEM.md para guías completas, mejores prácticas y patrones de uso.

Toast System

Sistema de notificaciones moderno y consistente

Toast Variants
Cuatro tipos semánticos para diferentes situaciones

Success Toast ✅

¡Guardado exitosamente!

Los cambios se guardaron correctamente

Error Toast ❌

Error al guardar

No se pudo conectar al servidor

Warning Toast ⚠️

Conexión inestable

Tu conexión es lenta, puede haber retrasos

Info Toast ℹ️

Nueva actualización disponible

Haz clic aquí para actualizar

Toast con Auto-Dismiss
Barra de progreso para toasts que se cierran automáticamente

Operación completada

Se cerrará automáticamente en 5 segundos

El toast se pausa automáticamente al hacer hover

Posicionamiento
ToastContainer con diferentes posiciones
position="top-right"

Default - Esquina superior derecha

position="top-left"

Esquina superior izquierda

position="top-center"

Centro superior

position="bottom-right"

Esquina inferior derecha

position="bottom-left"

Esquina inferior izquierda

position="bottom-center"

Centro inferior

Ejemplos de Uso
Cómo usar el Toast System en tu app

Confirmación simple

addNotification({
  type: "success",
  title: "¡Guardado!",
  duration: 3000
});

Error con acción

addNotification({
  type: "error",
  title: "Error al cargar",
  message: "No se pudo conectar",
  duration: 0 // Persiste
});

Warning persistente

addNotification({
  type: "warning",
  title: "Conexión limitada",
  message: "Modo offline activado",
  duration: 0,
  persistent: true
});
💡Best Practices

Cuándo usar cada tipo:

  • Success: Operaciones completadas, guardados exitosos, confirmaciones
  • Error: Fallos, errores de validación, problemas de red (sin auto-dismiss)
  • Warning: Advertencias, conexión inestable, límites próximos
  • Info: Información general, actualizaciones, tips

Duraciones recomendadas:

  • Success: 3000-5000ms (breve confirmación)
  • Error: 0ms (usuario debe leer el error)
  • Warning: 0ms (advertencias importantes)
  • Info: 5000-8000ms (información no crítica)

Ver la TOAST_SYSTEM.md para guías completas, mejores prácticas y patrones de uso.

⚠️ Sistema de Animaciones - DEPRECADO

Los componentes de animación React han sido removidos. Usa utilidades directas de Tailwind CSS.

Por qué el cambio: Las animaciones con componentes React son 96% más lentas que las utilidades directas de Tailwind CSS. El bundle es 95% más pequeño usando CSS puro.

Ver documentación: ANIMATION_SYSTEM.md y WHY_DIRECT_TAILWIND_IS_BETTER.md

Patrones de Reemplazo

Hover Scale

className="transform-gpu transition-transform duration-200 hover:scale-105"

Hover Lift

className="transition-all duration-300 hover:-translate-y-1 hover:shadow-lg"

Click Feedback

className="transform-gpu transition-transform duration-100 active:scale-95"

Fade In

className="motion-safe:animate-in motion-safe:fade-in motion-safe:duration-300"

Slide In (Ticket Reveal)

className="motion-safe:animate-in motion-safe:slide-in-from-bottom-4 motion-safe:zoom-in-95 motion-safe:duration-500"

Glow Pulse

className="animate-glow-pulse-subtle"

Ejemplos en Vivo

Hover Scale

Hover Lift

Click Me!

Aura Tech Components

Componentes del sistema Aura Tech (glass morphism, spotlight effects)

CTASection

EXAMPLE CTA

Join the Community

Connect with thousands of event creators and attendees

<CTASection kicker="EXAMPLE CTA" kickerDot title="Join the Community" subtitle="Description text" > <PrimaryButton>Action</PrimaryButton> </CTASection>

Card Variants (Glass)

Glass Card

bg-black/40 backdrop-blur-md

Glass Secondary

bg-black/30 backdrop-blur-sm

Glass Hover

Hover me! Interactive glass card

<Card variant="glass">Content</Card> <Card variant="glass-hover">Hover me</Card>

IconContainer

<IconContainer icon={<Ticket />} variant="primary" size="md" />

GlassPanel + SectionHeader

FEATURED

Section with Glass Panel

This is a glass panel with a section header. Perfect for content sections.

<GlassPanel variant="default"> <SectionHeader kicker="FEATURED" title="Title" action={<Button>Action</Button>} /> <Content /> </GlassPanel>

Efectos Electronic Theme

Electronic Glow

Hover para ver el efecto glow sutil con lime accent.

Electronic Border

Borde con acento lime sutil.

Electronic Text

Texto con acento lime y glow suave.

Las animaciones pulse, glow-wave y loading-sweep están desactivadas en esta vista para evitar layout shift. Podés activarlas manualmente agregando las clases cuando las necesites.

AfterDrop