Pulso.
Claridad en los datos.
Energía en cada interacción.
Pulso conecta la identidad de Cuotario con las decisiones de diseño y código. Una base compartida para construir una experiencia deportiva reconocible, accesible y preparada para crecer.
La misma pieza.
En el sistema y la app.
Estos ejemplos cargan pulso-data.css, el mismo archivo del dashboard. Datos ilustrativos, sin conexión con apuestas ni cuentas.
Ticket de ejemplo
0Añade una selección con +.
Prueba Editar y Listo. El borrador se mantiene solo en esta demo.
Badge · contrato
.p-badge + .today | .live | .warning | .neutral.
- Padding 5 px vertical / 10 px horizontal. Radio completo.
- Informativo: no recibe foco ni se comporta como botón.
- Hoy: lima + tinta oscura. Directo: fondo rosa suave y texto vino en claro; fondo vino y texto rosa claro en oscuro. Incluye punto y texto.
- No anidar otra píldora dentro ni anular su padding.
Selección · contrato
.p-selection y aria-pressed.
- 36 px con ratón; 44 px para entrada táctil. SVG de 18 × 18 centrado, con el mismo trazado de la app; no usar caracteres +, ✓ o ×.
- Hover visible. Seleccionado: check + lima, también por teclado.
- Enter o Espacio activa; segundo clic quita la misma selección.
- El contador y todas las instancias reflejan el borrador.
| Componente | Información | Estados / respuesta |
|---|---|---|
| Market card | Mercado → muestra → equipo → proyección → línea → probabilidad → añadir. | Sin datos = —, nunca 0; sin señal = sin botón. Probabilidad: verde desde 78%, amarillo de 70% a 77%, siempre en negrita. Menos de 70% no se recomienda; no existe estado rojo. Tres columnas en pantallas amplias desde 1720 px, dos desde 1100 px y una en móvil. Al plegar, la tarjeta recupera la altura de su encabezado. |
| Featured match | Competición → estado → equipos → marcador/hora → análisis. | Banderas decorativas con blur, fondo oscuro de respaldo; paginación manual sin autoplay. |
| Ticket | Selección → fuente de cuota → editar/quitar → monto → guardado. | Borrador local revisable; historial y guardado Pro. Escape cierra y devuelve foco. No ejecuta apuestas. |
| Live card | Minuto → equipos y marcador → lectura del encuentro. | Datos antiguos etiquetados; refrescos conservan foco. Superficie oscura independiente del tema general. |
| Card | Superficie, contenido y separación de 12–16 px. | Sin borde decorativo. Divisores suaves solo entre filas; foco de controles visible. |
Implementación y criterios para nuevas pantallas
<span class="p-badge today">Hoy</span> <button class="p-selection" type="button" aria-pressed="false" aria-label="Añadir al ticket: selección"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg> </button> <section class="p-theme-dark">…contenido en vivo…</section>
Antes de publicar una nueva variante: probar teclado, claro/oscuro, 320 px, texto largo, dato ausente y estado seleccionado. No duplicar CSS del componente en cada pantalla.
Mercados · apertura inicial
Solo la primera fila comienza abierta. El resto conserva su encabezado para abrirse bajo demanda.
Tiros al arco
Proyección y sugerencias por equipo.
Contenido ilustrativo del mercado.
Remates totales
Proyección y sugerencias por equipo.
Contenido ilustrativo del mercado.
Córners
Proyección y sugerencias por equipo.
Contenido ilustrativo del mercado.
Faltas cometidas
Proyección y sugerencias por equipo.
Contenido ilustrativo del mercado.
Tarjetas
Proyección y sugerencias por equipo.
Contenido ilustrativo del mercado.
Offsides
Proyección y sugerencias por equipo.
Contenido ilustrativo del mercado.
La primera fila se calcula con la retícula real de Pulso: tres columnas desde 1720 px, dos por encima de 1100 px y una hasta 1100 px. Se aplica una vez al cargar el partido; después se respetan las aperturas y cierres de la persona, incluso al redimensionar.
Una selección por tarjeta, con espacio para leer.
12 px entre tarjetas, 16 px de espacio interior y 8 px entre bloques de texto. Las alternativas se distribuyen en varias líneas cuando lo necesitan. El filtro de la app se separa 16 px del listado.
Local vs Visitante · ejemplo de componente
Probabilidad ilustrativa 76% · proyección 5.4 · cuota mínima 1.41
Local vs Visitante · ejemplo de componente
Probabilidad ilustrativa 74% · proyección 4.7 · cuota mínima 1.44
Estados por tema · Pulso 2.1
Fuente única: roles semánticos de pulso.tokens.json y componentes de pulso-data.css. Pasa el cursor o navega con Tab para revisar los estados.
Modo claro
Modo oscuro
| Componente | Regla compartida |
|---|---|
| Botón con icono | .p-button.icon.compact: SVG de 18 px, centrado en ambos ejes, sin padding asimétrico. Control compacto de 36 px; 44 px para entrada táctil. Cerrar y vaciar usan la variante estándar de 44 px e iconos SVG de 18 px, sin caracteres tipográficos. Usar etiqueta accesible. |
| Acceso a picks | .p-button.emphasis.block: acción de 48 px a todo el ancho debajo del resumen. Texto estable «Ver los mejores picks». Carga datos o reabre el listado existente. |
| Estado en vivo | live-fill / live-ink. Contraste de texto validado en ambos temas; punto y texto siempre presentes. |
| Tarjeta | surface-hover: gris tenue en claro y superficie más clara en oscuro. No colorear toda la tarjeta de lima. |
| Pro / sugerencia / métrica | emphasis para texto; emphasis-fill / emphasis-ink / emphasis-hover para controles. Cobalto en claro y lima en oscuro. |
| Destacado | Hover: línea interior blanca, alfa 0.3 y 1 px, sin salto de tamaño. |
| Ticket / editor | Campo dentro de la misma selección, separación interior, apertura de 200 ms y cierre de 180 ms. Movimiento reducido: sin animación. Vaciar y cerrar comparten objetivo de 44 px. |
| Directo / diálogo | live-overlay: opacidad 0.35. Marcador, lectura y comparación de estadísticas con roles de superficie propios. Tres columnas de encuentros desde 1500 px. |
Criterio: WCAG 2.2 · contraste de texto. Los ratios se calculan en Color y temas; no certifican toda la app.
Un encabezado de borde a borde.
Logo, buscador y acciones pertenecen a una sola superficie. Su sombra recorre todo el ancho, también sobre el menú lateral. La navegación y el contenido empiezan debajo.
Cuota de ejemplo
1.66Cuota de ejemplo
1.66Header compartido
.p-app-header usa elevation-header, con sombra de contacto y difusión por header-shadow / header-edge. Altura del producto: app-header-height, 64 px. El sidebar mide 208 px y comienza debajo; nunca contiene un logo duplicado.
Tarjetas con profundidad
elevation-card combina 2/4 px y 8/20 px de desplazamiento y difusión. card-shadow usa grafito al 8% en claro y negro al 24% en oscuro. El relieve se mantiene visible entre tarjetas y superficies del mismo color.
Cuenta y menú · claro
Cuenta y menú · oscuro
Cuenta: 44 px de alto, padding horizontal simétrico de 12 px, avatar de 28 px y separación de 8 px con el nombre. Menú: 44 × 44 px, icono centrado. En móvil la cuenta ocupa 44 × 44 px y centra el avatar al ocultar el nombre.
Las acciones siempre a mano.
En móvil, ticket, cuenta, búsqueda y menú conservan 44 × 44 px. El contador se superpone al ticket; la cuenta sin sesión usa la misma anatomía que el perfil. A 360 px o menos, la marca conserva el símbolo y su nombre accesible.
Variantes compartidas: .p-header-ticket, .p-user-control, .p-user-guest y .p-header-icon. Iconos con el acento del tema; estados seleccionados conservan contraste con su superficie.
Detalle de partido · Pulso
Jerarquía del análisis
La sugerencia lleva el acento del tema y peso 750. La proyección es secundaria: 16 px, peso 600 y texto neutro; en móvil estrecho baja a 14 px. Los iconos de contenido usan icon-accent: lima en oscuro y cobalto en claro.
La tabla contextual usa filas de 44 px, escudos de 22 px, padding de 16 px y un título propio. Se alinea con la tarjeta de recomendación.
Navegar entre partidos
El acceso «Ver partidos de [liga]» se ubica sobre el banner junto a Volver. Es un botón tonal, no un breadcrumb de texto. En móvil ocupa una fila completa. Abre los próximos encuentros de esa competición; el título del listado conserva la liga y al cerrar se devuelve el foco.
Los avisos usan texto de 14 px con interlínea de 22 px, tinta principal y un borde neutro visible. El botón tonal conserva un contorno de énfasis en reposo y hover. El acento identifica acciones e iconos; el mensaje se lee con tinta neutra.
El header global usa header-edge / header-shadow para separarse del menú lateral; no aplicar esa sombra a los headers de tarjetas.
Detalle · claro
Detalle · oscuro
Resultado del partido
Probabilidades y fuente. Las cuotas abren un diálogo de altura limitada con scroll propio; la comparación del modelo empieza cerrada.
Selección destacada
Solo cuando existe una recomendación. Si falta, Resultado del partido ocupa todo el ancho.
Jerarquía: Resumen → Mercados → Equipos y contexto → Cuotas y metodología. La primera fila de mercados comienza abierta; las herramientas secundarias, cerradas.
Posiciones en la liga
Una tarjeta sin vecina ocupa el 100%. Cada tarjeta conserva su altura natural, sin estirar a la vecina. La navegación de secciones permanece fija debajo del header al desplazarse. Los saltos dejan espacio para el header y la altura real de la navegación, incluidas sus dos filas en móvil. Los módulos opcionales sin cobertura se ocultan y no reservan espacio.
Cara a cara · últimos 5
El historial conserva una fila completa dentro de Equipos y contexto, tanto abierto como cerrado.
.p-detail-grid: distribución flexible con separación de 16 px. Una proyección de cero es un dato válido. Un error al cargar conserva un aviso con reintento; nunca equivale a falta de cobertura.
El once, de un vistazo.
Cancha compacta, equipos identificados y titulares junto a su distribución. Los suplentes y los cambios se consultan sin desplazar el contenido principal.
Distribución en cancha
Ubicación según la alineación publicada.
- 1A. RiveraPOR
- 2D. VegaDEF
- 3M. TorresDEF
- 4J. RojasDEF
- 5L. CastroDEF
- 6P. DíazMED
- 7S. LeónMED
- 8N. SotoMED
- 9C. SilvaMED
- 10R. MoraMED
- 11G. CruzDEL
DT A. Salas
Suplentes 3
- 12E. MendozaPOR
- 18M. SalazarMED
- 20J. RuizDEL
- 1J. PérezPOR
- 2S. ReyesDEF
- 3M. GarcíaDEF
- 4F. RamosDEF
- 5D. ParraDEF
- 6L. GómezMED
- 7A. NavarroMED
- 8P. OrtizMED
- 9N. ÁvilaMED
- 10C. MedinaMED
- 11V. RíosDEL
DT C. Romero
Suplentes 3
- 12E. MendozaPOR
- 18M. SalazarMED
- 20J. RuizDEL
Cambios durante el partido 1
- 67′↑ Entra · M. Salazar↓ Sale · P. DíazDeportivo Central
Datos ilustrativos. El componente compartido PulsoLineups.render genera la misma estructura en resultados históricos y alineaciones confirmadas. Campo de 400 px de alto; composición de dos columnas desde 1100 px de ancho disponible. En contenedores menores de 600 px, el campo gira a vertical (460 px) y las listas se apilan cuando es necesario. Superficies neutrales y acentos semánticos de Pulso en ambos temas.
Se siente diferente.
Desde el primer clic.
Una tipografía con carácter. Controles planos, estados claros y densidad útil. Una marca que se reconoce en pequeño.
Tu próxima lectura del partido.
Anatomía: etiqueta → superficie → valor → ayuda. Radio 12 px · altura 48 px · entrada de texto 16 px · foco exterior 3 px. El selector conserva su semántica HTML y su alternativa nativa.
Energía con criterio.
Cuotario ayuda a comparar estadísticas, cuotas y contexto. Cada decisión visual debe facilitar esa lectura.
La señal primero
Resultado, tiempo, mercado y fuente forman la jerarquía. El ruido visual nunca compite con la información.
Confianza trazable
Una estimación muestra sus límites. Una cuota conserva su origen y hora. Un dato desconocido se reconoce.
Carácter consistente
La tinta guía las acciones en claro; el lima señala interacción y selección. Los estados mantienen su propio significado.
Cuotario es la marca.
Pulso es su lenguaje.
Una C circular, abierta y precisa. El punto independiente representa una señal dentro del contexto. Menos trazos, más reconocimiento: legible en un icono, un marcador o una firma.
Espacio de protección
Reserva al menos ¼ del ancho del símbolo en cada lado. No superponer marcadores ni insignias.
Tamaño y versiones
Símbolo: mínimo 24 px. Firma: mínimo 144 px. El archivo monocromo sirve para impresión a una tinta.
Integridad
No estirar, inclinar ni añadir sombras. La firma SVG contiene contornos vectoriales: no depende de una fuente instalada. No sustituir sus colores por estados de resultados.
Una identidad eléctrica.
Lienzo gris azulado #EEF0F3 en claro y grafito #0C0E14 en oscuro, sin brillo ambiental verde. Tarjetas blancas y acciones en tinta en claro. Signal Lime destaca Hoy y selección. Las tarjetas usan hover neutro. Métricas, sugerencias y Pro: cobalto en claro, lima en oscuro. El directo usa grafito. El cobalto se conserva en identidad, foco y acciones del tema oscuro.
#4F5BFF#D8FF3E#0C0E14El lima identifica Hoy y selección; el hover de las tarjetas usa una superficie neutra. No significa “apuesta segura” ni reemplaza los estados de éxito. El directo usa una señal rosa adaptada a cada tema, con texto y punto.
Roles semánticos
Cargando roles de color…
Primero el rol, después el valor
En componentes usa --p-action, --p-text o --p-danger. Las primitivas definen temas y piezas de identidad.
.mi-control {
background: var(--p-action);
color: var(--p-action-ink);
border-radius: var(--p-radius-sm);
}Contraste comprobable
Texto normal ≥ 4,5:1. Texto grande y límites de controles ≥ 3:1. Estos pares se calculan con el tema activo; no certifican toda la aplicación.
Escala de cobalto y reglas de uso
En oscuro, 600 define la acción primaria. En claro, la acción usa tinta. Pro y las sugerencias usan cobalto; las tarjetas tienen hover gris. En oscuro, la jerarquía de datos usa lima. Enlaces claros en oscuro y profundos en claro. Los divisores decorativos no sustituyen el borde de un campo.
Una escala.
Nueve pasos.
Plus Jakarta Sans, autohospedada. Escala tipográfica de Pulso: tamaño, interlínea y tracking se eligen juntos. Pesos de producto: 400 lectura, 600 etiquetas y 700 títulos.
La información importante se reconoce antes de abrir el partido.
68,4% 2,10 90′
| Paso | Tamaño / línea | Tracking | Uso |
|---|---|---|---|
| 1 | 12 / 16 px | .0025em | Metadatos breves |
| 2 | 14 / 20 px | 0 | Filas, controles y texto de UI |
| 3 | 16 / 24 px | 0 | Cuerpo y formularios |
| 4 | 18 / 26 px | −.0025em | Títulos de tarjeta |
| 5 | 20 / 28 px | −.005em | Secciones |
| 6 | 24 / 30 px | −.00625em | Métricas |
| 7 | 28 / 36 px | −.0075em | Título de página |
| 8 | 35 / 40 px | −.01em | Marcador destacado |
| 9 | 60 / 60 px | −.025em | Marketing |
API CSS: class="p-type" data-size="2". Para cantidades, añadir cifras tabulares. El dashboard usa pasos 1–8; el paso 9 se reserva para la Home de marketing. No reducir todo el texto para ganar espacio: agrupar datos y quitar redundancia.
Espacio que organiza.
Ritmo de 4 px, con pasos de 8 px en la estructura. Agrupa lo relacionado y separa las decisiones.
Detalle · claro
Banner de partido · ejemplo
Cara a cara
El análisis empieza 16 px después del banner.
Detalle · oscuro
Banner de partido · ejemplo
Cara a cara
El análisis empieza 16 px después del banner.
.p-canvas usa --p-bg sin degradados globales. .p-match-header usa --p-space-12 arriba y --p-space-16 debajo; vacío no ocupa espacio. El mismo contrato aplica a móvil y escritorio.
Móvil / < 600
4 columnas; margen exterior 12 px y separación 10–12 px. Una tarjeta por fila. Acciones al alcance; navegación inferior en la app.
Tablet / 600–1023
8 columnas, margen 24 px. Dos módulos cuando la información siga legible. No comprimir etiquetas.
Escritorio / ≥ 1024
Margen exterior 20 px y sidebar de 208 px. Mercados en dos columnas desde 1100 px y tres desde 1720 px; partidos en tres desde 1450 px y directo desde 1500 px. El contenido se adapta al ancho disponible.
Densidad y forma
Campos 48 px, botones 44 px y selección compacta 36 px con ratón / 44 px táctil. Radios: badge completo, control 12 px, tarjeta 16–20 px. Espaciado interior 12–16 px.
Capas
Base 0 → sticky 20 → menú 40 → overlay 100 → modal 110 → toast 120. El diálogo nativo usa la capa superior del navegador.
Pequeños gestos.
La misma personalidad.
Iconos de contorno, retícula 24 × 24, trazo 1,75 px y extremos redondeados. Ningún emoji debe ser el único nombre de una acción.
120 ms / respuesta
Hover y color. No desplazar contenido para indicar selección.
Motion por función
Entrada 240 ms, salida 160 ms y panel lateral 320 ms. Ver curvas, tokens y laboratorio.
Movimiento reducido
Sin shimmer ni giros si se solicita menos movimiento. Los destacados no rotan solos.
Diseñados para responder.
18 componentes base con CSS compartido. Prueba formularios, pestañas, ordenación y diálogos. Todas las acciones de esta sección son demostraciones locales.
01 / Botón
.p-buttonUso, estados y accesibilidad
Una acción primaria por decisión. Texto con verbo y objeto; enlace para navegar. Reposo, hover, presión, foco, deshabilitado y carga. Explicar el motivo de indisponibilidad. Iconos solos requieren nombre accesible.
<button class="p-button primary" type="button">Ver análisis</button>
02 / Badge
.p-badgeUso y estados
Etiqueta breve con texto, no botón ni filtro. Live requiere estado del proveedor. “Destacado” es editorial; no mide confianza. El color nunca comunica por sí solo.
03 / Campo de texto
.p-inputUso, estados y accesibilidad
Label persistente y ayuda con aria-describedby. Validar al enviar y enfocar el primer error. Estados: vacío, completo, foco, inválido, deshabilitado. Placeholder nunca reemplaza etiqueta.
04 / Selector
.p-selectHora de ejemplo: 15:00 · Lima
Uso y accesibilidad
Select nativo con menú personalizado donde el navegador admite base-select. En otros navegadores conserva el menú del sistema. Flechas, búsqueda por letra, Enter y Escape siguen siendo nativos. Listas largas: añadir búsqueda, como en el selector de torneos de la app.
05 / Checkbox
.p-checkUso y estados
Varias opciones; label completo pulsable. Checked y disabled nativos. Estado mixto solo en selección de grupos, nunca fingido con un icono.
06 / Radio
.p-checkUso y accesibilidad
Una selección por grupo con legend. Flechas para recorrer las opciones nativas. No simular radios con botones sin semántica.
07 / Interruptor
.p-switchContexto visible en esta demostración.
Uso y estados
Preferencia binaria de efecto inmediato. Nombre estable. Encendido, apagado, foco y deshabilitado. No usar si necesita envío posterior.
08 / Pestañas
.p-tabs + .p-tabTeclado y estados
Flechas izquierda/derecha recorren y activan paneles locales. Home/End van al inicio/final. Tab entra al panel. Si una consulta es lenta, usar activación manual con Enter/Espacio.
09 / Tabla de datos
.p-table| Selección | Cuota registrada | Cobertura | |
|---|---|---|---|
| Ejemplo A | 64% | 1,80 | Parcial |
| Ejemplo B | 71% | — | Sin cuota |
| Ejemplo C | 58% | 2,10 | Parcial |
Pulsa el encabezado para ordenar la probabilidad.
Uso y accesibilidad
Caption, scope y cifras alineadas. aria-sort indica orden. En móvil, scroll dentro de la tabla sin romper semántica convirtiendo celdas en bloques.
10 / Aviso
.p-alertUso y estados
Información, advertencia o error con título y siguiente paso. role=alert solo para un error urgente nuevo; una nota persistente no debe interrumpir.
11 / Estado vacío
.p-emptyUso y variantes
Distinguir primera visita, ausencia de resultados y error. No mostrar ceros cuando faltan datos. Ofrecer una acción de recuperación si existe.
12 / Carga
.p-skeletonEjemplo de carga de estadísticas…
Uso y accesibilidad
Reservar tamaño final. Skeleton con aria-hidden; contenedor real con aria-busy. Mensaje de carga una sola vez; terminar ante respuesta o error.
13 / Acordeón
.p-accordion¿Qué significa “estimada”?
Es una salida del modelo basada en los datos disponibles; no garantiza el resultado del encuentro.
¿Cómo se compara con el resultado?
La vista histórica muestra el resultado real junto a la proyección previa.
¿Qué pasa cuando faltan datos?
El mercado indica que no hay datos disponibles.
Uso y accesibilidad
Details/summary nativos para ayuda secundaria. Las advertencias importantes permanecen visibles. Enter o Espacio cambia el estado. Agrupar acordeones consecutivos con .p-accordion-stack: separación de 16 px mediante --p-space-16, tanto abiertos como cerrados, en ambos temas y en móvil.
14 / Diálogo
.p-dialogFoco contenido, Escape y regreso al activador.
Uso y estados
Una decisión concreta con título y contexto. Dialog nativo con showModal. Foco en la opción segura. No anidar diálogos ni cerrar por clic accidental en el fondo.
15 / Confirmación breve
.p-toastUso y accesibilidad
role=status sin mover foco. Permanece hasta cerrarla. Los errores que requieren acción permanecen junto al campo o contenido afectado.
16 / Métrica
.p-metricUso y anatomía
Etiqueta, valor, unidad y contexto. Tendencias solo con periodo comparable y muestra suficiente. — y causa cuando falta el dato.
17 / Partido
.p-matchUso y estados
Competición, equipos, horario/marcador, estado y acción. Programado, directo, descanso, finalizado, aplazado, atrasado. No anidar botones en una tarjeta pulsable.
18 / Lectura de mercado
.p-pickMás de 8,5 córners
Local vs. Visitante · partido de ejemplo
- Prob. estimada
- 64%
- Cuota registrada
- —
- Estado
- Sin comparación
Uso y anatomía
Mercado y línea, partido, estimación, versión del modelo, cobertura, cuota con fuente/hora y estado. Sin precio no hay comparación. Retirar acción si el mercado está suspendido o desactualizado.
Tres datos.
Tres significados.
Lo ocurrido, lo estimado y el precio de una casa nunca deben parecer intercambiables.
6 córners
Estadística reportada. Conservar proveedor, minuto, hora de recepción y posibles correcciones.
9,2 al final
Salida ilustrativa. Añadir incertidumbre, variables ausentes y versión. Sin precisión falsa.
Cuota 1,80
Precio ilustrativo con casa, mercado, línea y captura. No es la cuota mínima del modelo.
| Situación | Presentación | Comportamiento |
|---|---|---|
| Sin dato | — · No disponible | No sustituir por cero |
| Feed atrasado | Hora + aviso | Conservar contexto; suspender acción de mercado |
| Mercado suspendido | Mercado suspendido | No mostrar precio como operativo |
| Muestra insuficiente | Sin estimación fiable | No inventar porcentaje |
| Fuente en conflicto | Dato por confirmar | Mostrar origen; no afirmar resultado |
La vigencia depende del proveedor, mercado y frecuencia contratada. Es configuración del producto con pruebas; no un umbral universal definido por diseño.
Que se entienda
sin descifrar colores.
Etiquetas, unidades y equivalente textual. Escalas comunes para comparar; rangos solo si el modelo realmente los produce.
Escala común: 0–16 remates. Local 12; visitante 8.
Reglas para gráficas
- Barras desde cero; no exagerar diferencias.
- Cobalto para local; visitante con otro color y trama.
- Tooltip complementario, nunca único acceso.
- Incertidumbre con banda, intervalo y método.
- No usar una torta si las categorías no suman 100%.
Directos. Útiles.
Sin promesas vacías.
Qué se sabe, qué falta y qué puede hacer la persona. Criterio sin presión para apostar.
“Faltan las alineaciones.”
“La estimación puede cambiar cuando se confirmen.”
“Cuota registrada a las 15:42. Comprueba el precio actual.”
“Apuesta ganadora garantizada.”
“Corre, no puedes perder esta oportunidad.”
“70% de acierto verificado”, sin evaluación que lo sostenga.
Formatea números con Intl según idioma y moneda. Almacena UTC y muestra zona local explícita. Si el precio es S/19 por 30 días con pago único, dilo así; no lo presentes como renovación automática.
Parte de la definición
de terminado.
Objetivo: WCAG 2.2 AA. Revisar ejemplos y pares de color no certifica todas las pantallas heredadas.
Percepción y lectura
- Contraste en ambos temas y estados.
- Zoom 200% y reflow hasta 320 CSS px.
- Texto, forma o icono además del color.
- Alt útil; logos decorativos junto al nombre con alt vacío.
Interacción y recuperación
- Teclado completo y foco visible sin quedar oculto.
- Objetivo táctil 44 px; compacto solo donde encaje.
- Escape y regreso al activador en diálogos.
- Error asociado al campo, con solución.
- Directo sin robar foco ni anunciar cada segundo.
Referencias: WCAG 2.2 › y WAI-ARIA APG ›.
Evolución del modelo.
Filtros, métricas comparables y control de publicación. Esta demostración usa datos ficticios; exportación y activación están deshabilitadas. La app entrega datos reales y verifica permisos en el servidor.
Contrato: PulsoModelMonitor.mount(host, {request, headers}). Tokens compartidos, foco visible, carga anunciada, error recuperable y tablas con desplazamiento horizontal en móvil. Los filtros descartan respuestas obsoletas; el color siempre acompaña un signo o texto.
Un sistema vivo.
Con reglas claras.
Cuotario consume los mismos tokens, componentes e interacciones que esta documentación. Las mejoras de diseño se definen aquí y llegan a la app desde los archivos compartidos. La lógica de partidos, cuentas y apuestas permanece en el producto.
- ProponerProblema, pantallas afectadas y por qué no basta una pieza existente.
- DiseñarAnatomía, variantes, estados, temas, móvil, teclado y casos sin datos.
- ValidarRevisión de producto, diseño y desarrollo, con comportamiento real.
- PublicarActualizar fuente, ejemplos, cambios y guía de migración.
Patch / 3.0.1
Corrección compatible. Documentar impacto.
Minor / 3.1.0
Nueva pieza compatible, validada en una pantalla real.
Major / 3.0.0
Cambiar contratos requiere mapa de sustitución y periodo de migración.
| Área | Estado | Alcance |
|---|---|---|
| Tokens e identidad | Compartidos | JSON, temas y adaptación global |
| Componentes p-* | En uso | Badges, mercados, selección, ticket y tarjetas en app y documentación |
| Controles e interacción | Integrados en Cuotario | Botones, campos, selectores, búsqueda con teclado, filtros, diálogos y avisos |
| Pantallas dinámicas | Inicialización compartida | Contenido insertado por la app: foco, acordeones, errores de campos y carga |
| Composiciones de producto | Adaptadores de layout | Jornada, directo, detalle, ticket, cuenta, Pro y administración; datos y permisos propios de la app |
| Biblioteca Figma | No publicada | Mapeo y entrega documentados |
Victoria en verde.
El estado, siempre escrito.
El verde Mint comunica victoria, acierto o un balance realizado positivo. El lima sigue siendo selección y énfasis de marca. Una probabilidad alta no es un resultado ganado.
Modo claro
Últimos resultados
Modo oscuro
Últimos resultados
Un estado, una función
Verde: victoria / acierto. Rose: derrota / fallo. Neutro: empate, pendiente, sin dato o cash out. El resultado monetario de un cash out puede ser positivo, negativo o cero; su etiqueta no implica victoria.
Los estados en curso mantienen “Va ganando” / “Va perdiendo” y nunca se presentan como liquidados. La identidad local/visitante en gráficas no indica éxito o fracaso.
Lectura y accesibilidad
Las fichas compactas miden 24 × 24 px y son informativas. Conservan V/E/D, nombre accesible y tooltip. Las filas del historial son botones accesibles con teclado.
El texto sobre cada ficha supera 4.5:1 en ambos temas. Los fondos semánticos tienen su propia pareja de texto; no se combina texto blanco con cualquier tono de la escala.
<span class="p-result" data-result="win" role="img" aria-label="Victoria" title="Victoria">V</span> <span class="p-badge success">✓ Ganada</span>
El mismo componente.
El mismo comportamiento.
Una pieza se valida en el catálogo y en una pantalla real. No hace falta incluir las 42 piezas en cada pantalla: cada necesidad usa el contrato apropiado.
Una fuente visual
Tokens → controles y biblioteca → componentes deportivos → composición de Cuotario. Los adaptadores distribuyen el contenido; no inventan colores ni estados.
Interacción compartida
PulsoUI gestiona foco, capas, búsqueda, acordeones, validación y carga. El producto entrega datos reales y conserva sus permisos y acciones.
En el resumen de un partido, Ganador del partido · 1X2 y Doble oportunidad son dos tarjetas de acordeón independientes, abiertas al inicio. Se muestran lado a lado en escritorio y apiladas en móvil, con filas compactas y sin igualar alturas al cerrar una tarjeta. Las cuotas se etiquetan como justas, sin margen; la comparación con el modelo sigue siendo secundaria.
La navegación del detalle utiliza .p-tabs + .p-tab con subrayado activo y queda fija bajo la cabecera. PulsoSectionNav sincroniza aria-current="location" con la sección visible al desplazarse, incluso al cambiar la altura de un acordeón. Es navegación por secciones continuas: no oculta contenido ni cambia el foco durante el scroll. En móvil mantiene una fila desplazable y revela el tab activo. Tab y Enter permiten navegar; las flechas, Inicio y Fin mueven el foco. Respeta movimiento reducido.
Demos identificadas
Las simulaciones viven en data-p-demo. No se conectan a cuentas, pagos ni partidos. Los estados de carga de la app reflejan sus peticiones reales.
| Necesidad | API compartida | Responsabilidad del producto |
|---|---|---|
| Contenido dinámico | PulsoUI.observe(root) | Insertar HTML semántico; evitar doble inicialización |
| Diálogo o panel | openLayer / closeLayer | Título, disparador y callback de cierre |
| Búsqueda | combobox(input, list, options) | Consulta, resultados y descarte de respuestas obsoletas |
| Formulario | fieldError / setBusy | Validación y confirmación del servidor |
| Acordeón | data-p-disclosure / setDisclosure | Carga de datos al recibir pulso:disclosure |
| Mensaje y confirmación | notify / prompt / confirm | Texto, decisión y persistencia explícita |
Carga pulso-runtime.js antes de pulso-library.js. Prueba ambos temas, teclado y móvil. Motion reducido conserva información; los estados nunca dependen solo del color.
Menos contornos.
Más jerarquía.
Selección revisada visualmente desde la búsqueda que compartiste. La fecha corresponde a la consulta, no a la publicación de cada shot. Son referencias visuales, no evidencia de conversión comercial.
Coinstax · Crypto Dashboard ›
Tarjetas blancas, base neutra y lima puntual. Aplicación: superficie clara, controles planos y selección lima; se evita colorear todas las cifras.
DRIBBBLE / FARHANFIFA · Live Streaming Dashboard ›
Marcadores agrupados y acento de alto contraste. Aplicación: directo oscuro, tarjetas compactas por competición y estado legible.
DRIBBBLE / SOGASO · ORIZONFIFA 2026 · Stats & Analytics Hub ›
Jerarquía por bloques y datos próximos entre sí. Aplicación: destacados con banderas desenfocadas, marcador central y acción secundaria integrada.
Probabilidades de un vistazo.
Verde desde 78%; amarillo entre 70% y 77%. Porcentaje en negrita, visible sin depender del color. No se muestran recomendaciones rojas.
Modo claro
Modo oscuro
Un criterio compartido
PulsoProbability.signal / badge / legend se usa en mercados, selección destacada y picks. Solo acepta probabilidades válidas entre 0 y 1 y exige un mínimo sin redondear de 70%. El nivel visual se asigna al porcentaje entero mostrado, para que un mismo número nunca cambie de color.
Por debajo del mínimo, el mercado conserva su proyección y muestra “Sin señal”, sin línea sugerida ni botón de ticket. No se elimina el histórico ni se aplica este filtro a la distribución 1X2. El porcentaje expresa una estimación; el verde no significa victoria, rentabilidad ni garantía.
Picks a primera vista.
Entre el banner y los próximos partidos. Tres tarjetas en escritorio, dos en tablet y una con avance visible en móvil. Datos ilustrativos.
Contrato compartido
PulsoPicks.render(root, options) recibe datos ya consultados y callbacks para analizar, ver todos y reintentar. El botón + usa p-selection del ticket. Sin avance automático, peticiones por tarjeta ni mezcla de probabilidades del modelo con cuotas reales.
Tab recorre acciones. Con foco en la fila, ← / → desplazan una tarjeta; Inicio / Fin recorren los extremos. Los controles se desactivan en los límites. El movimiento respeta la preferencia del sistema. Al iniciar el partido, la app retira el pick del resumen y del listado.
Primero el dato. Después la cuenta.
Google → home o liga → explorar el dashboard → acceso voluntario. Calendario y análisis públicos; historial guardado con Pro. Nunca abrir un modal de registro al llegar desde el buscador.
Contrato compartido
PulsoDiscovery.renderInvite utiliza tokens, botones y foco de Pulso. El aviso se puede cerrar durante la sesión; desaparece al iniciar sesión. El diálogo solo aparece tras una acción explícita, conserva la vista y el ticket, ofrece seguir sin cuenta y distingue registro gratuito de acceso Pro. Guardar requiere una confirmación nueva después de entrar.
Home y ocho ligas tienen HTML público, canonical y enlaces reales. Administración y documentación permanecen fuera del índice. No hay contenido especial para robots ni páginas automáticas por cada combinación de filtros.
La puerta de entrada.
Home pública de Cuotario: propuesta, ejemplo explícito, cobertura, metodología, planes y preguntas. El contenido se sirve en HTML en español e inglés.
Composición y comportamiento
pulso-marketing.css y pulso-hero.css consumen tokens, fuente y botones de Pulso. El hero utiliza la fotografía de estadio editada para Pulso como fondo, con un velo oscuro para mantener el contraste del texto y el ejemplo de producto. El recurso se sirve localmente en WebP con selección responsive y prioridad alta. Negro para el escenario, lima para la sugerencia y cobalt para la profundidad. En móvil se apilan el mensaje y la selección, con un recorte del estadio que mantiene visible la cancha. El ejemplo tiene margen lateral propio en escritorio y queda centrado en móvil. Tarjeta y selector comparten una superficie de vidrio con tinte ink, reflejo sutil, desenfoque de 18 px y borde claro. El texto y el estado seleccionado permanecen opacos. Sin soporte de backdrop-filter, con transparencia reducida o mayor contraste, se utiliza una superficie sólida legible.
El selector Córners / Tiros al arco / Tarjetas utiliza radios nativos: funciona sin JavaScript, admite flechas y conserva foco visible. Solo se muestra un mercado cada vez. Cambiarlo no consulta proveedores ni modifica un ticket. Las cifras siempre llevan la etiqueta de ejemplo ilustrativo.
Fondo estático; entrada del texto con el token --p-motion-page, una sola vez. Cambio de ejemplo: token --p-motion-enter. Sin bucles, parallax ni rotación automática. Con prefers-reduced-motion no se anima. La fotografía de fondo es decorativa para lectores de pantalla; la información está en HTML.
pulso-story.html y pulso-story.css añaden tres escenas de producto: histórico, contexto y ticket. Las tres escenas comparten fondo claro, acentos cobalt, la misma altura, cabecera y separadores. El ticket muestra una selección alineada en una fila, sin capas superpuestas ni inclinación; la entrada conserva solo una traslación vertical suave. Los gráficos son ilustrativos; todos los títulos, explicaciones y límites se sirven en HTML en ambos idiomas. El recorrido de metodología utiliza radios nativos: Tab entra al grupo y las flechas cambian el paso, con foco visible y sin JavaScript ni consultas a proveedores.
pulso-story.js activa entradas una sola vez cuando la sección llega a pantalla. Las barras crecen y los trazos se dibujan en 480–800 ms; la transición de paso usa --p-motion-page. No hay carrusel automático, bucles ni cambios de datos. Con movimiento reducido no se anima. Sin JavaScript se conserva el contenido y la interacción. En móvil las escenas se apilan y el recorrido usa tres controles compactos sobre la vista previa.
El bloque de planes utiliza una fotografía de estadio decorativa, servida en WebP. El desenfoque de 6 px se aplica solo a la imagen; un velo ink mantiene contraste para títulos blancos, texto secundario claro y CTA lima. El contenido y los controles permanecen nítidos. El fondo es estático y se sustituye por una superficie sólida cuando se solicita contraste reforzado o transparencia reducida.
La navegación y los CTA funcionan como enlaces. Los precios provienen de configuración. Las cifras de la vista previa son ilustrativas y nunca se presentan como resultados reales.
Del diseño
al producto.
Archivos versionados para trabajar desde la misma base. El proyecto conserva identificadores internos durante la migración.
Entrega de diseño
En Figma, separar primitivas y semánticos; modos Dark/Light y componentes con variantes y estados. Vincular medidas y colores a variables. Entregar anatomía, flujo, límites y enlace a este manual.
El repositorio contiene la fuente y reglas. Todavía no existe una biblioteca Figma sincronizada.
Entrega de desarrollo
python scripts/build_pulso_tokens.py python scripts/build_pulso_tokens.py --check node tests/ui-navigation.cjs
Editar pulso.tokens.json, regenerar CSS y revisar temas. No editar directamente el CSS generado.
Un producto con Pulso.Volver al inicio ⌃